Repository: olingo-odata2 Updated Branches: refs/heads/master de4aec1bd -> 4e1667fcc
[OLINGO-1055] ODatav2: Omit empty inline tags for null data Signed-off-by: Christian Amend <christian.am...@sap.com> Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/4e1667fc Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/4e1667fc Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/4e1667fc Branch: refs/heads/master Commit: 4e1667fcc4ac320aed19e3b0360af4c7fec651f0 Parents: de4aec1 Author: Archana Rai <archana....@sap.com> Authored: Thu Dec 1 16:21:18 2016 +0530 Committer: Christian Amend <christian.am...@sap.com> Committed: Thu Dec 1 12:54:54 2016 +0100 ---------------------------------------------------------------------- .../api/ep/EntityProviderWriteProperties.java | 10 + .../ep/producer/AtomEntryEntityProducer.java | 15 +- .../ep/producer/JsonEntryEntityProducer.java | 14 + .../ep/ODataEntityProviderPropertiesTest.java | 9 +- .../producer/JsonEntryEntityProducerTest.java | 487 +++++++++++-------- .../core/ep/producer/XmlExpandProducerTest.java | 48 ++ .../fit/ref/InvalidDataInScenarioTest.java | 2 +- 7 files changed, 375 insertions(+), 210 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/4e1667fc/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java index 354d0f5..ce448e0 100644 --- a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java +++ b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java @@ -50,8 +50,13 @@ public class EntityProviderWriteProperties { private boolean isResponsePayload = true; private boolean includeMetadataInContentOnly = false; private boolean isDataBasedPropertySerialization = false; + private boolean omitInlineForNullData = false; private EntityProviderWriteProperties() {} + + public final boolean isOmitInlineForNullData() { + return omitInlineForNullData; + } /** * Returns true if the payload has dynamic properties i.e. every entry has different property list @@ -163,6 +168,10 @@ public class EntityProviderWriteProperties { public static class ODataEntityProviderPropertiesBuilder { private final EntityProviderWriteProperties properties = new EntityProviderWriteProperties(); + public final ODataEntityProviderPropertiesBuilder omitInlineForNullData(boolean omitInlineForNullData) { + properties.omitInlineForNullData = omitInlineForNullData; + return this; + } /** * @param setting if payload has dynamic property */ @@ -312,6 +321,7 @@ public class EntityProviderWriteProperties { this.properties.isResponsePayload = properties.isResponsePayload; this.properties.includeMetadataInContentOnly = properties.includeMetadataInContentOnly; this.properties.isDataBasedPropertySerialization = properties.isDataBasedPropertySerialization; + this.properties.omitInlineForNullData = properties.omitInlineForNullData; return this; } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/4e1667fc/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java index ea00c6f..9c20bff 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java @@ -256,7 +256,6 @@ public class AtomEntryEntityProducer { if (eia.getExpandedNavigationPropertyNames().contains(navigationPropertyName)) { if (properties.getCallbacks() != null && properties.getCallbacks().containsKey(navigationPropertyName)) { - writer.writeStartElement(Edm.NAMESPACE_M_2007_08, FormatXml.M_INLINE); EdmNavigationProperty navProp = (EdmNavigationProperty) eia.getEntityType().getProperty(navigationPropertyName); WriteFeedCallbackContext context = new WriteFeedCallbackContext(); @@ -282,6 +281,12 @@ public class AtomEntryEntityProducer { if (inlineData == null) { inlineData = new ArrayList<Map<String, Object>>(); } + + // This statement is used for the client use case. Flag should never be set on server side + if (properties.isOmitInlineForNullData() && inlineData.isEmpty()) { + return; + } + writer.writeStartElement(Edm.NAMESPACE_M_2007_08, FormatXml.M_INLINE); EntityProviderWriteProperties inlineProperties = result.getInlineProperties(); EdmEntitySet inlineEntitySet = eia.getEntitySet().getRelatedEntitySet(navProp); @@ -301,7 +306,6 @@ public class AtomEntryEntityProducer { if (eia.getExpandedNavigationPropertyNames().contains(navigationPropertyName)) { if (properties.getCallbacks() != null && properties.getCallbacks().containsKey(navigationPropertyName)) { - writer.writeStartElement(Edm.NAMESPACE_M_2007_08, FormatXml.M_INLINE); EdmNavigationProperty navProp = (EdmNavigationProperty) eia.getEntityType().getProperty(navigationPropertyName); WriteEntryCallbackContext context = new WriteEntryCallbackContext(); @@ -323,6 +327,13 @@ public class AtomEntryEntityProducer { throw new EntityProviderProducerException(EntityProviderException.COMMON, e); } Map<String, Object> inlineData = result.getEntryData(); + + // This statement is used for the client use case. Flag should never be set on server side + if (properties.isOmitInlineForNullData() && (inlineData == null || inlineData.isEmpty())) { + return; + } + + writer.writeStartElement(Edm.NAMESPACE_M_2007_08, FormatXml.M_INLINE); if (inlineData != null && !inlineData.isEmpty()) { EntityProviderWriteProperties inlineProperties = result.getInlineProperties(); EdmEntitySet inlineEntitySet = eia.getEntitySet().getRelatedEntitySet(navProp); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/4e1667fc/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducer.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducer.java index ce9a5bb..887d4b9 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducer.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducer.java @@ -157,6 +157,13 @@ public class JsonEntryEntityProducer { if (inlineData == null) { inlineData = new ArrayList<Map<String, Object>>(); } + + //This statement is used for the client use case. Flag should never be set on server side + if(properties.isOmitInlineForNullData() && inlineData.isEmpty()){ + writeDeferredUri(entityInfo, navigationPropertyName); + return; + } + final EntityProviderWriteProperties inlineProperties = result.getInlineProperties(); final EntityInfoAggregator inlineEntityInfo = EntityInfoAggregator.create(inlineEntitySet, inlineProperties.getExpandSelectTree()); @@ -172,6 +179,13 @@ public class JsonEntryEntityProducer { final WriteEntryCallbackResult result = ((OnWriteEntryContent) callback).retrieveEntryResult((WriteEntryCallbackContext) context); Map<String, Object> inlineData = result.getEntryData(); + + //This statement is used for the client use case. Flag should never be set on server side + if(properties.isOmitInlineForNullData() && (inlineData == null || inlineData.isEmpty())){ + writeDeferredUri(entityInfo, navigationPropertyName); + return; + } + if (inlineData != null && !inlineData.isEmpty()) { final EntityProviderWriteProperties inlineProperties = result.getInlineProperties(); final EntityInfoAggregator inlineEntityInfo = http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/4e1667fc/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java index 241828c..192a67d 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java @@ -78,6 +78,7 @@ public class ODataEntityProviderPropertiesTest extends BaseTest { assertFalse(properties.isIncludeMetadataInContentOnly()); assertTrue(properties.isResponsePayload()); assertFalse(properties.isDataBasedPropertySerialization()); + assertFalse(properties.isOmitInlineForNullData()); } @Test @@ -104,6 +105,7 @@ public class ODataEntityProviderPropertiesTest extends BaseTest { .includeMetadataInContentOnly(true) .responsePayload(true) .isDataBasedPropertySerialization(true) + .omitInlineForNullData(true) .build(); assertEquals("Wrong amount of callbacks.", 1, properties.getCallbacks().size()); @@ -122,7 +124,8 @@ public class ODataEntityProviderPropertiesTest extends BaseTest { assertTrue("includeMetadataInContentOnly should be set", properties.isIncludeMetadataInContentOnly()); assertTrue("responsePayload flag should be set", properties.isResponsePayload()); - assertTrue(properties.isDataBasedPropertySerialization()); + assertTrue("isDataBasedPropertySerialization should be set", properties.isDataBasedPropertySerialization()); + assertTrue("omitInlineForNullData should be set", properties.isOmitInlineForNullData()); } @Test @@ -148,6 +151,8 @@ public class ODataEntityProviderPropertiesTest extends BaseTest { .omitETag(true) .includeMetadataInContentOnly(true) .responsePayload(true) + .isDataBasedPropertySerialization(true) + .omitInlineForNullData(true) .build(); // @@ -170,5 +175,7 @@ public class ODataEntityProviderPropertiesTest extends BaseTest { assertTrue("OmitETag should be set", fromProperties.isOmitETag()); assertTrue("includeMetadataInContentOnly should be set", fromProperties.isIncludeMetadataInContentOnly()); assertTrue("responsePayload flag should be set", fromProperties.isResponsePayload()); + assertTrue("isDataBasedPropertySerialization should be set", properties.isDataBasedPropertySerialization()); + assertTrue("omitInlineForNullData should be set", properties.isOmitInlineForNullData()); } } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/4e1667fc/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducerTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducerTest.java index 11c52c2..2673758 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducerTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducerTest.java @@ -531,52 +531,77 @@ public class JsonEntryEntityProducerTest extends BaseTest { json); } - @SuppressWarnings("unchecked") @Test public void entryWithExpandedEntryButNullData() throws Exception { final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"); Map<String, Object> roomData = new HashMap<String, Object>(); roomData.put("Id", "1"); roomData.put("Version", 1); + ExpandSelectTreeNode node1 = createRoomNode(); + + Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); + callbacks.put("nr_Building", new NullEntryCallback()); + + final ODataResponse response = + new JsonEntityProvider().writeEntry(entitySet, roomData, + EntityProviderWriteProperties.serviceRoot(URI.create(BASE_URI)).expandSelectTree(node1) + .callbacks(callbacks).build()); + assertNotNull(response); + assertNotNull(response.getEntity()); + assertNull("EntitypProvider must not set content header", response.getContentHeader()); + Map<String, Object> roomEntry = checkRoom(response); + assertTrue(roomEntry.containsKey("nr_Building")); + assertNull(roomEntry.get("nr_Building")); + } + + class NullEntryCallback implements OnWriteEntryContent { + @Override + public WriteEntryCallbackResult retrieveEntryResult(final WriteEntryCallbackContext context) + throws ODataApplicationException { + WriteEntryCallbackResult result = new WriteEntryCallbackResult(); + result.setEntryData(null); + result.setInlineProperties(DEFAULT_PROPERTIES); + return result; + } + } + + private ExpandSelectTreeNode createRoomNode() { ExpandSelectTreeNode node2 = Mockito.mock(ExpandSelectTreeNode.class); Map<String, ExpandSelectTreeNode> links = new HashMap<String, ExpandSelectTreeNode>(); links.put("nr_Building", node2); ExpandSelectTreeNode node1 = Mockito.mock(ExpandSelectTreeNode.class); Mockito.when(node1.getLinks()).thenReturn(links); + return node1; + } - class EntryCallback implements OnWriteEntryContent { - @Override - public WriteEntryCallbackResult retrieveEntryResult(final WriteEntryCallbackContext context) - throws ODataApplicationException { - WriteEntryCallbackResult result = new WriteEntryCallbackResult(); - result.setEntryData(null); - result.setInlineProperties(DEFAULT_PROPERTIES); - return result; - } - } - EntryCallback callback = new EntryCallback(); + @SuppressWarnings("unchecked") + @Test + public void entryWithExpandedEntryButNullDataOmitData() throws Exception { + final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"); + Map<String, Object> roomData = new HashMap<String, Object>(); + roomData.put("Id", "1"); + roomData.put("Version", 1); + + ExpandSelectTreeNode node1 = createRoomNode(); Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); - callbacks.put("nr_Building", callback); + callbacks.put("nr_Building", new NullEntryCallback()); final ODataResponse response = new JsonEntityProvider().writeEntry(entitySet, roomData, EntityProviderWriteProperties.serviceRoot(URI.create(BASE_URI)).expandSelectTree(node1) - .callbacks(callbacks).build()); + .callbacks(callbacks).omitInlineForNullData(true).build()); assertNotNull(response); assertNotNull(response.getEntity()); assertNull("EntitypProvider must not set content header", response.getContentHeader()); - Map<String, Object> roomEntry = - new Gson().fromJson(new InputStreamReader((InputStream) response.getEntity()), Map.class); - // remove d wrapper - roomEntry = (Map<String, Object>) roomEntry.get("d"); - assertEquals(2, roomEntry.size()); + Map<String, Object> roomEntry = checkRoom(response); assertTrue(roomEntry.containsKey("nr_Building")); - assertNull(roomEntry.get("nr_Building")); + assertNotNull(roomEntry.get("nr_Building")); + assertTrue(((Map<String, Object>) roomEntry.get("nr_Building")).size() == 1); + assertTrue(((Map<String, Object>) roomEntry.get("nr_Building")).containsKey("__deferred")); } - @SuppressWarnings("unchecked") @Test public void entryWithExpandedEntryButEmptyData() throws Exception { final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"); @@ -584,25 +609,10 @@ public class JsonEntryEntityProducerTest extends BaseTest { roomData.put("Id", "1"); roomData.put("Version", 1); - ExpandSelectTreeNode node2 = Mockito.mock(ExpandSelectTreeNode.class); - Map<String, ExpandSelectTreeNode> links = new HashMap<String, ExpandSelectTreeNode>(); - links.put("nr_Building", node2); - ExpandSelectTreeNode node1 = Mockito.mock(ExpandSelectTreeNode.class); - Mockito.when(node1.getLinks()).thenReturn(links); + ExpandSelectTreeNode node1 = createRoomNode(); - class EntryCallback implements OnWriteEntryContent { - @Override - public WriteEntryCallbackResult retrieveEntryResult(final WriteEntryCallbackContext context) - throws ODataApplicationException { - WriteEntryCallbackResult result = new WriteEntryCallbackResult(); - result.setEntryData(new HashMap<String, Object>()); - result.setInlineProperties(DEFAULT_PROPERTIES); - return result; - } - } - EntryCallback callback = new EntryCallback(); Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); - callbacks.put("nr_Building", callback); + callbacks.put("nr_Building", new EmptyEntryCallback()); ODataResponse response = new JsonEntityProvider().writeEntry(entitySet, roomData, @@ -612,15 +622,50 @@ public class JsonEntryEntityProducerTest extends BaseTest { assertNotNull(response.getEntity()); assertNull("EntitypProvider must not set content header", response.getContentHeader()); - Map<String, Object> roomEntry = - new Gson().fromJson(new InputStreamReader((InputStream) response.getEntity()), Map.class); - // remove d wrapper - roomEntry = (Map<String, Object>) roomEntry.get("d"); - assertEquals(2, roomEntry.size()); + Map<String, Object> roomEntry = checkRoom(response); assertTrue(roomEntry.containsKey("nr_Building")); assertNull(roomEntry.get("nr_Building")); } + class EmptyEntryCallback implements OnWriteEntryContent { + @Override + public WriteEntryCallbackResult retrieveEntryResult(final WriteEntryCallbackContext context) + throws ODataApplicationException { + WriteEntryCallbackResult result = new WriteEntryCallbackResult(); + result.setEntryData(new HashMap<String, Object>()); + result.setInlineProperties(DEFAULT_PROPERTIES); + return result; + } + } + + @SuppressWarnings("unchecked") + @Test + public void entryWithExpandedEntryButEmptyDataOmitInline() throws Exception { + final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"); + Map<String, Object> roomData = new HashMap<String, Object>(); + roomData.put("Id", "1"); + roomData.put("Version", 1); + + ExpandSelectTreeNode node1 = createRoomNode(); + + Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); + callbacks.put("nr_Building", new EmptyEntryCallback()); + + ODataResponse response = + new JsonEntityProvider().writeEntry(entitySet, roomData, + EntityProviderWriteProperties.serviceRoot(URI.create(BASE_URI)).expandSelectTree(node1) + .omitInlineForNullData(true).callbacks(callbacks).build()); + assertNotNull(response); + assertNotNull(response.getEntity()); + assertNull("EntitypProvider must not set content header", response.getContentHeader()); + + Map<String, Object> roomEntry = checkRoom(response); + assertTrue(roomEntry.containsKey("nr_Building")); + assertNotNull(roomEntry.get("nr_Building")); + assertTrue(((Map<String, Object>) roomEntry.get("nr_Building")).size() == 1); + assertTrue(((Map<String, Object>) roomEntry.get("nr_Building")).containsKey("__deferred")); + } + @Test public void entryWithExpandedEntry() throws Exception { final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"); @@ -628,11 +673,7 @@ public class JsonEntryEntityProducerTest extends BaseTest { roomData.put("Id", "1"); roomData.put("Version", 1); - ExpandSelectTreeNode node2 = Mockito.mock(ExpandSelectTreeNode.class); - Map<String, ExpandSelectTreeNode> links = new HashMap<String, ExpandSelectTreeNode>(); - links.put("nr_Building", node2); - ExpandSelectTreeNode node1 = Mockito.mock(ExpandSelectTreeNode.class); - Mockito.when(node1.getLinks()).thenReturn(links); + ExpandSelectTreeNode node1 = createRoomNode(); class EntryCallback implements OnWriteEntryContent { @Override @@ -784,11 +825,7 @@ public class JsonEntryEntityProducerTest extends BaseTest { roomData.put("Id", "1"); roomData.put("Version", 1); - ExpandSelectTreeNode node2 = Mockito.mock(ExpandSelectTreeNode.class); - Map<String, ExpandSelectTreeNode> links = new HashMap<String, ExpandSelectTreeNode>(); - links.put("nr_Building", node2); - ExpandSelectTreeNode node1 = Mockito.mock(ExpandSelectTreeNode.class); - Mockito.when(node1.getLinks()).thenReturn(links); + ExpandSelectTreeNode node1 = createRoomNode(); final ODataResponse response = new JsonEntityProvider().writeEntry(entitySet, roomData, EntityProviderWriteProperties.serviceRoot(URI.create(BASE_URI)).expandSelectTree(node1).build()); @@ -806,11 +843,7 @@ public class JsonEntryEntityProducerTest extends BaseTest { roomData.put("Id", "1"); roomData.put("Version", 1); - ExpandSelectTreeNode node2 = Mockito.mock(ExpandSelectTreeNode.class); - Map<String, ExpandSelectTreeNode> links = new HashMap<String, ExpandSelectTreeNode>(); - links.put("nr_Building", node2); - ExpandSelectTreeNode node1 = Mockito.mock(ExpandSelectTreeNode.class); - Mockito.when(node1.getLinks()).thenReturn(links); + ExpandSelectTreeNode node1 = createRoomNode(); Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); callbacks.put("nr_Building", null); @@ -827,30 +860,10 @@ public class JsonEntryEntityProducerTest extends BaseTest { Map<String, Object> buildingData = new HashMap<String, Object>(); buildingData.put("Id", "1"); - ExpandSelectTreeNode node2 = Mockito.mock(ExpandSelectTreeNode.class); - Map<String, ExpandSelectTreeNode> links = new HashMap<String, ExpandSelectTreeNode>(); - links.put("nb_Rooms", node2); - ExpandSelectTreeNode node1 = Mockito.mock(ExpandSelectTreeNode.class); - Mockito.when(node1.getLinks()).thenReturn(links); + ExpandSelectTreeNode node1 = createBuildingNode(); - class FeedCallback implements OnWriteFeedContent { - @Override - public WriteFeedCallbackResult retrieveFeedResult(final WriteFeedCallbackContext context) - throws ODataApplicationException { - Map<String, Object> roomData = new HashMap<String, Object>(); - roomData.put("Id", "1"); - roomData.put("Version", 1); - List<Map<String, Object>> roomsData = new ArrayList<Map<String, Object>>(); - roomsData.add(roomData); - WriteFeedCallbackResult result = new WriteFeedCallbackResult(); - result.setFeedData(roomsData); - result.setInlineProperties(DEFAULT_PROPERTIES); - return result; - } - } - FeedCallback callback = new FeedCallback(); Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); - callbacks.put("nb_Rooms", callback); + callbacks.put("nb_Rooms", new DataFeedCallback()); final ODataResponse response = new JsonEntityProvider().writeEntry(entitySet, buildingData, @@ -866,6 +879,23 @@ public class JsonEntryEntityProducerTest extends BaseTest { + "\"nr_Building\":{\"__deferred\":{\"uri\":\"" + BASE_URI + "Rooms('1')/nr_Building\"}}}]}}}", json); } + + class DataFeedCallback implements OnWriteFeedContent { + @Override + public WriteFeedCallbackResult retrieveFeedResult(final WriteFeedCallbackContext context) + throws ODataApplicationException { + Map<String, Object> roomData = new HashMap<String, Object>(); + roomData.put("Id", "1"); + roomData.put("Version", 1); + List<Map<String, Object>> roomsData = new ArrayList<Map<String, Object>>(); + roomsData.add(roomData); + WriteFeedCallbackResult result = new WriteFeedCallbackResult(); + result.setFeedData(roomsData); + result.setInlineProperties(DEFAULT_PROPERTIES); + return result; + } + } + @Test public void entryWithExpandedFeedInClientUseCase() throws Exception { @@ -873,28 +903,9 @@ public class JsonEntryEntityProducerTest extends BaseTest { Map<String, Object> buildingData = new HashMap<String, Object>(); buildingData.put("Id", "1"); - ExpandSelectTreeNode node2 = Mockito.mock(ExpandSelectTreeNode.class); - Map<String, ExpandSelectTreeNode> links = new HashMap<String, ExpandSelectTreeNode>(); - links.put("nb_Rooms", node2); - ExpandSelectTreeNode node1 = Mockito.mock(ExpandSelectTreeNode.class); - Mockito.when(node1.getLinks()).thenReturn(links); + ExpandSelectTreeNode node1 = createBuildingNode(); - class FeedCallback implements OnWriteFeedContent { - @Override - public WriteFeedCallbackResult retrieveFeedResult(final WriteFeedCallbackContext context) - throws ODataApplicationException { - Map<String, Object> roomData = new HashMap<String, Object>(); - roomData.put("Id", "1"); - roomData.put("Version", 1); - List<Map<String, Object>> roomsData = new ArrayList<Map<String, Object>>(); - roomsData.add(roomData); - WriteFeedCallbackResult result = new WriteFeedCallbackResult(); - result.setFeedData(roomsData); - result.setInlineProperties(DEFAULT_PROPERTIES); - return result; - } - } - FeedCallback callback = new FeedCallback(); + DataFeedCallback callback = new DataFeedCallback(); Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); callbacks.put("nb_Rooms", callback); @@ -920,25 +931,10 @@ public class JsonEntryEntityProducerTest extends BaseTest { Map<String, Object> buildingData = new HashMap<String, Object>(); buildingData.put("Id", "1"); - ExpandSelectTreeNode node2 = Mockito.mock(ExpandSelectTreeNode.class); - Map<String, ExpandSelectTreeNode> links = new HashMap<String, ExpandSelectTreeNode>(); - links.put("nb_Rooms", node2); - ExpandSelectTreeNode node1 = Mockito.mock(ExpandSelectTreeNode.class); - Mockito.when(node1.getLinks()).thenReturn(links); + ExpandSelectTreeNode node1 = createBuildingNode(); - class FeedCallback implements OnWriteFeedContent { - @Override - public WriteFeedCallbackResult retrieveFeedResult(final WriteFeedCallbackContext context) - throws ODataApplicationException { - WriteFeedCallbackResult result = new WriteFeedCallbackResult(); - result.setFeedData(null); - result.setInlineProperties(DEFAULT_PROPERTIES); - return result; - } - } - FeedCallback callback = new FeedCallback(); Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); - callbacks.put("nb_Rooms", callback); + callbacks.put("nb_Rooms", new NullFeedCallback()); final ODataResponse response = new JsonEntityProvider().writeEntry(entitySet, buildingData, @@ -948,18 +944,52 @@ public class JsonEntryEntityProducerTest extends BaseTest { assertNotNull(response.getEntity()); assertNull("EntitypProvider must not set content header", response.getContentHeader()); - Map<String, Object> buildingEntry = - new Gson().fromJson(new InputStreamReader((InputStream) response.getEntity()), Map.class); - // remove d wrapper - buildingEntry = (Map<String, Object>) buildingEntry.get("d"); - assertEquals(2, buildingEntry.size()); + Map<String, Object> buildingEntry = checkRoom(response); assertTrue(buildingEntry.containsKey("nb_Rooms")); Map<String, Object> roomsFeed = (Map<String, Object>) buildingEntry.get("nb_Rooms"); assertNotNull(roomsFeed); List<Object> roomsFeedEntries = (List<Object>) roomsFeed.get("results"); assertEquals(0, roomsFeedEntries.size()); } + public class NullFeedCallback implements OnWriteFeedContent { + @Override + public WriteFeedCallbackResult retrieveFeedResult(final WriteFeedCallbackContext context) + throws ODataApplicationException { + WriteFeedCallbackResult result = new WriteFeedCallbackResult(); + result.setFeedData(null); + result.setInlineProperties(DEFAULT_PROPERTIES); + return result; + } + } + + @SuppressWarnings("unchecked") + @Test + public void entryWithExpandedFeedButNullDataOmitInline() throws Exception { + final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Buildings"); + Map<String, Object> buildingData = new HashMap<String, Object>(); + buildingData.put("Id", "1"); + + ExpandSelectTreeNode node1 = createBuildingNode(); + + Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); + callbacks.put("nb_Rooms", new NullFeedCallback()); + + final ODataResponse response = + new JsonEntityProvider().writeEntry(entitySet, buildingData, + EntityProviderWriteProperties.serviceRoot(URI.create(BASE_URI)).expandSelectTree(node1) + .omitInlineForNullData(true).callbacks(callbacks).build()); + assertNotNull(response); + assertNotNull(response.getEntity()); + assertNull("EntitypProvider must not set content header", response.getContentHeader()); + Map<String, Object> buildingEntry = checkRoom(response); + assertTrue(buildingEntry.containsKey("nb_Rooms")); + assertNotNull(buildingEntry.get("nb_Rooms")); + Map<String, Object> navContent = (Map<String, Object>) buildingEntry.get("nb_Rooms"); + assertTrue(navContent.size() == 1); + assertTrue(navContent.containsKey("__deferred")); + } + @SuppressWarnings("unchecked") @Test public void entryWithExpandedFeedButNullDataClientUseCase() throws Exception { @@ -967,25 +997,10 @@ public class JsonEntryEntityProducerTest extends BaseTest { Map<String, Object> buildingData = new HashMap<String, Object>(); buildingData.put("Id", "1"); - ExpandSelectTreeNode node2 = Mockito.mock(ExpandSelectTreeNode.class); - Map<String, ExpandSelectTreeNode> links = new HashMap<String, ExpandSelectTreeNode>(); - links.put("nb_Rooms", node2); - ExpandSelectTreeNode node1 = Mockito.mock(ExpandSelectTreeNode.class); - Mockito.when(node1.getLinks()).thenReturn(links); + ExpandSelectTreeNode node1 = createBuildingNode(); - class FeedCallback implements OnWriteFeedContent { - @Override - public WriteFeedCallbackResult retrieveFeedResult(final WriteFeedCallbackContext context) - throws ODataApplicationException { - WriteFeedCallbackResult result = new WriteFeedCallbackResult(); - result.setFeedData(null); - result.setInlineProperties(DEFAULT_PROPERTIES); - return result; - } - } - FeedCallback callback = new FeedCallback(); Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); - callbacks.put("nb_Rooms", callback); + callbacks.put("nb_Rooms", new NullFeedCallback()); final ODataResponse response = new JsonEntityProvider().writeEntry(entitySet, buildingData, @@ -995,16 +1010,50 @@ public class JsonEntryEntityProducerTest extends BaseTest { assertNotNull(response.getEntity()); assertNull("EntitypProvider must not set content header", response.getContentHeader()); + Map<String, Object> buildingEntry = checkRoom(response); + + assertTrue(buildingEntry.containsKey("nb_Rooms")); + List<Object> roomsFeed = (List<Object>) buildingEntry.get("nb_Rooms"); + assertNotNull(roomsFeed); + assertEquals(0, roomsFeed.size()); + } + + @SuppressWarnings("unchecked") + private Map<String, Object> checkRoom(final ODataResponse response) { Map<String, Object> buildingEntry = new Gson().fromJson(new InputStreamReader((InputStream) response.getEntity()), Map.class); // remove d wrapper buildingEntry = (Map<String, Object>) buildingEntry.get("d"); assertEquals(2, buildingEntry.size()); + return buildingEntry; + } + + @SuppressWarnings("unchecked") + @Test + public void entryWithExpandedFeedButNullDataClientUseCaseOmitInline() throws Exception { + final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Buildings"); + Map<String, Object> buildingData = new HashMap<String, Object>(); + buildingData.put("Id", "1"); + + ExpandSelectTreeNode node1 = createBuildingNode(); + + Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); + callbacks.put("nb_Rooms", new NullFeedCallback()); + + final ODataResponse response = + new JsonEntityProvider().writeEntry(entitySet, buildingData, + EntityProviderWriteProperties.serviceRoot(URI.create(BASE_URI)).expandSelectTree(node1) + .omitInlineForNullData(true).callbacks(callbacks).responsePayload(false).build()); + assertNotNull(response); + assertNotNull(response.getEntity()); + assertNull("EntitypProvider must not set content header", response.getContentHeader()); + + Map<String, Object> buildingEntry = checkRoom(response); assertTrue(buildingEntry.containsKey("nb_Rooms")); - List<Object> roomsFeed = (List<Object>) buildingEntry.get("nb_Rooms"); - assertNotNull(roomsFeed); - assertEquals(0, roomsFeed.size()); + assertNotNull(buildingEntry.get("nb_Rooms")); + assertTrue(((Map<String, Object>) buildingEntry.get("nb_Rooms")).size() == 1); + assertTrue(((Map<String, Object>) buildingEntry.get("nb_Rooms")).containsKey("__deferred")); } @SuppressWarnings("unchecked") @@ -1014,26 +1063,12 @@ public class JsonEntryEntityProducerTest extends BaseTest { Map<String, Object> buildingData = new HashMap<String, Object>(); buildingData.put("Id", "1"); - ExpandSelectTreeNode node2 = Mockito.mock(ExpandSelectTreeNode.class); - Map<String, ExpandSelectTreeNode> links = new HashMap<String, ExpandSelectTreeNode>(); - links.put("nb_Rooms", node2); - ExpandSelectTreeNode node1 = Mockito.mock(ExpandSelectTreeNode.class); - Mockito.when(node1.getLinks()).thenReturn(links); + ExpandSelectTreeNode node1 = createBuildingNode(); - class FeedCallback implements OnWriteFeedContent { - @Override - public WriteFeedCallbackResult retrieveFeedResult(final WriteFeedCallbackContext context) - throws ODataApplicationException { - WriteFeedCallbackResult result = new WriteFeedCallbackResult(); - result.setFeedData(new ArrayList<Map<String, Object>>()); - result.setInlineProperties(DEFAULT_PROPERTIES); - return result; - } - } - FeedCallback callback = new FeedCallback(); + Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); - callbacks.put("nb_Rooms", callback); - + callbacks.put("nb_Rooms", new EmptyFeedCallback()); + final ODataResponse response = new JsonEntityProvider().writeEntry(entitySet, buildingData, EntityProviderWriteProperties.serviceRoot(URI.create(BASE_URI)).expandSelectTree(node1) @@ -1042,44 +1077,72 @@ public class JsonEntryEntityProducerTest extends BaseTest { assertNotNull(response.getEntity()); assertNull("EntitypProvider must not set content header", response.getContentHeader()); - Map<String, Object> buildingEntry = - new Gson().fromJson(new InputStreamReader((InputStream) response.getEntity()), Map.class); - // remove d wrapper - buildingEntry = (Map<String, Object>) buildingEntry.get("d"); - assertEquals(2, buildingEntry.size()); + Map<String, Object> buildingEntry = checkRoom(response); assertTrue(buildingEntry.containsKey("nb_Rooms")); Map<String, Object> roomsFeed = (Map<String, Object>) buildingEntry.get("nb_Rooms"); assertNotNull(roomsFeed); List<Object> roomsFeedEntries = (List<Object>) roomsFeed.get("results"); assertEquals(0, roomsFeedEntries.size()); } + private ExpandSelectTreeNode createBuildingNode() { + ExpandSelectTreeNode node2 = Mockito.mock(ExpandSelectTreeNode.class); + Map<String, ExpandSelectTreeNode> links = new HashMap<String, ExpandSelectTreeNode>(); + links.put("nb_Rooms", node2); + ExpandSelectTreeNode node1 = Mockito.mock(ExpandSelectTreeNode.class); + Mockito.when(node1.getLinks()).thenReturn(links); + return node1; + } + + class EmptyFeedCallback implements OnWriteFeedContent { + @Override + public WriteFeedCallbackResult retrieveFeedResult(final WriteFeedCallbackContext context) + throws ODataApplicationException { + WriteFeedCallbackResult result = new WriteFeedCallbackResult(); + result.setFeedData(new ArrayList<Map<String, Object>>()); + result.setInlineProperties(DEFAULT_PROPERTIES); + return result; + } + } @SuppressWarnings("unchecked") @Test + public void entryWithExpandedFeedButEmptyDataOmitInline() throws Exception { + final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Buildings"); + Map<String, Object> buildingData = new HashMap<String, Object>(); + buildingData.put("Id", "1"); + + ExpandSelectTreeNode node1 = createBuildingNode(); + + Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); + callbacks.put("nb_Rooms", new EmptyFeedCallback()); + + final ODataResponse response = + new JsonEntityProvider().writeEntry(entitySet, buildingData, + EntityProviderWriteProperties.serviceRoot(URI.create(BASE_URI)).expandSelectTree(node1) + .omitInlineForNullData(true).callbacks(callbacks).build()); + assertNotNull(response); + assertNotNull(response.getEntity()); + assertNull("EntitypProvider must not set content header", response.getContentHeader()); + + Map<String, Object> buildingEntry = checkRoom(response); + assertTrue(buildingEntry.containsKey("nb_Rooms")); + assertNotNull(buildingEntry.get("nb_Rooms")); + assertTrue(((Map<String, Object>) buildingEntry.get("nb_Rooms")).size() == 1); + assertTrue(((Map<String, Object>) buildingEntry.get("nb_Rooms")).containsKey("__deferred")); + } + + @SuppressWarnings("unchecked") + @Test public void entryWithExpandedFeedButEmptyDataClientCase() throws Exception { final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Buildings"); Map<String, Object> buildingData = new HashMap<String, Object>(); buildingData.put("Id", "1"); - ExpandSelectTreeNode node2 = Mockito.mock(ExpandSelectTreeNode.class); - Map<String, ExpandSelectTreeNode> links = new HashMap<String, ExpandSelectTreeNode>(); - links.put("nb_Rooms", node2); - ExpandSelectTreeNode node1 = Mockito.mock(ExpandSelectTreeNode.class); - Mockito.when(node1.getLinks()).thenReturn(links); + ExpandSelectTreeNode node1 = createBuildingNode(); - class FeedCallback implements OnWriteFeedContent { - @Override - public WriteFeedCallbackResult retrieveFeedResult(final WriteFeedCallbackContext context) - throws ODataApplicationException { - WriteFeedCallbackResult result = new WriteFeedCallbackResult(); - result.setFeedData(new ArrayList<Map<String, Object>>()); - result.setInlineProperties(DEFAULT_PROPERTIES); - return result; - } - } - FeedCallback callback = new FeedCallback(); + Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); - callbacks.put("nb_Rooms", callback); + callbacks.put("nb_Rooms", new EmptyFeedCallback()); final ODataResponse response = new JsonEntityProvider().writeEntry(entitySet, buildingData, @@ -1089,17 +1152,41 @@ public class JsonEntryEntityProducerTest extends BaseTest { assertNotNull(response.getEntity()); assertNull("EntitypProvider must not set content header", response.getContentHeader()); - Map<String, Object> buildingEntry = - new Gson().fromJson(new InputStreamReader((InputStream) response.getEntity()), Map.class); - // remove d wrapper - buildingEntry = (Map<String, Object>) buildingEntry.get("d"); - assertEquals(2, buildingEntry.size()); + Map<String, Object> buildingEntry = checkRoom(response); assertTrue(buildingEntry.containsKey("nb_Rooms")); List<Object> roomsFeed = (List<Object>) buildingEntry.get("nb_Rooms"); assertNotNull(roomsFeed); assertEquals(0, roomsFeed.size()); } + + @SuppressWarnings("unchecked") + @Test + public void entryWithExpandedFeedButEmptyDataClientCaseOmitInline() throws Exception { + final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Buildings"); + Map<String, Object> buildingData = new HashMap<String, Object>(); + buildingData.put("Id", "1"); + + ExpandSelectTreeNode node1 = createBuildingNode(); + + Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); + callbacks.put("nb_Rooms", new EmptyFeedCallback()); + + final ODataResponse response = + new JsonEntityProvider().writeEntry(entitySet, buildingData, + EntityProviderWriteProperties.serviceRoot(URI.create(BASE_URI)).expandSelectTree(node1) + .omitInlineForNullData(true).callbacks(callbacks).responsePayload(false).build()); + assertNotNull(response); + assertNotNull(response.getEntity()); + assertNull("EntitypProvider must not set content header", response.getContentHeader()); + + Map<String, Object> buildingEntry = checkRoom(response); + + assertTrue(buildingEntry.containsKey("nb_Rooms")); + assertNotNull(buildingEntry.get("nb_Rooms")); + assertTrue(((Map<String, Object>) buildingEntry.get("nb_Rooms")).size() == 1); + assertTrue(((Map<String, Object>) buildingEntry.get("nb_Rooms")).containsKey("__deferred")); + } @Test public void entryWithExpandedFeedButNoRegisteredCallback() throws Exception { @@ -1107,11 +1194,7 @@ public class JsonEntryEntityProducerTest extends BaseTest { Map<String, Object> buildingData = new HashMap<String, Object>(); buildingData.put("Id", "1"); - ExpandSelectTreeNode node2 = Mockito.mock(ExpandSelectTreeNode.class); - Map<String, ExpandSelectTreeNode> links = new HashMap<String, ExpandSelectTreeNode>(); - links.put("nb_Rooms", node2); - ExpandSelectTreeNode node1 = Mockito.mock(ExpandSelectTreeNode.class); - Mockito.when(node1.getLinks()).thenReturn(links); + ExpandSelectTreeNode node1 = createBuildingNode(); final ODataResponse response = new JsonEntityProvider().writeEntry(entitySet, buildingData, EntityProviderWriteProperties.serviceRoot(URI.create(BASE_URI)).expandSelectTree(node1).build()); @@ -1128,11 +1211,7 @@ public class JsonEntryEntityProducerTest extends BaseTest { Map<String, Object> buildingData = new HashMap<String, Object>(); buildingData.put("Id", "1"); - ExpandSelectTreeNode node2 = Mockito.mock(ExpandSelectTreeNode.class); - Map<String, ExpandSelectTreeNode> links = new HashMap<String, ExpandSelectTreeNode>(); - links.put("nb_Rooms", node2); - ExpandSelectTreeNode node1 = Mockito.mock(ExpandSelectTreeNode.class); - Mockito.when(node1.getLinks()).thenReturn(links); + ExpandSelectTreeNode node1 = createBuildingNode(); Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); callbacks.put("nb_Rooms", null); @@ -1389,11 +1468,7 @@ public class JsonEntryEntityProducerTest extends BaseTest { roomData.put("Id", "1"); roomData.put("Version", 1); - ExpandSelectTreeNode node2 = Mockito.mock(ExpandSelectTreeNode.class); - Map<String, ExpandSelectTreeNode> links = new HashMap<String, ExpandSelectTreeNode>(); - links.put("nr_Building", node2); - ExpandSelectTreeNode node1 = Mockito.mock(ExpandSelectTreeNode.class); - Mockito.when(node1.getLinks()).thenReturn(links); + ExpandSelectTreeNode node1 = createRoomNode(); class EntryCallback implements OnWriteEntryContent { @Override @@ -1422,10 +1497,10 @@ public class JsonEntryEntityProducerTest extends BaseTest { final String json = StringHelper.inputStreamToString((InputStream) response.getEntity()); assertNotNull(json); - assertEquals("{\"d\":{\"__metadata\":{\"id\":\""+BASE_URI+"Rooms('1')\",\"uri\":\""+BASE_URI+"Rooms('1')\"," + assertEquals("{\"d\":{\"__metadata\":{\"id\":\"" + BASE_URI + "Rooms('1')\",\"uri\":\"" + BASE_URI + "Rooms('1')\"," + "\"type\":\"RefScenario.Room\",\"etag\":\"W/\\\"1\\\"\"},\"Id\":\"1\",\"Version\":1," - + "\"nr_Building\":{\"__metadata\":{\"id\":\""+BASE_URI+"Buildings('1')\"," - + "\"uri\":\""+BASE_URI+"Buildings('1')\",\"type\":\"RefScenario.Building\"}," + + "\"nr_Building\":{\"__metadata\":{\"id\":\"" + BASE_URI + "Buildings('1')\"," + + "\"uri\":\"" + BASE_URI + "Buildings('1')\",\"type\":\"RefScenario.Building\"}," + "\"Id\":\"1\",\"Name\":\"Building1\"}}}", json); } } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/4e1667fc/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/XmlExpandProducerTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/XmlExpandProducerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/XmlExpandProducerTest.java index faab701..6504f2e 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/XmlExpandProducerTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/XmlExpandProducerTest.java @@ -86,6 +86,54 @@ public class XmlExpandProducerTest extends AbstractProviderTest { } @Test + public void expandSelectedTeamNullOmitInline() throws Exception { + ExpandSelectTreeNode selectTree = getSelectExpandTree("Employees('1')", "ne_Team", "ne_Team"); + + HashMap<String, ODataCallback> callbacksEmployee = createCallbacks("Employees"); + EntityProviderWriteProperties properties = + EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksEmployee) + .omitInlineForNullData(true).build(); + AtomEntityProvider provider = createAtomEntityProvider(); + ODataResponse response = + provider.writeEntry(MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees"), + employeeData, properties); + + String xmlString = verifyResponse(response); + verifyNavigationProperties(xmlString, F, F, T); + assertXpathExists(teamXPathString, xmlString); + assertXpathNotExists("/a:entry/m:properties", xmlString); + assertXpathNotExists(teamXPathString + "/m:inline", xmlString); + assertXpathNotExists(teamXPathString + "/m:inline/a:entry", xmlString); + } + + @Test + public void expandSelectedRoomsNullOmitInline() throws Exception { + ExpandSelectTreeNode selectTree = getSelectExpandTree("Buildings('1')", "nb_Rooms", "nb_Rooms"); + + HashMap<String, ODataCallback> callbacksEmployee = createCallbacks("Buildings"); + EntityProviderWriteProperties properties = + EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksEmployee) + .omitInlineForNullData(true).build(); + AtomEntityProvider provider = createAtomEntityProvider(); + ODataResponse response = + provider.writeEntry(MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Buildings"), + buildingData, properties); + + String xmlString = verifyResponse(response); + assertXpathNotExists("/a:entry/m:properties", xmlString); + assertXpathExists(buildingXPathString, xmlString); + assertXpathNotExists(buildingXPathString + "/m:inline", xmlString); + + assertXpathNotExists(buildingXPathString + "/m:inline/a:feed", xmlString); + assertXpathNotExists(buildingXPathString + "/m:inline/a:feed/a:id", xmlString); + assertXpathNotExists(buildingXPathString + "/m:inline/a:feed/a:title", xmlString); + assertXpathNotExists(buildingXPathString + "/m:inline/a:feed/a:updated", xmlString); + assertXpathNotExists(buildingXPathString + "/m:inline/a:feed/a:author", xmlString); + assertXpathNotExists(buildingXPathString + "/m:inline/a:feed/a:author/a:name", xmlString); + assertXpathNotExists(buildingXPathString + "/m:inline/a:feed/a:link[@href=\"Buildings('1')/nb_Rooms\"]", xmlString); + assertXpathNotExists(buildingXPathString + "/m:inline/a:feed/a:entry", xmlString); + } + @Test public void expandSelectedEmployees() throws Exception { ExpandSelectTreeNode selectTree = getSelectExpandTree("Rooms('1')", "nr_Employees", "nr_Employees"); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/4e1667fc/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/InvalidDataInScenarioTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/InvalidDataInScenarioTest.java b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/InvalidDataInScenarioTest.java index 10be915..a796b39 100644 --- a/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/InvalidDataInScenarioTest.java +++ b/odata2-lib/odata-fit/src/test/java/org/apache/olingo/odata2/fit/ref/InvalidDataInScenarioTest.java @@ -73,7 +73,7 @@ public class InvalidDataInScenarioTest extends AbstractRefTest { @Test public void nullKeyInEntryData() throws Exception { HttpResponse response = callUri("Employees('1')", HttpStatusCodes.INTERNAL_SERVER_ERROR); - System.out.println(getBody(response)); + assertTrue(getBody(response).contains("null value")); response = callUri("Employees('1')?$format=json", HttpStatusCodes.INTERNAL_SERVER_ERROR); assertTrue(getBody(response).contains("null value")); }