Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/olingo-odata2.git
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonLinkEntityProducer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonLinkEntityProducer.java
index 69a0c5a..9ddfddd 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonLinkEntityProducer.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonLinkEntityProducer.java
@@ -47,10 +47,14 @@
     final String uri = (properties.getServiceRoot() == null ? "" : properties.getServiceRoot().toASCIIString())
         + AtomEntryEntityProducer.createSelfLink(entityInfo, data, null);
     try {
-      jsonStreamWriter.beginObject()
-          .name(FormatJson.D);
+      if (!properties.isOmitJsonWrapper()) {
+        jsonStreamWriter.beginObject()
+            .name(FormatJson.D);
+      }
       appendUri(jsonStreamWriter, uri);
-      jsonStreamWriter.endObject();
+      if (!properties.isOmitJsonWrapper()) {
+        jsonStreamWriter.endObject();
+      }
     } catch (final IOException e) {
       throw new EntityProviderException(EntityProviderException.EXCEPTION_OCCURRED.addContent(e.getClass()
           .getSimpleName()), e);
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonLinksEntityProducer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonLinksEntityProducer.java
index a3a5e79..858456c 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonLinksEntityProducer.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonLinksEntityProducer.java
@@ -47,8 +47,10 @@
     JsonStreamWriter jsonStreamWriter = new JsonStreamWriter(writer);
 
     try {
-      jsonStreamWriter.beginObject()
-          .name(FormatJson.D);
+      if (!properties.isOmitJsonWrapper()) {
+        jsonStreamWriter.beginObject()
+            .name(FormatJson.D);
+      }
 
       if (properties.getInlineCountType() == InlineCount.ALLPAGES) {
         final int inlineCount = properties.getInlineCount() == null ? 0 : properties.getInlineCount();
@@ -75,8 +77,9 @@
       if (properties.getInlineCountType() == InlineCount.ALLPAGES) {
         jsonStreamWriter.endObject();
       }
-
-      jsonStreamWriter.endObject();
+      if (!properties.isOmitJsonWrapper()) {
+        jsonStreamWriter.endObject();
+      }
     } catch (final IOException e) {
       throw new EntityProviderException(EntityProviderException.EXCEPTION_OCCURRED.addContent(e.getClass()
           .getSimpleName()), e);
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/JsonLinkEntityProducerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/JsonLinkEntityProducerTest.java
index b23ac7b..91785b5 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/JsonLinkEntityProducerTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/JsonLinkEntityProducerTest.java
@@ -44,6 +44,23 @@
       EntityProviderWriteProperties.serviceRoot(URI.create(BASE_URI)).build();
 
   @Test
+  public void omitJsonWrapperOnLink() throws Exception {
+    final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees");
+    Map<String, Object> employeeData = new HashMap<String, Object>();
+    employeeData.put("EmployeeId", "1");
+
+    EntityProviderWriteProperties properties =
+        EntityProviderWriteProperties.fromProperties(DEFAULT_PROPERTIES).omitJsonWrapper(true).build();
+    final ODataResponse response = new JsonEntityProvider().writeLink(entitySet, employeeData, properties);
+    assertNotNull(response);
+    assertNotNull(response.getEntity());
+
+    final String json = StringHelper.inputStreamToString((InputStream) response.getEntity());
+    assertNotNull(json);
+    assertEquals("{\"uri\":\"" + BASE_URI + "Employees('1')\"}", json);
+  }
+
+  @Test
   public void serializeEmployeeLink() throws Exception {
     final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees");
     Map<String, Object> employeeData = new HashMap<String, Object>();
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/JsonLinksEntityProducerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/JsonLinksEntityProducerTest.java
index bef9ecb..2365d29 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/JsonLinksEntityProducerTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/JsonLinksEntityProducerTest.java
@@ -47,6 +47,82 @@
       EntityProviderWriteProperties.serviceRoot(URI.create(BASE_URI)).build();
 
   @Test
+  public void omitJsonWrapperSingleLink() throws Exception {
+    final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees");
+    Map<String, Object> employeeData = new HashMap<String, Object>();
+    employeeData.put("EmployeeId", "1");
+    ArrayList<Map<String, Object>> employeesData = new ArrayList<Map<String, Object>>();
+    employeesData.add(employeeData);
+
+    EntityProviderWriteProperties properties =
+        EntityProviderWriteProperties.fromProperties(DEFAULT_PROPERTIES).omitJsonWrapper(true).build();
+    final ODataResponse response = new JsonEntityProvider().writeLinks(entitySet, employeesData, properties);
+    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("[{\"uri\":\"" + BASE_URI + "Employees('1')\"}]", json);
+  }
+
+  @Test
+  public void omitJsonWrapperSingleLinks() throws Exception {
+    final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees");
+    Map<String, Object> employee1 = new HashMap<String, Object>();
+    employee1.put("EmployeeId", "1");
+    Map<String, Object> employee2 = new HashMap<String, Object>();
+    employee2.put("EmployeeId", "2");
+    Map<String, Object> employee3 = new HashMap<String, Object>();
+    employee3.put("EmployeeId", "3");
+    ArrayList<Map<String, Object>> employeesData = new ArrayList<Map<String, Object>>();
+    employeesData.add(employee1);
+    employeesData.add(employee2);
+    employeesData.add(employee3);
+
+    EntityProviderWriteProperties properties =
+        EntityProviderWriteProperties.fromProperties(DEFAULT_PROPERTIES).omitJsonWrapper(true).build();
+    final ODataResponse response = new JsonEntityProvider().writeLinks(entitySet, employeesData, properties);
+    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("[{\"uri\":\"" + BASE_URI + "Employees('1')\"},"
+        + "{\"uri\":\"" + BASE_URI + "Employees('2')\"},"
+        + "{\"uri\":\"" + BASE_URI + "Employees('3')\"}]",
+        json);
+  }
+
+  @Test
+  public void serializeLinksAndInlineCountWithOmitJsonWrapper() throws Exception {
+    final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees");
+    Map<String, Object> employee1 = new HashMap<String, Object>();
+    employee1.put("EmployeeId", "1");
+    Map<String, Object> employee2 = new HashMap<String, Object>();
+    employee2.put("EmployeeId", "2");
+    ArrayList<Map<String, Object>> employeesData = new ArrayList<Map<String, Object>>();
+    employeesData.add(employee1);
+    employeesData.add(employee2);
+
+    EntityProviderWriteProperties properties =
+        EntityProviderWriteProperties.fromProperties(DEFAULT_PROPERTIES).omitJsonWrapper(true).inlineCountType(
+            InlineCount.ALLPAGES).inlineCount(42).build();
+    final ODataResponse response = new JsonEntityProvider().writeLinks(entitySet, employeesData, properties);
+    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("{\"__count\":\"42\",\"results\":["
+        + "{\"uri\":\"" + BASE_URI + "Employees('1')\"},"
+        + "{\"uri\":\"" + BASE_URI + "Employees('2')\"}]}",
+        json);
+  }
+
+  @Test
   public void serializeEmployeeLink() throws Exception {
     final EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees");
     Map<String, Object> employeeData = new HashMap<String, Object>();