This is an automated email from the ASF dual-hosted git repository. archanarai pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/olingo-odata2.git
The following commit(s) were added to refs/heads/master by this push: new 156e167 [OLINGO-1365]Child entities not serialized if parent has no property 156e167 is described below commit 156e167c9de4238dee75f8c82995463aa5ee84f3 Author: Archana Rai <archana....@sap.com> AuthorDate: Wed Jun 12 10:50:58 2019 +0530 [OLINGO-1365]Child entities not serialized if parent has no property --- .../ep/serializer/JsonEntryEntitySerializer.java | 12 +++--- .../serializer/JsonEntryEntitySerializerTest.java | 45 ++++++++++++++++++++++ 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/ep/serializer/JsonEntryEntitySerializer.java b/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/ep/serializer/JsonEntryEntitySerializer.java index b727538..fec92c8 100644 --- a/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/ep/serializer/JsonEntryEntitySerializer.java +++ b/odata2-lib/odata-client-core/src/main/java/org/apache/olingo/odata2/client/core/ep/serializer/JsonEntryEntitySerializer.java @@ -92,7 +92,7 @@ public class JsonEntryEntitySerializer { } writeProperties(entityInfo, data.getProperties(), type, containsMetadata); - writeNavigationProperties(writer, entityInfo, data.getNavigations(), type); + writeNavigationProperties(writer, entityInfo, data.getNavigations(), type, data.getProperties().isEmpty()); jsonStreamWriter.endObject(); writer.flush(); @@ -107,7 +107,7 @@ public class JsonEntryEntitySerializer { private void writeNavigationProperties(final Writer writer, final EntityInfoAggregator entityInfo, final Map<String, Object> data, - final EdmEntityType type) throws EdmException, EntityProviderException, IOException { + final EdmEntityType type, boolean emptyData) throws EdmException, EntityProviderException, IOException { for (final String navigationPropertyName : type.getNavigationPropertyNames()) { if (data.containsKey(navigationPropertyName)) { if (data.get(navigationPropertyName) == null) { @@ -115,7 +115,10 @@ public class JsonEntryEntitySerializer { } if (data.get(navigationPropertyName) instanceof Entity || data.get(navigationPropertyName) instanceof EntityCollection) { - jsonStreamWriter.separator(); + if( !emptyData){ + jsonStreamWriter.separator(); + } + emptyData=false; jsonStreamWriter.name(navigationPropertyName); writeExpandedNavigationProperty(writer, entityInfo, data, type, navigationPropertyName); } else if (data.get(navigationPropertyName) instanceof Map<?,?>){ @@ -157,8 +160,7 @@ public class JsonEntryEntitySerializer { if(inlineData == null){ throw new EntityProviderException(EntityProviderException.NULL_VALUE); } - if (inlineData != null && inlineData.getProperties() != null && - !inlineData.getProperties().isEmpty()) { + if (inlineData != null && inlineData.getProperties() != null) { final EntitySerializerProperties inlineProperties = inlineData.getWriteProperties() == null ? EntitySerializerProperties. serviceRoot(properties.getServiceRoot()).build() : inlineData.getWriteProperties(); diff --git a/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/ep/serializer/JsonEntryEntitySerializerTest.java b/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/ep/serializer/JsonEntryEntitySerializerTest.java index e3e06f0..69524a4 100644 --- a/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/ep/serializer/JsonEntryEntitySerializerTest.java +++ b/odata2-lib/odata-client-core/src/test/java/org/apache/olingo/odata2/client/core/ep/serializer/JsonEntryEntitySerializerTest.java @@ -739,6 +739,51 @@ public class JsonEntryEntitySerializerTest extends BaseTest { assertNotNull(json); assertEquals("{\"Id\":\"1\",\"Version\":1,\"nr_Building\":{\"Id\":\"1\",\"Name\":\"Building1\"}}", json); } + + @Test + public void unbalancedPropertyEntryWithMultipleInlineEntry() throws Exception { + final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"); + Entity roomData = new Entity(); + roomData.addProperty("Id", "1"); + roomData.addProperty("Version", 1); + + Entity nrBuildingData = new Entity(); + EntityCollection roomsCollection = new EntityCollection(); + Entity nbRoomData = new Entity(); + nbRoomData.addProperty("Id", "1"); + nbRoomData.addProperty("Version", 1); + roomsCollection.addEntity(nbRoomData); + nrBuildingData.addNavigation("nb_Rooms", roomsCollection); + roomData.addNavigation("nr_Building", nrBuildingData); + + EntityCollection nrEmployeeCollection = new EntityCollection(); + Entity employeeData = new Entity(); + Entity managerData = new Entity(); + managerData.addProperty("EmployeeId", "1"); + managerData.addProperty("ImageUrl", "hhtp://url"); + employeeData.addNavigation("ne_Manager", managerData); + Entity neRoomData = new Entity(); + neRoomData.addProperty("Id", "1"); + neRoomData.addProperty("Version", 1); + employeeData.addNavigation("ne_Room", neRoomData); + nrEmployeeCollection.addEntity(employeeData); + nrEmployeeCollection.addEntity(managerData); + roomData.addNavigation("nr_Employees", nrEmployeeCollection); + + final ODataResponse response = + new JsonSerializerDeserializer().writeEntry(entitySet, roomData); + assertNotNull(response); + assertNotNull(response.getEntity()); + assertNull("EntitypProvider must not set content header", response.getContentHeader()); + + final String json = StringHelper.inputStreamToString((InputStream) response.getEntity()); + assertNotNull(json); + assertEquals("{\"Id\":\"1\",\"Version\":1,\"nr_Employees\":[{" + + "\"ne_Manager\":{\"EmployeeId\":\"1\"},\"ne_Room\":{\"Id\":\"1\",\"Version\":1}},"+ + "{\"EmployeeId\":\"1\",\"ImageUrl\":\"hhtp://url\"}],"+ + "\"nr_Building\":{\"nb_Rooms\":[{\"Id\":\"1\",\"Version\":1}]}}", json); + } + @Test public void entryWithEmptyInlineEntry() throws Exception { final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms");