You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2016/12/01 13:05:08 UTC

olingo-odata2 git commit: [OLINGO-1055] ODatav2: Omit empty inline tags for null data

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 <ch...@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 <ar...@sap.com>
Authored: Thu Dec 1 16:21:18 2016 +0530
Committer: Christian Amend <ch...@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"));
   }