[OLINGO-1365]Child entities not serialized if parent has no property
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 @@
}
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 @@
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 @@
}
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 @@
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 @@
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");