[OLINGO-659] support for OData-EntityID header, more clean-up

Change-Id: I168a6efac6fc9ad85865f71dd534fd850d8e777e

Signed-off-by: Christian Amend <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/abf5bf79
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/abf5bf79
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/abf5bf79

Branch: refs/heads/olingo712
Commit: abf5bf79aa865c6dbcd5e0af8b521a7ae6341af2
Parents: 2a84155
Author: Klaus Straubinger <[email protected]>
Authored: Fri Jun 26 15:34:23 2015 +0200
Committer: Christian Amend <[email protected]>
Committed: Fri Jun 26 16:38:46 2015 +0200

----------------------------------------------------------------------
 .../fit/tecsvc/client/ActionImportITCase.java   | 20 ++++
 .../BasicHttpExceptionHandlingITCase.java       |  4 +-
 .../olingo/fit/tecsvc/client/BasicITCase.java   | 14 +--
 .../fit/tecsvc/client/BatchClientITCase.java    | 96 ++++++++++----------
 .../tecsvc/client/EdmEnabledClientITCase.java   | 63 -------------
 .../fit/tecsvc/client/ExpandSelectITCase.java   | 12 +++
 .../fit/tecsvc/http/BasicBatchITCase.java       | 15 ++-
 .../olingo/fit/tecsvc/http/BasicHttpITCase.java | 89 +++++++-----------
 .../fit/tecsvc/http/EntityReferenceITCase.java  | 54 ++++-------
 .../olingo/fit/tecsvc/http/PingITCase.java      | 12 +--
 .../olingo/fit/v4/EntityRetrieveTestITCase.java |  3 +-
 .../api/domain/ClientEntitySetIterator.java     | 14 +--
 .../olingo/client/core/ODataClientImpl.java     | 12 +--
 .../invoke/AbstractODataInvokeRequest.java      |  7 +-
 .../ClientODataDeserializerImpl.java            | 11 ++-
 .../apache/olingo/client/core/AbstractTest.java |  5 +-
 .../olingo/client/core/v4/EntityTest.java       |  3 +-
 .../olingo/commons/api/format/AcceptType.java   | 26 ++----
 .../olingo/commons/api/format/ContentType.java  | 85 ++++-------------
 .../olingo/commons/api/format/TypeUtil.java     | 36 ++++++--
 .../olingo/commons/api/http/HttpHeader.java     | 20 ++--
 .../commons/api/format/ContentTypeTest.java     |  1 -
 .../processor/TechnicalActionProcessor.java     |  9 +-
 .../processor/TechnicalEntityProcessor.java     |  6 +-
 .../tecsvc/processor/TechnicalProcessor.java    |  4 +-
 25 files changed, 259 insertions(+), 362 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/ActionImportITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/ActionImportITCase.java 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/ActionImportITCase.java
index 22aea29..2a05021 100644
--- 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/ActionImportITCase.java
+++ 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/ActionImportITCase.java
@@ -45,6 +45,7 @@ import org.apache.olingo.client.api.domain.ClientValue;
 import org.apache.olingo.client.core.ODataClientFactory;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
 import org.apache.olingo.commons.api.format.ContentType;
+import org.apache.olingo.commons.api.http.HttpHeader;
 import org.apache.olingo.commons.api.http.HttpStatusCode;
 import org.apache.olingo.fit.AbstractBaseTestITCase;
 import org.apache.olingo.fit.tecsvc.TecSvcConst;
@@ -304,6 +305,25 @@ public class ActionImportITCase extends 
AbstractBaseTestITCase {
         
getClient().getInvokeRequestFactory().getActionInvokeRequest(actionURI, 
ClientEntity.class, parameters)
             .execute();
     assertEquals(HttpStatusCode.CREATED.getStatusCode(), 
response.getStatusCode());
+    assertEquals(TecSvcConst.BASE_URI + "/ESAllPrim(1)", 
response.getHeader(HttpHeader.LOCATION).iterator().next());
+  }
+
+  @Test
+  public void entityActionETAllPrimNoContent() throws Exception {
+    final URI actionURI = getClient().newURIBuilder(TecSvcConst.BASE_URI)
+        .appendActionCallSegment("AIRTESAllPrimParam").build();
+    final Map<String, ClientValue> parameters = Collections.singletonMap(
+        "ParameterDate",
+        (ClientValue) 
getClient().getObjectFactory().newPrimitiveValueBuilder().buildString("2000-02-29"));
+    ODataInvokeRequest<ClientEntity> request = 
getClient().getInvokeRequestFactory()
+        .getActionInvokeRequest(actionURI, ClientEntity.class, parameters);
+    request.setPrefer(getClient().newPreferences().returnMinimal());
+    final ODataInvokeResponse<ClientEntity> response = request.execute();
+    assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), 
response.getStatusCode());
+    assertEquals("return=minimal", 
response.getHeader(HttpHeader.PREFERENCE_APPLIED).iterator().next());
+    final String location = TecSvcConst.BASE_URI + "/ESAllPrim(1)";
+    assertEquals(location, 
response.getHeader(HttpHeader.LOCATION).iterator().next());
+    assertEquals(location, 
response.getHeader(HttpHeader.ODATA_ENTITY_ID).iterator().next());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicHttpExceptionHandlingITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicHttpExceptionHandlingITCase.java
 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicHttpExceptionHandlingITCase.java
index 2166235..c0b1c69 100644
--- 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicHttpExceptionHandlingITCase.java
+++ 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicHttpExceptionHandlingITCase.java
@@ -25,6 +25,7 @@ import java.net.URL;
 
 import org.apache.olingo.client.api.ODataClient;
 import org.apache.olingo.commons.api.http.HttpHeader;
+import org.apache.olingo.commons.api.http.HttpStatusCode;
 import org.apache.olingo.fit.AbstractBaseTestITCase;
 import org.apache.olingo.fit.tecsvc.TecSvcConst;
 import org.junit.Test;
@@ -44,8 +45,7 @@ public class BasicHttpExceptionHandlingITCase extends 
AbstractBaseTestITCase {
     connection.setRequestProperty(HttpHeader.X_HTTP_METHOD_OVERRIDE, 
"differentValue");
     connection.connect();
 
-    int code = connection.getResponseCode();
-    assertEquals(400, code);
+    assertEquals(HttpStatusCode.BAD_REQUEST.getStatusCode(), 
connection.getResponseCode());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
index 3466d46..2efba8a 100644
--- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
@@ -84,18 +84,18 @@ import org.junit.Test;
 
 public class BasicITCase extends AbstractBaseTestITCase {
   
-  private static final String CONTENT_TYPE_JSON_IEEE754_COMPATIBLE = 
"application/json;odata.metadata=minimal;" 
-                                                                   + 
"IEEE754Compatible=true";
+  private static final String CONTENT_TYPE_JSON_IEEE754_COMPATIBLE =
+      ContentType.create(ContentType.JSON, 
ContentType.PARAMETER_IEEE754_COMPATIBLE, "true").toContentTypeString();
   private static final String SERVICE_NAMESPACE = "olingo.odata.test1";
   private static final String ET_ALL_PRIM_NAME = "ETAllPrim";
   private static final FullQualifiedName ET_ALL_PRIM = new 
FullQualifiedName(SERVICE_NAMESPACE, ET_ALL_PRIM_NAME);
-  
+
   private static final String PROPERTY_INT16 = "PropertyInt16";
   private static final String PROPERTY_INT64 = "PropertyInt64";
   private static final String PROPERTY_DECIMAL = "PropertyDecimal";
   private static final String PROPERTY_COMP_ALL_PRIM = "PropertyCompAllPrim";
   private static final String NAV_PROPERTY_ET_TWO_PRIM_ONE = 
"NavPropertyETTwoPrimOne";
-  
+
   private static final String SERVICE_URI = TecSvcConst.BASE_URI;
   private static final String ES_ALL_PRIM = "ESAllPrim";
   private static final String ES_TWO_PRIM = "ESTwoPrim";
@@ -435,7 +435,9 @@ public class BasicITCase extends AbstractBaseTestITCase {
     final ODataEntityCreateResponse<ClientEntity> response = request.execute();
     assertEquals(HttpStatusCode.NO_CONTENT.getStatusCode(), 
response.getStatusCode());
     assertEquals("return=minimal", 
response.getHeader(HeaderName.preferenceApplied).iterator().next());
-    assertEquals(SERVICE_URI + "/ESTwoPrim(1)", 
response.getHeader(HttpHeader.LOCATION).iterator().next());
+    final String location = SERVICE_URI + "/ESTwoPrim(1)";
+    assertEquals(location, 
response.getHeader(HttpHeader.LOCATION).iterator().next());
+    assertEquals(location, 
response.getHeader(HttpHeader.ODATA_ENTITY_ID).iterator().next());
   }
 
   @Test
@@ -1291,7 +1293,7 @@ public class BasicITCase extends AbstractBaseTestITCase {
     
     assertEquals(BigDecimal.valueOf(34), 
response.getBody().getPrimitiveValue().toValue());
   }
-  
+
   @Override
   protected ODataClient getClient() {
     ODataClient odata = ODataClientFactory.getClient();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java
index 0039db6..3ab94da 100644
--- 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java
+++ 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BatchClientITCase.java
@@ -48,6 +48,7 @@ import 
org.apache.olingo.client.api.domain.ClientObjectFactory;
 import org.apache.olingo.client.api.http.HttpClientException;
 import org.apache.olingo.client.api.uri.URIBuilder;
 import 
org.apache.olingo.client.core.communication.request.batch.ODataChangesetResponseItem;
+import org.apache.olingo.commons.api.ODataPreferenceNames;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.format.ContentType;
@@ -160,14 +161,14 @@ public class BatchClientITCase extends AbstractTestITCase 
{
     ODataBatchResponseItem item = iter.next();
     assertFalse(item.isChangeset());
 
-    ODataResponse oDataResonse = item.next();
-    assertNotNull(oDataResonse);
-    assertEquals(HttpStatusCode.OK.getStatusCode(), 
oDataResonse.getStatusCode());
-    assertEquals(1, oDataResonse.getHeader("OData-Version").size());
-    assertEquals("4.0", oDataResonse.getHeader("OData-Version").toArray()[0]);
-    assertEquals(1, oDataResonse.getHeader("Content-Length").size());
-    assertEquals("605", oDataResonse.getHeader("Content-Length").toArray()[0]);
-    assertEquals("application/json;odata.metadata=minimal", 
oDataResonse.getContentType());
+    ODataResponse oDataResponse = item.next();
+    assertNotNull(oDataResponse);
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
oDataResponse.getStatusCode());
+    assertEquals(1, oDataResponse.getHeader("OData-Version").size());
+    assertEquals("4.0", oDataResponse.getHeader("OData-Version").toArray()[0]);
+    assertEquals(1, oDataResponse.getHeader("Content-Length").size());
+    assertEquals("605", 
oDataResponse.getHeader("Content-Length").toArray()[0]);
+    assertEquals(ContentType.JSON.toContentTypeString(), 
oDataResponse.getContentType());
   }
 
   @Test
@@ -191,14 +192,14 @@ public class BatchClientITCase extends AbstractTestITCase 
{
     ODataBatchResponseItem item = iter.next();
     assertFalse(item.isChangeset());
 
-    ODataResponse oDataResonse = item.next();
-    assertNotNull(oDataResonse);
-    assertEquals(HttpStatusCode.OK.getStatusCode(), 
oDataResonse.getStatusCode());
-    assertEquals(1, oDataResonse.getHeader("OData-Version").size());
-    assertEquals("4.0", oDataResonse.getHeader("OData-Version").toArray()[0]);
-    assertEquals(1, oDataResonse.getHeader("Content-Length").size());
-    assertEquals("605", oDataResonse.getHeader("Content-Length").toArray()[0]);
-    assertEquals("application/json;odata.metadata=minimal", 
oDataResonse.getContentType());
+    ODataResponse oDataResponse = item.next();
+    assertNotNull(oDataResponse);
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
oDataResponse.getStatusCode());
+    assertEquals(1, oDataResponse.getHeader("OData-Version").size());
+    assertEquals("4.0", oDataResponse.getHeader("OData-Version").toArray()[0]);
+    assertEquals(1, oDataResponse.getHeader("Content-Length").size());
+    assertEquals("605", 
oDataResponse.getHeader("Content-Length").toArray()[0]);
+    assertEquals(ContentType.JSON.toContentTypeString(), 
oDataResponse.getContentType());
   }
 
   @Test
@@ -222,23 +223,23 @@ public class BatchClientITCase extends AbstractTestITCase 
{
     ODataBatchResponseItem item = iter.next();
     assertFalse(item.isChangeset());
 
-    ODataResponse oDataResonse = item.next();
-    assertNotNull(oDataResonse);
-    assertEquals(HttpStatusCode.OK.getStatusCode(), 
oDataResonse.getStatusCode());
-    assertEquals(1, oDataResonse.getHeader("OData-Version").size());
-    assertEquals("4.0", oDataResonse.getHeader("OData-Version").toArray()[0]);
-    assertEquals(1, oDataResonse.getHeader("Content-Length").size());
-    assertEquals("605", oDataResonse.getHeader("Content-Length").toArray()[0]);
-    assertEquals("application/json;odata.metadata=minimal", 
oDataResonse.getContentType());
+    ODataResponse oDataResponse = item.next();
+    assertNotNull(oDataResponse);
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
oDataResponse.getStatusCode());
+    assertEquals(1, oDataResponse.getHeader("OData-Version").size());
+    assertEquals("4.0", oDataResponse.getHeader("OData-Version").toArray()[0]);
+    assertEquals(1, oDataResponse.getHeader("Content-Length").size());
+    assertEquals("605", 
oDataResponse.getHeader("Content-Length").toArray()[0]);
+    assertEquals(ContentType.JSON.toContentTypeString(), 
oDataResponse.getContentType());
 
     // Check second get request
     assertTrue(iter.hasNext());
     item = iter.next();
     assertFalse(item.isChangeset());
 
-    oDataResonse = item.next();
-    assertNotNull(oDataResonse);
-    assertEquals(HttpStatusCode.NOT_FOUND.getStatusCode(), 
oDataResonse.getStatusCode());
+    oDataResponse = item.next();
+    assertNotNull(oDataResponse);
+    assertEquals(HttpStatusCode.NOT_FOUND.getStatusCode(), 
oDataResponse.getStatusCode());
 
     // Check if third request is available
     assertFalse(iter.hasNext());
@@ -310,7 +311,8 @@ public class BatchClientITCase extends AbstractTestITCase {
     // Fetch result
     final ODataBatchResponse response = payload.getResponse();
     assertEquals(HttpStatusCode.ACCEPTED.getStatusCode(), 
response.getStatusCode());
-    assertEquals("odata.continue-on-error", 
response.getHeader(HttpHeader.PREFERENCE_APPLIED).iterator().next());
+    assertEquals(ODataPreferenceNames.CONTINUE_ON_ERROR.toString(),
+        response.getHeader(HttpHeader.PREFERENCE_APPLIED).iterator().next());
 
     final Iterator<ODataBatchResponseItem> bodyIterator = response.getBody();
 
@@ -319,37 +321,37 @@ public class BatchClientITCase extends AbstractTestITCase 
{
     ODataBatchResponseItem item = bodyIterator.next();
     assertFalse(item.isChangeset());
 
-    ODataResponse oDataResonse = item.next();
-    assertNotNull(oDataResonse);
-    assertEquals(HttpStatusCode.OK.getStatusCode(), 
oDataResonse.getStatusCode());
-    assertEquals(1, oDataResonse.getHeader(HttpHeader.ODATA_VERSION).size());
-    assertEquals("4.0", 
oDataResonse.getHeader(HttpHeader.ODATA_VERSION).toArray()[0]);
-    assertEquals(1, oDataResonse.getHeader(HttpHeader.CONTENT_LENGTH).size());
-    assertEquals("605", 
oDataResonse.getHeader(HttpHeader.CONTENT_LENGTH).toArray()[0]);
-    assertEquals("application/json;odata.metadata=minimal", 
oDataResonse.getContentType());
+    ODataResponse oDataResponse = item.next();
+    assertNotNull(oDataResponse);
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
oDataResponse.getStatusCode());
+    assertEquals(1, oDataResponse.getHeader(HttpHeader.ODATA_VERSION).size());
+    assertEquals("4.0", 
oDataResponse.getHeader(HttpHeader.ODATA_VERSION).toArray()[0]);
+    assertEquals(1, oDataResponse.getHeader(HttpHeader.CONTENT_LENGTH).size());
+    assertEquals("605", 
oDataResponse.getHeader(HttpHeader.CONTENT_LENGTH).toArray()[0]);
+    assertEquals(ContentType.JSON.toContentTypeString(), 
oDataResponse.getContentType());
 
     // Check second get request
     assertTrue(bodyIterator.hasNext());
     item = bodyIterator.next();
     assertFalse(item.isChangeset());
 
-    oDataResonse = item.next();
-    assertNotNull(oDataResonse);
-    assertEquals(HttpStatusCode.NOT_FOUND.getStatusCode(), 
oDataResonse.getStatusCode());
+    oDataResponse = item.next();
+    assertNotNull(oDataResponse);
+    assertEquals(HttpStatusCode.NOT_FOUND.getStatusCode(), 
oDataResponse.getStatusCode());
 
     // Check if third request is available
     assertTrue(bodyIterator.hasNext());
     item = bodyIterator.next();
     assertFalse(item.isChangeset());
 
-    oDataResonse = item.next();
-    assertNotNull(oDataResonse);
-    assertEquals(HttpStatusCode.OK.getStatusCode(), 
oDataResonse.getStatusCode());
-    assertEquals(1, oDataResonse.getHeader(HttpHeader.ODATA_VERSION).size());
-    assertEquals("4.0", 
oDataResonse.getHeader(HttpHeader.ODATA_VERSION).toArray()[0]);
-    assertEquals(1, oDataResonse.getHeader(HttpHeader.CONTENT_LENGTH).size());
-    assertEquals("513", 
oDataResonse.getHeader(HttpHeader.CONTENT_LENGTH).toArray()[0]);
-    assertEquals("application/json;odata.metadata=minimal", 
oDataResonse.getContentType());
+    oDataResponse = item.next();
+    assertNotNull(oDataResponse);
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
oDataResponse.getStatusCode());
+    assertEquals(1, oDataResponse.getHeader(HttpHeader.ODATA_VERSION).size());
+    assertEquals("4.0", 
oDataResponse.getHeader(HttpHeader.ODATA_VERSION).toArray()[0]);
+    assertEquals(1, oDataResponse.getHeader(HttpHeader.CONTENT_LENGTH).size());
+    assertEquals("513", 
oDataResponse.getHeader(HttpHeader.CONTENT_LENGTH).toArray()[0]);
+    assertEquals(ContentType.JSON.toContentTypeString(), 
oDataResponse.getContentType());
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/EdmEnabledClientITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/EdmEnabledClientITCase.java
 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/EdmEnabledClientITCase.java
deleted file mode 100644
index 05622bf..0000000
--- 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/EdmEnabledClientITCase.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.olingo.fit.tecsvc.client;
-
-import static org.junit.Assert.*;
-
-import java.net.URI;
-
-import org.apache.olingo.client.api.EdmEnabledODataClient;
-import org.apache.olingo.client.api.ODataClient;
-import 
org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
-import org.apache.olingo.client.api.domain.ClientEntity;
-import org.apache.olingo.client.core.ODataClientFactory;
-import org.apache.olingo.fit.AbstractBaseTestITCase;
-import org.apache.olingo.fit.tecsvc.TecSvcConst;
-import org.junit.Test;
-
-public class EdmEnabledClientITCase extends AbstractBaseTestITCase {
-
-  private static final String SERVICE_URI = TecSvcConst.BASE_URI;
-  private static final String ES_KEY_NAV = "ESKeyNav";
-  private static final String NAV_PROPERTY_ET_KEY_NAV_ONE = 
"NavPropertyETKeyNavOne";
-
-  @Test
-  public void readSingleValuedNavigationPropertyWithNullValue() {
-    final ODataClient client = getClient();
-    final URI uri = client.newURIBuilder(SERVICE_URI)
-                          .appendEntitySetSegment(ES_KEY_NAV)
-                          .appendKeySegment(3)
-                          .expand(NAV_PROPERTY_ET_KEY_NAV_ONE)
-                          .build();
-    
-    
-    final ODataRetrieveResponse<ClientEntity> response = 
getClient().getRetrieveRequestFactory()
-                                                                    
.getEntityRequest(uri)
-                                                                    .execute();
-    
-    assertEquals(0, response.getBody().getNavigationLinks().size());
-    
assertNull(response.getBody().getNavigationLink(NAV_PROPERTY_ET_KEY_NAV_ONE));
-  }
-
-  @Override
-  protected ODataClient getClient() {
-    final EdmEnabledODataClient client = 
ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
-    return client;
-  }
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/ExpandSelectITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/ExpandSelectITCase.java 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/ExpandSelectITCase.java
index 1ae1f22..df95a6e 100644
--- 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/ExpandSelectITCase.java
+++ 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/ExpandSelectITCase.java
@@ -149,6 +149,18 @@ public final class ExpandSelectITCase extends 
AbstractBaseTestITCase {
     assertEquals("Test String4", 
innerEntity.getProperty("PropertyString").getPrimitiveValue().toValue());
   }
 
+  @Test
+  public void expandSingleValuedNavigationPropertyWithNullValue() {
+    final ODataClient client = getClient();
+    final ODataRetrieveResponse<ClientEntity> response = 
client.getRetrieveRequestFactory()
+        .getEntityRequest(client.newURIBuilder(TecSvcConst.BASE_URI)
+            
.appendEntitySetSegment("ESKeyNav").appendKeySegment(3).expand("NavPropertyETKeyNavOne").build())
+            .execute();
+
+    assertEquals(0, response.getBody().getNavigationLinks().size());
+    assertNull(response.getBody().getNavigationLink("NavPropertyETKeyNavOne"));
+  }
+
   @Override
   protected ODataClient getClient() {
     return ODataClientFactory.getEdmEnabledClient(TecSvcConst.BASE_URI);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicBatchITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicBatchITCase.java 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicBatchITCase.java
index 65d8830..38b3cf6 100644
--- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicBatchITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicBatchITCase.java
@@ -31,6 +31,7 @@ import java.net.ProtocolException;
 import java.net.URL;
 
 import org.apache.olingo.client.api.ODataClient;
+import org.apache.olingo.commons.api.format.ContentType;
 import org.apache.olingo.commons.api.http.HttpHeader;
 import org.apache.olingo.commons.api.http.HttpMethod;
 import org.apache.olingo.commons.api.http.HttpStatusCode;
@@ -40,12 +41,16 @@ import org.junit.Test;
 
 public class BasicBatchITCase extends AbstractBaseTestITCase {
 
-  private static final String HEADER_CONTENT_TRANSFER_ENCODING_BINARY = 
"Content-Transfer-Encoding: binary";
-  private static final String HEADER_CONTENT_TYPE_HTTP = "Content-Type: 
application/http";
   private static final String SERVICE_URI = TecSvcConst.BASE_URI + "/";
-  private static final String CONTENT_TYPE_HEADER_VALUE = " 
multipart/mixed;boundary=batch_123";
+
+  private static final String HEADER_CONTENT_TRANSFER_ENCODING_BINARY = 
"Content-Transfer-Encoding: binary";
+  private static final String HEADER_CONTENT_TYPE_HTTP =
+      HttpHeader.CONTENT_TYPE + ": " + 
ContentType.APPLICATION_HTTP.toContentTypeString();
+  private static final String CONTENT_TYPE_HEADER_VALUE = " "
+      + ContentType.create(ContentType.MULTIPART_MIXED, "boundary", 
"batch_123").toContentTypeString();
+  private static final String ACCEPT_HEADER_VALUE = 
ContentType.APPLICATION_JSON.toContentTypeString();
+
   private static final String CRLF = "\r\n";
-  private static final String ACCEPT_HEADER_VALUE = "application/json";
 
   @Test
   public void test() throws IOException {
@@ -110,7 +115,7 @@ public class BasicBatchITCase extends 
AbstractBaseTestITCase {
   }
 
   private void blankLine(final BufferedReader reader) throws IOException {
-    assertEquals("", reader.readLine()); // CRLF becomes to an empty string
+    assertEquals("", reader.readLine()); // CRLF becomes an empty string
   }
 
   private String getRequest(final String uri) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicHttpITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicHttpITCase.java 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicHttpITCase.java
index dc32808..e097581 100644
--- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicHttpITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicHttpITCase.java
@@ -21,18 +21,17 @@ package org.apache.olingo.fit.tecsvc.http;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.net.HttpURLConnection;
 import java.net.URL;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.olingo.client.api.ODataClient;
 import org.apache.olingo.commons.api.format.ContentType;
 import org.apache.olingo.commons.api.http.HttpHeader;
+import org.apache.olingo.commons.api.http.HttpMethod;
 import org.apache.olingo.commons.api.http.HttpStatusCode;
 import org.apache.olingo.fit.AbstractBaseTestITCase;
 import org.apache.olingo.fit.tecsvc.TecSvcConst;
-import 
org.apache.olingo.server.core.deserializer.batch.BufferedReaderIncludingLineEndings;
 import org.junit.Test;
 
 public class BasicHttpITCase extends AbstractBaseTestITCase {
@@ -44,13 +43,11 @@ public class BasicHttpITCase extends AbstractBaseTestITCase 
{
     URL url = new URL(SERVICE_URI + "?$format=json");
 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection();
-    connection.setRequestMethod("GET");
+    connection.setRequestMethod(HttpMethod.GET.name());
     connection.connect();
 
-    int code = connection.getResponseCode();
-    assertEquals(200, code);
-    String ct = connection.getHeaderField(HttpHeader.CONTENT_TYPE);
-    
assertEquals(ContentType.create("application/json;odata.metadata=minimal"), 
ContentType.create(ct));
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
connection.getResponseCode());
+    assertEquals(ContentType.JSON, 
ContentType.create(connection.getHeaderField(HttpHeader.CONTENT_TYPE)));
   }
 
   @Test
@@ -59,15 +56,13 @@ public class BasicHttpITCase extends AbstractBaseTestITCase 
{
 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection();
 
-    connection.setRequestMethod("GET");
+    connection.setRequestMethod(HttpMethod.GET.name());
     connection.setRequestProperty(HttpHeader.ACCEPT, 
"application/json;q=0.2;odata.metadata=minimal");
 
     connection.connect();
 
-    int code = connection.getResponseCode();
-    assertEquals(200, code);
-    String ct = connection.getHeaderField(HttpHeader.CONTENT_TYPE);
-    
assertEquals(ContentType.create("application/json;odata.metadata=minimal"), 
ContentType.create(ct));
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
connection.getResponseCode());
+    assertEquals(ContentType.JSON, 
ContentType.create(connection.getHeaderField(HttpHeader.CONTENT_TYPE)));
   }
 
   @Test
@@ -76,15 +71,13 @@ public class BasicHttpITCase extends AbstractBaseTestITCase 
{
 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection();
 
-    connection.setRequestMethod("GET");
+    connection.setRequestMethod(HttpMethod.GET.name());
     connection.setRequestProperty(HttpHeader.ACCEPT, "application/json");
 
     connection.connect();
 
-    int code = connection.getResponseCode();
-    assertEquals(200, code);
-    String ct = connection.getHeaderField(HttpHeader.CONTENT_TYPE);
-    
assertEquals(ContentType.create("application/json;odata.metadata=minimal"), 
ContentType.create(ct));
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
connection.getResponseCode());
+    assertEquals(ContentType.JSON, 
ContentType.create(connection.getHeaderField(HttpHeader.CONTENT_TYPE)));
   }
 
   @Test
@@ -93,15 +86,14 @@ public class BasicHttpITCase extends AbstractBaseTestITCase 
{
 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection();
 
-    connection.setRequestMethod("GET");
+    connection.setRequestMethod(HttpMethod.GET.name());
     connection.setRequestProperty(HttpHeader.ACCEPT, 
"application/json;q=0.2;odata.metadata=minimal;charset=utf-8");
 
     connection.connect();
 
-    int code = connection.getResponseCode();
-    assertEquals(200, code);
-    String ct = connection.getHeaderField(HttpHeader.CONTENT_TYPE);
-    
assertEquals(ContentType.create("application/json;odata.metadata=minimal;charset=utf-8"),
 ContentType.create(ct));
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
connection.getResponseCode());
+    assertEquals(ContentType.create(ContentType.JSON, 
ContentType.PARAMETER_CHARSET, "utf-8"),
+        
ContentType.create(connection.getHeaderField(HttpHeader.CONTENT_TYPE)));
   }
 
   @Test
@@ -110,65 +102,50 @@ public class BasicHttpITCase extends 
AbstractBaseTestITCase {
 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection();
 
-    connection.setRequestMethod("GET");
+    connection.setRequestMethod(HttpMethod.GET.name());
     connection.setRequestProperty(HttpHeader.ODATA_MAX_VERSION, "4.0");
     connection.setRequestProperty(HttpHeader.ACCEPT, "*/*");
 
     connection.connect();
 
-    int code = connection.getResponseCode();
-    assertEquals(200, code);
-    String v = connection.getHeaderField(HttpHeader.ODATA_VERSION);
-    assertEquals("4.0", v);
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
connection.getResponseCode());
+    assertEquals("4.0", connection.getHeaderField(HttpHeader.ODATA_VERSION));
   }
-  
+
   @Test
   public void testIEEE754ParameterContentNegotiation() throws Exception {
     final URL url = new URL(SERVICE_URI + 
"/ESAllPrim(32767)?$format=application/json;IEEE754Compatible=true");
     final HttpURLConnection connection = (HttpURLConnection) 
url.openConnection();
-    connection.setRequestMethod("GET");
+    connection.setRequestMethod(HttpMethod.GET.name());
     connection.setRequestProperty(HttpHeader.ACCEPT, 
"application/json;IEEE754Compatible=false");
     connection.connect();
-    
+
     assertEquals(HttpStatusCode.OK.getStatusCode(), 
connection.getResponseCode());
-    
assertEquals(ContentType.create("application/json;IEEE754Compatible=true;odata.metadata=minimal"),
 
-                 ContentType.create(connection.getContentType()));
-    final String content = inputStreamToString(connection.getInputStream());
-    
+    assertEquals(ContentType.create(ContentType.JSON, 
ContentType.PARAMETER_IEEE754_COMPATIBLE, "true"),
+        ContentType.create(connection.getContentType()));
+    final String content = IOUtils.toString(connection.getInputStream());
+
     assertTrue(content.contains("\"PropertyDecimal\":\"34\""));
     assertTrue(content.contains("\"PropertyInt64\":\"9223372036854775807\""));
   }
-  
+
   @Test
   public void testIEEE754ParameterViaAcceptHeader() throws Exception {
     final URL url = new URL(SERVICE_URI + "/ESAllPrim(32767)");
     final HttpURLConnection connection = (HttpURLConnection) 
url.openConnection();
-    connection.setRequestMethod("GET");
+    connection.setRequestMethod(HttpMethod.GET.name());
     connection.setRequestProperty(HttpHeader.ACCEPT, 
"application/json;IEEE754Compatible=true");
     connection.connect();
-    
+
     assertEquals(HttpStatusCode.OK.getStatusCode(), 
connection.getResponseCode());
-    
assertEquals(ContentType.create("application/json;IEEE754Compatible=true;odata.metadata=minimal"),
 
-                 ContentType.create(connection.getContentType()));
-    final String content = inputStreamToString(connection.getInputStream());
-    
+    assertEquals(ContentType.create(ContentType.JSON, 
ContentType.PARAMETER_IEEE754_COMPATIBLE, "true"),
+        ContentType.create(connection.getContentType()));
+    final String content = IOUtils.toString(connection.getInputStream());
+
     assertTrue(content.contains("\"PropertyDecimal\":\"34\""));
     assertTrue(content.contains("\"PropertyInt64\":\"9223372036854775807\""));
   }
-  
-  private String inputStreamToString(final InputStream in) throws Exception {
-    final BufferedReaderIncludingLineEndings reader = new 
BufferedReaderIncludingLineEndings(new InputStreamReader(in));
-    final StringBuffer buffer = new StringBuffer();
-    String current;
-    
-    while((current = reader.readLine()) != null) {
-      buffer.append(current);
-    }
-    
-    reader.close();
-    return buffer.toString();
-  }
-  
+
   @Override
   protected ODataClient getClient() {
     return null;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/EntityReferenceITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/EntityReferenceITCase.java
 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/EntityReferenceITCase.java
index bcfc096..359feb7 100644
--- 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/EntityReferenceITCase.java
+++ 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/EntityReferenceITCase.java
@@ -21,16 +21,17 @@ package org.apache.olingo.fit.tecsvc.http;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.net.HttpURLConnection;
 import java.net.URL;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.olingo.client.api.ODataClient;
+import org.apache.olingo.commons.api.format.ContentType;
 import org.apache.olingo.commons.api.http.HttpHeader;
+import org.apache.olingo.commons.api.http.HttpMethod;
+import org.apache.olingo.commons.api.http.HttpStatusCode;
 import org.apache.olingo.fit.AbstractBaseTestITCase;
 import org.apache.olingo.fit.tecsvc.TecSvcConst;
-import 
org.apache.olingo.server.core.deserializer.batch.BufferedReaderIncludingLineEndings;
 import org.junit.Test;
 
 public class EntityReferenceITCase extends AbstractBaseTestITCase {
@@ -41,49 +42,34 @@ public class EntityReferenceITCase extends 
AbstractBaseTestITCase {
 
   @Test
   public void testContextURlSingleEntity() throws Exception {
-      URL url = new URL(SERVICE_URI + "/ESAllPrim(0)/$ref");
+    URL url = new URL(SERVICE_URI + "/ESAllPrim(0)/$ref");
 
-      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
-      connection.setRequestProperty(HttpHeader.ACCEPT, "application/json");
-      connection.setRequestMethod("GET");
-      connection.connect();
+    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+    connection.setRequestProperty(HttpHeader.ACCEPT, 
ContentType.APPLICATION_JSON.toContentTypeString());
+    connection.setRequestMethod(HttpMethod.GET.name());
+    connection.connect();
 
-      int code = connection.getResponseCode();
-      assertEquals(200, code);
-      
-      final String content = getString(connection.getInputStream());
-      assertTrue(content.contains(CONTEXT_ENTITY_REFERENCE));
-  } 
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
connection.getResponseCode());
+
+    final String content = IOUtils.toString(connection.getInputStream());
+    assertTrue(content.contains(CONTEXT_ENTITY_REFERENCE));
+  }
 
   @Test
   public void testContextURLEntityCollection() throws Exception {
     URL url = new URL(SERVICE_URI + "/ESAllPrim/$ref");
 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection();
-    connection.setRequestProperty(HttpHeader.ACCEPT, "application/json");
-    connection.setRequestMethod("GET");
+    connection.setRequestProperty(HttpHeader.ACCEPT, 
ContentType.APPLICATION_JSON.toContentTypeString());
+    connection.setRequestMethod(HttpMethod.GET.name());
     connection.connect();
 
-    int code = connection.getResponseCode();
-    assertEquals(200, code);
-    
-    final String content = getString(connection.getInputStream());
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
connection.getResponseCode());
+
+    final String content = IOUtils.toString(connection.getInputStream());
     assertTrue(content.contains(CONTEXT_COLLECTION_REFERENCE));
   }
-  
-  private String getString(final InputStream in) throws Exception {
-    final StringBuilder builder = new StringBuilder();
-    final BufferedReaderIncludingLineEndings reader = new 
BufferedReaderIncludingLineEndings(new InputStreamReader(in));
-    
-    String line;
-    while((line = reader.readLine()) != null) {
-      builder.append(line);
-    }
-     
-    reader.close();
-    return builder.toString();
-  }
-  
+
   @Override
   protected ODataClient getClient() {
     return null;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/PingITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/PingITCase.java 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/PingITCase.java
index b016a4b..5a20f29 100644
--- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/PingITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/PingITCase.java
@@ -25,6 +25,8 @@ import java.net.URL;
 
 import org.apache.olingo.client.api.ODataClient;
 import org.apache.olingo.commons.api.http.HttpHeader;
+import org.apache.olingo.commons.api.http.HttpMethod;
+import org.apache.olingo.commons.api.http.HttpStatusCode;
 import org.apache.olingo.fit.AbstractBaseTestITCase;
 import org.apache.olingo.fit.tecsvc.TecSvcConst;
 import org.junit.Test;
@@ -41,12 +43,11 @@ public class PingITCase extends AbstractBaseTestITCase {
     LOG.debug("ping request: " + SERVICE_URI);
 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection();
-    connection.setRequestMethod("GET");
+    connection.setRequestMethod(HttpMethod.GET.name());
     connection.setRequestProperty(HttpHeader.ACCEPT, "*/*");
     connection.connect();
 
-    int code = connection.getResponseCode();
-    assertEquals(200, code);
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
connection.getResponseCode());
   }
 
   @Test
@@ -57,12 +58,11 @@ public class PingITCase extends AbstractBaseTestITCase {
     LOG.debug("redirect request: " + REDIRECT_URI);
 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection();
-    connection.setRequestMethod("GET");
+    connection.setRequestMethod(HttpMethod.GET.name());
     connection.setRequestProperty(HttpHeader.ACCEPT, "*/*");
     connection.connect();
 
-    int code = connection.getResponseCode();
-    assertEquals(200, code);
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
connection.getResponseCode());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/fit/src/test/java/org/apache/olingo/fit/v4/EntityRetrieveTestITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/v4/EntityRetrieveTestITCase.java 
b/fit/src/test/java/org/apache/olingo/fit/v4/EntityRetrieveTestITCase.java
index 58fc160..7831bd7 100644
--- a/fit/src/test/java/org/apache/olingo/fit/v4/EntityRetrieveTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/v4/EntityRetrieveTestITCase.java
@@ -70,7 +70,8 @@ public class EntityRetrieveTestITCase extends 
AbstractTestITCase {
     assertEquals("Edm.GeographyPoint", 
entity.getProperty("Home").getPrimitiveValue().getTypeName());
 
     // In JSON with minimal metadata, links are not provided
-    if(contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC, 
ContentType.APPLICATION_ATOM_XML) 
+    if (contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC)
+        || contentType.isCompatible(ContentType.APPLICATION_ATOM_XML) 
         || (contentType.isCompatible(ContentType.JSON) 
               && ContentType.VALUE_ODATA_METADATA_FULL
               
.equals(contentType.getParameter(ContentType.PARAMETER_ODATA_METADATA)))) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/lib/client-api/src/main/java/org/apache/olingo/client/api/domain/ClientEntitySetIterator.java
----------------------------------------------------------------------
diff --git 
a/lib/client-api/src/main/java/org/apache/olingo/client/api/domain/ClientEntitySetIterator.java
 
b/lib/client-api/src/main/java/org/apache/olingo/client/api/domain/ClientEntitySetIterator.java
index added7a..376404b 100644
--- 
a/lib/client-api/src/main/java/org/apache/olingo/client/api/domain/ClientEntitySetIterator.java
+++ 
b/lib/client-api/src/main/java/org/apache/olingo/client/api/domain/ClientEntitySetIterator.java
@@ -85,7 +85,8 @@ public class ClientEntitySetIterator<ES extends 
ClientEntitySet, E extends Clien
     this.contentType = contentType;
     this.osEntitySet = new ByteArrayOutputStream();
     
-    if(contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC, 
ContentType.APPLICATION_ATOM_XML)) {
+    if(contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC)
+        || contentType.isCompatible(ContentType.APPLICATION_ATOM_XML)) {
       namespaces = getAllElementAttributes(stream, "feed", osEntitySet);
     } else {
       namespaces = null;
@@ -103,14 +104,12 @@ public class ClientEntitySetIterator<ES extends 
ClientEntitySet, E extends Clien
     }
   }
 
-  /**
-   * {@inheritDoc }
-   */
-  @Override
   @SuppressWarnings("unchecked")
+  @Override
   public boolean hasNext() {
     if (available && cached == null) {
-      if (contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC, 
ContentType.APPLICATION_ATOM_XML)) {
+      if (contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC)
+          || contentType.isCompatible(ContentType.APPLICATION_ATOM_XML)) {
         cached = nextAtomEntityFromEntitySet(stream, osEntitySet, namespaces);
       } else {
         cached = nextJSONEntityFromEntitySet(stream, osEntitySet);
@@ -131,9 +130,6 @@ public class ClientEntitySetIterator<ES extends 
ClientEntitySet, E extends Clien
     return available;
   }
 
-  /**
-   * {@inheritDoc }
-   */
   @Override
   public E next() {
     if (hasNext()) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/lib/client-core/src/main/java/org/apache/olingo/client/core/ODataClientImpl.java
----------------------------------------------------------------------
diff --git 
a/lib/client-core/src/main/java/org/apache/olingo/client/core/ODataClientImpl.java
 
b/lib/client-core/src/main/java/org/apache/olingo/client/core/ODataClientImpl.java
index b00d3a8..6c3bb4c 100644
--- 
a/lib/client-core/src/main/java/org/apache/olingo/client/core/ODataClientImpl.java
+++ 
b/lib/client-core/src/main/java/org/apache/olingo/client/core/ODataClientImpl.java
@@ -95,7 +95,7 @@ public class ODataClientImpl implements ODataClient {
   public ODataWriter getWriter() {
     return writer;
   }
-  
+
   @Override
   public ODataServiceVersion getServiceVersion() {
     return ODataServiceVersion.V40;
@@ -113,7 +113,7 @@ public class ODataClientImpl implements ODataClient {
   public URIBuilder newURIBuilder(final String serviceRoot) {
     return new URIBuilderImpl(getConfiguration(), serviceRoot);
   }
-  
+
   @Override
   public FilterFactory getFilterFactory() {
     return filterFactory;
@@ -131,10 +131,10 @@ public class ODataClientImpl implements ODataClient {
 
   @Override
   public ODataSerializer getSerializer(final ContentType contentType) {
-    return contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC, 
ContentType.APPLICATION_ATOM_XML, 
-                                    ContentType.APPLICATION_XML) ?  
-                                        new AtomSerializer() : new 
JsonSerializer(false, contentType);
-       
+    return contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC)
+        || contentType.isCompatible(ContentType.APPLICATION_ATOM_XML)
+        || contentType.isCompatible(ContentType.APPLICATION_XML) ?
+        new AtomSerializer() : new JsonSerializer(false, contentType);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/AbstractODataInvokeRequest.java
----------------------------------------------------------------------
diff --git 
a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/AbstractODataInvokeRequest.java
 
b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/AbstractODataInvokeRequest.java
index f28130d..8bd3363 100644
--- 
a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/AbstractODataInvokeRequest.java
+++ 
b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/invoke/AbstractODataInvokeRequest.java
@@ -96,9 +96,10 @@ public abstract class AbstractODataInvokeRequest<T extends 
ClientInvokeResult>
   }
 
   private String getActualFormat(final ContentType contentType) {
-    return ((ClientProperty.class.isAssignableFrom(reference) 
-        && contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC, 
ContentType.APPLICATION_ATOM_XML))
-        ? ContentType.APPLICATION_XML : contentType).toContentTypeString();
+    return (ClientProperty.class.isAssignableFrom(reference)
+        && (contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC)
+        || contentType.isCompatible(ContentType.APPLICATION_ATOM_XML)) ?
+        ContentType.APPLICATION_XML : contentType).toContentTypeString();
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ClientODataDeserializerImpl.java
----------------------------------------------------------------------
diff --git 
a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ClientODataDeserializerImpl.java
 
b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ClientODataDeserializerImpl.java
index b6c233f..4a2f078 100644
--- 
a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ClientODataDeserializerImpl.java
+++ 
b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/ClientODataDeserializerImpl.java
@@ -54,13 +54,13 @@ import com.fasterxml.jackson.dataformat.xml.XmlMapper;
 public class ClientODataDeserializerImpl implements ClientODataDeserializer {
 
   private final ODataDeserializer deserializer;
-
   private final ContentType contentType;
 
   public ClientODataDeserializerImpl(final boolean serverMode, final 
ContentType contentType) {
     this.contentType = contentType;
-    if(contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC, 
ContentType.APPLICATION_ATOM_XML, 
-        ContentType.APPLICATION_XML )) {
+    if (contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC)
+        || contentType.isCompatible(ContentType.APPLICATION_ATOM_XML)
+        || contentType.isCompatible(ContentType.APPLICATION_XML)) {
       deserializer = new AtomDeserializer();
     } else {
       deserializer = new JsonDeserializer(serverMode);
@@ -127,10 +127,11 @@ public class ClientODataDeserializerImpl implements 
ClientODataDeserializer {
   @Override
   public ResWrap<Delta> toDelta(final InputStream input) throws 
ODataDeserializerException {
     try {
-      return contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC, 
ContentType.APPLICATION_ATOM_XML) ?
+      return contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC)
+          || contentType.isCompatible(ContentType.APPLICATION_ATOM_XML) ?
           new AtomDeserializer().delta(input) :
           new JsonDeltaDeserializer(false).toDelta(input);
-    } catch (XMLStreamException e) {
+    } catch (final XMLStreamException e) {
       throw new ODataDeserializerException(e);
     } catch (final EdmPrimitiveTypeException e) {
       throw new ODataDeserializerException(e);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/lib/client-core/src/test/java/org/apache/olingo/client/core/AbstractTest.java
----------------------------------------------------------------------
diff --git 
a/lib/client-core/src/test/java/org/apache/olingo/client/core/AbstractTest.java 
b/lib/client-core/src/test/java/org/apache/olingo/client/core/AbstractTest.java
index beeda7e..bc116a8 100644
--- 
a/lib/client-core/src/test/java/org/apache/olingo/client/core/AbstractTest.java
+++ 
b/lib/client-core/src/test/java/org/apache/olingo/client/core/AbstractTest.java
@@ -44,7 +44,8 @@ public abstract class AbstractTest {
   }
 
   protected String getSuffix(final ContentType contentType) {
-    return contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC, 
ContentType.APPLICATION_ATOM_XML, 
-                                    ContentType.APPLICATION_XML) ? "xml": 
"json";
+    return contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC)
+        || contentType.isCompatible(ContentType.APPLICATION_ATOM_XML)
+        || contentType.isCompatible(ContentType.APPLICATION_XML) ? "xml": 
"json";
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/EntityTest.java
----------------------------------------------------------------------
diff --git 
a/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/EntityTest.java
 
b/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/EntityTest.java
index a21cc15..6b69135 100644
--- 
a/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/EntityTest.java
+++ 
b/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/EntityTest.java
@@ -102,7 +102,8 @@ public class EntityTest extends AbstractTest {
       }
       if ("Orders".equals(link.getName())) {
         checked++;
-        if(contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC, 
ContentType.APPLICATION_ATOM_XML)) {
+        if (contentType.isCompatible(ContentType.APPLICATION_ATOM_SVC)
+            || contentType.isCompatible(ContentType.APPLICATION_ATOM_XML)) {
           assertEquals(ClientLinkType.ENTITY_SET_NAVIGATION, link.getType());
         }
       }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/AcceptType.java
----------------------------------------------------------------------
diff --git 
a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/AcceptType.java
 
b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/AcceptType.java
index ec273be..caf52ba 100644
--- 
a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/AcceptType.java
+++ 
b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/AcceptType.java
@@ -24,7 +24,6 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import java.util.TreeMap;
 
 /**
  * Internally used {@link AcceptType} for OData library.
@@ -55,26 +54,17 @@ public class AcceptType {
       final Float quality) {
     this.type = type;
     this.subtype = subtype;
-    this.parameters = createParameterMap();
+    this.parameters = TypeUtil.createParameterMap();
     this.parameters.putAll(parameters);
     this.quality = quality;
   }
 
-  private static TreeMap<String, String> createParameterMap() {
-    return new TreeMap<String, String>(new Comparator<String>() {
-      @Override
-      public int compare(final String o1, final String o2) {
-        return o1.compareToIgnoreCase(o2);
-      }
-    });
-  }
-
   private AcceptType(final String type) {
     if (type == null) {
       throw new IllegalArgumentException("Type parameter MUST NOT be null.");
     }
     List<String> typeSubtype = new ArrayList<String>();
-    parameters = createParameterMap();
+    parameters = TypeUtil.createParameterMap();
 
     parse(type, typeSubtype, parameters);
     this.type = typeSubtype.get(0);
@@ -122,15 +112,15 @@ public class AcceptType {
   }
 
   /**
-   * Creates a list of {@link AcceptType} objects based on given input string 
(<code>format</code>).
-   * @param contentType accept types, comma-separated, as specified for the 
HTTP header <code>Accept</code>
+   * Creates a list of {@link AcceptType} objects based on given input string.
+   * @param acceptTypes accept types, comma-separated, as specified for the 
HTTP header <code>Accept</code>
    * @return a list of <code>AcceptType</code> objects
    * @throws IllegalArgumentException if input string is not parseable
    */
-  public static List<AcceptType> create(final String contentType) {
+  public static List<AcceptType> create(final String acceptTypes) {
     List<AcceptType> result = new ArrayList<AcceptType>();
 
-    String[] values = contentType.split(",");
+    String[] values = acceptTypes.split(",");
     for (String value : values) {
       result.add(new AcceptType(value.trim()));
     }
@@ -220,12 +210,12 @@ public class AcceptType {
   }
 
   /**
-   * Sort given list of Accept types
+   * Sorts given list of Accept types
    * according to their quality-parameter values and their specificity
    * as defined in RFC 7231, chapters 3.1.1.1, 5.3.1, and 5.3.2.
    * @param toSort list which is sorted and hence re-arranged
    */
-  private static void sort(final List<AcceptType> toSort) {
+  private static void sort(List<AcceptType> toSort) {
     Collections.sort(toSort,
         new Comparator<AcceptType>() {
       @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/ContentType.java
----------------------------------------------------------------------
diff --git 
a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/ContentType.java
 
b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/ContentType.java
index 473ff58..2ff035d 100644
--- 
a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/ContentType.java
+++ 
b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/ContentType.java
@@ -20,14 +20,12 @@ package org.apache.olingo.commons.api.format;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.TreeMap;
 
 /**
  * Internally used {@link ContentType} for OData library.
@@ -96,10 +94,9 @@ public final class ContentType {
 
   /**
    * Creates a content type from type, subtype, and parameters.
-   *
-   * @param type
-   * @param subtype
-   * @param parameters
+   * @param type       type
+   * @param subtype    subtype
+   * @param parameters parameters as map from names to values
    */
   private ContentType(final String type, final String subtype, final 
Map<String, String> parameters) {
     this.type = validateType(type);
@@ -108,17 +105,12 @@ public final class ContentType {
     if (parameters == null) {
       this.parameters = Collections.emptyMap();
     } else {
-      this.parameters = new TreeMap<String, String>(new Comparator<String>() {
-        @Override
-        public int compare(final String o1, final String o2) {
-          return o1.compareToIgnoreCase(o2);
-        }
-      });
+      this.parameters = TypeUtil.createParameterMap();
       this.parameters.putAll(parameters);
     }
   }
 
-  private String validateType(final String type) {
+  private String validateType(final String type) throws 
IllegalArgumentException {
     if (type == null || type.isEmpty() || "*".equals(type)) {
       throw new IllegalArgumentException("Illegal type '" + type + "'.");
     }
@@ -129,20 +121,6 @@ public final class ContentType {
   }
 
   /**
-   * Validates if given <code>format</code> is parseable and can be used as 
input for {@link #create(String)} method.
-   *
-   * @param format to be validated string
-   * @return <code>true</code> if format is parseable otherwise 
<code>false</code>
-   */
-  public static boolean isParseable(final String format) {
-    try {
-      return ContentType.create(format) != null;
-    } catch (IllegalArgumentException e) {
-      return false;
-    }
-  }
-
-  /**
    * Creates a content type from an existing content type and an additional 
parameter as key-value pair.
    * @param contentType    an existing content type
    * @param parameterName  the name of the additional parameter
@@ -150,17 +128,12 @@ public final class ContentType {
    * @return a new {@link ContentType} object
    */
   public static ContentType create(final ContentType contentType,
-      final String parameterName, final String parameterValue) {
-    if (parameterName == null || parameterName.isEmpty() || 
parameterName.indexOf(TypeUtil.WHITESPACE_CHAR) >= 0) {
-      throw new IllegalArgumentException("Illegal parameter name '" + 
parameterName + "'.");
-    }
-    if (Character.isWhitespace(parameterValue.charAt(0))) {
-      throw new IllegalArgumentException("Value of parameter '" + 
parameterName + "' starts with whitespace.");
-    }
+      final String parameterName, final String parameterValue) throws 
IllegalArgumentException {
+    TypeUtil.validateParameterNameAndValue(parameterName, parameterValue);
 
-    ContentType ct = new ContentType(contentType.type, contentType.subtype, 
contentType.parameters);
-    ct.parameters.put(parameterName.toLowerCase(Locale.ROOT), parameterValue);
-    return ct;
+    ContentType type = new ContentType(contentType.type, contentType.subtype, 
contentType.parameters);
+    type.parameters.put(parameterName.toLowerCase(Locale.ROOT), 
parameterValue);
+    return type;
   }
 
   /**
@@ -168,15 +141,15 @@ public final class ContentType {
    * <code>Media Type</code> format as defined in RFC 7231, chapter 3.1.1.1.
    *
    * @param format a string in format as defined in RFC 7231, chapter 3.1.1.1
-   * @return a new <code>ContentType</code> object
+   * @return a new {@link ContentType} object
    * @throws IllegalArgumentException if input string is not parseable
    */
-  public static ContentType create(final String format) {
+  public static ContentType create(final String format) throws 
IllegalArgumentException {
     if (format == null) {
       throw new IllegalArgumentException("Parameter format MUST NOT be NULL.");
     }
-    final List<String> typeSubtype = new ArrayList<String>();
-    final Map<String, String> parameters = new HashMap<String, String>();
+    List<String> typeSubtype = new ArrayList<String>();
+    Map<String, String> parameters = new HashMap<String, String>();
     parse(format, typeSubtype, parameters);
     return new ContentType(typeSubtype.get(0), typeSubtype.get(1), parameters);
   }
@@ -198,7 +171,8 @@ public final class ContentType {
     }
   }
 
-  private static void parse(final String format, final List<String> 
typeSubtype, final Map<String, String> parameters) {
+  private static void parse(final String format, List<String> typeSubtype, 
Map<String, String> parameters)
+      throws IllegalArgumentException {
     final String[] typesAndParameters = 
format.split(TypeUtil.PARAMETER_SEPARATOR, 2);
     final String types = typesAndParameters[0];
     final String params = (typesAndParameters.length > 1 ? 
typesAndParameters[1] : null);
@@ -246,8 +220,7 @@ public final class ContentType {
 
   /**
    * Returns the value of a given parameter.
-   * If the parameter does not exists the method returns null.
-   * 
+   * If the parameter does not exist the method returns null.
    * @param name the name of the parameter to get (case-insensitive)
    * @return the value of the parameter or <code>null</code> if the parameter 
is not present
    */
@@ -311,25 +284,7 @@ public final class ContentType {
   }
 
   /**
-   * <p>{@link ContentType}s are <b>compatible</b>
-   * if <code>type</code> and <code>subtype</code> have the same value.</p>
-   * <p>The set <code>parameters</code> are <b>always</b> ignored
-   * (for compare with parameters see {@link #equals(Object)}).</p>
-   * @return <code>true</code> if both instances are compatible (see 
definition above), otherwise <code>false</code>.
-   */
-  public boolean isCompatible(final ContentType... otherTypes) {
-    for (final ContentType otherType : otherTypes) {
-      if (isCompatible(otherType)) {
-        return true;
-      }
-    }
-
-    return false;
-  }
-
-  /**
    * Checks whether both strings are equal ignoring the case of the strings.
-   *
    * @param first first string
    * @param second second string
    * @return <code>true</code> if both strings are equal (ignoring the case), 
otherwise <code>false</code>
@@ -340,10 +295,8 @@ public final class ContentType {
 
   /**
    * Gets {@link ContentType} as string as defined in
-   * <a href="http://www.ietf.org/rfc/rfc7231.txt";>RFC 7231</a>, chapter 
3.1.1.1:
-   * Media Type.
-   *
-   * @return string representation of <code>ContentType</code> object
+   * <a href="http://www.ietf.org/rfc/rfc7231.txt";>RFC 7231</a>, chapter 
3.1.1.1: Media Type.
+   * @return string representation of {@link ContentType} object
    */
   public String toContentTypeString() {
     final StringBuilder sb = new StringBuilder();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/TypeUtil.java
----------------------------------------------------------------------
diff --git 
a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/TypeUtil.java
 
b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/TypeUtil.java
index 03fd078..64b2672 100644
--- 
a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/TypeUtil.java
+++ 
b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/TypeUtil.java
@@ -18,8 +18,10 @@
  */
 package org.apache.olingo.commons.api.format;
 
+import java.util.Comparator;
 import java.util.Locale;
 import java.util.Map;
+import java.util.TreeMap;
 
 class TypeUtil {
 
@@ -32,6 +34,16 @@ class TypeUtil {
   static final String TYPE_SUBTYPE_SEPARATOR = "/";
   static final String TYPE_SUBTYPE_WILDCARD = "*";
 
+  /** Creates a parameter map with predictable order. */
+  protected static Map<String, String> createParameterMap() {
+    return new TreeMap<String, String>(new Comparator<String>() {
+      @Override
+      public int compare(final String o1, final String o2) {
+        return o1.compareToIgnoreCase(o2);
+      }
+    });
+  }
+
   /**
    * Valid input are <code>;</code> separated <code>key=value</code> pairs
    * without spaces between key and value.
@@ -60,19 +72,23 @@ class TypeUtil {
     if (parameter.isEmpty()) {
       throw new IllegalArgumentException("An empty parameter is not allowed.");
     }
-    String[] keyValue = 
parameter.trim().split(TypeUtil.PARAMETER_KEY_VALUE_SEPARATOR);
-    if (keyValue.length != 2 || keyValue[0].isEmpty()) {
-      throw new IllegalArgumentException(
-          "Parameter '" + parameter + "' must have exactly one '" + 
TypeUtil.PARAMETER_KEY_VALUE_SEPARATOR +
-              "' that separates the name and the value.");
+    String[] keyValue = parameter.trim().split(PARAMETER_KEY_VALUE_SEPARATOR);
+    if (keyValue.length != 2) {
+      throw new IllegalArgumentException("Parameter '" + parameter + "' must 
have exactly one '"
+          + PARAMETER_KEY_VALUE_SEPARATOR + "' that separates the name and the 
value.");
     }
+    validateParameterNameAndValue(keyValue[0], keyValue[1]);
     keyValue[0] = keyValue[0].toLowerCase(Locale.ENGLISH);
-    if (keyValue[0].indexOf(WHITESPACE_CHAR) >= 0) {
-      throw new IllegalArgumentException("Parameter name '" + keyValue[0] + "' 
contains whitespace.");
+    return keyValue;
+  }
+
+  protected static void validateParameterNameAndValue(final String 
parameterName, final String parameterValue)
+      throws IllegalArgumentException {
+    if (parameterName == null || parameterName.isEmpty() || 
parameterName.indexOf(WHITESPACE_CHAR) >= 0) {
+      throw new IllegalArgumentException("Illegal parameter name '" + 
parameterName + "'.");
     }
-    if (Character.isWhitespace(keyValue[1].charAt(0))) {
-      throw new IllegalArgumentException("Value of parameter '" + keyValue[0] 
+ "' starts with whitespace.");
+    if (Character.isWhitespace(parameterValue.charAt(0))) {
+      throw new IllegalArgumentException("Value of parameter '" + 
parameterName + "' starts with whitespace.");
     }
-    return keyValue;
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/lib/commons-api/src/main/java/org/apache/olingo/commons/api/http/HttpHeader.java
----------------------------------------------------------------------
diff --git 
a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/http/HttpHeader.java
 
b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/http/HttpHeader.java
index 1036b88..d9ebe1b 100644
--- 
a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/http/HttpHeader.java
+++ 
b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/http/HttpHeader.java
@@ -165,23 +165,15 @@ public interface HttpHeader {
    */
   public static final String SET_COOKIE = "Set-Cookie";
 
-  /**
-   * non standard header
-   */
+  /** Non standard header. */
   public static final String X_HTTP_METHOD = "X-HTTP-Method";
-
-  /**
-   * non standard header
-   */
+  /** Non standard header. */
   public static final String X_HTTP_METHOD_OVERRIDE = "X-HTTP-Method-Override";
 
-  /**
-   * OData Custom Header
-   */
+  /** Custom Header defined in the OData standard. */
   public static final String ODATA_VERSION = "OData-Version";
-
-  /**
-   * OData Custom Header
-   */
+  /** Custom Header defined in the OData standard. */
   public static final String ODATA_MAX_VERSION = "OData-MaxVersion";
+  /** Custom Header defined in the OData standard. */
+  public static final String ODATA_ENTITY_ID = "OData-EntityID";
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/lib/commons-api/src/test/java/org/apache/olingo/commons/api/format/ContentTypeTest.java
----------------------------------------------------------------------
diff --git 
a/lib/commons-api/src/test/java/org/apache/olingo/commons/api/format/ContentTypeTest.java
 
b/lib/commons-api/src/test/java/org/apache/olingo/commons/api/format/ContentTypeTest.java
index 6f7460b..f173a76 100644
--- 
a/lib/commons-api/src/test/java/org/apache/olingo/commons/api/format/ContentTypeTest.java
+++ 
b/lib/commons-api/src/test/java/org/apache/olingo/commons/api/format/ContentTypeTest.java
@@ -100,7 +100,6 @@ public class ContentTypeTest {
   @Test
   public void testParse() {
     assertNull(ContentType.parse("a"));
-    assertFalse(ContentType.isParseable("a"));
   }
 
   @Test(expected = IllegalArgumentException.class)

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalActionProcessor.java
----------------------------------------------------------------------
diff --git 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalActionProcessor.java
 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalActionProcessor.java
index 663a7eb..9eb836c 100644
--- 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalActionProcessor.java
+++ 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalActionProcessor.java
@@ -158,9 +158,12 @@ public class TechnicalActionProcessor extends 
TechnicalProcessor
             
PreferencesApplied.with().returnRepresentation(returnPreference).build().toValueString());
       }
       if (entityResult.isCreated()) {
-        response.setHeader(HttpHeader.LOCATION,
-            request.getRawBaseUri() + '/'
-                + odata.createUriHelper().buildCanonicalURL(edmEntitySet, 
entityResult.getEntity()));
+        final String location = request.getRawBaseUri() + '/'
+            + odata.createUriHelper().buildCanonicalURL(edmEntitySet, 
entityResult.getEntity());
+        response.setHeader(HttpHeader.LOCATION, location);
+        if (returnPreference == Return.MINIMAL) {
+          response.setHeader(HttpHeader.ODATA_ENTITY_ID, location);
+        }
       }
       if (entityResult.getEntity().getETag() != null) {
         response.setHeader(HttpHeader.ETAG, 
entityResult.getEntity().getETag());

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java
----------------------------------------------------------------------
diff --git 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java
 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java
index 9844d71..2904e18 100644
--- 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java
+++ 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java
@@ -164,6 +164,8 @@ public class TechnicalEntityProcessor extends 
TechnicalProcessor
       expand = deserializerResult.getExpandTree();
     }
 
+    final String location = request.getRawBaseUri() + '/'
+        + odata.createUriHelper().buildCanonicalURL(edmEntitySet, entity);
     final Return returnPreference = 
odata.createPreferences(request.getHeaders(HttpHeader.PREFER)).getReturn();
     if (returnPreference == null || returnPreference == Return.REPRESENTATION) 
{
       response.setContent(serializeEntity(entity, edmEntitySet, edmEntityType, 
responseFormat, expand, null)
@@ -172,13 +174,13 @@ public class TechnicalEntityProcessor extends 
TechnicalProcessor
       response.setStatusCode(HttpStatusCode.CREATED.getStatusCode());
     } else {
       response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
+      response.setHeader(HttpHeader.ODATA_ENTITY_ID, location);
     }
     if (returnPreference != null) {
       response.setHeader(HttpHeader.PREFERENCE_APPLIED,
           
PreferencesApplied.with().returnRepresentation(returnPreference).build().toValueString());
     }
-    response.setHeader(HttpHeader.LOCATION,
-        request.getRawBaseUri() + '/' + 
odata.createUriHelper().buildCanonicalURL(edmEntitySet, entity));
+    response.setHeader(HttpHeader.LOCATION, location);
     if (entity.getETag() != null) {
       response.setHeader(HttpHeader.ETAG, entity.getETag());
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/abf5bf79/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
----------------------------------------------------------------------
diff --git 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
index e9761dc..55c0761 100644
--- 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
+++ 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
@@ -50,12 +50,12 @@ import org.apache.olingo.server.tecsvc.data.DataProvider;
  */
 public abstract class TechnicalProcessor implements Processor {
 
+  protected final DataProvider dataProvider;
   protected OData odata;
-  protected DataProvider dataProvider;
   protected ServiceMetadata serviceMetadata;
 
   protected TechnicalProcessor(final DataProvider dataProvider) {
-    this.dataProvider = dataProvider;
+    this(dataProvider, null);
   }
 
   protected TechnicalProcessor(final DataProvider dataProvider, final 
ServiceMetadata serviceMetadata) {

Reply via email to