http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java
 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java
index 00b9b8c..f0cb444 100644
--- 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java
+++ 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java
@@ -255,9 +255,10 @@ public class XmlMetadataConsumer {
     function.setHttpMethod(reader.getAttributeValue(Edm.NAMESPACE_M_2007_08,
         XmlMetadataConstants.EDM_FUNCTION_IMPORT_HTTP_METHOD));
     function.setEntitySet(reader.getAttributeValue(null, 
XmlMetadataConstants.EDM_ENTITY_SET));
-    ReturnType returnType = new ReturnType();
+
     String returnTypeString = reader.getAttributeValue(null, 
XmlMetadataConstants.EDM_FUNCTION_IMPORT_RETURN);
     if (returnTypeString != null) {
+      ReturnType returnType = new ReturnType();
       if (returnTypeString.startsWith("Collection") || 
returnTypeString.startsWith("collection")) {
         returnType.setMultiplicity(EdmMultiplicity.MANY);
         returnTypeString = 
returnTypeString.substring(returnTypeString.indexOf("(") + 1, 
returnTypeString.length() - 1);
@@ -305,7 +306,7 @@ public class XmlMetadataConsumer {
     functionParameter.setAnnotationAttributes(readAnnotationAttribute(reader));
     while (reader.hasNext()
         && !(reader.isEndElement() && 
edmNamespace.equals(reader.getNamespaceURI())
-        && 
XmlMetadataConstants.EDM_FUNCTION_IMPORT.equals(reader.getLocalName()))) {
+        && 
XmlMetadataConstants.EDM_FUNCTION_PARAMETER.equals(reader.getLocalName()))) {
       reader.next();
       if (reader.isStartElement()) {
         extractNamespaces(reader);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/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 6987eb1..d7522ee 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
@@ -25,6 +25,7 @@ import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
 import org.apache.olingo.odata2.api.ODataCallback;
 import org.apache.olingo.odata2.api.edm.Edm;
@@ -93,25 +94,36 @@ public class AtomEntryEntityProducer {
         writer.writeAttribute(Edm.NAMESPACE_M_2007_08, FormatXml.M_ETAG, etag);
       }
 
-      // write all atom infos (mandatory and optional)
-      String selfLink = createSelfLink(eia, data, null);
-      appendAtomMandatoryParts(writer, eia, data, selfLink);
-      appendAtomOptionalParts(writer, eia, data);
-
+      String selfLink = null;
+      if (!properties.isContentOnly()) {
+        // write all atom infos (mandatory and optional)
+        selfLink = createSelfLink(eia, data, null);
+        appendAtomMandatoryParts(writer, eia, data, selfLink);
+        appendAtomOptionalParts(writer, eia, data);
+      }
       if (eia.getEntityType().hasStream()) {
         // write all links
-        appendAtomEditLink(writer, eia, data, selfLink);
-        // TODO: fix
-        appendAtomContentLink(writer, eia, data, selfLink);
-        appendAtomNavigationLinks(writer, eia, data);
+        if (!properties.isContentOnly()) {
+          appendAtomEditLink(writer, eia, data, selfLink);
+          appendAtomContentLink(writer, eia, data, selfLink);
+          appendAtomNavigationLinks(writer, eia, data);
+        } else {
+          appendAdditinalLinks(writer, eia, data);
+        }
         // write properties/content
         appendCustomProperties(writer, eia, data);
-        appendAtomContentPart(writer, eia, data, selfLink);
+        if (!properties.isContentOnly()) {
+          appendAtomContentPart(writer, eia, data, selfLink);
+        }
         appendProperties(writer, eia, data);
       } else {
         // write all links
-        appendAtomEditLink(writer, eia, data, selfLink);
-        appendAtomNavigationLinks(writer, eia, data);
+        if (!properties.isContentOnly()) {
+          appendAtomEditLink(writer, eia, data, selfLink);
+          appendAtomNavigationLinks(writer, eia, data);
+        } else {
+          appendAdditinalLinks(writer, eia, data);
+        }
         // write properties/content
         appendCustomProperties(writer, eia, data);
         writer.writeStartElement(FormatXml.ATOM_CONTENT);
@@ -132,6 +144,24 @@ public class AtomEntryEntityProducer {
     }
   }
 
+  private void appendAdditinalLinks(final XMLStreamWriter writer, final 
EntityInfoAggregator eia,
+      final Map<String, Object> data)
+      throws EntityProviderException, EdmException, URISyntaxException {
+    final Map<String, Map<String, Object>> links = 
properties.getAdditionalLinks();
+    if (links != null && !links.isEmpty()) {
+      for (Entry<String, Map<String, Object>> entry : links.entrySet()) {
+        Map<String, Object> navigationKeyMap = entry.getValue();
+        if (navigationKeyMap != null && !navigationKeyMap.isEmpty()) {
+          final EntityInfoAggregator targetEntityInfo = 
EntityInfoAggregator.create(
+              eia.getEntitySet().getRelatedEntitySet(
+                  (EdmNavigationProperty) 
eia.getEntityType().getProperty(entry.getKey())));
+          appendAtomNavigationLink(writer, createSelfLink(targetEntityInfo, 
navigationKeyMap, null), entry.getKey(),
+              null, eia, data);
+        }
+      }
+    }
+  }
+
   private void appendCustomProperties(final XMLStreamWriter writer, final 
EntityInfoAggregator eia,
       final Map<String, Object> data) throws EntityProviderException {
     List<String> noneSyndicationTargetPaths = 
eia.getNoneSyndicationTargetPathNames();
@@ -320,19 +350,17 @@ public class AtomEntryEntityProducer {
   private void appendAtomContentLink(final XMLStreamWriter writer, final 
EntityInfoAggregator eia,
       final Map<String, Object> data, final String selfLink) throws 
EntityProviderException, EdmException {
     try {
-      String mediaResourceMimeType = properties.getMediaResourceMimeType();
-      if (mediaResourceMimeType == null) {
-        EdmMapping entityTypeMapping = eia.getEntityType().getMapping();
-        if (entityTypeMapping != null) {
-          String mediaResourceMimeTypeKey = 
entityTypeMapping.getMediaResourceMimeTypeKey();
-          if (mediaResourceMimeTypeKey != null) {
-            mediaResourceMimeType = (String) 
data.get(mediaResourceMimeTypeKey);
-          }
-        }
-        if (mediaResourceMimeType == null) {
-          mediaResourceMimeType = 
ContentType.APPLICATION_OCTET_STREAM.toString();
+      String mediaResourceMimeType = null;
+      EdmMapping entityTypeMapping = eia.getEntityType().getMapping();
+      if (entityTypeMapping != null) {
+        String mediaResourceMimeTypeKey = 
entityTypeMapping.getMediaResourceMimeTypeKey();
+        if (mediaResourceMimeTypeKey != null) {
+          mediaResourceMimeType = (String) data.get(mediaResourceMimeTypeKey);
         }
       }
+      if (mediaResourceMimeType == null) {
+        mediaResourceMimeType = 
ContentType.APPLICATION_OCTET_STREAM.toString();
+      }
 
       writer.writeStartElement(FormatXml.ATOM_LINK);
       writer.writeAttribute(FormatXml.ATOM_HREF, selfLink + "/$value");
@@ -348,10 +376,9 @@ public class AtomEntryEntityProducer {
       final Map<String, Object> data, final String selfLink) throws 
EntityProviderException, EdmException {
     try {
 
-      // We have to support the media resource mime type at the properties 
till version 1.2 then this can be refactored
-      String mediaResourceMimeType = properties.getMediaResourceMimeType();
       EdmMapping entityTypeMapping = eia.getEntityType().getMapping();
       String self = null;
+      String mediaResourceMimeType = null;
 
       if (entityTypeMapping != null) {
         String mediaResourceSourceKey = 
entityTypeMapping.getMediaResourceSourceKey();
@@ -361,22 +388,16 @@ public class AtomEntryEntityProducer {
         if (self == null) {
           self = selfLink + "/$value";
         }
-        if (mediaResourceMimeType == null) {
-          String mediaResourceMimeTypeKey =
-              entityTypeMapping.getMimeType() != null ? 
entityTypeMapping.getMimeType()
-                  : entityTypeMapping.getMediaResourceMimeTypeKey();
-          if (mediaResourceMimeTypeKey != null) {
-            mediaResourceMimeType = (String) 
data.get(mediaResourceMimeTypeKey);
-          }
-          if (mediaResourceMimeType == null) {
-            mediaResourceMimeType = 
ContentType.APPLICATION_OCTET_STREAM.toString();
-          }
+        String mediaResourceMimeTypeKey = 
entityTypeMapping.getMediaResourceMimeTypeKey();
+        if (mediaResourceMimeTypeKey != null) {
+          mediaResourceMimeType = (String) data.get(mediaResourceMimeTypeKey);
         }
-      } else {
-        self = selfLink + "/$value";
         if (mediaResourceMimeType == null) {
           mediaResourceMimeType = 
ContentType.APPLICATION_OCTET_STREAM.toString();
         }
+      } else {
+        self = selfLink + "/$value";
+        mediaResourceMimeType = 
ContentType.APPLICATION_OCTET_STREAM.toString();
       }
 
       writer.writeStartElement(FormatXml.ATOM_CONTENT);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/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 8ad5d42..ab2daf8 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
@@ -23,6 +23,7 @@ import java.io.Writer;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
 import org.apache.olingo.odata2.api.ODataCallback;
 import org.apache.olingo.odata2.api.edm.Edm;
@@ -70,21 +71,27 @@ public class JsonEntryEntityProducer {
 
     try {
       jsonStreamWriter = new JsonStreamWriter(writer);
-      if (isRootElement) {
+      if (isRootElement && !properties.isOmitJsonWrapper()) {
         jsonStreamWriter.beginObject().name(FormatJson.D);
       }
 
       jsonStreamWriter.beginObject();
 
-      writeMetadata(entityInfo, data, type);
+      if (!properties.isContentOnly()) {
+        writeMetadata(entityInfo, data, type);
+      }
 
       writeProperties(entityInfo, data, type);
 
-      writeNavigationProperties(writer, entityInfo, data, type);
+      if (!properties.isContentOnly()) {
+        writeNavigationProperties(writer, entityInfo, data, type);
+      } else {
+        writeAdditonalLinksInContentOnlyCase(entityInfo);
+      }
 
       jsonStreamWriter.endObject();
 
-      if (isRootElement) {
+      if (isRootElement && !properties.isOmitJsonWrapper()) {
         jsonStreamWriter.endObject();
       }
 
@@ -173,9 +180,17 @@ public class JsonEntryEntityProducer {
 
   private void writeProperties(final EntityInfoAggregator entityInfo, final 
Map<String, Object> data,
       final EdmEntityType type) throws EdmException, EntityProviderException, 
IOException {
+    boolean omitComma = false;
+    if (properties.isContentOnly()) {
+      omitComma = true;
+    }
     for (final String propertyName : type.getPropertyNames()) {
       if (entityInfo.getSelectedPropertyNames().contains(propertyName)) {
-        jsonStreamWriter.separator();
+        if (omitComma == true) {
+          omitComma = false;
+        } else {
+          jsonStreamWriter.separator();
+        }
         jsonStreamWriter.name(propertyName);
         JsonPropertyEntityProducer.appendPropertyValue(jsonStreamWriter, 
entityInfo.getPropertyInfo(propertyName),
             data.get(propertyName));
@@ -202,9 +217,8 @@ public class JsonEntryEntityProducer {
     if (type.hasStream()) {
       jsonStreamWriter.separator();
 
-      // We have to support the media resource mime type at the properties 
till version 1.2 then this can be refactored
-      String mediaResourceMimeType = properties.getMediaResourceMimeType();
       EdmMapping entityTypeMapping = entityInfo.getEntityType().getMapping();
+      String mediaResourceMimeType = null;
       String mediaSrc = null;
 
       if (entityTypeMapping != null) {
@@ -215,19 +229,16 @@ public class JsonEntryEntityProducer {
         if (mediaSrc == null) {
           mediaSrc = self + "/$value";
         }
-        if (mediaResourceMimeType == null) {
-          mediaResourceMimeType =
-              entityTypeMapping.getMimeType() != null ? (String) 
data.get(entityTypeMapping.getMimeType())
-                  : (String) 
data.get(entityTypeMapping.getMediaResourceMimeTypeKey());
-          if (mediaResourceMimeType == null) {
-            mediaResourceMimeType = 
ContentType.APPLICATION_OCTET_STREAM.toString();
-          }
+        String mediaResourceMimeTypeKey = 
entityTypeMapping.getMediaResourceMimeTypeKey();
+        if (mediaResourceMimeTypeKey != null) {
+          mediaResourceMimeType = (String) data.get(mediaResourceMimeTypeKey);
         }
-      } else {
-        mediaSrc = self + "/$value";
         if (mediaResourceMimeType == null) {
           mediaResourceMimeType = 
ContentType.APPLICATION_OCTET_STREAM.toString();
         }
+      } else {
+        mediaSrc = self + "/$value";
+        mediaResourceMimeType = 
ContentType.APPLICATION_OCTET_STREAM.toString();
       }
 
       jsonStreamWriter.namedStringValueRaw(FormatJson.CONTENT_TYPE, 
mediaResourceMimeType);
@@ -250,16 +261,42 @@ public class JsonEntryEntityProducer {
     if (key == null || key.isEmpty()) {
       target = location + "/" + Encoder.encode(navigationPropertyName);
     } else {
-      final EntityInfoAggregator targetEntityInfo = 
EntityInfoAggregator.create(
-          entityInfo.getEntitySet().getRelatedEntitySet(
-              (EdmNavigationProperty) 
entityInfo.getEntityType().getProperty(navigationPropertyName)));
-      target = (properties.getServiceRoot() == null ? "" : 
properties.getServiceRoot().toASCIIString())
-          + AtomEntryEntityProducer.createSelfLink(targetEntityInfo, key, 
null);
+      target = createCustomTargetLink(entityInfo, navigationPropertyName, key);
     }
     JsonLinkEntityProducer.appendUri(jsonStreamWriter, target);
     jsonStreamWriter.endObject();
   }
 
+  private String createCustomTargetLink(final EntityInfoAggregator entityInfo, 
final String navigationPropertyName,
+      final Map<String, Object> key) throws EntityProviderException, 
EdmException {
+    String target;
+    final EntityInfoAggregator targetEntityInfo = EntityInfoAggregator.create(
+        entityInfo.getEntitySet().getRelatedEntitySet(
+            (EdmNavigationProperty) 
entityInfo.getEntityType().getProperty(navigationPropertyName)));
+    target = (properties.getServiceRoot() == null ? "" : 
properties.getServiceRoot().toASCIIString())
+        + AtomEntryEntityProducer.createSelfLink(targetEntityInfo, key, null);
+    return target;
+  }
+
+  private void writeAdditonalLinksInContentOnlyCase(final EntityInfoAggregator 
entityInfo)
+      throws IOException, EntityProviderException, EdmException {
+    final Map<String, Map<String, Object>> links = 
properties.getAdditionalLinks();
+    if (links != null && !links.isEmpty()) {
+      for (Entry<String, Map<String, Object>> entry : links.entrySet()) {
+        Map<String, Object> navigationKeyMap = entry.getValue();
+        if (navigationKeyMap != null && !navigationKeyMap.isEmpty()) {
+          String target = createCustomTargetLink(entityInfo, entry.getKey(), 
navigationKeyMap);
+          jsonStreamWriter.separator();
+          jsonStreamWriter.name(entry.getKey());
+          jsonStreamWriter.beginObject()
+              .name(FormatJson.DEFERRED);
+          JsonLinkEntityProducer.appendUri(jsonStreamWriter, target);
+          jsonStreamWriter.endObject();
+        }
+      }
+    }
+  }
+
   public String getETag() {
     return eTag;
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlPropertyEntityProducer.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlPropertyEntityProducer.java
 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlPropertyEntityProducer.java
index 7f05942..5439925 100644
--- 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlPropertyEntityProducer.java
+++ 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlPropertyEntityProducer.java
@@ -182,8 +182,8 @@ public class XmlPropertyEntityProducer {
     String mimeType = null;
     if (prop.getMimeType() != null) {
       mimeType = prop.getMimeType();
-    } else if (prop.getMapping() != null && prop.getMapping().getMimeType() != 
null) {
-      mimeType = (String) extractChildValue(value, 
prop.getMapping().getMimeType());
+    } else if (prop.getMapping() != null && 
prop.getMapping().getMediaResourceMimeTypeKey() != null) {
+      mimeType = (String) extractChildValue(value, 
prop.getMapping().getMediaResourceMimeTypeKey());
       contentValue = extractChildValue(value, prop.getName());
     }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataExceptionMapperImpl.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataExceptionMapperImpl.java
 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataExceptionMapperImpl.java
index 5f7d059..b5dd749 100644
--- 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataExceptionMapperImpl.java
+++ 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataExceptionMapperImpl.java
@@ -25,7 +25,6 @@ import java.util.Set;
 
 import javax.servlet.ServletConfig;
 import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.NotAllowedException;
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.Application;
 import javax.ws.rs.core.Context;
@@ -93,8 +92,7 @@ public class ODataExceptionMapperImpl implements 
ExceptionMapper<Exception> {
 
     ODataExceptionWrapper exceptionWrapper =
         new ODataExceptionWrapper(uriInfo, httpHeaders, 
getErrorHandlerCallback());
-    ODataResponse oDataResponse = 
exceptionWrapper.wrapInExceptionResponse(exception);
-    return oDataResponse;
+    return exceptionWrapper.wrapInExceptionResponse(exception);
   }
 
   private ODataResponse handleWebApplicationException(final Exception 
exception) throws ClassNotFoundException,
@@ -132,8 +130,9 @@ public class ODataExceptionMapperImpl implements 
ExceptionMapper<Exception> {
     context.setErrorCode(null);
     context.setMessage(exception.getMessage());
     context.setLocale(DEFAULT_RESPONSE_LOCALE);
-    
context.setHttpStatus(HttpStatusCodes.fromStatusCode(exception.getResponse().getStatus()));
-    if (exception instanceof NotAllowedException) {
+    HttpStatusCodes statusCode = 
HttpStatusCodes.fromStatusCode(exception.getResponse().getStatus());
+    context.setHttpStatus(statusCode);
+    if (statusCode == HttpStatusCodes.METHOD_NOT_ALLOWED) {
       // RFC 2616, 5.1.1: " An origin server SHOULD return the status code
       // 405 (Method Not Allowed) if the method is known by the origin server
       // but not allowed for the requested resource, and 501 (Not Implemented)
@@ -194,10 +193,8 @@ public class ODataExceptionMapperImpl implements 
ExceptionMapper<Exception> {
   }
 
   private ODataErrorCallback getErrorHandlerCallback() {
-    ODataErrorCallback callback = null;
     final ODataServiceFactory serviceFactory =
         ODataRootLocator.createServiceFactoryFromContext(app, servletRequest, 
servletConfig);
-    callback = serviceFactory.getCallback(ODataErrorCallback.class);
-    return callback;
+    return serviceFactory.getCallback(ODataErrorCallback.class);
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java
 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java
index dbe2935..5078e4b 100644
--- 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java
+++ 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java
@@ -128,7 +128,7 @@ public class ODataServlet extends HttpServlet {
     } else if (HTTP_METHOD_HEAD.equals(method) || 
HTTP_METHOD_OPTIONS.equals(method)) {
       createNotImplementedResponse(req, ODataNotImplementedException.COMMON, 
resp);
     } else {
-      createMethodNotAllowedResponse(req, ODataHttpException.COMMON, resp);
+      createNotImplementedResponse(req, ODataHttpException.COMMON, resp);
     }
   }
 
@@ -149,7 +149,7 @@ public class ODataServlet extends HttpServlet {
     } else if (HTTP_METHOD_HEAD.equals(xHttpMethod) || 
HTTP_METHOD_OPTIONS.equals(xHttpMethod)) {
       createNotImplementedResponse(req, ODataNotImplementedException.COMMON, 
resp);
     } else {
-      return false;
+      createNotImplementedResponse(req, ODataNotImplementedException.COMMON, 
resp);
     }
     return true;
   }
@@ -197,15 +197,29 @@ public class ODataServlet extends HttpServlet {
         HTTP_METHOD_HEAD.equals(method) ||
         HTTP_METHOD_OPTIONS.equals(method)) {
       ODataResponse odataResponse = 
ODataResponse.status(HttpStatusCodes.TEMPORARY_REDIRECT)
-          .header(HttpHeaders.LOCATION, "/")
+          .header(HttpHeaders.LOCATION, createLocation(req))
           .build();
       createResponse(resp, odataResponse);
     } else {
-      createMethodNotAllowedResponse(req, ODataHttpException.COMMON, resp);
+      createNotImplementedResponse(req, ODataHttpException.COMMON, resp);
     }
 
   }
 
+  private String createLocation(final HttpServletRequest req) {
+    StringBuilder location = new StringBuilder();
+    String contextPath = req.getContextPath();
+    if (contextPath != null) {
+      location.append(contextPath);
+    }
+    String servletPath = req.getServletPath();
+    if (servletPath != null) {
+      location.append(servletPath);
+    }
+    location.append("/");
+    return location.toString();
+  }
+
   private void createResponse(final HttpServletResponse resp, final 
ODataResponse response) throws IOException {
     resp.setStatus(response.getStatus().getStatusCode());
     resp.setContentType(response.getContentHeader());
@@ -239,6 +253,7 @@ public class ODataServlet extends HttpServlet {
     ODataExceptionWrapper exceptionWrapper = new ODataExceptionWrapper(req);
     ODataResponse response =
         exceptionWrapper.wrapInExceptionResponse(new 
ODataNotImplementedException(messageReference));
+//    resp.setStatus(HttpStatusCodes.NOT_IMPLEMENTED.getStatusCode());
     createResponse(resp, response);
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/RestUtil.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/RestUtil.java
 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/RestUtil.java
index e5b5555..36a1f65 100644
--- 
a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/RestUtil.java
+++ 
b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/RestUtil.java
@@ -269,6 +269,7 @@ public class RestUtil {
       if (index < 0) {
         odataSegments.add(new ODataPathSegmentImpl(segment, null));
       } else {
+        // post condition: we do not allow matrix parameters in OData path 
segments
         String path = segment.substring(0, index);
         Map<String, List<String>> parameterMap = 
extractMatrixParameter(segment, index);
         throw new 
ODataNotFoundException(ODataNotFoundException.MATRIX.addContent(parameterMap.keySet(),
 path));

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/main/resources/i18n_en.properties
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/resources/i18n_en.properties 
b/odata2-lib/odata-core/src/main/resources/i18n_en.properties
index d6d0654..564dfef 100644
--- a/odata2-lib/odata-core/src/main/resources/i18n_en.properties
+++ b/odata2-lib/odata-core/src/main/resources/i18n_en.properties
@@ -107,7 +107,7 @@ 
org.apache.olingo.odata2.api.exception.ODataBadRequestException.AMBIGUOUS_XMETHO
 
 org.apache.olingo.odata2.api.exception.ODataForbiddenException.COMMON=Forbidden
 
-org.apache.olingo.odata2.api.exception.ODataNotFoundException.MATRIX=Matrix 
parameter '%1$s' with path segment '%2$s' not found!
+org.apache.olingo.odata2.api.exception.ODataNotFoundException.MATRIX=Matrix 
parameter '%1$s' in path segment '%2$s' not supported!
 org.apache.olingo.odata2.api.exception.ODataNotFoundException.ENTITY=Requested 
entity could not be found.
 
 
org.apache.olingo.odata2.api.exception.ODataMethodNotAllowedException.DISPATCH=The
 request dispatcher does not allow the HTTP method used for the request.

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataRequestTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataRequestTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataRequestTest.java
new file mode 100644
index 0000000..673641d
--- /dev/null
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataRequestTest.java
@@ -0,0 +1,77 @@
+/*
+ * 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.odata2.core;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.olingo.odata2.api.processor.ODataRequest;
+import org.junit.Test;
+
+public class ODataRequestTest {
+
+  @Test
+  public void testInsensitveHeaders() {
+
+    Map<String, List<String>> headers = new HashMap<String, List<String>>();
+
+    headers.put("lower", Arrays.asList("lower"));
+    headers.put("UPPER", Arrays.asList("UPPER"));
+    headers.put("mIxEd", Arrays.asList("mIxEd"));
+
+    ODataRequest r1 = ODataRequest.requestHeaders(headers).build();
+    verifyHeader(r1);
+
+    ODataRequest r2 = ODataRequest.fromRequest(r1).build();
+    verifyHeader(r2);
+
+  }
+
+  void verifyHeader(final ODataRequest r) {
+    assertEquals("lower", r.getRequestHeaderValue("lower"));
+    assertEquals("lower", r.getRequestHeaderValue("LOWER"));
+    assertEquals("lower", r.getRequestHeaderValue("Lower"));
+
+    assertEquals("UPPER", r.getRequestHeaderValue("upper"));
+    assertEquals("UPPER", r.getRequestHeaderValue("UPPER"));
+    assertEquals("UPPER", r.getRequestHeaderValue("Upper"));
+
+    assertEquals("mIxEd", r.getRequestHeaderValue("mixed"));
+    assertEquals("mIxEd", r.getRequestHeaderValue("MIXED"));
+    assertEquals("mIxEd", r.getRequestHeaderValue("mIxEd"));
+
+    Map<String, List<String>> map = r.getRequestHeaders();
+
+    assertEquals("lower", map.get("lower").get(0));
+    assertEquals("lower", map.get("LOWER").get(0));
+    assertEquals("lower", map.get("Lower").get(0));
+
+    assertEquals("UPPER", map.get("upper").get(0));
+    assertEquals("UPPER", map.get("UPPER").get(0));
+    assertEquals("UPPER", map.get("Upper").get(0));
+
+    assertEquals("mIxEd", map.get("mixed").get(0));
+    assertEquals("mIxEd", map.get("MIXED").get(0));
+    assertEquals("mIxEd", map.get("mIxEd").get(0));
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataResponseTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataResponseTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataResponseTest.java
index fb20afc..19cd6ed 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataResponseTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataResponseTest.java
@@ -20,15 +20,18 @@ package org.apache.olingo.odata2.core;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.ByteArrayInputStream;
 import java.util.Arrays;
 import java.util.HashSet;
 
 import org.apache.olingo.odata2.api.commons.HttpContentType;
 import org.apache.olingo.odata2.api.commons.HttpHeaders;
 import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
+import org.apache.olingo.odata2.api.exception.ODataException;
 import org.apache.olingo.odata2.api.processor.ODataResponse;
 import org.apache.olingo.odata2.testutil.fit.BaseTest;
 import org.junit.Test;
@@ -52,6 +55,20 @@ public class ODataResponseTest extends BaseTest {
   }
 
   @Test
+  public void buildEntityAsStreamResponseTest() throws ODataException {
+    ODataResponse response = ODataResponse.entity(new 
ByteArrayInputStream("abc".getBytes())).build();
+    assertNull(response.getStatus());
+    assertNotNull(response.getEntityAsStream());
+  }
+
+  @Test(expected = ODataException.class)
+  public void buildEntityAsStreamResponseFailTest() throws ODataException {
+    ODataResponse response = ODataResponse.entity("abc").build();
+    assertNull(response.getStatus());
+    assertNotNull(response.getEntityAsStream());
+  }
+
+  @Test
   public void buildHeaderResponseTest() {
     ODataResponse response = ODataResponse
         .header("abc", "123")

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java
index b3f41a0..ca6b655 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java
@@ -18,16 +18,9 @@
  
******************************************************************************/
 package org.apache.olingo.odata2.core.batch;
 
-import org.apache.olingo.odata2.api.batch.BatchException;
-import org.apache.olingo.odata2.api.batch.BatchRequestPart;
-import org.apache.olingo.odata2.api.client.batch.BatchChangeSet;
-import org.apache.olingo.odata2.api.client.batch.BatchChangeSetPart;
-import org.apache.olingo.odata2.api.client.batch.BatchPart;
-import org.apache.olingo.odata2.api.client.batch.BatchQueryPart;
-import org.apache.olingo.odata2.api.ep.EntityProviderBatchProperties;
-import org.apache.olingo.odata2.core.PathInfoImpl;
-import org.apache.olingo.odata2.testutil.helper.StringHelper;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -38,9 +31,16 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import org.apache.olingo.odata2.api.batch.BatchException;
+import org.apache.olingo.odata2.api.batch.BatchRequestPart;
+import org.apache.olingo.odata2.api.client.batch.BatchChangeSet;
+import org.apache.olingo.odata2.api.client.batch.BatchChangeSetPart;
+import org.apache.olingo.odata2.api.client.batch.BatchPart;
+import org.apache.olingo.odata2.api.client.batch.BatchQueryPart;
+import org.apache.olingo.odata2.api.ep.EntityProviderBatchProperties;
+import org.apache.olingo.odata2.core.PathInfoImpl;
+import org.apache.olingo.odata2.testutil.helper.StringHelper;
+import org.junit.Test;
 
 /**
  * Test creation of a batch request with BatchRequestWriter and

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java
index 89bdea3..051e1da 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java
@@ -18,13 +18,9 @@
  
******************************************************************************/
 package org.apache.olingo.odata2.core.batch;
 
-import org.apache.olingo.odata2.api.batch.BatchException;
-import org.apache.olingo.odata2.api.client.batch.BatchChangeSet;
-import org.apache.olingo.odata2.api.client.batch.BatchChangeSetPart;
-import org.apache.olingo.odata2.api.client.batch.BatchPart;
-import org.apache.olingo.odata2.api.client.batch.BatchQueryPart;
-import org.apache.olingo.odata2.testutil.helper.StringHelper;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -33,9 +29,13 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import org.apache.olingo.odata2.api.batch.BatchException;
+import org.apache.olingo.odata2.api.client.batch.BatchChangeSet;
+import org.apache.olingo.odata2.api.client.batch.BatchChangeSetPart;
+import org.apache.olingo.odata2.api.client.batch.BatchPart;
+import org.apache.olingo.odata2.api.client.batch.BatchQueryPart;
+import org.apache.olingo.odata2.testutil.helper.StringHelper;
+import org.junit.Test;
 
 public class BatchRequestWriterTest {
 

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java
index c438a0f..f5f05ff 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java
@@ -18,6 +18,16 @@
  
******************************************************************************/
 package org.apache.olingo.odata2.core.batch;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.olingo.odata2.api.batch.BatchException;
 import org.apache.olingo.odata2.api.batch.BatchResponsePart;
 import org.apache.olingo.odata2.api.client.batch.BatchSingleResponse;
@@ -26,13 +36,6 @@ import org.apache.olingo.odata2.api.processor.ODataResponse;
 import org.apache.olingo.odata2.testutil.helper.StringHelper;
 import org.junit.Test;
 
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.junit.Assert.*;
-
 /**
  * Test creation of a batch response with BatchResponseWriter and
  * then parsing this response again with BatchResponseParser.

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/EdmSimpleTypeTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/EdmSimpleTypeTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/EdmSimpleTypeTest.java
index 9a80bce..7ddb197 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/EdmSimpleTypeTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/EdmSimpleTypeTest.java
@@ -1042,6 +1042,10 @@ public class EdmSimpleTypeTest extends BaseTest {
         getMaxLengthFacets(2), byte[].class)));
     assertTrue(Arrays.equals(binary, 
instance.valueOfString("qrvM\r\n3e7/\r\n", EdmLiteralKind.DEFAULT,
         getMaxLengthFacets(6), byte[].class)));
+    assertTrue(Arrays.equals(binary, instance.valueOfString("\nqrvM3e7/", 
EdmLiteralKind.DEFAULT,
+        getMaxLengthFacets(6), byte[].class)));
+    assertTrue(Arrays.equals(binary, instance.valueOfString("qrvM\n3e7/", 
EdmLiteralKind.DEFAULT,
+        getMaxLengthFacets(6), byte[].class)));
     assertTrue(Arrays.equals(binary, instance.valueOfString("qrvM3e7/", 
EdmLiteralKind.DEFAULT,
         getMaxLengthFacets(Integer.MAX_VALUE), byte[].class)));
     assertTrue(Arrays.equals(binary, instance.valueOfString("X'AABBCCDDEEFF'", 
EdmLiteralKind.URI,
@@ -1053,11 +1057,13 @@ public class EdmSimpleTypeTest extends BaseTest {
     assertTrue(Arrays.equals(binary, instance.valueOfString("X'AABBCCDDEEFF'", 
EdmLiteralKind.URI,
         getMaxLengthFacets(null), byte[].class)));
 
-    expectErrorInValueOfString(instance, "qrvM3e7/", EdmLiteralKind.DEFAULT, 
getMaxLengthFacets(3),
+    expectErrorInValueOfString(instance, "qrvM3e7/", EdmLiteralKind.DEFAULT, 
getMaxLengthFacets(5),
+        EdmSimpleTypeException.LITERAL_FACETS_NOT_MATCHED);
+    expectErrorInValueOfString(instance, "qrvM3e7/", EdmLiteralKind.JSON, 
getMaxLengthFacets(5),
         EdmSimpleTypeException.LITERAL_FACETS_NOT_MATCHED);
-    expectErrorInValueOfString(instance, "qrvM3e7/", EdmLiteralKind.JSON, 
getMaxLengthFacets(3),
+    expectErrorInValueOfString(instance, "binary'AABBCCDDEEFF'", 
EdmLiteralKind.URI, getMaxLengthFacets(5),
         EdmSimpleTypeException.LITERAL_FACETS_NOT_MATCHED);
-    expectErrorInValueOfString(instance, "binary'AABBCCDDEEFF'", 
EdmLiteralKind.URI, getMaxLengthFacets(3),
+    expectErrorInValueOfString(instance, "qrvM3e7/\r", EdmLiteralKind.DEFAULT, 
getMaxLengthFacets(6),
         EdmSimpleTypeException.LITERAL_FACETS_NOT_MATCHED);
 
     expectErrorInValueOfString(instance, "@", EdmLiteralKind.DEFAULT, null,

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmAssociationImplProvTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmAssociationImplProvTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmAssociationImplProvTest.java
index b1dc084..7cde2cb 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmAssociationImplProvTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmAssociationImplProvTest.java
@@ -100,9 +100,15 @@ public class EdmAssociationImplProvTest extends BaseTest {
 
   @Test
   public void testReferentialConstraint() throws EdmException {
-    EdmAssociation association = associationProv;
-    assertEquals("end1Role", 
association.getReferentialConstraint().getDependent().getRole());
-    assertEquals("end2Role", 
association.getReferentialConstraint().getPrincipal().getRole());
+    assertEquals("end1Role", 
associationProv.getReferentialConstraint().getDependent().getRole());
+    assertEquals("end2Role", 
associationProv.getReferentialConstraint().getPrincipal().getRole());
+  }
+
+  @Test
+  public void testReferentialConstraintNull() throws EdmException {
+    Association association = new Association().setName("association");
+    EdmAssociation edmAssociation = new EdmAssociationImplProv(null, 
association, "ns");
+    assertNull(edmAssociation.getReferentialConstraint());
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmFunctionImportImplProvTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmFunctionImportImplProvTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmFunctionImportImplProvTest.java
index 69e1b11..84cab5e 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmFunctionImportImplProvTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmFunctionImportImplProvTest.java
@@ -91,7 +91,6 @@ public class EdmFunctionImportImplProvTest extends BaseTest {
     when(edmProvider.getFunctionImport("Container", 
"bar")).thenReturn(functionImportBar);
     edmFunctionImportWithoutParameters =
         new EdmFunctionImportImplProv(edmImplProv, functionImportBar, 
edmEntityContainer);
-
   }
 
   @Test
@@ -160,6 +159,11 @@ public class EdmFunctionImportImplProvTest extends 
BaseTest {
   }
 
   @Test
+  public void nulllReturnType() throws Exception {
+    assertNull(edmFunctionImportWithoutParameters.getReturnType());
+  }
+
+  @Test
   public void parameterAnnotations() throws Exception {
     EdmParameter parameter = edmFunctionImport.getParameter("fooParameter1");
     assertNotNull(parameter);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmMappingTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmMappingTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmMappingTest.java
index 62da2e7..7f8757d 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmMappingTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmMappingTest.java
@@ -47,8 +47,7 @@ public class EdmMappingTest extends BaseTest {
 
     mappedObject = new EdmMappingTest();
 
-    Mapping propertySimpleMapping =
-        new 
Mapping().setMimeType("mimeType").setInternalName("value").setObject(mappedObject);
+    Mapping propertySimpleMapping = new 
Mapping().setInternalName("value").setObject(mappedObject);
     CustomizableFeedMappings propertySimpleFeedMappings = new 
CustomizableFeedMappings().setFcKeepInContent(true);
     SimpleProperty propertySimple =
         new 
SimpleProperty().setName("PropertyName").setType(EdmSimpleTypeKind.String)
@@ -67,7 +66,6 @@ public class EdmMappingTest extends BaseTest {
     EdmMapping mapping = propertySimpleProvider.getMapping();
     assertNotNull(mapping);
     assertEquals("value", mapping.getInternalName());
-    assertEquals("mimeType", mapping.getMimeType());
     assertEquals(mappedObject, mapping.getObject());
   }
 
@@ -76,7 +74,6 @@ public class EdmMappingTest extends BaseTest {
     EdmMapping mapping = navPropertyProvider.getMapping();
     assertNotNull(mapping);
     assertEquals("value", mapping.getInternalName());
-    assertEquals("mimeType", mapping.getMimeType());
     assertEquals(mappedObject, mapping.getObject());
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmPropertyImplProvTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmPropertyImplProvTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmPropertyImplProvTest.java
index 79ef3a6..c9348df 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmPropertyImplProvTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmPropertyImplProvTest.java
@@ -59,7 +59,7 @@ public class EdmPropertyImplProvTest extends BaseTest {
     edmProvider = mock(EdmProvider.class);
     EdmImplProv edmImplProv = new EdmImplProv(edmProvider);
 
-    Mapping propertySimpleMapping = new 
Mapping().setMimeType("mimeType2").setInternalName("value");
+    Mapping propertySimpleMapping = new Mapping().setInternalName("value");
     CustomizableFeedMappings propertySimpleFeedMappings = new 
CustomizableFeedMappings().setFcKeepInContent(true);
     SimpleProperty propertySimple =
         new 
SimpleProperty().setName("PropertyName").setType(EdmSimpleTypeKind.String)
@@ -94,7 +94,6 @@ public class EdmPropertyImplProvTest extends BaseTest {
     
assertEquals(EdmSimpleTypeFacadeImpl.getEdmSimpleType(EdmSimpleTypeKind.String),
 propertySimpleProvider.getType());
     assertEquals("mimeType", propertySimpleProvider.getMimeType());
     assertNotNull(propertySimpleProvider.getMapping());
-    assertEquals("mimeType2", 
propertySimpleProvider.getMapping().getMimeType());
     assertNotNull(propertySimpleProvider.getCustomizableFeedMappings());
     assertEquals("value", 
propertySimpleProvider.getMapping().getInternalName());
     assertNull(propertySimpleProvider.getFacets());

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/AbstractProviderTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/AbstractProviderTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/AbstractProviderTest.java
index 3845675..3c53540 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/AbstractProviderTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/AbstractProviderTest.java
@@ -95,6 +95,7 @@ public abstract class AbstractProviderTest extends 
AbstractXmlProducerTestHelper
     employeeData.put("EntryDate", date);
     employeeData.put("TeamId", "42");
     employeeData.put("EmployeeName", "Walter Winter");
+    // employeeData.put("getImageType", "abc");
 
     Map<String, Object> locationData = new HashMap<String, Object>();
     Map<String, Object> cityData = new HashMap<String, Object>();

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/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 3b0d5ab..94f6650 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
@@ -69,34 +69,26 @@ public class ODataEntityProviderPropertiesTest extends 
BaseTest {
         .expandSelectTree(expandSelectTree)
         .inlineCount(1)
         .inlineCountType(InlineCount.ALLPAGES)
-        .mediaResourceMimeType("image/png")
         .nextLink("http://localhost";)
         .selfLink(selfLink)
         .includeSimplePropertyType(true)
         .additionalLinks(links)
+        .omitJsonWrapper(true)
+        .contentOnly(true)
         .build();
 
     assertEquals("Wrong amount of callbacks.", 1, 
properties.getCallbacks().size());
     assertTrue("No callback found.", 
properties.getCallbacks().containsKey("aCallback"));
     assertEquals("Wrong expand select tree.", expandSelectTree, 
properties.getExpandSelectTree());
     assertEquals("Wrong self link.", selfLink, properties.getSelfLink());
-    assertEquals("Wrong media resource mime type.", "image/png", 
properties.getMediaResourceMimeType());
     assertEquals("Wrong base uri.", "http://localhost:80/";, 
properties.getServiceRoot().toASCIIString());
     assertEquals("Wrong inline count type.", InlineCount.ALLPAGES, 
properties.getInlineCountType());
     assertEquals("Wrong inline count.", Integer.valueOf(1), 
properties.getInlineCount());
     assertEquals("Wrong nextLink", "http://localhost";, 
properties.getNextLink());
     assertTrue("Simple property types should be true", 
properties.isIncludeSimplePropertyType());
     assertEquals(Collections.emptyMap(), 
properties.getAdditionalLinks().get("aNavigationProperty"));
-  }
-
-  @Test
-  public void buildEntryProperties() throws Exception {
-    final String mediaResourceMimeType = "text/html";
-    final URI serviceRoot = new URI("http://localhost:80/";);
-    final EntityProviderWriteProperties properties = 
EntityProviderWriteProperties.serviceRoot(serviceRoot)
-        .mediaResourceMimeType(mediaResourceMimeType)
-        .build();
-    assertEquals("Wrong mime type.", "text/html", 
properties.getMediaResourceMimeType());
+    assertTrue("Json Wrapper should be omitted", 
properties.isOmitJsonWrapper());
+    assertTrue("ContentOnlyFlag should be set", properties.isContentOnly());
   }
 
   @Test
@@ -113,11 +105,12 @@ public class ODataEntityProviderPropertiesTest extends 
BaseTest {
         .expandSelectTree(expandSelectTree)
         .inlineCount(1)
         .inlineCountType(InlineCount.ALLPAGES)
-        .mediaResourceMimeType("image/png")
         .nextLink("http://localhost";)
         .selfLink(selfLink)
         .includeSimplePropertyType(true)
         .additionalLinks(links)
+        .omitJsonWrapper(true)
+        .contentOnly(true)
         .build();
 
     //
@@ -129,12 +122,13 @@ public class ODataEntityProviderPropertiesTest extends 
BaseTest {
     assertTrue(fromProperties.getCallbacks().containsKey("aCallback"));
     assertEquals(expandSelectTree, fromProperties.getExpandSelectTree());
     assertEquals(selfLink, fromProperties.getSelfLink());
-    assertEquals("image/png", fromProperties.getMediaResourceMimeType());
     assertEquals("Wrong base uri.", "http://localhost:80/";, 
fromProperties.getServiceRoot().toASCIIString());
     assertEquals("Wrong inline count type.", InlineCount.ALLPAGES, 
fromProperties.getInlineCountType());
     assertEquals("Wrong inline count.", Integer.valueOf(1), 
fromProperties.getInlineCount());
     assertEquals("Wrong nextLink", "http://localhost";, 
fromProperties.getNextLink());
     assertTrue("Simple property types should be true", 
fromProperties.isIncludeSimplePropertyType());
     assertEquals(Collections.emptyMap(), 
fromProperties.getAdditionalLinks().get("aNavigationProperty"));
+    assertTrue("Json Wrapper should be omitted", 
properties.isOmitJsonWrapper());
+    assertTrue("ContentOnlyFlag should be set", properties.isContentOnly());
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumerTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumerTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumerTest.java
index 0d4a2f4..4836fd3 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumerTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumerTest.java
@@ -33,6 +33,7 @@ import java.util.TimeZone;
 import org.apache.olingo.odata2.api.edm.EdmEntitySet;
 import org.apache.olingo.odata2.api.ep.EntityProviderException;
 import org.apache.olingo.odata2.api.ep.EntityProviderReadProperties;
+import org.apache.olingo.odata2.api.ep.entry.EntryMetadata;
 import org.apache.olingo.odata2.api.ep.entry.MediaMetadata;
 import org.apache.olingo.odata2.api.ep.entry.ODataEntry;
 import org.apache.olingo.odata2.testutil.mock.MockFacade;
@@ -44,6 +45,7 @@ import org.junit.Test;
 public class JsonEntryConsumerTest extends AbstractConsumerTest {
 
   private static final String SIMPLE_ENTRY_BUILDING = "JsonBuilding.json";
+  private static final String SIMPLE_ENTRY_ROOM = "JsonRoom.json";
   private static final String SIMPLE_ENTRY_EMPLOYEE = "JsonEmployee.json";
   private static final String SIMPLE_ENTRY_TEAM = "JsonTeam.json";
   private static final String INVALID_ENTRY_TEAM_DOUBLE_NAME_PROPERTY = 
"JsonInvalidTeamDoubleNameProperty.json";
@@ -53,6 +55,76 @@ public class JsonEntryConsumerTest extends 
AbstractConsumerTest {
   private static final String negativeJsonStart_1 = "{ \"abc\": {";
   private static final String negativeJsonStart_2 = "{ \"d\": [a: 1, b: 2] }";
 
+  @Test
+  public void readContentOnlyEmployee() throws Exception {
+    // prepare
+    String content = readFile("JsonEmployeeContentOnly.json");
+    EdmEntitySet entitySet = 
MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees");
+    InputStream contentBody = createContentAsStream(content);
+
+    // execute
+    JsonEntityConsumer xec = new JsonEntityConsumer();
+    ODataEntry result =
+        xec.readEntry(entitySet, contentBody, 
EntityProviderReadProperties.init().mergeSemantic(true).build());
+
+    // verify
+    assertEquals(9, result.getProperties().size());
+  }
+
+  @Test
+  public void readContentOnlyRoom() throws Exception {
+    // prepare
+    String content = readFile("JsonRoomContentOnly.json");
+    EdmEntitySet entitySet = 
MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms");
+    InputStream contentBody = createContentAsStream(content);
+
+    // execute
+    JsonEntityConsumer xec = new JsonEntityConsumer();
+    ODataEntry result =
+        xec.readEntry(entitySet, contentBody, 
EntityProviderReadProperties.init().mergeSemantic(true).build());
+
+    // verify
+    assertEquals(4, result.getProperties().size());
+  }
+
+  @Test
+  public void readContentOnlyEmployeeWithAdditionalLink() throws Exception {
+    // prepare
+    String content = 
readFile("JsonEmployeeContentOnlyWithAdditionalLink.json");
+    EdmEntitySet entitySet = 
MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees");
+    InputStream contentBody = createContentAsStream(content);
+
+    // execute
+    JsonEntityConsumer xec = new JsonEntityConsumer();
+    ODataEntry result =
+        xec.readEntry(entitySet, contentBody, 
EntityProviderReadProperties.init().mergeSemantic(true).build());
+
+    // verify
+    assertEquals(9, result.getProperties().size());
+    List<String> associationUris = 
result.getMetadata().getAssociationUris("ne_Manager");
+    assertEquals(1, associationUris.size());
+    assertEquals("http://host:8080/ReferenceScenario.svc/Managers('1')", 
associationUris.get(0));
+  }
+
+  @Test
+  public void readContentOnlyRoomWithAdditionalLink() throws Exception {
+    // prepare
+    String content = readFile("JsonRoomContentOnlyWithAdditionalLink.json");
+    EdmEntitySet entitySet = 
MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms");
+    InputStream contentBody = createContentAsStream(content);
+
+    // execute
+    JsonEntityConsumer xec = new JsonEntityConsumer();
+    ODataEntry result =
+        xec.readEntry(entitySet, contentBody, 
EntityProviderReadProperties.init().mergeSemantic(true).build());
+
+    // verify
+    assertEquals(4, result.getProperties().size());
+    List<String> associationUris = 
result.getMetadata().getAssociationUris("nr_Building");
+    assertEquals(1, associationUris.size());
+    assertEquals("http://host:8080/ReferenceScenario.svc/Buildings('1')", 
associationUris.get(0));
+  }
+
   @Test(expected = EntityProviderException.class)
   public void doubleClosingBracketsAtTheEnd() throws Exception {
     String invalidJson = "{ \"Id\" : \"1\", \"Seats\" : 1, \"Version\" : 1}}";
@@ -64,6 +136,31 @@ public class JsonEntryConsumerTest extends 
AbstractConsumerTest {
     xec.readEntry(entitySet, contentBody, DEFAULT_PROPERTIES);
   }
 
+  @Test
+  public void readSimpleRoomEntry() throws Exception {
+    ODataEntry roomEntry = prepareAndExecuteEntry(SIMPLE_ENTRY_ROOM, "Rooms", 
DEFAULT_PROPERTIES);
+
+    // verify
+    Map<String, Object> properties = roomEntry.getProperties();
+    assertEquals(4, properties.size());
+
+    assertEquals("1", properties.get("Id"));
+    assertEquals("Room 1", properties.get("Name"));
+    assertEquals((short) 1, properties.get("Seats"));
+    assertEquals((short) 1, properties.get("Version"));
+
+    List<String> associationUris = 
roomEntry.getMetadata().getAssociationUris("nr_Employees");
+    assertEquals(1, associationUris.size());
+    
assertEquals("http://localhost:8080/ReferenceScenario.svc/Rooms('1')/nr_Employees",
 associationUris.get(0));
+
+    associationUris = 
roomEntry.getMetadata().getAssociationUris("nr_Building");
+    assertEquals(1, associationUris.size());
+    
assertEquals("http://localhost:8080/ReferenceScenario.svc/Rooms('1')/nr_Building",
 associationUris.get(0));
+
+    EntryMetadata metadata = roomEntry.getMetadata();
+    assertEquals("W/\"1\"", metadata.getEtag());
+  }
+
   @SuppressWarnings("unchecked")
   @Test
   public void readSimpleEmployeeEntry() throws Exception {

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java
index 1a057af..e12cb59 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java
@@ -162,6 +162,8 @@ public class JsonEntryDeepInsertEntryTest extends 
AbstractConsumerTest {
     associationUris = 
innerRoom.getMetadata().getAssociationUris("nr_Building");
     assertEquals(Collections.emptyList(), associationUris);
 
+    assertEquals("W/\"1\"", innerRoom.getMetadata().getEtag());
+
     ODataEntry innerBuilding = (ODataEntry) 
innerRoomProperties.get("nr_Building");
     assertNotNull(innerBuilding);
     assertFalse(innerBuilding.containsInlineEntry());

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumerTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumerTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumerTest.java
index 3d9201c..6495b73 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumerTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumerTest.java
@@ -507,6 +507,8 @@ public class JsonFeedConsumerTest extends 
AbstractConsumerTest {
     assertNotNull(feedMetadata);
     
assertEquals("http://localhost:8080/ReferenceScenario.svc/Rooms?!deltatoken=4711";,
 feedMetadata.getDeltaLink());
 
+    assertEquals("W/\"2\"", entries.get(0).getMetadata().getEtag());
+
     List<DeletedEntryMetadata> deletedEntries = feed.getDeletedEntries();
     assertEquals(2, deletedEntries.size());
     for (DeletedEntryMetadata deletedEntry : deletedEntries) {

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java
index 7d51314..cc5ec25 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java
@@ -130,6 +130,12 @@ public class JsonPropertyConsumerTest extends BaseTest {
     
when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Double.getEdmSimpleTypeInstance());
     resultMap = execute(edmProperty, reader);
     assertEquals(Double.valueOf("123456789"), resultMap.get("Name"));
+    // Double without "
+    simplePropertyJson = "{\"d\":{\"Name\":123456789}}";
+    reader = prepareReader(simplePropertyJson);
+    
when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Double.getEdmSimpleTypeInstance());
+    resultMap = execute(edmProperty, reader);
+    assertEquals(Double.valueOf("123456789"), resultMap.get("Name"));
     // Int64
     simplePropertyJson = "{\"d\":{\"Name\":\"123456789\"}}";
     reader = prepareReader(simplePropertyJson);
@@ -142,6 +148,12 @@ public class JsonPropertyConsumerTest extends BaseTest {
     
when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Single.getEdmSimpleTypeInstance());
     resultMap = execute(edmProperty, reader);
     assertEquals(Float.valueOf("123456"), resultMap.get("Name"));
+    // Single without "
+    simplePropertyJson = "{\"d\":{\"Name\":123456}}";
+    reader = prepareReader(simplePropertyJson);
+    
when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Single.getEdmSimpleTypeInstance());
+    resultMap = execute(edmProperty, reader);
+    assertEquals(Float.valueOf("123456"), resultMap.get("Name"));
     // String
     simplePropertyJson = "{\"d\":{\"Name\":\"123456789\"}}";
     reader = prepareReader(simplePropertyJson);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumerTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumerTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumerTest.java
index 59df942..2194619 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumerTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumerTest.java
@@ -433,6 +433,76 @@ public class XmlEntityConsumerTest extends 
AbstractXmlConsumerTest {
   }
 
   @Test
+  public void readContentOnlyEmployee() throws Exception {
+    // prepare
+    String content = readFile("EmployeeContentOnly.xml");
+    EdmEntitySet entitySet = 
MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees");
+    InputStream contentBody = createContentAsStream(content);
+
+    // execute
+    XmlEntityConsumer xec = new XmlEntityConsumer();
+    ODataEntry result =
+        xec.readEntry(entitySet, contentBody, 
EntityProviderReadProperties.init().mergeSemantic(true).build());
+
+    // verify
+    assertEquals(9, result.getProperties().size());
+  }
+
+  @Test
+  public void readContentOnlyRoom() throws Exception {
+    // prepare
+    String content = readFile("RoomContentOnly.xml");
+    EdmEntitySet entitySet = 
MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms");
+    InputStream contentBody = createContentAsStream(content);
+
+    // execute
+    XmlEntityConsumer xec = new XmlEntityConsumer();
+    ODataEntry result =
+        xec.readEntry(entitySet, contentBody, 
EntityProviderReadProperties.init().mergeSemantic(true).build());
+
+    // verify
+    assertEquals(4, result.getProperties().size());
+  }
+
+  @Test
+  public void readContentOnlyEmployeeWithAdditionalLink() throws Exception {
+    // prepare
+    String content = readFile("EmployeeContentOnlyWithAdditionalLink.xml");
+    EdmEntitySet entitySet = 
MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees");
+    InputStream contentBody = createContentAsStream(content);
+
+    // execute
+    XmlEntityConsumer xec = new XmlEntityConsumer();
+    ODataEntry result =
+        xec.readEntry(entitySet, contentBody, 
EntityProviderReadProperties.init().mergeSemantic(true).build());
+
+    // verify
+    assertEquals(9, result.getProperties().size());
+    List<String> associationUris = 
result.getMetadata().getAssociationUris("ne_Manager");
+    assertEquals(1, associationUris.size());
+    assertEquals("Managers('1')", associationUris.get(0));
+  }
+
+  @Test
+  public void readContentOnlyRoomWithAdditionalLink() throws Exception {
+    // prepare
+    String content = readFile("RoomContentOnlyWithAdditionalLink.xml");
+    EdmEntitySet entitySet = 
MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms");
+    InputStream contentBody = createContentAsStream(content);
+
+    // execute
+    XmlEntityConsumer xec = new XmlEntityConsumer();
+    ODataEntry result =
+        xec.readEntry(entitySet, contentBody, 
EntityProviderReadProperties.init().mergeSemantic(true).build());
+
+    // verify
+    assertEquals(4, result.getProperties().size());
+    List<String> associationUris = 
result.getMetadata().getAssociationUris("nr_Building");
+    assertEquals(1, associationUris.size());
+    assertEquals("Buildings('1')", associationUris.get(0));
+  }
+
+  @Test
   public void readDeltaLink() throws Exception {
     // prepare
     String content = readFile("feed_with_delta_link.xml");
@@ -804,14 +874,19 @@ public class XmlEntityConsumerTest extends 
AbstractXmlConsumerTest {
 
     // execute
     XmlEntityConsumer xec = new XmlEntityConsumer();
-    ODataEntry entry =
+    ODataEntry employee =
         xec.readEntry(entitySet, reqContent, 
EntityProviderReadProperties.init().mergeSemantic(true).build());
 
     // validate
-    assertNotNull(entry);
-    Map<String, Object> properties = entry.getProperties();
+    assertNotNull(employee);
+    Map<String, Object> properties = employee.getProperties();
     assertEquals("1", properties.get("EmployeeId"));
     assertEquals("Walter Winter", properties.get("EmployeeName"));
+    EntryMetadata employeeMetadata = employee.getMetadata();
+    assertNotNull(employeeMetadata);
+    assertEquals("W/\"1\"", employeeMetadata.getEtag());
+
+    // Inline
     ODataEntry room = (ODataEntry) properties.get("ne_Room");
     Map<String, Object> roomProperties = room.getProperties();
     assertEquals(4, roomProperties.size());
@@ -819,6 +894,9 @@ public class XmlEntityConsumerTest extends 
AbstractXmlConsumerTest {
     assertEquals("Room 1", roomProperties.get("Name"));
     assertEquals(Short.valueOf("1"), roomProperties.get("Seats"));
     assertEquals(Short.valueOf("1"), roomProperties.get("Version"));
+    EntryMetadata roomMetadata = room.getMetadata();
+    assertNotNull(roomMetadata);
+    assertEquals("W/1", roomMetadata.getEtag());
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumerTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumerTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumerTest.java
index 9301258..ec7ce71 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumerTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumerTest.java
@@ -22,6 +22,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
 import java.io.InputStream;
+import java.util.List;
 
 import junit.framework.Assert;
 
@@ -29,6 +30,8 @@ import org.apache.olingo.odata2.api.edm.EdmEntitySet;
 import org.apache.olingo.odata2.api.ep.EntityProvider;
 import org.apache.olingo.odata2.api.ep.EntityProviderException;
 import org.apache.olingo.odata2.api.ep.EntityProviderReadProperties;
+import org.apache.olingo.odata2.api.ep.entry.EntryMetadata;
+import org.apache.olingo.odata2.api.ep.entry.ODataEntry;
 import org.apache.olingo.odata2.api.ep.feed.FeedMetadata;
 import org.apache.olingo.odata2.api.ep.feed.ODataDeltaFeed;
 import org.apache.olingo.odata2.api.ep.feed.ODataFeed;
@@ -42,6 +45,30 @@ public class XmlFeedConsumerTest extends 
AbstractXmlConsumerTest {
   }
 
   @Test
+  public void roomsFeedWithEtagEntries() throws Exception {
+    InputStream stream = getFileAsStream("feed_rooms_small.xml");
+    assertNotNull(stream);
+
+    ODataFeed feed =
+        EntityProvider.readFeed("application/atom+xml", 
MockFacade.getMockEdm().getDefaultEntityContainer()
+            .getEntitySet(
+                "Rooms"), stream, DEFAULT_PROPERTIES);
+    assertNotNull(feed);
+
+    FeedMetadata feedMetadata = feed.getFeedMetadata();
+    assertNotNull(feedMetadata);
+    assertNotNull(feedMetadata.getNextLink());
+
+    List<ODataEntry> entries = feed.getEntries();
+    assertEquals(3, entries.size());
+    ODataEntry singleRoom = entries.get(0);
+    EntryMetadata roomMetadata = singleRoom.getMetadata();
+    assertNotNull(roomMetadata);
+
+    assertEquals("W/\"1\"", roomMetadata.getEtag());
+  }
+
+  @Test
   public void readLargeEmployeesFeed() throws Exception {
     InputStream file = getFileAsStream("LargeEmployeeFeed.xml");
     assertNotNull(file);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java
 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java
index 2f303f5..78967af 100644
--- 
a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java
+++ 
b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java
@@ -528,8 +528,20 @@ public class XmlMetadataConsumerTest extends 
AbstractXmlConsumerTest {
             + "<EntitySet Name=\"Employees\" 
EntityType=\"RefScenario.Employee\"/>"
             + "<FunctionImport Name=\"EmployeeSearch\" 
ReturnType=\"Collection(RefScenario.Employee)\" " +
             "EntitySet=\"Employees\" m:HttpMethod=\"GET\">"
-            + "<Parameter Name=\"q\" Type=\"Edm.String\" Nullable=\"true\" />"
-            + "</FunctionImport>" + "</EntityContainer>" + "</Schema>" + 
"</edmx:DataServices>" + "</edmx:Edmx>";
+            + "<Parameter Name=\"q1\" Type=\"Edm.String\" Nullable=\"true\" />"
+            + "<Parameter Name=\"q2\" Type=\"Edm.Int32\" Nullable=\"false\" />"
+            + "</FunctionImport>"
+            + "<FunctionImport Name=\"RoomSearch\" 
ReturnType=\"Collection(RefScenario.Room)\" " +
+            "EntitySet=\"Rooms\" m:HttpMethod=\"GET\">"
+            + "<Parameter Name=\"q1\" Type=\"Edm.String\" Nullable=\"true\" />"
+            + "<Parameter Name=\"q2\" Type=\"Edm.Int32\" Nullable=\"false\" />"
+            + "</FunctionImport>"
+            + "<FunctionImport Name=\"NoParamters\" 
ReturnType=\"Collection(RefScenario.Room)\" " +
+            "EntitySet=\"Rooms\" m:HttpMethod=\"GET\">"
+            + "</FunctionImport>"
+            + "<FunctionImport Name=\"NoReturn\" " +
+            "EntitySet=\"Rooms\" m:HttpMethod=\"GET\"/>"
+            + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + 
"</edmx:Edmx>";
     XmlMetadataConsumer parser = new XmlMetadataConsumer();
     XMLStreamReader reader = createStreamReader(xmWithEntityContainer);
     DataServices result = parser.readMetadata(reader, true);
@@ -537,22 +549,59 @@ public class XmlMetadataConsumerTest extends 
AbstractXmlConsumerTest {
       for (EntityContainer container : schema.getEntityContainers()) {
         assertEquals("Container1", container.getName());
         assertEquals(Boolean.TRUE, container.isDefaultEntityContainer());
-        for (FunctionImport functionImport : container.getFunctionImports()) {
-          assertEquals("EmployeeSearch", functionImport.getName());
-          assertEquals("Employees", functionImport.getEntitySet());
-          assertEquals(NAMESPACE, 
functionImport.getReturnType().getTypeName().getNamespace());
-          assertEquals("Employee", 
functionImport.getReturnType().getTypeName().getName());
-          assertEquals(EdmMultiplicity.MANY, 
functionImport.getReturnType().getMultiplicity());
-          assertEquals("GET", functionImport.getHttpMethod());
-          for (FunctionImportParameter parameter : 
functionImport.getParameters()) {
-            assertEquals("q", parameter.getName());
-            assertEquals(EdmSimpleTypeKind.String, parameter.getType());
-            assertEquals(Boolean.TRUE, parameter.getFacets().isNullable());
-          }
-        }
+
+        assertEquals(4, container.getFunctionImports().size());
+        FunctionImport functionImport1 = container.getFunctionImports().get(0);
+
+        assertEquals("EmployeeSearch", functionImport1.getName());
+        assertEquals("Employees", functionImport1.getEntitySet());
+        assertEquals(NAMESPACE, 
functionImport1.getReturnType().getTypeName().getNamespace());
+        assertEquals("Employee", 
functionImport1.getReturnType().getTypeName().getName());
+        assertEquals(EdmMultiplicity.MANY, 
functionImport1.getReturnType().getMultiplicity());
+        assertEquals("GET", functionImport1.getHttpMethod());
+        assertEquals(2, functionImport1.getParameters().size());
+
+        assertEquals("q1", functionImport1.getParameters().get(0).getName());
+        assertEquals(EdmSimpleTypeKind.String, 
functionImport1.getParameters().get(0).getType());
+        assertEquals(Boolean.TRUE, 
functionImport1.getParameters().get(0).getFacets().isNullable());
+
+        assertEquals("q2", functionImport1.getParameters().get(1).getName());
+        assertEquals(EdmSimpleTypeKind.Int32, 
functionImport1.getParameters().get(1).getType());
+        assertEquals(Boolean.FALSE, 
functionImport1.getParameters().get(1).getFacets().isNullable());
+
+        FunctionImport functionImport2 = container.getFunctionImports().get(1);
+
+        assertEquals("RoomSearch", functionImport2.getName());
+        assertEquals("Rooms", functionImport2.getEntitySet());
+        assertEquals(NAMESPACE, 
functionImport2.getReturnType().getTypeName().getNamespace());
+        assertEquals("Room", 
functionImport2.getReturnType().getTypeName().getName());
+        assertEquals(EdmMultiplicity.MANY, 
functionImport2.getReturnType().getMultiplicity());
+        assertEquals("GET", functionImport2.getHttpMethod());
+        assertEquals(2, functionImport2.getParameters().size());
+
+        assertEquals("q1", functionImport2.getParameters().get(0).getName());
+        assertEquals(EdmSimpleTypeKind.String, 
functionImport2.getParameters().get(0).getType());
+        assertEquals(Boolean.TRUE, 
functionImport2.getParameters().get(0).getFacets().isNullable());
+
+        assertEquals("q2", functionImport2.getParameters().get(1).getName());
+        assertEquals(EdmSimpleTypeKind.Int32, 
functionImport2.getParameters().get(1).getType());
+        assertEquals(Boolean.FALSE, 
functionImport2.getParameters().get(1).getFacets().isNullable());
+
+        FunctionImport functionImport3 = container.getFunctionImports().get(2);
+
+        assertEquals("NoParamters", functionImport3.getName());
+        List<FunctionImportParameter> parameters3 = 
functionImport3.getParameters();
+        assertNotNull(parameters3);
+        assertEquals(0, parameters3.size());
+
+        FunctionImport functionImport4 = container.getFunctionImports().get(3);
+        assertEquals("NoReturn", functionImport4.getName());
+        List<FunctionImportParameter> parameters4 = 
functionImport4.getParameters();
+        assertNotNull(parameters4);
+        assertEquals(0, parameters4.size());
+        assertNull(functionImport4.getReturnType());
       }
     }
-
   }
 
   @Test()

Reply via email to