You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2015/03/04 17:14:38 UTC

[3/3] olingo-odata4 git commit: [OLINGO-575] Start merging ComplexValue and LinkedComplexValue

[OLINGO-575] Start merging ComplexValue and LinkedComplexValue


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

Branch: refs/heads/master
Commit: 0d57a0763a70e1875f15b8882b9008f88772cfac
Parents: 033f35d
Author: Christian Amend <ch...@apache.org>
Authored: Wed Mar 4 17:13:55 2015 +0100
Committer: Christian Amend <ch...@apache.org>
Committed: Wed Mar 4 17:13:55 2015 +0100

----------------------------------------------------------------------
 .../commons/AnnotatableInvocationHandler.java   |  25 +-
 .../proxy/commons/ComplexInvocationHandler.java |  34 +-
 .../olingo/ext/proxy/utils/CoreUtils.java       |   2 +-
 .../org/apache/olingo/fit/AbstractServices.java | 787 ++++++++++---------
 .../java/org/apache/olingo/fit/V4Services.java  |   8 +-
 .../olingo/fit/tecsvc/client/BasicITCase.java   |  14 +-
 .../fit/v4/BoundOperationInvokeTestITCase.java  |   8 +-
 .../olingo/fit/v4/DerivedTypeTestITCase.java    |  15 +-
 .../olingo/fit/v4/OpenTypeTestITCase.java       |  19 +-
 .../fit/v4/OperationImportInvokeTestITCase.java |  32 +-
 .../core/serialization/ODataBinderImpl.java     | 101 +--
 .../olingo/client/core/v4/EntityTest.java       |   6 +-
 .../apache/olingo/client/core/v4/JSONTest.java  |  15 +-
 .../olingo/client/core/v4/PropertyTest.java     |   2 +-
 .../olingo/commons/api/data/ComplexValue.java   |  26 +
 .../commons/api/data/LinkedComplexValue.java    |  26 -
 .../olingo/commons/api/data/Valuable.java       |   6 +-
 .../olingo/commons/api/data/ValueType.java      |   5 +-
 .../commons/api/domain/AbstractODataValue.java  |   5 +-
 .../commons/api/domain/ODataComplexValue.java   |   6 +-
 .../api/domain/ODataLinkedComplexValue.java     |  25 -
 .../commons/api/domain/ODataObjectFactory.java  |   6 +-
 .../commons/api/domain/ODataValuable.java       |   9 +-
 .../olingo/commons/api/domain/ODataValue.java   |  19 +-
 .../commons/core/data/AbstractValuable.java     |  24 +-
 .../commons/core/data/ComplexValueImpl.java     |  88 +++
 .../core/data/LinkedComplexValueImpl.java       |  88 ---
 .../core/domain/ODataAnnotationImpl.java        |   9 +-
 .../core/domain/ODataCollectionValueImpl.java   |  18 +-
 .../core/domain/ODataComplexValueImpl.java      |  30 +-
 .../commons/core/domain/ODataEnumValueImpl.java |   8 +-
 .../core/domain/ODataObjectFactoryImpl.java     |  21 +-
 .../core/domain/ODataPrimitiveValueImpl.java    |  12 +-
 .../commons/core/domain/ODataPropertyImpl.java  |  18 +-
 .../commons/core/domain/ODataValuableImpl.java  |  13 +-
 .../core/serialization/AtomDeserializer.java    |  21 +-
 .../core/serialization/AtomSerializer.java      |  47 +-
 .../core/serialization/JsonDeserializer.java    | 147 ++--
 .../serialization/JsonPropertySerializer.java   |   6 +-
 .../core/serialization/JsonSerializer.java      |  16 +-
 .../json/ODataJsonDeserializer.java             |  13 +-
 .../serializer/json/ODataJsonSerializer.java    |  23 +-
 .../json/ODataJsonSerializerTest.java           |  20 +-
 .../olingo/server/tecsvc/data/DataCreator.java  |  42 +-
 .../olingo/server/tecsvc/data/DataProvider.java |  22 +-
 .../TechnicalPrimitiveComplexProcessor.java     |   9 +-
 .../expression/ExpressionVisitorImpl.java       |   5 +-
 .../server/tecsvc/data/DataProviderTest.java    |  12 +-
 .../json/ODataJsonDeserializerEntityTest.java   |  27 +-
 49 files changed, 873 insertions(+), 1067 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/0d57a076/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AnnotatableInvocationHandler.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AnnotatableInvocationHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AnnotatableInvocationHandler.java
index b08afba..16ef932 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AnnotatableInvocationHandler.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/AnnotatableInvocationHandler.java
@@ -18,16 +18,6 @@
  */
 package org.apache.olingo.ext.proxy.commons;
 
-import org.apache.olingo.commons.api.domain.ODataAnnotation;
-import org.apache.olingo.commons.api.domain.ODataEntity;
-import org.apache.olingo.commons.api.domain.ODataLinkedComplexValue;
-import org.apache.olingo.ext.proxy.api.AbstractTerm;
-import org.apache.olingo.ext.proxy.api.Annotatable;
-import org.apache.olingo.ext.proxy.api.annotations.Namespace;
-import org.apache.olingo.ext.proxy.api.annotations.Term;
-import org.apache.olingo.ext.proxy.context.AttachedEntityStatus;
-import org.apache.olingo.ext.proxy.utils.CoreUtils;
-
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
@@ -37,7 +27,16 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.olingo.commons.api.domain.ODataAnnotation;
+import org.apache.olingo.commons.api.domain.ODataComplexValue;
+import org.apache.olingo.commons.api.domain.ODataEntity;
 import org.apache.olingo.ext.proxy.AbstractService;
+import org.apache.olingo.ext.proxy.api.AbstractTerm;
+import org.apache.olingo.ext.proxy.api.Annotatable;
+import org.apache.olingo.ext.proxy.api.annotations.Namespace;
+import org.apache.olingo.ext.proxy.api.annotations.Term;
+import org.apache.olingo.ext.proxy.context.AttachedEntityStatus;
+import org.apache.olingo.ext.proxy.utils.CoreUtils;
 
 public class AnnotatableInvocationHandler extends AbstractInvocationHandler implements Annotatable {
 
@@ -87,11 +86,11 @@ public class AnnotatableInvocationHandler extends AbstractInvocationHandler impl
                 ? ((org.apache.olingo.commons.api.domain.ODataLink) ((ODataEntity) targetHandler.getInternal()).
                 getNavigationLink(navPropName)).getAnnotations()
                 : ((ODataEntity) targetHandler.getInternal()).getProperty(propName).getAnnotations();
-      } else if (targetHandler.getInternal() instanceof ODataLinkedComplexValue) {
+      } else if (targetHandler.getInternal() instanceof ODataComplexValue) {
         result = propName == null
-                ? ((org.apache.olingo.commons.api.domain.ODataLink) ((ODataLinkedComplexValue) targetHandler.
+                ? ((org.apache.olingo.commons.api.domain.ODataLink) ((ODataComplexValue) targetHandler.
                 getInternal()).getNavigationLink(navPropName)).getAnnotations()
-                : ((ODataLinkedComplexValue) targetHandler.getInternal()).get(propName).getAnnotations();
+                : ((ODataComplexValue) targetHandler.getInternal()).get(propName).getAnnotations();
       }
     }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/0d57a076/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java
index 29b0708..2e1deb6 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java
@@ -39,7 +39,7 @@ import org.apache.olingo.ext.proxy.utils.ClassUtils;
 
 public class ComplexInvocationHandler extends AbstractStructuredInvocationHandler {
 
-  private static Pair<ODataComplexValue<? extends ODataProperty>, Class<?>> init(
+  private static Pair<ODataComplexValue, Class<?>> init(
           final Class<?> typeRef,
           final AbstractService<?> service) {
 
@@ -57,10 +57,10 @@ public class ComplexInvocationHandler extends AbstractStructuredInvocationHandle
 
     final FullQualifiedName typeName =
             new FullQualifiedName(ClassUtils.getNamespace(complexTypeRef), annotation.name());
-    final ODataComplexValue<? extends ODataProperty> complex =
+    final ODataComplexValue complex =
             service.getClient().getObjectFactory().newComplexValue(typeName.toString());
 
-    return new ImmutablePair<ODataComplexValue<? extends ODataProperty>, Class<?>>(complex, complexTypeRef);
+    return new ImmutablePair<ODataComplexValue, Class<?>>(complex, complexTypeRef);
   }
 
   public static ComplexInvocationHandler getInstance(
@@ -68,12 +68,12 @@ public class ComplexInvocationHandler extends AbstractStructuredInvocationHandle
           final EntityInvocationHandler handler,
           final Class<?> typeRef) {
 
-    final Pair<ODataComplexValue<? extends ODataProperty>, Class<?>> init = init(typeRef, handler.service);
+    final Pair<ODataComplexValue, Class<?>> init = init(typeRef, handler.service);
     return new ComplexInvocationHandler(init.getLeft(), init.getRight(), handler);
   }
 
   public static ComplexInvocationHandler getInstance(
-          final ODataComplexValue<?> complex,
+          final ODataComplexValue complex,
           final Class<?> typeRef,
           final AbstractService<?> service) {
 
@@ -84,7 +84,7 @@ public class ComplexInvocationHandler extends AbstractStructuredInvocationHandle
           final Class<?> typeRef,
           final AbstractService<?> service) {
       
-    final Pair<ODataComplexValue<? extends ODataProperty>, Class<?>> init = init(typeRef, service);
+    final Pair<ODataComplexValue, Class<?>> init = init(typeRef, service);
     return new ComplexInvocationHandler(init.getLeft(), init.getRight(), service);
   }
 
@@ -93,12 +93,12 @@ public class ComplexInvocationHandler extends AbstractStructuredInvocationHandle
           final AbstractService<?> service,
           final URIBuilder uri) {
       
-    final Pair<ODataComplexValue<? extends ODataProperty>, Class<?>> init = init(typeRef, service);
+    final Pair<ODataComplexValue, Class<?>> init = init(typeRef, service);
     return new ComplexInvocationHandler(init.getLeft(), init.getRight(), service, uri);
   }
 
   public static ComplexInvocationHandler getInstance(
-          final ODataComplexValue<? extends ODataProperty> complex,
+          final ODataComplexValue complex,
           final Class<?> typeRef,
           final AbstractService<?> service,
           final URIBuilder uri) {
@@ -107,7 +107,7 @@ public class ComplexInvocationHandler extends AbstractStructuredInvocationHandle
   }
 
   private ComplexInvocationHandler(
-          final ODataComplexValue<? extends ODataProperty> complex,
+          final ODataComplexValue complex,
           final Class<?> typeRef,
           final AbstractService<?> service,
           final URIBuilder uri) {
@@ -118,7 +118,7 @@ public class ComplexInvocationHandler extends AbstractStructuredInvocationHandle
   }
 
   private ComplexInvocationHandler(
-          final ODataComplexValue<? extends ODataProperty> complex,
+          final ODataComplexValue complex,
           final Class<?> typeRef,
           final EntityInvocationHandler handler) {
 
@@ -127,7 +127,7 @@ public class ComplexInvocationHandler extends AbstractStructuredInvocationHandle
   }
 
   private ComplexInvocationHandler(
-          final ODataComplexValue<? extends ODataProperty> complex,
+          final ODataComplexValue complex,
           final Class<?> typeRef,
           final AbstractService<?> service) {
 
@@ -135,9 +135,8 @@ public class ComplexInvocationHandler extends AbstractStructuredInvocationHandle
     this.uri = null;
   }
 
-  @SuppressWarnings("unchecked")
-  public ODataComplexValue<ODataProperty> getComplex() {
-    return (ODataComplexValue<ODataProperty>) this.internal;
+  public ODataComplexValue getComplex() {
+    return (ODataComplexValue) this.internal;
   }
 
   @Override
@@ -174,12 +173,11 @@ public class ComplexInvocationHandler extends AbstractStructuredInvocationHandle
   }
 
   @Override
-  @SuppressWarnings("unchecked")
-  protected <T extends ODataProperty> List<T> getInternalProperties() {
-    final List<T> res = new ArrayList<T>();
+  protected List<ODataProperty> getInternalProperties() {
+    final List<ODataProperty> res = new ArrayList<ODataProperty>();
     if (getComplex() != null) {
       for (ODataProperty property : getComplex()) {
-        res.add((T) property);
+        res.add(property);
       }
     }
     return res;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/0d57a076/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/utils/CoreUtils.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/utils/CoreUtils.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/utils/CoreUtils.java
index 7ab03a6..6e3f68c 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/utils/CoreUtils.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/utils/CoreUtils.java
@@ -308,7 +308,7 @@ public final class CoreUtils {
   public static void addProperties(
       final EdmEnabledODataClient client,
       final Map<String, Object> changes,
-      final ODataComplexValue<ODataProperty> entity) {
+      final ODataComplexValue entity) {
 
     for (Map.Entry<String, Object> entry : changes.entrySet()) {
       entity.add(getODataComplexProperty(

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/0d57a076/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java b/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
index 3d70109..77e3478 100644
--- a/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
+++ b/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
@@ -18,8 +18,49 @@
  */
 package org.apache.olingo.fit;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.net.URI;
+import java.util.AbstractMap;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.ConcurrentModificationException;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.mail.Header;
+import javax.mail.internet.MimeBodyPart;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.NotFoundException;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedHashMap;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
@@ -27,13 +68,12 @@ import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.jaxrs.ext.multipart.Attachment;
 import org.apache.cxf.jaxrs.ext.multipart.Multipart;
 import org.apache.cxf.jaxrs.ext.multipart.MultipartBody;
+import org.apache.olingo.commons.api.data.ComplexValue;
 import org.apache.olingo.commons.api.data.Entity;
 import org.apache.olingo.commons.api.data.EntitySet;
 import org.apache.olingo.commons.api.data.Link;
-import org.apache.olingo.commons.api.data.LinkedComplexValue;
 import org.apache.olingo.commons.api.data.Property;
 import org.apache.olingo.commons.api.data.ResWrap;
-import org.apache.olingo.commons.api.data.Valuable;
 import org.apache.olingo.commons.api.data.ValueType;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
@@ -67,47 +107,8 @@ import org.apache.olingo.fit.utils.XMLUtilities;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.mail.Header;
-import javax.mail.internet.MimeBodyPart;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.DefaultValue;
-import javax.ws.rs.GET;
-import javax.ws.rs.HeaderParam;
-import javax.ws.rs.NotFoundException;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedHashMap;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStreamWriter;
-import java.net.URI;
-import java.util.AbstractMap;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.ConcurrentModificationException;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 
 public abstract class AbstractServices {
 
@@ -173,9 +174,9 @@ public abstract class AbstractServices {
       }
 
       return xml.createResponse(
-              null,
-              FSManager.instance(version).readFile(Constants.get(version, ConstantKey.SERVICES), acceptType),
-              null, acceptType);
+          null,
+          FSManager.instance(version).readFile(Constants.get(version, ConstantKey.SERVICES), acceptType),
+          null, acceptType);
     } catch (Exception e) {
       return xml.createFaultResponse(accept, e);
     }
@@ -206,13 +207,13 @@ public abstract class AbstractServices {
   @Consumes(MULTIPART_MIXED)
   @Produces(APPLICATION_OCTET_STREAM + ";boundary=" + BOUNDARY)
   public Response batch(
-          @HeaderParam("Authorization") @DefaultValue(StringUtils.EMPTY) final String authorization,
-          @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
-          final @Multipart MultipartBody attachment) {
+      @HeaderParam("Authorization") @DefaultValue(StringUtils.EMPTY) final String authorization,
+      @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
+      final @Multipart MultipartBody attachment) {
     try {
       final boolean continueOnError = prefer.contains("odata.continue-on-error");
       return xml.createBatchResponse(
-              exploreMultipart(attachment.getAllAttachments(), BOUNDARY, continueOnError));
+          exploreMultipart(attachment.getAllAttachments(), BOUNDARY, continueOnError));
     } catch (IOException e) {
       return xml.createFaultResponse(Accept.XML.toString(version), e);
     }
@@ -260,10 +261,11 @@ public abstract class AbstractServices {
     // just for non nullable property test into PropertyTestITCase
     return xml.createFaultResponse(Accept.JSON_FULLMETA.toString(version), new Exception("Non nullable properties"));
   }
+
   // ----------------------------------------------
 
   protected Response bodyPartRequest(final MimeBodyPart body) throws Exception {
-    return bodyPartRequest(body, Collections.<String, String>emptyMap());
+    return bodyPartRequest(body, Collections.<String, String> emptyMap());
   }
 
   protected Response bodyPartRequest(final MimeBodyPart body, final Map<String, String> references) throws Exception {
@@ -272,7 +274,7 @@ public abstract class AbstractServices {
 
     Header header = en.nextElement();
     final String request =
-            header.getName() + (StringUtils.isNotBlank(header.getValue()) ? ":" + header.getValue() : "");
+        header.getName() + (StringUtils.isNotBlank(header.getValue()) ? ":" + header.getValue() : "");
 
     final Matcher matcher = REQUEST_PATTERN.matcher(request);
     final Matcher matcherRef = BATCH_REQUEST_REF_PATTERN.matcher(request);
@@ -327,15 +329,15 @@ public abstract class AbstractServices {
       }
 
       // When updating to CXF 3.0.1, uncomment the following line, see CXF-5865
-      //client.close();
+      // client.close();
     }
 
     return res;
   }
 
   protected abstract InputStream exploreMultipart(
-          final List<Attachment> attachments, final String boundary, final boolean continueOnError)
-          throws IOException;
+      final List<Attachment> attachments, final String boundary, final boolean continueOnError)
+      throws IOException;
 
   protected void addItemIntro(final ByteArrayOutputStream bos) throws IOException {
     addItemIntro(bos, null);
@@ -356,7 +358,7 @@ public abstract class AbstractServices {
   }
 
   protected void addChangesetItemIntro(
-          final ByteArrayOutputStream bos, final String contentId, final String cboundary) throws IOException {
+      final ByteArrayOutputStream bos, final String contentId, final String cboundary) throws IOException {
     bos.write(("--" + cboundary).getBytes());
     bos.write(Constants.CRLF);
     bos.write(("Content-ID: " + contentId).getBytes());
@@ -365,12 +367,12 @@ public abstract class AbstractServices {
   }
 
   protected void addSingleBatchResponse(
-          final Response response, final ByteArrayOutputStream bos) throws IOException {
+      final Response response, final ByteArrayOutputStream bos) throws IOException {
     addSingleBatchResponse(response, null, bos);
   }
 
   protected void addSingleBatchResponse(
-          final Response response, final String contentId, final ByteArrayOutputStream bos) throws IOException {
+      final Response response, final String contentId, final ByteArrayOutputStream bos) throws IOException {
     bos.write("HTTP/1.1 ".getBytes());
     bos.write(String.valueOf(response.getStatusInfo().getStatusCode()).getBytes());
     bos.write(" ".getBytes());
@@ -407,45 +409,45 @@ public abstract class AbstractServices {
   }
 
   protected void addErrorBatchResponse(final Exception e, final ByteArrayOutputStream bos)
-          throws IOException {
+      throws IOException {
     addErrorBatchResponse(e, null, bos);
   }
 
   protected void addErrorBatchResponse(final Exception e, final String contentId, final ByteArrayOutputStream bos)
-          throws IOException {
+      throws IOException {
     addSingleBatchResponse(xml.createFaultResponse(Accept.XML.toString(version), e), contentId, bos);
   }
 
   @MERGE
   @Path("/{entitySetName}({entityId})")
-  @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON})
-  @Consumes({MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON})
+  @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON })
+  @Consumes({ MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON })
   public Response mergeEntity(
-          @Context final UriInfo uriInfo,
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) final String contentType,
-          @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
-          @HeaderParam("If-Match") @DefaultValue(StringUtils.EMPTY) final String ifMatch,
-          @PathParam("entitySetName") final String entitySetName,
-          @PathParam("entityId") final String entityId,
-          final String changes) {
+      @Context final UriInfo uriInfo,
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) final String contentType,
+      @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
+      @HeaderParam("If-Match") @DefaultValue(StringUtils.EMPTY) final String ifMatch,
+      @PathParam("entitySetName") final String entitySetName,
+      @PathParam("entityId") final String entityId,
+      final String changes) {
 
     return patchEntity(uriInfo, accept, contentType, prefer, ifMatch, entitySetName, entityId, changes);
   }
 
   @PATCH
   @Path("/{entitySetName}({entityId})")
-  @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON})
-  @Consumes({MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON})
+  @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON })
+  @Consumes({ MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON })
   public Response patchEntity(
-          @Context final UriInfo uriInfo,
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) final String contentType,
-          @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
-          @HeaderParam("If-Match") @DefaultValue(StringUtils.EMPTY) final String ifMatch,
-          @PathParam("entitySetName") final String entitySetName,
-          @PathParam("entityId") final String entityId,
-          final String changes) {
+      @Context final UriInfo uriInfo,
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) final String contentType,
+      @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
+      @HeaderParam("If-Match") @DefaultValue(StringUtils.EMPTY) final String ifMatch,
+      @PathParam("entitySetName") final String entitySetName,
+      @PathParam("entityId") final String entityId,
+      final String changes) {
 
     try {
       final Accept acceptType = Accept.parse(accept, version);
@@ -469,7 +471,7 @@ public abstract class AbstractServices {
         throw new UnsupportedMediaTypeException("Unsupported media type");
       } else if (contentTypeValue == Accept.ATOM) {
         entryChanges = atomDeserializer.toEntity(
-                IOUtils.toInputStream(changes, Constants.ENCODING)).getPayload();
+            IOUtils.toInputStream(changes, Constants.ENCODING)).getPayload();
       } else {
         final ResWrap<Entity> jcont = jsonDeserializer.toEntity(IOUtils.toInputStream(changes, Constants.ENCODING));
         entryChanges = jcont.getPayload();
@@ -497,7 +499,7 @@ public abstract class AbstractServices {
       writer.close();
 
       final InputStream res = xml.addOrReplaceEntity(
-              entityId, entitySetName, new ByteArrayInputStream(content.toByteArray()), container.getPayload());
+          entityId, entitySetName, new ByteArrayInputStream(content.toByteArray()), container.getPayload());
 
       final ResWrap<Entity> cres = atomDeserializer.toEntity(res);
 
@@ -505,25 +507,25 @@ public abstract class AbstractServices {
 
       final String path = Commons.getEntityBasePath(entitySetName, entityId);
       FSManager.instance(version).putInMemory(
-              cres, path + File.separatorChar + Constants.get(version, ConstantKey.ENTITY));
+          cres, path + File.separatorChar + Constants.get(version, ConstantKey.ENTITY));
 
       final Response response;
       if ("return-content".equalsIgnoreCase(prefer)) {
         response = xml.createResponse(
-                uriInfo.getRequestUri().toASCIIString(),
-                xml.readEntity(entitySetName, entityId, acceptType).getValue(),
-                null, acceptType, Response.Status.OK);
+            uriInfo.getRequestUri().toASCIIString(),
+            xml.readEntity(entitySetName, entityId, acceptType).getValue(),
+            null, acceptType, Response.Status.OK);
       } else {
         res.close();
         response = xml.createResponse(
-                uriInfo.getRequestUri().toASCIIString(),
-                null,
-                null,
-                acceptType, Response.Status.NO_CONTENT);
+            uriInfo.getRequestUri().toASCIIString(),
+            null,
+            null,
+            acceptType, Response.Status.NO_CONTENT);
       }
 
       if (StringUtils.isNotBlank(prefer)) {
-        response.getHeaders().put("Preference-Applied", Collections.<Object>singletonList(prefer));
+        response.getHeaders().put("Preference-Applied", Collections.<Object> singletonList(prefer));
       }
 
       return response;
@@ -534,16 +536,16 @@ public abstract class AbstractServices {
 
   @PUT
   @Path("/{entitySetName}({entityId})")
-  @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON})
-  @Consumes({MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON})
+  @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON })
+  @Consumes({ MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON })
   public Response replaceEntity(
-          @Context final UriInfo uriInfo,
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) final String contentType,
-          @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
-          @PathParam("entitySetName") final String entitySetName,
-          @PathParam("entityId") final String entityId,
-          final String entity) {
+      @Context final UriInfo uriInfo,
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) final String contentType,
+      @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
+      @PathParam("entitySetName") final String entitySetName,
+      @PathParam("entityId") final String entityId,
+      final String entity) {
 
     try {
       final Accept acceptType = Accept.parse(accept, version);
@@ -553,8 +555,8 @@ public abstract class AbstractServices {
       }
 
       final InputStream res = getUtilities(acceptType).addOrReplaceEntity(entityId, entitySetName,
-              IOUtils.toInputStream(entity, Constants.ENCODING),
-              xml.readEntity(acceptType, IOUtils.toInputStream(entity, Constants.ENCODING)));
+          IOUtils.toInputStream(entity, Constants.ENCODING),
+          xml.readEntity(acceptType, IOUtils.toInputStream(entity, Constants.ENCODING)));
 
       final ResWrap<Entity> cres;
       if (acceptType == Accept.ATOM) {
@@ -565,28 +567,28 @@ public abstract class AbstractServices {
 
       final String path = Commons.getEntityBasePath(entitySetName, entityId);
       FSManager.instance(version).putInMemory(
-              cres, path + File.separatorChar + Constants.get(version, ConstantKey.ENTITY));
+          cres, path + File.separatorChar + Constants.get(version, ConstantKey.ENTITY));
 
       final Response response;
       if ("return-content".equalsIgnoreCase(prefer)) {
         response = xml.createResponse(
-                uriInfo.getRequestUri().toASCIIString(),
-                xml.readEntity(entitySetName, entityId, acceptType).getValue(),
-                null,
-                acceptType,
-                Response.Status.OK);
+            uriInfo.getRequestUri().toASCIIString(),
+            xml.readEntity(entitySetName, entityId, acceptType).getValue(),
+            null,
+            acceptType,
+            Response.Status.OK);
       } else {
         res.close();
         response = xml.createResponse(
-                uriInfo.getRequestUri().toASCIIString(),
-                null,
-                null,
-                acceptType,
-                Response.Status.NO_CONTENT);
+            uriInfo.getRequestUri().toASCIIString(),
+            null,
+            null,
+            acceptType,
+            Response.Status.NO_CONTENT);
       }
 
       if (StringUtils.isNotBlank(prefer)) {
-        response.getHeaders().put("Preference-Applied", Collections.<Object>singletonList(prefer));
+        response.getHeaders().put("Preference-Applied", Collections.<Object> singletonList(prefer));
       }
 
       return response;
@@ -597,15 +599,15 @@ public abstract class AbstractServices {
 
   @POST
   @Path("/{entitySetName}")
-  @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON})
-  @Consumes({MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON, MediaType.APPLICATION_OCTET_STREAM})
+  @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON })
+  @Consumes({ MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON, MediaType.APPLICATION_OCTET_STREAM })
   public Response postNewEntity(
-          @Context final UriInfo uriInfo,
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) final String contentType,
-          @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
-          @PathParam("entitySetName") final String entitySetName,
-          final String entity) {
+      @Context final UriInfo uriInfo,
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) final String contentType,
+      @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
+      @PathParam("entitySetName") final String entitySetName,
+      final String entity) {
 
     try {
       final Accept acceptType = Accept.parse(accept, version);
@@ -634,11 +636,11 @@ public abstract class AbstractServices {
           prop.setName(id.getKey());
           prop.setType(id.getValue().toString());
           prop.setValue(ValueType.PRIMITIVE,
-                  id.getValue() == EdmPrimitiveTypeKind.Int32
+              id.getValue() == EdmPrimitiveTypeKind.Int32
                   ? Integer.parseInt(entityKey)
                   : id.getValue() == EdmPrimitiveTypeKind.Guid
-                  ? UUID.fromString(entityKey)
-                  : entityKey);
+                      ? UUID.fromString(entityKey)
+                      : entityKey);
           entry.getProperties().add(prop);
         }
 
@@ -673,13 +675,13 @@ public abstract class AbstractServices {
       writer.close();
 
       final InputStream serialization =
-              xml.addOrReplaceEntity(entityKey, entitySetName, new ByteArrayInputStream(content.toByteArray()), entry);
+          xml.addOrReplaceEntity(entityKey, entitySetName, new ByteArrayInputStream(content.toByteArray()), entry);
 
       ResWrap<Entity> result = atomDeserializer.toEntity(serialization);
       result = new ResWrap<Entity>(
-              URI.create(Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX)
+          URI.create(Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX)
               + entitySetName + Constants.get(version, ConstantKey.ODATA_METADATA_ENTITY_SUFFIX)),
-              null, result.getPayload());
+          null, result.getPayload());
 
       final String path = Commons.getEntityBasePath(entitySetName, entityKey);
       FSManager.instance(version).putInMemory(result, path + Constants.get(version, ConstantKey.ENTITY));
@@ -702,22 +704,22 @@ public abstract class AbstractServices {
       final Response response;
       if ("return-no-content".equalsIgnoreCase(prefer)) {
         response = xml.createResponse(
-                location,
-                null,
-                null,
-                acceptType,
-                Response.Status.NO_CONTENT);
+            location,
+            null,
+            null,
+            acceptType,
+            Response.Status.NO_CONTENT);
       } else {
         response = xml.createResponse(
-                location,
-                xml.writeEntity(acceptType, result),
-                null,
-                acceptType,
-                Response.Status.CREATED);
+            location,
+            xml.writeEntity(acceptType, result),
+            null,
+            acceptType,
+            Response.Status.CREATED);
       }
 
       if (StringUtils.isNotBlank(prefer)) {
-        response.getHeaders().put("Preference-Applied", Collections.<Object>singletonList(prefer));
+        response.getHeaders().put("Preference-Applied", Collections.<Object> singletonList(prefer));
       }
 
       return response;
@@ -730,10 +732,10 @@ public abstract class AbstractServices {
   @POST
   @Path("/Person({entityId})/{type:.*}/Sack")
   public Response actionSack(
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @PathParam("entityId") final String entityId,
-          @PathParam("type") final String type,
-          @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format) {
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @PathParam("entityId") final String entityId,
+      @PathParam("type") final String type,
+      @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format) {
 
     final Map.Entry<Accept, AbstractUtilities> utils = getUtilities(accept, format);
 
@@ -752,7 +754,7 @@ public abstract class AbstractServices {
 
       final FSManager fsManager = FSManager.instance(version);
       fsManager.putInMemory(xml.writeEntity(Accept.ATOM, container),
-              fsManager.getAbsolutePath(Commons.getEntityBasePath("Person", entityId) + Constants.get(version,
+          fsManager.getAbsolutePath(Commons.getEntityBasePath("Person", entityId) + Constants.get(version,
               ConstantKey.ENTITY), Accept.ATOM));
 
       return utils.getValue().createResponse(null, null, null, utils.getKey(), Response.Status.NO_CONTENT);
@@ -764,10 +766,10 @@ public abstract class AbstractServices {
   @POST
   @Path("/Person/{type:.*}/IncreaseSalaries")
   public Response actionIncreaseSalaries(
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @PathParam("type") final String type,
-          @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
-          final String body) {
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @PathParam("type") final String type,
+      @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
+      final String body) {
 
     final String name = "Person";
     try {
@@ -783,12 +785,12 @@ public abstract class AbstractServices {
       final int n = tree.get("n").asInt();
 
       final StringBuilder path = new StringBuilder(name).
-              append(File.separatorChar).append(type).
-              append(File.separatorChar);
+          append(File.separatorChar).append(type).
+          append(File.separatorChar);
 
       path.append(metadata.getEntitySet(name).isSingleton()
-              ? Constants.get(version, ConstantKey.ENTITY)
-              : Constants.get(version, ConstantKey.FEED));
+          ? Constants.get(version, ConstantKey.ENTITY)
+          : Constants.get(version, ConstantKey.FEED));
 
       final InputStream feed = FSManager.instance(version).readFile(path.toString(), acceptType);
 
@@ -798,20 +800,20 @@ public abstract class AbstractServices {
 
       String newContent = new String(copy.toByteArray(), "UTF-8");
       final Pattern salary = Pattern.compile(acceptType == Accept.ATOM
-              ? "\\<d:Salary m:type=\"Edm.Int32\"\\>(-?\\d+)\\</d:Salary\\>"
-              : "\"Salary\":(-?\\d+),");
+          ? "\\<d:Salary m:type=\"Edm.Int32\"\\>(-?\\d+)\\</d:Salary\\>"
+          : "\"Salary\":(-?\\d+),");
       final Matcher salaryMatcher = salary.matcher(newContent);
       while (salaryMatcher.find()) {
         final Long newSalary = Long.valueOf(salaryMatcher.group(1)) + n;
         newContent = newContent.
-                replaceAll("\"Salary\":" + salaryMatcher.group(1) + ",",
+            replaceAll("\"Salary\":" + salaryMatcher.group(1) + ",",
                 "\"Salary\":" + newSalary + ",").
-                replaceAll("\\<d:Salary m:type=\"Edm.Int32\"\\>" + salaryMatcher.group(1) + "</d:Salary\\>",
+            replaceAll("\\<d:Salary m:type=\"Edm.Int32\"\\>" + salaryMatcher.group(1) + "</d:Salary\\>",
                 "<d:Salary m:type=\"Edm.Int32\">" + newSalary + "</d:Salary>");
       }
 
       FSManager.instance(version).putInMemory(IOUtils.toInputStream(newContent, Constants.ENCODING),
-              FSManager.instance(version).getAbsolutePath(path.toString(), acceptType));
+          FSManager.instance(version).getAbsolutePath(path.toString(), acceptType));
 
       return xml.createResponse(null, null, null, acceptType, Response.Status.NO_CONTENT);
     } catch (Exception e) {
@@ -822,10 +824,10 @@ public abstract class AbstractServices {
   @POST
   @Path("/Product({entityId})/ChangeProductDimensions")
   public Response actionChangeProductDimensions(
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @PathParam("entityId") final String entityId,
-          @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
-          final String argument) {
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @PathParam("entityId") final String entityId,
+      @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
+      final String argument) {
 
     final Map.Entry<Accept, AbstractUtilities> utils = getUtilities(accept, format);
 
@@ -846,7 +848,7 @@ public abstract class AbstractServices {
 
       final FSManager fsManager = FSManager.instance(version);
       fsManager.putInMemory(xml.writeEntity(Accept.ATOM, container),
-              fsManager.getAbsolutePath(Commons.getEntityBasePath("Product", entityId) + Constants.get(version,
+          fsManager.getAbsolutePath(Commons.getEntityBasePath("Product", entityId) + Constants.get(version,
               ConstantKey.ENTITY), Accept.ATOM));
 
       return utils.getValue().createResponse(null, null, null, utils.getKey(), Response.Status.NO_CONTENT);
@@ -858,10 +860,10 @@ public abstract class AbstractServices {
   @POST
   @Path("/ComputerDetail({entityId})/ResetComputerDetailsSpecifications")
   public Response actionResetComputerDetailsSpecifications(
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @PathParam("entityId") final String entityId,
-          @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
-          final String argument) {
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @PathParam("entityId") final String entityId,
+      @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
+      final String argument) {
 
     final Map.Entry<Accept, AbstractUtilities> utils = getUtilities(accept, format);
 
@@ -884,7 +886,7 @@ public abstract class AbstractServices {
 
       final FSManager fsManager = FSManager.instance(version);
       fsManager.putInMemory(xml.writeEntity(Accept.ATOM, container),
-              fsManager.getAbsolutePath(Commons.getEntityBasePath("ComputerDetail", entityId) + Constants.get(version,
+          fsManager.getAbsolutePath(Commons.getEntityBasePath("ComputerDetail", entityId) + Constants.get(version,
               ConstantKey.ENTITY), Accept.ATOM));
 
       return utils.getValue().createResponse(null, null, null, utils.getKey(), Response.Status.NO_CONTENT);
@@ -904,9 +906,9 @@ public abstract class AbstractServices {
   @GET
   @Path("/{name}/{type:[a-zA-Z].*}")
   public Response getEntitySet(
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @PathParam("name") final String name,
-          @PathParam("type") final String type) {
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @PathParam("name") final String name,
+      @PathParam("type") final String type) {
 
     try {
       final Accept acceptType = Accept.parse(accept, version);
@@ -916,12 +918,12 @@ public abstract class AbstractServices {
 
       final String basePath = name + File.separatorChar;
       final StringBuilder path = new StringBuilder(name).
-              append(File.separatorChar).append(type).
-              append(File.separatorChar);
+          append(File.separatorChar).append(type).
+          append(File.separatorChar);
 
       path.append(metadata.getEntitySet(name).isSingleton()
-              ? Constants.get(version, ConstantKey.ENTITY)
-              : Constants.get(version, ConstantKey.FEED));
+          ? Constants.get(version, ConstantKey.ENTITY)
+          : Constants.get(version, ConstantKey.FEED));
 
       final InputStream feed = FSManager.instance(version).readFile(path.toString(), acceptType);
       return xml.createResponse(null, feed, Commons.getETag(basePath, version), acceptType);
@@ -945,16 +947,16 @@ public abstract class AbstractServices {
   @GET
   @Path("/{name}")
   public Response getEntitySet(
-          @Context final UriInfo uriInfo,
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @PathParam("name") final String name,
-          @QueryParam("$top") @DefaultValue(StringUtils.EMPTY) final String top,
-          @QueryParam("$skip") @DefaultValue(StringUtils.EMPTY) final String skip,
-          @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
-          @QueryParam("$inlinecount") @DefaultValue(StringUtils.EMPTY) final String count,
-          @QueryParam("$filter") @DefaultValue(StringUtils.EMPTY) final String filter,
-          @QueryParam("$orderby") @DefaultValue(StringUtils.EMPTY) final String orderby,
-          @QueryParam("$skiptoken") @DefaultValue(StringUtils.EMPTY) final String skiptoken) {
+      @Context final UriInfo uriInfo,
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @PathParam("name") final String name,
+      @QueryParam("$top") @DefaultValue(StringUtils.EMPTY) final String top,
+      @QueryParam("$skip") @DefaultValue(StringUtils.EMPTY) final String skip,
+      @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
+      @QueryParam("$inlinecount") @DefaultValue(StringUtils.EMPTY) final String count,
+      @QueryParam("$filter") @DefaultValue(StringUtils.EMPTY) final String filter,
+      @QueryParam("$orderby") @DefaultValue(StringUtils.EMPTY) final String orderby,
+      @QueryParam("$skiptoken") @DefaultValue(StringUtils.EMPTY) final String skiptoken) {
 
     try {
       final Accept acceptType;
@@ -982,19 +984,19 @@ public abstract class AbstractServices {
 
         if (StringUtils.isNotBlank(orderby)) {
           builder.append(Constants.get(version, ConstantKey.ORDERBY)).append(File.separatorChar).
-                  append(orderby).append(File.separatorChar);
+              append(orderby).append(File.separatorChar);
         }
 
         if (StringUtils.isNotBlank(filter)) {
           builder.append(Constants.get(version, ConstantKey.FILTER)).append(File.separatorChar).
-                  append(filter.replaceAll("/", "."));
+              append(filter.replaceAll("/", "."));
         } else if (StringUtils.isNotBlank(skiptoken)) {
           builder.append(Constants.get(version, ConstantKey.SKIP_TOKEN)).append(File.separatorChar).
-                  append(skiptoken);
+              append(skiptoken);
         } else {
           builder.append(metadata.getEntitySet(name).isSingleton()
-                  ? Constants.get(version, ConstantKey.ENTITY)
-                  : Constants.get(version, ConstantKey.FEED));
+              ? Constants.get(version, ConstantKey.ENTITY)
+              : Constants.get(version, ConstantKey.FEED));
         }
 
         final InputStream feed = FSManager.instance(version).readFile(builder.toString(), Accept.ATOM);
@@ -1032,10 +1034,10 @@ public abstract class AbstractServices {
         writer.close();
 
         return xml.createResponse(
-                location,
-                new ByteArrayInputStream(content.toByteArray()),
-                Commons.getETag(basePath, version),
-                acceptType);
+            location,
+            new ByteArrayInputStream(content.toByteArray()),
+            Commons.getETag(basePath, version),
+            acceptType);
       }
     } catch (Exception e) {
       return xml.createFaultResponse(accept, e);
@@ -1047,29 +1049,29 @@ public abstract class AbstractServices {
   @GET
   @Path("/Person({entityId})")
   public Response getPerson(
-          @Context final UriInfo uriInfo,
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @PathParam("entityId") final String entityId,
-          @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format) {
+      @Context final UriInfo uriInfo,
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @PathParam("entityId") final String entityId,
+      @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format) {
 
     final Map.Entry<Accept, AbstractUtilities> utils = getUtilities(accept, format);
 
     final Response internal = getEntityInternal(
-            uriInfo.getRequestUri().toASCIIString(), accept, "Person", entityId, format, null, null);
+        uriInfo.getRequestUri().toASCIIString(), accept, "Person", entityId, format, null, null);
     if (internal.getStatus() == 200) {
       InputStream entity = (InputStream) internal.getEntity();
       try {
         if (utils.getKey() == Accept.JSON_FULLMETA || utils.getKey() == Accept.ATOM) {
           entity = utils.getValue().addOperation(entity, "Sack", "#DefaultContainer.Sack",
-                  uriInfo.getAbsolutePath().toASCIIString()
+              uriInfo.getAbsolutePath().toASCIIString()
                   + "/Microsoft.Test.OData.Services.AstoriaDefaultService.SpecialEmployee/Sack");
         }
 
         return utils.getValue().createResponse(
-                uriInfo.getRequestUri().toASCIIString(),
-                entity,
-                internal.getHeaderString("ETag"),
-                utils.getKey());
+            uriInfo.getRequestUri().toASCIIString(),
+            entity,
+            internal.getHeaderString("ETag"),
+            utils.getKey());
       } catch (Exception e) {
         LOG.error("Error retrieving entity", e);
         return xml.createFaultResponse(accept, e);
@@ -1082,29 +1084,29 @@ public abstract class AbstractServices {
   @GET
   @Path("/Product({entityId})")
   public Response getProduct(
-          @Context final UriInfo uriInfo,
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @PathParam("entityId") final String entityId,
-          @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format) {
+      @Context final UriInfo uriInfo,
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @PathParam("entityId") final String entityId,
+      @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format) {
 
     final Map.Entry<Accept, AbstractUtilities> utils = getUtilities(accept, format);
 
     final Response internal = getEntityInternal(
-            uriInfo.getRequestUri().toASCIIString(), accept, "Product", entityId, format, null, null);
+        uriInfo.getRequestUri().toASCIIString(), accept, "Product", entityId, format, null, null);
     if (internal.getStatus() == 200) {
       InputStream entity = (InputStream) internal.getEntity();
       try {
         if (utils.getKey() == Accept.JSON_FULLMETA || utils.getKey() == Accept.ATOM) {
           entity = utils.getValue().addOperation(entity,
-                  "ChangeProductDimensions", "#DefaultContainer.ChangeProductDimensions",
-                  uriInfo.getAbsolutePath().toASCIIString() + "/ChangeProductDimensions");
+              "ChangeProductDimensions", "#DefaultContainer.ChangeProductDimensions",
+              uriInfo.getAbsolutePath().toASCIIString() + "/ChangeProductDimensions");
         }
 
         return utils.getValue().createResponse(
-                uriInfo.getRequestUri().toASCIIString(),
-                entity,
-                internal.getHeaderString("ETag"),
-                utils.getKey());
+            uriInfo.getRequestUri().toASCIIString(),
+            entity,
+            internal.getHeaderString("ETag"),
+            utils.getKey());
       } catch (Exception e) {
         LOG.error("Error retrieving entity", e);
         return xml.createFaultResponse(accept, e);
@@ -1117,29 +1119,29 @@ public abstract class AbstractServices {
   @GET
   @Path("/ComputerDetail({entityId})")
   public Response getComputerDetail(
-          @Context final UriInfo uriInfo,
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @PathParam("entityId") final String entityId,
-          @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format) {
+      @Context final UriInfo uriInfo,
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @PathParam("entityId") final String entityId,
+      @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format) {
 
     final Map.Entry<Accept, AbstractUtilities> utils = getUtilities(accept, format);
 
     final Response internal = getEntityInternal(
-            uriInfo.getRequestUri().toASCIIString(), accept, "ComputerDetail", entityId, format, null, null);
+        uriInfo.getRequestUri().toASCIIString(), accept, "ComputerDetail", entityId, format, null, null);
     if (internal.getStatus() == 200) {
       InputStream entity = (InputStream) internal.getEntity();
       try {
         if (utils.getKey() == Accept.JSON_FULLMETA || utils.getKey() == Accept.ATOM) {
           entity = utils.getValue().addOperation(entity,
-                  "ResetComputerDetailsSpecifications", "#DefaultContainer.ResetComputerDetailsSpecifications",
-                  uriInfo.getAbsolutePath().toASCIIString() + "/ResetComputerDetailsSpecifications");
+              "ResetComputerDetailsSpecifications", "#DefaultContainer.ResetComputerDetailsSpecifications",
+              uriInfo.getAbsolutePath().toASCIIString() + "/ResetComputerDetailsSpecifications");
         }
 
         return utils.getValue().createResponse(
-                uriInfo.getRequestUri().toASCIIString(),
-                entity,
-                internal.getHeaderString("ETag"),
-                utils.getKey());
+            uriInfo.getRequestUri().toASCIIString(),
+            entity,
+            internal.getHeaderString("ETag"),
+            utils.getKey());
       } catch (Exception e) {
         LOG.error("Error retrieving entity", e);
         return xml.createFaultResponse(accept, e);
@@ -1163,26 +1165,26 @@ public abstract class AbstractServices {
   @GET
   @Path("/{entitySetName}({entityId})")
   public Response getEntity(
-          @Context final UriInfo uriInfo,
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @PathParam("entitySetName") final String entitySetName,
-          @PathParam("entityId") final String entityId,
-          @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
-          @QueryParam("$expand") @DefaultValue(StringUtils.EMPTY) final String expand,
-          @QueryParam("$select") @DefaultValue(StringUtils.EMPTY) final String select) {
+      @Context final UriInfo uriInfo,
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @PathParam("entitySetName") final String entitySetName,
+      @PathParam("entityId") final String entityId,
+      @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
+      @QueryParam("$expand") @DefaultValue(StringUtils.EMPTY) final String expand,
+      @QueryParam("$select") @DefaultValue(StringUtils.EMPTY) final String select) {
 
     return getEntityInternal(
-            uriInfo.getRequestUri().toASCIIString(), accept, entitySetName, entityId, format, expand, select);
+        uriInfo.getRequestUri().toASCIIString(), accept, entitySetName, entityId, format, expand, select);
   }
 
   protected Response getEntityInternal(
-          final String location,
-          final String accept,
-          final String entitySetName,
-          final String entityId,
-          final String format,
-          String expand,
-          final String select) {
+      final String location,
+      final String accept,
+      final String entitySetName,
+      final String entityId,
+      final String format,
+      String expand,
+      final String select) {
 
     try {
       final Map.Entry<Accept, AbstractUtilities> utils = getUtilities(accept, format);
@@ -1192,15 +1194,15 @@ public abstract class AbstractServices {
       }
 
       final Map.Entry<String, InputStream> entityInfo =
-              utils.getValue().readEntity(entitySetName, entityId, Accept.ATOM);
+          utils.getValue().readEntity(entitySetName, entityId, Accept.ATOM);
 
       final InputStream entity = entityInfo.getValue();
 
       ResWrap<Entity> container = atomDeserializer.toEntity(entity);
       if (container.getContextURL() == null) {
         container = new ResWrap<Entity>(URI.create(Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX)
-                + entitySetName + Constants.get(version, ConstantKey.ODATA_METADATA_ENTITY_SUFFIX)),
-                container.getMetadataETag(), container.getPayload());
+            + entitySetName + Constants.get(version, ConstantKey.ODATA_METADATA_ENTITY_SUFFIX)),
+            container.getMetadataETag(), container.getPayload());
       }
       final Entity entry = container.getPayload();
 
@@ -1253,12 +1255,12 @@ public abstract class AbstractServices {
             if (link.getType().equals(Constants.get(version, ConstantKey.ATOM_LINK_ENTRY))) {
               // inline entry
               final Entity inline = atomDeserializer.toEntity(
-                      xml.expandEntity(entitySetName, entityId, link.getTitle())).getPayload();
+                  xml.expandEntity(entitySetName, entityId, link.getTitle())).getPayload();
               rep.setInlineEntity(inline);
             } else if (link.getType().equals(Constants.get(version, ConstantKey.ATOM_LINK_FEED))) {
               // inline feed
               final EntitySet inline = atomDeserializer.toEntitySet(
-                      xml.expandEntity(entitySetName, entityId, link.getTitle())).getPayload();
+                  xml.expandEntity(entitySetName, entityId, link.getTitle())).getPayload();
               rep.setInlineEntitySet(inline);
             }
             replace.put(link, rep);
@@ -1272,10 +1274,10 @@ public abstract class AbstractServices {
       }
 
       return xml.createResponse(
-              location,
-              xml.writeEntity(utils.getKey(), container),
-              Commons.getETag(entityInfo.getKey(), version),
-              utils.getKey());
+          location,
+          xml.writeEntity(utils.getKey(), container),
+          Commons.getETag(entityInfo.getKey(), version),
+          utils.getKey());
     } catch (Exception e) {
       LOG.error("Error retrieving entity", e);
       return xml.createFaultResponse(accept, e);
@@ -1285,10 +1287,10 @@ public abstract class AbstractServices {
   @GET
   @Path("/{entitySetName}({entityId})/$value")
   public Response getMediaEntity(
-          @Context final UriInfo uriInfo,
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @PathParam("entitySetName") final String entitySetName,
-          @PathParam("entityId") final String entityId) {
+      @Context final UriInfo uriInfo,
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @PathParam("entitySetName") final String entitySetName,
+      @PathParam("entityId") final String entityId) {
 
     try {
       if (!accept.contains("*/*") && !accept.contains("application/octet-stream")) {
@@ -1298,10 +1300,10 @@ public abstract class AbstractServices {
       final AbstractUtilities utils = getUtilities(null);
       final Map.Entry<String, InputStream> entityInfo = utils.readMediaEntity(entitySetName, entityId);
       return utils.createResponse(
-              uriInfo.getRequestUri().toASCIIString(),
-              entityInfo.getValue(),
-              Commons.getETag(entityInfo.getKey(), version),
-              null);
+          uriInfo.getRequestUri().toASCIIString(),
+          entityInfo.getValue(),
+          Commons.getETag(entityInfo.getKey(), version),
+          null);
 
     } catch (Exception e) {
       LOG.error("Error retrieving entity", e);
@@ -1312,8 +1314,8 @@ public abstract class AbstractServices {
   @DELETE
   @Path("/{entitySetName}({entityId})")
   public Response removeEntity(
-          @PathParam("entitySetName") final String entitySetName,
-          @PathParam("entityId") final String entityId) {
+      @PathParam("entitySetName") final String entitySetName,
+      @PathParam("entityId") final String entityId) {
 
     try {
       final String basePath = entitySetName + File.separatorChar + Commons.getEntityKey(entityId);
@@ -1327,16 +1329,16 @@ public abstract class AbstractServices {
   }
 
   private Response replaceProperty(
-          final String location,
-          final String accept,
-          final String contentType,
-          final String prefer,
-          final String entitySetName,
-          final String entityId,
-          final String path,
-          final String format,
-          final String changes,
-          final boolean justValue) {
+      final String location,
+      final String accept,
+      final String contentType,
+      final String prefer,
+      final String entitySetName,
+      final String entityId,
+      final String path,
+      final String format,
+      final String changes,
+      final boolean justValue) {
 
     // if the given path is not about any link then search for property
     LOG.info("Retrieve property {}", path);
@@ -1346,7 +1348,7 @@ public abstract class AbstractServices {
       final String basePath = Commons.getEntityBasePath(entitySetName, entityId);
 
       final ResWrap<Entity> container = xml.readContainerEntity(Accept.ATOM,
-              fsManager.readFile(basePath + Constants.get(version, ConstantKey.ENTITY), Accept.ATOM));
+          fsManager.readFile(basePath + Constants.get(version, ConstantKey.ENTITY), Accept.ATOM));
 
       final Entity entry = container.getPayload();
 
@@ -1355,7 +1357,7 @@ public abstract class AbstractServices {
         if (toBeReplaced == null) {
           toBeReplaced = entry.getProperty(element.trim());
         } else {
-          List<Property> value = toBeReplaced.asComplex();
+          List<Property> value = toBeReplaced.asComplex().getValue();
           for (Property field : value) {
             if (field.getName().equalsIgnoreCase(element)) {
               toBeReplaced = field;
@@ -1373,14 +1375,14 @@ public abstract class AbstractServices {
         toBeReplaced.setValue(ValueType.PRIMITIVE, changes);
       } else {
         final Property pchanges = xml.readProperty(
-                Accept.parse(contentType, version),
-                IOUtils.toInputStream(changes, Constants.ENCODING));
+            Accept.parse(contentType, version),
+            IOUtils.toInputStream(changes, Constants.ENCODING));
 
         toBeReplaced.setValue(pchanges.getValueType(), pchanges.getValue());
       }
 
       fsManager.putInMemory(xml.writeEntity(Accept.ATOM, container),
-              fsManager.getAbsolutePath(basePath + Constants.get(version, ConstantKey.ENTITY), Accept.ATOM));
+          fsManager.getAbsolutePath(basePath + Constants.get(version, ConstantKey.ENTITY), Accept.ATOM));
 
       final Response response;
       if ("return-content".equalsIgnoreCase(prefer)) {
@@ -1397,7 +1399,7 @@ public abstract class AbstractServices {
       }
 
       if (StringUtils.isNotBlank(prefer)) {
-        response.getHeaders().put("Preference-Applied", Collections.<Object>singletonList(prefer));
+        response.getHeaders().put("Preference-Applied", Collections.<Object> singletonList(prefer));
       }
 
       return response;
@@ -1407,12 +1409,12 @@ public abstract class AbstractServices {
   }
 
   private Response deletePropertyValue(
-          final String accept,
-          final String prefer,
-          final String entitySetName,
-          final String entityId,
-          final String path,
-          final String format) {
+      final String accept,
+      final String prefer,
+      final String entitySetName,
+      final String entityId,
+      final String path,
+      final String format) {
     try {
       Accept acceptType = null;
       if (StringUtils.isNotBlank(format)) {
@@ -1427,10 +1429,10 @@ public abstract class AbstractServices {
       final AbstractUtilities utils = getUtilities(acceptType);
 
       final InputStream changed = utils.deleteProperty(
-              entitySetName,
-              entityId,
-              Arrays.asList(path.split("/")),
-              acceptType);
+          entitySetName,
+          entityId,
+          Arrays.asList(path.split("/")),
+          acceptType);
 
       final Response response;
       if ("return-content".equalsIgnoreCase(prefer)) {
@@ -1441,7 +1443,7 @@ public abstract class AbstractServices {
       }
 
       if (StringUtils.isNotBlank(prefer)) {
-        response.getHeaders().put("Preference-Applied", Collections.<Object>singletonList(prefer));
+        response.getHeaders().put("Preference-Applied", Collections.<Object> singletonList(prefer));
       }
 
       return response;
@@ -1465,18 +1467,18 @@ public abstract class AbstractServices {
   @PUT
   @Path("/{entitySetName}({entityId})/{path:.*}/$value")
   public Response replacePropertyValue(
-          @Context final UriInfo uriInfo,
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) final String contentType,
-          @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
-          @PathParam("entitySetName") final String entitySetName,
-          @PathParam("entityId") final String entityId,
-          @PathParam("path") final String path,
-          @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
-          final String changes) {
+      @Context final UriInfo uriInfo,
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) final String contentType,
+      @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
+      @PathParam("entitySetName") final String entitySetName,
+      @PathParam("entityId") final String entityId,
+      @PathParam("path") final String path,
+      @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
+      final String changes) {
 
     return replaceProperty(uriInfo.getRequestUri().toASCIIString(),
-            accept, contentType, prefer, entitySetName, entityId, path, format, changes, true);
+        accept, contentType, prefer, entitySetName, entityId, path, format, changes, true);
   }
 
   /**
@@ -1493,18 +1495,18 @@ public abstract class AbstractServices {
   @MERGE
   @Path("/{entitySetName}({entityId})/{path:.*}")
   public Response mergeProperty(
-          @Context final UriInfo uriInfo,
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) final String contentType,
-          @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
-          @PathParam("entitySetName") final String entitySetName,
-          @PathParam("entityId") final String entityId,
-          @PathParam("path") final String path,
-          @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
-          final String changes) {
+      @Context final UriInfo uriInfo,
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) final String contentType,
+      @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
+      @PathParam("entitySetName") final String entitySetName,
+      @PathParam("entityId") final String entityId,
+      @PathParam("path") final String path,
+      @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
+      final String changes) {
 
     return replaceProperty(uriInfo.getRequestUri().toASCIIString(),
-            accept, contentType, prefer, entitySetName, entityId, path, format, changes, false);
+        accept, contentType, prefer, entitySetName, entityId, path, format, changes, false);
   }
 
   /**
@@ -1521,37 +1523,37 @@ public abstract class AbstractServices {
   @PATCH
   @Path("/{entitySetName}({entityId})/{path:.*}")
   public Response patchProperty(
-          @Context final UriInfo uriInfo,
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) final String contentType,
-          @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
-          @PathParam("entitySetName") final String entitySetName,
-          @PathParam("entityId") final String entityId,
-          @PathParam("path") final String path,
-          @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
-          final String changes) {
+      @Context final UriInfo uriInfo,
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) final String contentType,
+      @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
+      @PathParam("entitySetName") final String entitySetName,
+      @PathParam("entityId") final String entityId,
+      @PathParam("path") final String path,
+      @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
+      final String changes) {
 
     return replaceProperty(uriInfo.getRequestUri().toASCIIString(),
-            accept, contentType, prefer, entitySetName, entityId, path, format, changes, false);
+        accept, contentType, prefer, entitySetName, entityId, path, format, changes, false);
   }
 
   @PUT
-  @Produces({MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON})
-  @Consumes({MediaType.WILDCARD, MediaType.APPLICATION_OCTET_STREAM})
+  @Produces({ MediaType.APPLICATION_ATOM_XML, MediaType.APPLICATION_JSON })
+  @Consumes({ MediaType.WILDCARD, MediaType.APPLICATION_OCTET_STREAM })
   @Path("/{entitySetName}({entityId})/$value")
   public Response replaceMediaEntity(
-          @Context final UriInfo uriInfo,
-          @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
-          @PathParam("entitySetName") final String entitySetName,
-          @PathParam("entityId") final String entityId,
-          @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
-          final String value) {
+      @Context final UriInfo uriInfo,
+      @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
+      @PathParam("entitySetName") final String entitySetName,
+      @PathParam("entityId") final String entityId,
+      @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
+      final String value) {
     try {
 
       final AbstractUtilities utils = getUtilities(null);
 
       final InputStream res = utils.putMediaInMemory(
-              entitySetName, entityId, IOUtils.toInputStream(value, Constants.ENCODING));
+          entitySetName, entityId, IOUtils.toInputStream(value, Constants.ENCODING));
 
       final String location = uriInfo.getRequestUri().toASCIIString().replace("/$value", "");
 
@@ -1564,7 +1566,7 @@ public abstract class AbstractServices {
       }
 
       if (StringUtils.isNotBlank(prefer)) {
-        response.getHeaders().put("Preference-Applied", Collections.<Object>singletonList(prefer));
+        response.getHeaders().put("Preference-Applied", Collections.<Object> singletonList(prefer));
       }
 
       return response;
@@ -1589,36 +1591,36 @@ public abstract class AbstractServices {
   @PUT
   @Path("/{entitySetName}({entityId})/{path:.*}")
   public Response replaceProperty(
-          @Context final UriInfo uriInfo,
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) final String contentType,
-          @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
-          @PathParam("entitySetName") final String entitySetName,
-          @PathParam("entityId") final String entityId,
-          @PathParam("path") final String path,
-          @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
-          final String changes) {
+      @Context final UriInfo uriInfo,
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) final String contentType,
+      @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
+      @PathParam("entitySetName") final String entitySetName,
+      @PathParam("entityId") final String entityId,
+      @PathParam("path") final String path,
+      @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format,
+      final String changes) {
 
     if (xml.isMediaContent(entitySetName + "/" + path)) {
       return replaceMediaProperty(prefer, entitySetName, entityId, path, changes);
     } else {
       return replaceProperty(uriInfo.getRequestUri().toASCIIString(),
-              accept, contentType, prefer, entitySetName, entityId, path, format, changes, false);
+          accept, contentType, prefer, entitySetName, entityId, path, format, changes, false);
     }
   }
 
   private Response replaceMediaProperty(
-          final String prefer,
-          final String entitySetName,
-          final String entityId,
-          final String path,
-          final String value) {
+      final String prefer,
+      final String entitySetName,
+      final String entityId,
+      final String path,
+      final String value) {
 
     try {
       final AbstractUtilities utils = getUtilities(null);
 
       InputStream res = utils.putMediaInMemory(
-              entitySetName, entityId, path, IOUtils.toInputStream(value, Constants.ENCODING));
+          entitySetName, entityId, path, IOUtils.toInputStream(value, Constants.ENCODING));
 
       final Response response;
       if ("return-content".equalsIgnoreCase(prefer)) {
@@ -1629,7 +1631,7 @@ public abstract class AbstractServices {
       }
 
       if (StringUtils.isNotBlank(prefer)) {
-        response.getHeaders().put("Preference-Applied", Collections.<Object>singletonList(prefer));
+        response.getHeaders().put("Preference-Applied", Collections.<Object> singletonList(prefer));
       }
 
       return response;
@@ -1652,12 +1654,12 @@ public abstract class AbstractServices {
   @DELETE
   @Path("/{entitySetName}({entityId})/{path:.*}/$value")
   public Response deleteProperty(
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
-          @PathParam("entitySetName") final String entitySetName,
-          @PathParam("entityId") final String entityId,
-          @PathParam("path") final String path,
-          @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format) {
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) final String prefer,
+      @PathParam("entitySetName") final String entitySetName,
+      @PathParam("entityId") final String entityId,
+      @PathParam("path") final String path,
+      @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format) {
     return deletePropertyValue(accept, prefer, entitySetName, entityId, path, format);
   }
 
@@ -1674,11 +1676,11 @@ public abstract class AbstractServices {
   @GET
   @Path("/{entitySetName}({entityId})/{path:.*}/$value")
   public Response getPathValue(
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @PathParam("entitySetName") final String entitySetName,
-          @PathParam("entityId") final String entityId,
-          @PathParam("path") final String path,
-          @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format) {
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @PathParam("entitySetName") final String entitySetName,
+      @PathParam("entityId") final String entityId,
+      @PathParam("path") final String path,
+      @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format) {
 
     try {
       Accept acceptType = null;
@@ -1707,11 +1709,11 @@ public abstract class AbstractServices {
   @GET
   @Path("/{entitySetName}({entityId})/{path:.*}")
   public Response getPath(
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @PathParam("entitySetName") final String entitySetName,
-          @PathParam("entityId") final String entityId,
-          @PathParam("path") final String path,
-          @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format) {
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @PathParam("entitySetName") final String entitySetName,
+      @PathParam("entityId") final String entityId,
+      @PathParam("path") final String path,
+      @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) final String format) {
 
     // default utilities
     final AbstractUtilities utils = xml;
@@ -1736,7 +1738,7 @@ public abstract class AbstractServices {
           final OutputStreamWriter writer = new OutputStreamWriter(content, Constants.ENCODING);
 
           final ResWrap<?> container = linkInfo.isFeed() ? atomDeserializer.toEntitySet(stream) : atomDeserializer.
-                  toEntity(stream);
+              toEntity(stream);
           if (acceptType == Accept.ATOM) {
             atomSerializer.write(writer, container);
           } else {
@@ -1748,10 +1750,10 @@ public abstract class AbstractServices {
           final String basePath = Commons.getEntityBasePath(entitySetName, entityId);
 
           return xml.createResponse(
-                  null,
-                  new ByteArrayInputStream(content.toByteArray()),
-                  Commons.getETag(basePath, version),
-                  acceptType);
+              null,
+              new ByteArrayInputStream(content.toByteArray()),
+              Commons.getETag(basePath, version),
+              acceptType);
 
         } catch (NotFoundException e) {
           // if the given path is not about any link then search for property
@@ -1764,9 +1766,9 @@ public abstract class AbstractServices {
   }
 
   private Response navigateStreamedEntity(
-          final String entitySetName,
-          final String entityId,
-          final String path) throws Exception {
+      final String entitySetName,
+      final String entityId,
+      final String path) throws Exception {
 
     final AbstractUtilities utils = getUtilities(null);
     final Map.Entry<String, InputStream> entityInfo = utils.readMediaEntity(entitySetName, entityId, path);
@@ -1774,11 +1776,11 @@ public abstract class AbstractServices {
   }
 
   private Response navigateProperty(
-          final Accept acceptType,
-          final String entitySetName,
-          final String entityId,
-          final String path,
-          final boolean searchForValue) throws Exception {
+      final Accept acceptType,
+      final String entitySetName,
+      final String entityId,
+      final String path,
+      final boolean searchForValue) throws Exception {
 
     if ((searchForValue && acceptType != null && acceptType != Accept.TEXT) || acceptType == Accept.ATOM) {
       throw new UnsupportedMediaTypeException("Unsupported media type " + acceptType);
@@ -1795,11 +1797,11 @@ public abstract class AbstractServices {
     final String[] pathElems = StringUtils.split(path, "/");
     Property property = entryContainer.getPayload().getProperty(pathElems[0]);
     if (pathElems.length > 1 && property.isComplex()) {
-      for (Property sub : property.asComplex()) {
+      for (Property sub : property.asComplex().getValue()) {
         if (pathElems[1].equals(sub.getName())) {
           property = sub;
           if (pathElems.length > 2 && property.isComplex()) {
-            for (Property subsub : property.asComplex()) {
+            for (Property subsub : property.asComplex().getValue()) {
               if (pathElems[2].equals(subsub.getName())) {
                 property = subsub;
               }
@@ -1810,25 +1812,25 @@ public abstract class AbstractServices {
     }
 
     final ResWrap<Property> container = new ResWrap<Property>(
-            URI.create(Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX)
+        URI.create(Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX)
             + (version.compareTo(ODataServiceVersion.V40) >= 0 ? entitySetName + "(" + entityId + ")/" + path
-            : property.getType())),
-            entryContainer.getMetadataETag(),
-            property);
+                : property.getType())),
+        entryContainer.getMetadataETag(),
+        property);
 
     return xml.createResponse(null,
-            searchForValue ? IOUtils.toInputStream(
+        searchForValue ? IOUtils.toInputStream(
             container.getPayload().isNull() ? StringUtils.EMPTY : stringValue(container.getPayload()),
             Constants.ENCODING) : utils.writeProperty(acceptType, container),
-            Commons.getETag(Commons.getEntityBasePath(entitySetName, entityId), version),
-            acceptType);
+        Commons.getETag(Commons.getEntityBasePath(entitySetName, entityId), version),
+        acceptType);
   }
 
   private String stringValue(final Property property) {
     EdmPrimitiveTypeKind kind = EdmPrimitiveTypeKind.valueOfFQN(version, property.getType());
     try {
       return EdmPrimitiveTypeFactory.getInstance(kind)
-              .valueToString(property.asPrimitive(), null, null,
+          .valueToString(property.asPrimitive(), null, null,
               org.apache.olingo.commons.api.Constants.DEFAULT_PRECISION,
               org.apache.olingo.commons.api.Constants.DEFAULT_SCALE, null);
     } catch (final EdmPrimitiveTypeException e) {
@@ -1846,8 +1848,8 @@ public abstract class AbstractServices {
   @GET
   @Path("/{entitySetName}/$count")
   public Response count(
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
-          @PathParam("entitySetName") final String entitySetName) {
+      @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) final String accept,
+      @PathParam("entitySetName") final String entitySetName) {
     try {
       final Accept acceptType = Accept.parse(accept, version, Accept.TEXT);
 
@@ -1908,15 +1910,15 @@ public abstract class AbstractServices {
         alink.getAnnotations().addAll(property.getAnnotations());
 
         alink.setType(navProperties.get(property.getName()).isEntitySet()
-                ? Constants.get(version, ConstantKey.ATOM_LINK_FEED)
-                : Constants.get(version, ConstantKey.ATOM_LINK_ENTRY));
+            ? Constants.get(version, ConstantKey.ATOM_LINK_FEED)
+            : Constants.get(version, ConstantKey.ATOM_LINK_ENTRY));
 
         alink.setRel(Constants.get(version, ConstantKey.ATOM_LINK_REL) + property.getName());
 
         if (property.isComplex()) {
           Entity inline = new EntityImpl();
           inline.setType(navProperties.get(property.getName()).getType());
-          for (Property prop : property.asComplex()) {
+          for (Property prop : property.asComplex().getValue()) {
             inline.getProperties().add(prop);
           }
           alink.setInlineEntity(inline);
@@ -1926,8 +1928,7 @@ public abstract class AbstractServices {
           for (Object value : property.asCollection()) {
             Entity inlineEntity = new EntityImpl();
             inlineEntity.setType(navProperties.get(property.getName()).getType());
-            for (Property prop : (value instanceof LinkedComplexValue ? ((LinkedComplexValue) value).getValue()
-                    : ((Valuable) value).asComplex())) {
+            for (Property prop : ((ComplexValue) value).getValue()) {
               inlineEntity.getProperties().add(prop);
             }
             inline.getEntities().add(inlineEntity);
@@ -1965,8 +1966,8 @@ public abstract class AbstractServices {
         final LinkImpl link = new LinkImpl();
         link.setTitle(property.getKey());
         link.setType(property.getValue().isEntitySet()
-                ? Constants.get(version, ConstantKey.ATOM_LINK_FEED)
-                : Constants.get(version, ConstantKey.ATOM_LINK_ENTRY));
+            ? Constants.get(version, ConstantKey.ATOM_LINK_FEED)
+            : Constants.get(version, ConstantKey.ATOM_LINK_ENTRY));
         link.setRel(Constants.get(version, ConstantKey.ATOM_LINK_REL) + property.getKey());
         link.setHref(entitySetName + "(" + entityKey + ")/" + property.getKey());
         entry.getNavigationLinks().add(link);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/0d57a076/fit/src/main/java/org/apache/olingo/fit/V4Services.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/V4Services.java b/fit/src/main/java/org/apache/olingo/fit/V4Services.java
index 6af5e2e..9ae4648 100644
--- a/fit/src/main/java/org/apache/olingo/fit/V4Services.java
+++ b/fit/src/main/java/org/apache/olingo/fit/V4Services.java
@@ -1310,10 +1310,10 @@ public class V4Services extends AbstractServices {
       }
 
       assert property.isComplex();
-      assert 1 == property.asComplex().size();
-      assert "Edm.Int32".equals(property.asComplex().get(0).getType());
-      assert property.asComplex().get(0).isPrimitive();
-      assert "percentage".equals(property.asComplex().get(0).getName());
+      assert 1 == property.asComplex().getValue().size();
+      assert "Edm.Int32".equals(property.asComplex().getValue().get(0).getType());
+      assert property.asComplex().getValue().get(0).isPrimitive();
+      assert "percentage".equals(property.asComplex().getValue().get(0).getName());
 
       return xml.createResponse(null, null, null, acceptType, Response.Status.NO_CONTENT);
     } catch (Exception e) {