You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2014/06/13 12:58:27 UTC

[07/21] [OLINGO-317] First presentable state

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/46a34178/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java b/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
index 0c60609..99a3320 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
@@ -18,8 +18,6 @@
  */
 package org.apache.olingo.fit.utils;
 
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -37,31 +35,30 @@ import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 import java.util.regex.Pattern;
+
 import javax.ws.rs.NotFoundException;
 import javax.ws.rs.core.Response;
-import javax.xml.stream.XMLStreamException;
+
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.vfs2.FileObject;
 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.Property;
 import org.apache.olingo.commons.api.data.ResWrap;
 import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
-import org.apache.olingo.commons.core.data.AtomEntityImpl;
-import org.apache.olingo.commons.core.data.AtomEntitySetImpl;
-import org.apache.olingo.commons.core.data.AtomPropertyImpl;
+import org.apache.olingo.commons.api.op.ODataDeserializer;
+import org.apache.olingo.commons.api.op.ODataDeserializerException;
+import org.apache.olingo.commons.api.op.ODataSerializer;
+import org.apache.olingo.commons.api.op.ODataSerializerException;
 import org.apache.olingo.commons.core.data.AtomSerializer;
-import org.apache.olingo.commons.core.data.JSONEntityImpl;
-import org.apache.olingo.commons.core.data.JSONEntitySetImpl;
-import org.apache.olingo.commons.core.data.JSONPropertyImpl;
+import org.apache.olingo.commons.core.data.JsonDeserializer;
+import org.apache.olingo.commons.core.data.JsonSerializer;
 import org.apache.olingo.fit.UnsupportedMediaTypeException;
 import org.apache.olingo.fit.metadata.Metadata;
 import org.apache.olingo.fit.metadata.NavigationProperty;
 import org.apache.olingo.fit.serializer.FITAtomDeserializer;
-import org.apache.olingo.fit.serializer.JSONEntryContainer;
-import org.apache.olingo.fit.serializer.JSONFeedContainer;
-import org.apache.olingo.fit.serializer.JSONPropertyContainer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -90,27 +87,21 @@ public abstract class AbstractUtilities {
   public static final String BOUNDARY = "boundary";
 
   protected final ODataServiceVersion version;
-
   protected final Metadata metadata;
-
   protected final FSManager fsManager;
-
-  protected final DataBinder dataBinder;
-
-  protected final FITAtomDeserializer atomDeserializer;
-
-  protected final AtomSerializer atomSerializer;
-
-  protected final ObjectMapper mapper;
+  protected final ODataDeserializer atomDeserializer;
+  protected final ODataDeserializer jsonDeserializer;
+  protected final ODataSerializer atomSerializer;
+  protected final ODataSerializer jsonSerializer;
 
   public AbstractUtilities(final ODataServiceVersion version, final Metadata metadata) throws Exception {
     this.version = version;
     this.metadata = metadata;
     this.fsManager = FSManager.instance(version);
-    this.dataBinder = new DataBinder(version, metadata);
-    this.atomDeserializer = Commons.getAtomDeserializer(version);
-    this.atomSerializer = Commons.getAtomSerializer(version);
-    this.mapper = Commons.getJSONMapper(version);
+    atomDeserializer = new FITAtomDeserializer(version);
+    jsonDeserializer = new JsonDeserializer(version, true);
+    atomSerializer = new AtomSerializer(version);
+    jsonSerializer = new JsonSerializer(version, true);
   }
 
   public boolean isMediaContent(final String entityName) {
@@ -128,8 +119,8 @@ public abstract class AbstractUtilities {
    * @throws IOException
    */
   protected abstract InputStream addLinks(
-          final String entitySetName, final String entitykey, final InputStream is, final Set<String> links)
-          throws Exception;
+      final String entitySetName, final String entitykey, final InputStream is, final Set<String> links)
+      throws Exception;
 
   /**
    * Retrieve all entity link names.
@@ -149,8 +140,8 @@ public abstract class AbstractUtilities {
    * @throws IOException
    */
   protected abstract NavigationLinks retrieveNavigationInfo(
-          final String entitySetName, final InputStream is)
-          throws Exception;
+      final String entitySetName, final InputStream is)
+      throws Exception;
 
   /**
    * Normalize navigation info and add edit link if missing.
@@ -163,28 +154,28 @@ public abstract class AbstractUtilities {
    * @throws IOException
    */
   protected abstract InputStream normalizeLinks(
-          final String entitySetName, final String entityKey, final InputStream is, final NavigationLinks links)
-          throws Exception;
+      final String entitySetName, final String entityKey, final InputStream is, final NavigationLinks links)
+      throws Exception;
 
   public InputStream saveSingleEntity(
-          final String key,
-          final String entitySetName,
-          final InputStream is) throws Exception {
+      final String key,
+      final String entitySetName,
+      final InputStream is) throws Exception {
 
     return saveSingleEntity(key, entitySetName, is, null);
   }
 
   public InputStream saveSingleEntity(
-          final String key,
-          final String entitySetName,
-          final InputStream is,
-          final NavigationLinks links) throws Exception {
+      final String key,
+      final String entitySetName,
+      final InputStream is,
+      final NavigationLinks links) throws Exception {
 
     // -----------------------------------------
     // 0. Get the path
     // -----------------------------------------
     final String path =
-            entitySetName + File.separatorChar + Commons.getEntityKey(key) + File.separatorChar
+        entitySetName + File.separatorChar + Commons.getEntityKey(key) + File.separatorChar
             + Constants.get(version, ConstantKey.ENTITY);
     // -----------------------------------------
 
@@ -203,7 +194,7 @@ public abstract class AbstractUtilities {
     return fo.getContent().getInputStream();
   }
 
-  private InputStream toInputStream(final AtomEntityImpl entry) throws XMLStreamException {
+  private InputStream toInputStream(final Entity entry) throws ODataSerializerException {
     final StringWriter writer = new StringWriter();
     atomSerializer.write(writer, entry);
 
@@ -211,10 +202,10 @@ public abstract class AbstractUtilities {
   }
 
   public InputStream addOrReplaceEntity(
-          final String key,
-          final String entitySetName,
-          final InputStream is,
-          final AtomEntityImpl entry) throws Exception {
+      final String key,
+      final String entitySetName,
+      final InputStream is,
+      final Entity entry) throws Exception {
 
     final ByteArrayOutputStream bos = new ByteArrayOutputStream();
     IOUtils.copy(is, bos);
@@ -229,7 +220,7 @@ public abstract class AbstractUtilities {
     try {
       linksToBeKept = new HashSet<String>(navigationProperties.keySet());
     } catch (Exception e) {
-      linksToBeKept = Collections.<String>emptySet();
+      linksToBeKept = Collections.<String> emptySet();
     }
 
     for (String availableLink : new HashSet<String>(linksToBeKept)) {
@@ -263,7 +254,7 @@ public abstract class AbstractUtilities {
     // 3. Normalize navigation info; add edit link; ... and save entity ....
     // -----------------------------------------
     final InputStream createdEntity =
-            saveSingleEntity(entityKey, entitySetName, new ByteArrayInputStream(bos.toByteArray()), links);
+        saveSingleEntity(entityKey, entitySetName, new ByteArrayInputStream(bos.toByteArray()), links);
     // -----------------------------------------
 
     bos.reset();
@@ -273,7 +264,7 @@ public abstract class AbstractUtilities {
     // 4. Add navigation links to be kept
     // -----------------------------------------
     final InputStream normalizedEntity =
-            addLinks(entitySetName, entityKey, new ByteArrayInputStream(bos.toByteArray()), linksToBeKept);
+        addLinks(entitySetName, entityKey, new ByteArrayInputStream(bos.toByteArray()), linksToBeKept);
     // -----------------------------------------
 
     IOUtils.closeQuietly(bos);
@@ -282,8 +273,8 @@ public abstract class AbstractUtilities {
     // 5. save the entity
     // -----------------------------------------
     final FileObject fo = fsManager.putInMemory(
-            normalizedEntity,
-            fsManager.getAbsolutePath(path + Constants.get(version, ConstantKey.ENTITY), getDefaultFormat()));
+        normalizedEntity,
+        fsManager.getAbsolutePath(path + Constants.get(version, ConstantKey.ENTITY), getDefaultFormat()));
     // -----------------------------------------
 
     // -----------------------------------------
@@ -297,30 +288,28 @@ public abstract class AbstractUtilities {
 
     for (final Link link : entry.getNavigationLinks()) {
       final NavigationProperty navProp =
-              navigationProperties == null ? null : navigationProperties.get(link.getTitle());
+          navigationProperties == null ? null : navigationProperties.get(link.getTitle());
       if (navProp != null) {
         final String inlineEntitySetName = navProp.getTarget();
         if (link.getInlineEntity() != null) {
-          final String inlineEntryKey = getDefaultEntryKey(
-                  inlineEntitySetName, (AtomEntityImpl) link.getInlineEntity());
+          final String inlineEntryKey = getDefaultEntryKey(inlineEntitySetName, link.getInlineEntity());
 
           addOrReplaceEntity(
-                  inlineEntryKey,
-                  inlineEntitySetName,
-                  toInputStream((AtomEntityImpl) link.getInlineEntity()),
-                  (AtomEntityImpl) link.getInlineEntity());
+              inlineEntryKey,
+              inlineEntitySetName,
+              toInputStream(link.getInlineEntity()),
+              link.getInlineEntity());
 
           hrefs.add(inlineEntitySetName + "(" + inlineEntryKey + ")");
         } else if (link.getInlineEntitySet() != null) {
           for (Entity subentry : link.getInlineEntitySet().getEntities()) {
-            final String inlineEntryKey = getDefaultEntryKey(
-                    inlineEntitySetName, (AtomEntityImpl) subentry);
+            final String inlineEntryKey = getDefaultEntryKey(inlineEntitySetName, subentry);
 
             addOrReplaceEntity(
-                    inlineEntryKey,
-                    inlineEntitySetName,
-                    toInputStream((AtomEntityImpl) subentry),
-                    (AtomEntityImpl) subentry);
+                inlineEntryKey,
+                inlineEntitySetName,
+                toInputStream(subentry),
+                subentry);
 
             hrefs.add(inlineEntitySetName + "(" + inlineEntryKey + ")");
           }
@@ -337,9 +326,9 @@ public abstract class AbstractUtilities {
   }
 
   public void addMediaEntityValue(
-          final String entitySetName,
-          final String entityKey,
-          final InputStream is) throws Exception {
+      final String entitySetName,
+      final String entityKey,
+      final InputStream is) throws Exception {
 
     // -----------------------------------------
     // 0. Get default entry key and path (N.B. operation will consume/close the stream; use a copy instead)
@@ -351,17 +340,17 @@ public abstract class AbstractUtilities {
     // 1. save the media entity value
     // -----------------------------------------
     fsManager.putInMemory(is, fsManager.getAbsolutePath(path
-            + Constants.get(version, ConstantKey.MEDIA_CONTENT_FILENAME), null));
+        + Constants.get(version, ConstantKey.MEDIA_CONTENT_FILENAME), null));
     IOUtils.closeQuietly(is);
     // -----------------------------------------
   }
 
   public void putLinksInMemory(
-          final String basePath,
-          final String entitySetName,
-          final String entityKey,
-          final String linkName,
-          final Collection<String> links) throws IOException {
+      final String basePath,
+      final String entitySetName,
+      final String entityKey,
+      final String linkName,
+      final Collection<String> links) throws IOException {
 
     final HashSet<String> uris = new HashSet<String>();
 
@@ -372,8 +361,7 @@ public abstract class AbstractUtilities {
       try {
         final Map.Entry<String, List<String>> currents = extractLinkURIs(entitySetName, entityKey, linkName);
         uris.addAll(currents.getValue());
-      } catch (Exception ignore) {
-      }
+      } catch (Exception ignore) {}
     }
 
     uris.addAll(links);
@@ -382,20 +370,20 @@ public abstract class AbstractUtilities {
   }
 
   public void putLinksInMemory(
-          final String basePath, final String entitySetName, final String linkName, final Collection<String> uris)
-          throws IOException {
+      final String basePath, final String entitySetName, final String linkName, final Collection<String> uris)
+      throws IOException {
 
     fsManager.putInMemory(
-            Commons.getLinksAsJSON(version, entitySetName, new SimpleEntry<String, Collection<String>>(linkName, uris)),
-            Commons.getLinksPath(version, basePath, linkName, Accept.JSON_FULLMETA));
+        Commons.getLinksAsJSON(version, entitySetName, new SimpleEntry<String, Collection<String>>(linkName, uris)),
+        Commons.getLinksPath(version, basePath, linkName, Accept.JSON_FULLMETA));
 
     fsManager.putInMemory(
-            Commons.getLinksAsATOM(version, new SimpleEntry<String, Collection<String>>(linkName, uris)),
-            Commons.getLinksPath(version, basePath, linkName, Accept.XML));
+        Commons.getLinksAsATOM(version, new SimpleEntry<String, Collection<String>>(linkName, uris)),
+        Commons.getLinksPath(version, basePath, linkName, Accept.XML));
   }
 
   public Response createResponse(
-          final String location, final InputStream entity, final String etag, final Accept accept) {
+      final String location, final InputStream entity, final String etag, final Accept accept) {
     return createResponse(location, entity, etag, accept, null);
   }
 
@@ -430,26 +418,26 @@ public abstract class AbstractUtilities {
 
   public Response createBatchResponse(final InputStream stream, final String boundary) {
     final Response.ResponseBuilder builder = version.compareTo(ODataServiceVersion.V30) <= 0
-            ? Response.accepted(stream)
-            : Response.ok(stream);
+        ? Response.accepted(stream)
+        : Response.ok(stream);
     builder.header(Constants.get(version, ConstantKey.ODATA_SERVICE_VERSION), version.toString() + ";");
     return builder.build();
   }
 
   public Response createResponse(
-          final InputStream entity,
-          final String etag,
-          final Accept accept,
-          final Response.Status status) {
+      final InputStream entity,
+      final String etag,
+      final Accept accept,
+      final Response.Status status) {
     return createResponse(null, entity, etag, accept, status);
   }
 
   public Response createResponse(
-          final String location,
-          final InputStream entity,
-          final String etag,
-          final Accept accept,
-          final Response.Status status) {
+      final String location,
+      final InputStream entity,
+      final String etag,
+      final Accept accept,
+      final Response.Status status) {
 
     final Response.ResponseBuilder builder = Response.ok();
     if (version.compareTo(ODataServiceVersion.V30) <= 0) {
@@ -543,130 +531,87 @@ public abstract class AbstractUtilities {
     return builder.build();
   }
 
-  public AtomEntitySetImpl readEntitySet(final Accept accept, final InputStream entitySet)
-          throws XMLStreamException, IOException {
-
-    final AtomEntitySetImpl entry;
-
-    if (accept == Accept.ATOM || accept == Accept.XML) {
-      final ResWrap<AtomEntitySetImpl> container = atomDeserializer.read(entitySet, AtomEntitySetImpl.class);
-      entry = container.getPayload();
-    } else {
-      final ResWrap<JSONEntitySetImpl> container =
-              mapper.readValue(entitySet, new TypeReference<JSONEntitySetImpl>() {
-      });
-      entry = dataBinder.toAtomEntitySet(container.getPayload());
-    }
-
-    return entry;
+  public EntitySet readEntitySet(final Accept accept, final InputStream entitySet)
+      throws ODataDeserializerException {
+    return (accept == Accept.ATOM || accept == Accept.XML ?
+        atomDeserializer.toEntitySet(entitySet) : jsonDeserializer.toEntitySet(entitySet))
+        .getPayload();
   }
 
-  public InputStream writeEntitySet(final Accept accept, final ResWrap<AtomEntitySetImpl> container)
-          throws XMLStreamException, IOException {
+  public InputStream writeEntitySet(final Accept accept, final ResWrap<EntitySet> container)
+      throws ODataSerializerException, IOException {
 
     final StringWriter writer = new StringWriter();
     if (accept == Accept.ATOM || accept == Accept.XML) {
       atomSerializer.write(writer, container);
-      writer.flush();
-      writer.close();
     } else {
-      mapper.writeValue(
-              writer, new JSONFeedContainer(container.getContextURL(),
-              container.getMetadataETag(), dataBinder.toJSONEntitySet(container.getPayload())));
+      jsonSerializer.write(writer, container);
     }
+    writer.flush();
+    writer.close();
 
     return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
   }
 
-  public ResWrap<AtomEntityImpl> readContainerEntity(final Accept accept, final InputStream entity)
-          throws XMLStreamException, IOException {
-    final ResWrap<AtomEntityImpl> container;
-
-    if (accept == Accept.ATOM || accept == Accept.XML) {
-      container = atomDeserializer.read(entity, AtomEntityImpl.class);
-    } else {
-      final ResWrap<JSONEntityImpl> jcontainer =
-              mapper.readValue(entity, new TypeReference<JSONEntityImpl>() {
-      });
-      container = new ResWrap<AtomEntityImpl>(
-              jcontainer.getContextURL(),
-              jcontainer.getMetadataETag(),
-              dataBinder.toAtomEntity(jcontainer.getPayload()));
-    }
-
-    return container;
+  public ResWrap<Entity> readContainerEntity(final Accept accept, final InputStream entity)
+      throws ODataDeserializerException {
+    return accept == Accept.ATOM || accept == Accept.XML ?
+        atomDeserializer.toEntity(entity) : jsonDeserializer.toEntity(entity);
   }
 
-  public AtomEntityImpl readEntity(final Accept accept, final InputStream entity)
-          throws XMLStreamException, IOException {
-
+  public Entity readEntity(final Accept accept, final InputStream entity)
+      throws IOException, ODataDeserializerException {
     return readContainerEntity(accept, entity).getPayload();
   }
 
-  public InputStream writeEntity(final Accept accept, final ResWrap<AtomEntityImpl> container)
-          throws XMLStreamException, IOException {
+  public InputStream writeEntity(final Accept accept, final ResWrap<Entity> container)
+      throws ODataSerializerException {
+    StringWriter writer = new StringWriter();
 
-    final StringWriter writer = new StringWriter();
     if (accept == Accept.ATOM || accept == Accept.XML) {
       atomSerializer.write(writer, container);
     } else {
-      mapper.writeValue(
-              writer, new JSONEntryContainer(container.getContextURL(), container.getMetadataETag(),
-              dataBinder.toJSONEntity(container.getPayload())));
+      jsonSerializer.write(writer, container);
     }
 
     return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
   }
 
   public InputStream writeProperty(final Accept accept, final Property property)
-          throws XMLStreamException, IOException {
+      throws ODataSerializerException {
 
     final StringWriter writer = new StringWriter();
     if (accept == Accept.XML || accept == Accept.ATOM) {
-      atomSerializer.write(writer, property instanceof AtomPropertyImpl
-              ? property : dataBinder.toAtomProperty((JSONPropertyImpl) property, property.getType()));
+      atomSerializer.write(writer, property);
     } else {
-      mapper.writeValue(writer, property instanceof JSONPropertyImpl
-              ? property : dataBinder.toJSONProperty((AtomPropertyImpl) property));
+      jsonSerializer.write(writer, property);
     }
 
     return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
   }
 
-  public AtomPropertyImpl readProperty(final Accept accept, final InputStream property, final String entryType)
-          throws XMLStreamException, IOException {
-    final AtomPropertyImpl atomProperty;
-    if (Accept.ATOM == accept || Accept.XML == accept) {
-      final ResWrap<AtomPropertyImpl> container = atomDeserializer.read(property, AtomPropertyImpl.class);
-      atomProperty = container.getPayload();
-    } else {
-      final ResWrap<JSONPropertyImpl> jcontainer = mapper.readValue(property,
-              new TypeReference<JSONPropertyImpl>() {
-      });
-
-      atomProperty = dataBinder.toAtomProperty(jcontainer.getPayload(), entryType);
-    }
-
-    return atomProperty;
+  public Property readProperty(final Accept accept, final InputStream property, final String entryType)
+      throws ODataDeserializerException {
+    return (Accept.ATOM == accept || Accept.XML == accept ?
+        atomDeserializer.toProperty(property) : jsonDeserializer.toProperty(property))
+        .getPayload();
   }
 
-  public InputStream writeProperty(final Accept accept, final ResWrap<AtomPropertyImpl> container)
-          throws XMLStreamException, IOException {
+  public InputStream writeProperty(final Accept accept, final ResWrap<Property> container)
+      throws ODataSerializerException {
 
     final StringWriter writer = new StringWriter();
     if (accept == Accept.XML || accept == Accept.ATOM) {
       atomSerializer.write(writer, container);
     } else {
-      mapper.writeValue(
-              writer, new JSONPropertyContainer(container.getContextURL(), container.getMetadataETag(),
-              dataBinder.toJSONProperty(container.getPayload())));
+      jsonSerializer.write(writer, container);
     }
 
     return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
   }
 
-  private String getDefaultEntryKey(final String entitySetName, final AtomEntityImpl entry, final String propertyName)
-          throws Exception {
+  private String getDefaultEntryKey(final String entitySetName, final Entity entry, final String propertyName)
+      throws Exception {
 
     String res;
     if (entry.getProperty(propertyName) == null) {
@@ -683,7 +628,7 @@ public abstract class AbstractUtilities {
     return res;
   }
 
-  public String getDefaultEntryKey(final String entitySetName, final AtomEntityImpl entity) throws IOException {
+  public String getDefaultEntryKey(final String entitySetName, final Entity entity) throws IOException {
     try {
       String res;
 
@@ -699,7 +644,7 @@ public abstract class AbstractUtilities {
         } else {
           productID = Integer.valueOf(entity.getProperty("OrderID").getValue().asPrimitive().get());
           res = "OrderID=" + entity.getProperty("OrderID").getValue().asPrimitive().get()
-                  + ",ProductID=" + entity.getProperty("ProductID").getValue().asPrimitive().get();
+              + ",ProductID=" + entity.getProperty("ProductID").getValue().asPrimitive().get();
         }
         Commons.SEQUENCE.put(entitySetName, productID);
       } else if ("Message".equals(entitySetName)) {
@@ -714,7 +659,7 @@ public abstract class AbstractUtilities {
         } else {
           messageId = Integer.valueOf(entity.getProperty("MessageId").getValue().asPrimitive().get());
           res = "FromUsername=" + entity.getProperty("FromUsername").getValue().asPrimitive().get()
-                  + ",MessageId=" + entity.getProperty("MessageId").getValue().asPrimitive().get();
+              + ",MessageId=" + entity.getProperty("MessageId").getValue().asPrimitive().get();
         }
         Commons.SEQUENCE.put(entitySetName, messageId);
       } else if ("Order".equals(entitySetName)) {
@@ -759,7 +704,7 @@ public abstract class AbstractUtilities {
           productId = Integer.valueOf(entity.getProperty("ProductID").getValue().asPrimitive().get());
           productDetailId = Integer.valueOf(entity.getProperty("ProductDetailID").getValue().asPrimitive().get());
           res = "ProductID=" + entity.getProperty("ProductID").getValue().asPrimitive().get()
-                  + ",ProductDetailID=" + entity.getProperty("ProductDetailID").getValue().asPrimitive().get();
+              + ",ProductDetailID=" + entity.getProperty("ProductDetailID").getValue().asPrimitive().get();
         }
         Commons.SEQUENCE.put(entitySetName, productDetailId);
         Commons.SEQUENCE.put("Products", productId);
@@ -781,7 +726,7 @@ public abstract class AbstractUtilities {
 
   public String getLinksBasePath(final String entitySetName, final String entityId) {
     return entitySetName + File.separatorChar + Commons.getEntityKey(entityId) + File.separatorChar
-            + Constants.get(version, ConstantKey.LINKS_FILE_PATH) + File.separatorChar;
+        + Constants.get(version, ConstantKey.LINKS_FILE_PATH) + File.separatorChar;
   }
 
   /**
@@ -794,8 +739,8 @@ public abstract class AbstractUtilities {
    * @return a pair of ETag/links stream
    */
   public LinkInfo readLinks(
-          final String entitySetName, final String entityId, final String linkName, final Accept accept)
-          throws Exception {
+      final String entitySetName, final String entityId, final String linkName, final Accept accept)
+      throws Exception {
 
     final String basePath = getLinksBasePath(entitySetName, entityId);
 
@@ -809,16 +754,16 @@ public abstract class AbstractUtilities {
   }
 
   public InputStream putMediaInMemory(
-          final String entitySetName, final String entityId, final InputStream value)
-          throws IOException {
+      final String entitySetName, final String entityId, final InputStream value)
+      throws IOException {
     return putMediaInMemory(entitySetName, entityId, null, value);
   }
 
   public InputStream putMediaInMemory(
-          final String entitySetName, final String entityId, final String name, final InputStream value)
-          throws IOException {
+      final String entitySetName, final String entityId, final String name, final InputStream value)
+      throws IOException {
     final FileObject fo = fsManager.putInMemory(value, fsManager.getAbsolutePath(
-            Commons.getEntityBasePath(entitySetName, entityId)
+        Commons.getEntityBasePath(entitySetName, entityId)
             + (name == null ? Constants.get(version, ConstantKey.MEDIA_CONTENT_FILENAME) : name), null));
 
     return fo.getContent().getInputStream();
@@ -829,14 +774,14 @@ public abstract class AbstractUtilities {
   }
 
   public Map.Entry<String, InputStream> readMediaEntity(
-          final String entitySetName, final String entityId, final String name) {
+      final String entitySetName, final String entityId, final String name) {
     final String basePath = Commons.getEntityBasePath(entitySetName, entityId);
     return new SimpleEntry<String, InputStream>(basePath, fsManager.readFile(basePath
-            + (name == null ? Constants.get(version, ConstantKey.MEDIA_CONTENT_FILENAME) : name)));
+        + (name == null ? Constants.get(version, ConstantKey.MEDIA_CONTENT_FILENAME) : name)));
   }
 
   public Map.Entry<String, InputStream> readEntity(
-          final String entitySetName, final String entityId, final Accept accept) {
+      final String entitySetName, final String entityId, final Accept accept) {
 
     if (accept == Accept.XML || accept == Accept.TEXT) {
       throw new UnsupportedMediaTypeException("Unsupported media type");
@@ -844,14 +789,14 @@ public abstract class AbstractUtilities {
 
     final String basePath = Commons.getEntityBasePath(entitySetName, entityId);
     return new SimpleEntry<String, InputStream>(basePath,
-            fsManager.readFile(basePath + Constants.get(version, ConstantKey.ENTITY), accept));
+        fsManager.readFile(basePath + Constants.get(version, ConstantKey.ENTITY), accept));
   }
 
   public InputStream expandEntity(
-          final String entitySetName,
-          final String entityId,
-          final String linkName)
-          throws Exception {
+      final String entitySetName,
+      final String entityId,
+      final String linkName)
+      throws Exception {
 
     // --------------------------------
     // 0. Retrieve all 'linkName' navigation link uris (NotFoundException if missing) 
@@ -865,18 +810,18 @@ public abstract class AbstractUtilities {
     final Map<String, NavigationProperty> navigationProperties = metadata.getNavigationProperties(entitySetName);
 
     return readEntities(
-            links.getValue(),
-            linkName,
-            links.getKey(),
-            navigationProperties.get(linkName).isEntitySet());
+        links.getValue(),
+        linkName,
+        links.getKey(),
+        navigationProperties.get(linkName).isEntitySet());
   }
 
   public InputStream expandEntity(
-          final String entitySetName,
-          final String entityId,
-          final InputStream entity,
-          final String linkName)
-          throws Exception {
+      final String entitySetName,
+      final String entityId,
+      final InputStream entity,
+      final String linkName)
+      throws Exception {
     // --------------------------------
     // 2. Retrieve expanded object (entry or feed)
     // --------------------------------
@@ -885,14 +830,14 @@ public abstract class AbstractUtilities {
   }
 
   public InputStream deleteProperty(
-          final String entitySetName,
-          final String entityId,
-          final List<String> path,
-          final Accept accept) throws Exception {
+      final String entitySetName,
+      final String entityId,
+      final List<String> path,
+      final Accept accept) throws Exception {
     final String basePath = Commons.getEntityBasePath(entitySetName, entityId);
 
     final Accept acceptType = accept == null || Accept.TEXT == accept
-            ? Accept.XML : accept.getExtension().equals(Accept.JSON.getExtension()) ? Accept.JSON_FULLMETA : accept;
+        ? Accept.XML : accept.getExtension().equals(Accept.JSON.getExtension()) ? Accept.JSON_FULLMETA : accept;
 
     // read atom
     InputStream stream = fsManager.readFile(basePath + Constants.get(version, ConstantKey.ENTITY), acceptType);
@@ -902,17 +847,17 @@ public abstract class AbstractUtilities {
 
     // save atom
     fsManager.putInMemory(stream,
-            fsManager.getAbsolutePath(basePath + Constants.get(version, ConstantKey.ENTITY), acceptType));
+        fsManager.getAbsolutePath(basePath + Constants.get(version, ConstantKey.ENTITY), acceptType));
 
     return fsManager.readFile(basePath + Constants.get(version, ConstantKey.ENTITY), acceptType);
   }
 
   public abstract InputStream readEntities(
-          final List<String> links, final String linkName, final String next, final boolean forceFeed)
-          throws Exception;
+      final List<String> links, final String linkName, final String next, final boolean forceFeed)
+      throws Exception;
 
   protected abstract InputStream replaceLink(
-          final InputStream toBeChanged, final String linkName, final InputStream replacement) throws Exception;
+      final InputStream toBeChanged, final String linkName, final InputStream replacement) throws Exception;
 
   public abstract InputStream selectEntity(final InputStream entity, final String[] propertyNames) throws Exception;
 
@@ -921,19 +866,19 @@ public abstract class AbstractUtilities {
   protected abstract Map<String, InputStream> getChanges(final InputStream src) throws Exception;
 
   public abstract InputStream addEditLink(
-          final InputStream content, final String title, final String href) throws Exception;
+      final InputStream content, final String title, final String href) throws Exception;
 
   public abstract InputStream addOperation(
-          final InputStream content, final String name, final String metaAnchor, final String href) throws Exception;
+      final InputStream content, final String name, final String metaAnchor, final String href) throws Exception;
 
   protected abstract InputStream replaceProperty(
-          final InputStream src, final InputStream replacement, final List<String> path, final boolean justValue)
-          throws Exception;
+      final InputStream src, final InputStream replacement, final List<String> path, final boolean justValue)
+      throws Exception;
 
   protected abstract InputStream deleteProperty(final InputStream src, final List<String> path) throws Exception;
 
   public abstract Map.Entry<String, List<String>> extractLinkURIs(final InputStream is) throws Exception;
 
   public abstract Map.Entry<String, List<String>> extractLinkURIs(
-          final String entitySetName, final String entityId, final String linkName) throws Exception;
+      final String entitySetName, final String entityId, final String linkName) throws Exception;
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/46a34178/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java b/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java
index 65b7eae..c9f4128 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java
@@ -18,15 +18,6 @@
  */
 package org.apache.olingo.fit.utils;
 
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.core.JsonFactory;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.InjectableValues;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.JsonNodeFactory;
-import com.fasterxml.jackson.databind.node.ObjectNode;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -42,19 +33,25 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Pattern;
+
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
 import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
-import org.apache.olingo.commons.core.data.AtomSerializer;
-import org.apache.olingo.commons.core.op.InjectableSerializerProvider;
 import org.apache.olingo.fit.metadata.Metadata;
-import org.apache.olingo.fit.serializer.FITAtomDeserializer;
 import org.codehaus.plexus.util.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 public abstract class Commons {
 
   /**
@@ -62,15 +59,6 @@ public abstract class Commons {
    */
   protected static final Logger LOG = LoggerFactory.getLogger(Commons.class);
 
-  private static final Map<ODataServiceVersion, FITAtomDeserializer> ATOM_DESERIALIZER =
-          new EnumMap<ODataServiceVersion, FITAtomDeserializer>(ODataServiceVersion.class);
-
-  private static final Map<ODataServiceVersion, AtomSerializer> ATOM_SERIALIZER =
-          new EnumMap<ODataServiceVersion, AtomSerializer>(ODataServiceVersion.class);
-
-  private static final Map<ODataServiceVersion, ObjectMapper> JSON_MAPPER =
-          new EnumMap<ODataServiceVersion, ObjectMapper>(ODataServiceVersion.class);
-
   private static final EnumMap<ODataServiceVersion, Metadata> METADATA =
           new EnumMap<ODataServiceVersion, Metadata>(ODataServiceVersion.class);
 
@@ -109,41 +97,6 @@ public abstract class Commons {
             new ImmutablePair<String, EdmPrimitiveTypeKind>("ID", EdmPrimitiveTypeKind.Guid));
   }
 
-  public static FITAtomDeserializer getAtomDeserializer(final ODataServiceVersion version) {
-    if (!ATOM_DESERIALIZER.containsKey(version)) {
-      ATOM_DESERIALIZER.put(version, new FITAtomDeserializer(version));
-    }
-    return ATOM_DESERIALIZER.get(version);
-  }
-
-  public static AtomSerializer getAtomSerializer(final ODataServiceVersion version) {
-    if (!ATOM_SERIALIZER.containsKey(version)) {
-      ATOM_SERIALIZER.put(version, new AtomSerializer(version, true));
-    }
-
-    return ATOM_SERIALIZER.get(version);
-  }
-
-  public static ObjectMapper getJSONMapper(final ODataServiceVersion version) {
-    if (!JSON_MAPPER.containsKey(version)) {
-      final ObjectMapper mapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
-
-      mapper.setInjectableValues(new InjectableValues.Std()
-              .addValue(Boolean.class, Boolean.TRUE)
-              .addValue(ODataServiceVersion.class, version));
-
-      mapper.setSerializerProvider(new InjectableSerializerProvider(mapper.getSerializerProvider(),
-              mapper.getSerializationConfig()
-              .withAttribute(ODataServiceVersion.class, version)
-              .withAttribute(Boolean.class, Boolean.TRUE),
-              mapper.getSerializerFactory()));
-
-      JSON_MAPPER.put(version, mapper);
-    }
-
-    return JSON_MAPPER.get(version);
-  }
-
   public static Metadata getMetadata(final ODataServiceVersion version) {
     if (!METADATA.containsKey(version)) {
       final InputStream is = Commons.class.getResourceAsStream("/" + version.name() + "/metadata.xml");

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/46a34178/fit/src/main/java/org/apache/olingo/fit/utils/DataBinder.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/DataBinder.java b/fit/src/main/java/org/apache/olingo/fit/utils/DataBinder.java
deleted file mode 100644
index 4dbd725..0000000
--- a/fit/src/main/java/org/apache/olingo/fit/utils/DataBinder.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.olingo.fit.utils;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import org.apache.commons.lang3.StringUtils;
-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.Property;
-import org.apache.olingo.commons.api.data.Value;
-import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
-import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
-import org.apache.olingo.commons.core.data.AtomEntityImpl;
-import org.apache.olingo.commons.core.data.AtomEntitySetImpl;
-import org.apache.olingo.commons.core.data.AtomPropertyImpl;
-import org.apache.olingo.commons.core.data.CollectionValueImpl;
-import org.apache.olingo.commons.core.data.ComplexValueImpl;
-import org.apache.olingo.commons.core.data.JSONEntityImpl;
-import org.apache.olingo.commons.core.data.JSONEntitySetImpl;
-import org.apache.olingo.commons.core.data.JSONPropertyImpl;
-import org.apache.olingo.commons.core.data.LinkImpl;
-import org.apache.olingo.fit.metadata.EntityType;
-import org.apache.olingo.fit.metadata.Metadata;
-import org.apache.olingo.fit.metadata.NavigationProperty;
-import org.springframework.beans.BeanUtils;
-
-public class DataBinder {
-
-  private final ODataServiceVersion version;
-
-  private final Metadata metadata;
-
-  public DataBinder(final ODataServiceVersion version, final Metadata metadata) {
-    this.version = version;
-    this.metadata = metadata;
-  }
-
-  public JSONEntitySetImpl toJSONEntitySet(final AtomEntitySetImpl atomEntitySet) {
-    final JSONEntitySetImpl jsonEntitySet = new JSONEntitySetImpl();
-
-    BeanUtils.copyProperties(atomEntitySet, jsonEntitySet, "baseURI", "metadataContextURL");
-    jsonEntitySet.setBaseURI(atomEntitySet.getBaseURI() == null
-            ? null
-            : atomEntitySet.getBaseURI().toASCIIString() + "/$metadata");
-
-    final Collection<Entity> entries = jsonEntitySet.getEntities();
-    for (Entity entity : atomEntitySet.getEntities()) {
-      entries.add(toJSONEntity((AtomEntityImpl) entity));
-    }
-
-    return jsonEntitySet;
-  }
-
-  public AtomEntitySetImpl toAtomEntitySet(final JSONEntitySetImpl jsonEntitySet) {
-    final AtomEntitySetImpl atomEntitySet = new AtomEntitySetImpl();
-
-    BeanUtils.copyProperties(jsonEntitySet, atomEntitySet, "baseURI", "metadataContextURL");
-    atomEntitySet.setBaseURI(jsonEntitySet.getBaseURI() == null
-            ? null
-            : jsonEntitySet.getBaseURI().toASCIIString() + "/$metadata");
-
-    final Collection<Entity> entries = atomEntitySet.getEntities();
-    for (Entity entity : jsonEntitySet.getEntities()) {
-      entries.add(toAtomEntity((JSONEntityImpl) entity));
-    }
-
-    return atomEntitySet;
-  }
-
-  public JSONEntityImpl toJSONEntity(final AtomEntityImpl atomEntity) {
-    final JSONEntityImpl jsonEntity = new JSONEntityImpl();
-    jsonEntity.getAnnotations().addAll(atomEntity.getAnnotations());
-
-    BeanUtils.copyProperties(atomEntity, jsonEntity, "baseURI", "properties", "links");
-    // This shouldn't ever happen, but...
-    if (atomEntity.getType() != null && atomEntity.getType().startsWith("Collection(")) {
-      jsonEntity.setType(atomEntity.getType().replaceAll("^Collection\\(", "").replaceAll("\\)$", ""));
-    }
-    jsonEntity.setBaseURI(atomEntity.getBaseURI() == null ? null : atomEntity.getBaseURI().toASCIIString());
-    jsonEntity.getOperations().addAll(atomEntity.getOperations());
-
-    for (Link link : atomEntity.getMediaEditLinks()) {
-      final Link jlink = new LinkImpl();
-      jlink.setHref(link.getHref());
-      jlink.setTitle(link.getTitle());
-      jlink.setType(link.getType());
-      jlink.setRel(link.getRel());
-
-      if (link.getInlineEntity() instanceof AtomEntityImpl) {
-        final Entity inlineEntity = link.getInlineEntity();
-        if (inlineEntity instanceof AtomEntityImpl) {
-          jlink.setInlineEntity(toJSONEntity((AtomEntityImpl) link.getInlineEntity()));
-        }
-      } else if (link.getInlineEntitySet() instanceof AtomEntitySetImpl) {
-        final EntitySet inlineEntitySet = link.getInlineEntitySet();
-        if (inlineEntitySet instanceof AtomEntitySetImpl) {
-          jlink.setInlineEntitySet(toJSONEntitySet((AtomEntitySetImpl) link.getInlineEntitySet()));
-        }
-      }
-
-      jsonEntity.getMediaEditLinks().add(jlink);
-    }
-
-    for (Link link : atomEntity.getNavigationLinks()) {
-      final Link jlink = new LinkImpl();
-      jlink.setHref(link.getHref());
-      jlink.setTitle(link.getTitle());
-      jlink.setType(link.getType());
-      jlink.setRel(link.getRel());
-      jlink.getAnnotations().addAll(link.getAnnotations());
-
-      if (link.getInlineEntity() instanceof AtomEntityImpl) {
-        final Entity inlineEntity = link.getInlineEntity();
-        if (inlineEntity instanceof AtomEntityImpl) {
-          jlink.setInlineEntity(toJSONEntity((AtomEntityImpl) link.getInlineEntity()));
-        }
-      } else if (link.getInlineEntitySet() instanceof AtomEntitySetImpl) {
-        final EntitySet inlineEntitySet = link.getInlineEntitySet();
-        if (inlineEntitySet instanceof AtomEntitySetImpl) {
-          jlink.setInlineEntitySet(toJSONEntitySet((AtomEntitySetImpl) link.getInlineEntitySet()));
-        }
-      }
-
-      jsonEntity.getNavigationLinks().add(jlink);
-    }
-
-    final Collection<Property> properties = jsonEntity.getProperties();
-    for (Property property : atomEntity.getProperties()) {
-      properties.add(toJSONProperty((AtomPropertyImpl) property));
-    }
-
-    jsonEntity.getAnnotations().addAll(atomEntity.getAnnotations());
-
-    return jsonEntity;
-  }
-
-  public AtomEntityImpl toAtomEntity(final JSONEntityImpl jsonEntity) {
-    final AtomEntityImpl atomEntity = new AtomEntityImpl();
-
-    BeanUtils.copyProperties(jsonEntity, atomEntity, "baseURI", "properties", "links");
-    atomEntity.setBaseURI(jsonEntity.getBaseURI() == null ? null : jsonEntity.getBaseURI().toASCIIString());
-
-    for (Link link : jsonEntity.getMediaEditLinks()) {
-      final Link alink = new LinkImpl();
-      alink.setHref(link.getHref());
-      alink.setTitle(link.getTitle());
-      alink.setRel(link.getRel());
-      alink.setType(link.getType());
-
-      if (link.getInlineEntity() instanceof JSONEntityImpl) {
-        final Entity inlineEntity = link.getInlineEntity();
-        if (inlineEntity instanceof JSONEntityImpl) {
-          alink.setInlineEntity(toAtomEntity((JSONEntityImpl) link.getInlineEntity()));
-        }
-      } else if (link.getInlineEntitySet() instanceof JSONEntitySetImpl) {
-        final EntitySet inlineEntitySet = link.getInlineEntitySet();
-        if (inlineEntitySet instanceof JSONEntitySetImpl) {
-          alink.setInlineEntitySet(toAtomEntitySet((JSONEntitySetImpl) link.getInlineEntitySet()));
-        }
-      }
-
-      atomEntity.getMediaEditLinks().add(alink);
-    }
-
-    for (Link link : jsonEntity.getNavigationLinks()) {
-      final Link alink = new LinkImpl();
-      alink.setHref(link.getHref());
-      alink.setTitle(link.getTitle());
-      alink.getAnnotations().addAll(link.getAnnotations());
-
-      final NavigationProperty navPropDetails =
-              metadata.getEntityOrComplexType(jsonEntity.getType()).getNavigationProperty(link.getTitle());
-
-      alink.setType(navPropDetails != null && navPropDetails.isEntitySet()
-              ? Constants.get(ConstantKey.ATOM_LINK_FEED) : Constants.get(ConstantKey.ATOM_LINK_ENTRY));
-      alink.setRel(link.getRel());
-
-      if (link.getInlineEntity() instanceof JSONEntityImpl) {
-        final Entity inlineEntity = link.getInlineEntity();
-        if (inlineEntity instanceof JSONEntityImpl) {
-          alink.setInlineEntity(toAtomEntity((JSONEntityImpl) link.getInlineEntity()));
-        }
-      } else if (link.getInlineEntitySet() instanceof JSONEntitySetImpl) {
-        final EntitySet inlineEntitySet = link.getInlineEntitySet();
-        if (inlineEntitySet instanceof JSONEntitySetImpl) {
-          alink.setInlineEntitySet(toAtomEntitySet((JSONEntitySetImpl) link.getInlineEntitySet()));
-        }
-      }
-
-      atomEntity.getNavigationLinks().add(alink);
-    }
-
-    final EntityType entityType = StringUtils.isBlank(jsonEntity.getType())
-            ? null : metadata.getEntityOrComplexType(jsonEntity.getType());
-    final Map<String, NavigationProperty> navProperties = entityType == null
-            ? Collections.<String, NavigationProperty>emptyMap() : entityType.getNavigationPropertyMap();
-
-    final List<Property> properties = atomEntity.getProperties();
-
-    for (Property property : jsonEntity.getProperties()) {
-      if (navProperties.containsKey(property.getName())) {
-        final Link alink = new LinkImpl();
-        alink.setTitle(property.getName());
-        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));
-
-        alink.setRel(Constants.get(version, ConstantKey.ATOM_LINK_REL) + property.getName());
-
-        if (property.getValue().isComplex()) {
-          final Entity inline = new AtomEntityImpl();
-          inline.setType(navProperties.get(property.getName()).getType());
-          for (Property prop : property.getValue().asComplex().get()) {
-            inline.getProperties().add(prop);
-          }
-          alink.setInlineEntity(inline);
-
-        } else if (property.getValue().isCollection()) {
-          final EntitySet inline = new AtomEntitySetImpl();
-          for (Value value : property.getValue().asCollection().get()) {
-            final Entity inlineEntity = new AtomEntityImpl();
-            inlineEntity.setType(navProperties.get(property.getName()).getType());
-            for (Property prop : value.asComplex().get()) {
-              inlineEntity.getProperties().add(toAtomProperty((JSONPropertyImpl) prop, inlineEntity.getType()));
-            }
-            inline.getEntities().add(inlineEntity);
-          }
-          alink.setInlineEntitySet(inline);
-        } else {
-          throw new IllegalStateException("Invalid navigation property " + property);
-        }
-        atomEntity.getNavigationLinks().add(alink);
-      } else {
-        properties.add(toAtomProperty((JSONPropertyImpl) property, atomEntity.getType()));
-      }
-    }
-
-    return atomEntity;
-  }
-
-  public JSONPropertyImpl toJSONProperty(final AtomPropertyImpl atomProperty) {
-    final JSONPropertyImpl jsonProperty = new JSONPropertyImpl();
-    BeanUtils.copyProperties(atomProperty, jsonProperty, "value");
-    jsonProperty.getAnnotations().addAll(atomProperty.getAnnotations());
-
-    if (atomProperty.getValue().isComplex()) {
-      final ComplexValueImpl complex = new ComplexValueImpl();
-      jsonProperty.setValue(complex);
-
-      for (Property field : atomProperty.getValue().asComplex().get()) {
-        complex.get().add(toJSONProperty((AtomPropertyImpl) field));
-      }
-    } else if (atomProperty.getValue().isCollection()) {
-      final CollectionValueImpl collection = new CollectionValueImpl();
-      jsonProperty.setValue(collection);
-
-      for (Value element : atomProperty.getValue().asCollection().get()) {
-        if (element.isComplex()) {
-          final ComplexValueImpl complex = new ComplexValueImpl();
-          collection.get().add(complex);
-
-          for (Property field : element.asComplex().get()) {
-            complex.get().add(toJSONProperty((AtomPropertyImpl) field));
-          }
-        } else {
-          collection.get().add(element);
-        }
-      }
-    } else {
-      jsonProperty.setValue(atomProperty.getValue());
-    }
-
-    return jsonProperty;
-  }
-
-  public AtomPropertyImpl toAtomProperty(final JSONPropertyImpl jsonProperty, final String entryType) {
-    final AtomPropertyImpl atomProperty = new AtomPropertyImpl();
-    atomProperty.setName(jsonProperty.getName());
-    atomProperty.getAnnotations().addAll(jsonProperty.getAnnotations());
-
-    final EntityType entityType = entryType == null
-            ? null
-            : metadata.getEntityOrComplexType(entryType.replaceAll("^Collection\\(", "").replaceAll("\\)$", ""));
-
-    // For non-primitive types, alwasy trust what was sent - if available; otherwise, search metadata
-    if (StringUtils.isNotBlank(jsonProperty.getType())
-            && ((entityType != null && entityType.isOpenType())
-            || jsonProperty.getName() == null
-            || !jsonProperty.getType().startsWith(EdmPrimitiveType.EDM_NAMESPACE))) {
-
-      atomProperty.setType(jsonProperty.getType());
-    } else if (entityType != null) {
-      atomProperty.setType(entityType.getProperty(jsonProperty.getName()).getType());
-    }
-
-    if (jsonProperty.getValue().isComplex()) {
-      final ComplexValueImpl complex = new ComplexValueImpl();
-      atomProperty.setValue(complex);
-
-      for (Property field : jsonProperty.getValue().asComplex().get()) {
-        complex.get().add(toAtomProperty((JSONPropertyImpl) field, atomProperty.getType()));
-      }
-    } else if (jsonProperty.getValue().isCollection()) {
-      final CollectionValueImpl collection = new CollectionValueImpl();
-      atomProperty.setValue(collection);
-
-      for (Value element : jsonProperty.getValue().asCollection().get()) {
-        if (element instanceof ComplexValueImpl) {
-          final ComplexValueImpl complex = new ComplexValueImpl();
-          collection.get().add(complex);
-
-          for (Property field : element.asComplex().get()) {
-            complex.get().add(toAtomProperty((JSONPropertyImpl) field, atomProperty.getType()));
-          }
-        } else {
-          collection.get().add(element);
-        }
-      }
-    } else {
-      atomProperty.setValue(jsonProperty.getValue());
-    }
-
-    return atomProperty;
-  }
-}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/46a34178/fit/src/main/java/org/apache/olingo/fit/utils/FSManager.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/FSManager.java b/fit/src/main/java/org/apache/olingo/fit/utils/FSManager.java
index b8378cb..374d0f5 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/FSManager.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/FSManager.java
@@ -18,7 +18,6 @@
  */
 package org.apache.olingo.fit.utils;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -28,7 +27,9 @@ import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.util.EnumMap;
 import java.util.Map;
+
 import javax.ws.rs.NotFoundException;
+
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.vfs2.FileObject;
 import org.apache.commons.vfs2.FileSelectInfo;
@@ -37,11 +38,12 @@ import org.apache.commons.vfs2.FileSystemException;
 import org.apache.commons.vfs2.FileSystemManager;
 import org.apache.commons.vfs2.FileType;
 import org.apache.commons.vfs2.VFS;
+import org.apache.olingo.commons.api.data.Entity;
 import org.apache.olingo.commons.api.data.ResWrap;
 import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
-import org.apache.olingo.commons.core.data.AtomEntityImpl;
+import org.apache.olingo.commons.api.op.ODataSerializerException;
 import org.apache.olingo.commons.core.data.AtomSerializer;
-import org.apache.olingo.fit.serializer.JSONEntryContainer;
+import org.apache.olingo.commons.core.data.JsonSerializer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -59,7 +61,7 @@ public class FSManager {
   private final FileSystemManager fsManager;
 
   private static Map<ODataServiceVersion, FSManager> instance =
-          new EnumMap<ODataServiceVersion, FSManager>(ODataServiceVersion.class);
+      new EnumMap<ODataServiceVersion, FSManager>(ODataServiceVersion.class);
 
   private final ODataServiceVersion version;
 
@@ -79,8 +81,8 @@ public class FSManager {
 
     for (FileObject fo : find(basePath, null)) {
       if (fo.getType() == FileType.FILE
-              && !fo.getName().getBaseName().contains("Metadata")
-              && !fo.getName().getBaseName().contains("metadata")) {
+          && !fo.getName().getBaseName().contains("Metadata")
+          && !fo.getName().getBaseName().contains("metadata")) {
         final String path = fo.getURL().getPath().replace(absoluteBaseFolder, "//" + version.name());
         putInMemory(fo.getContent().getInputStream(), path);
       }
@@ -89,7 +91,7 @@ public class FSManager {
 
   public String getAbsolutePath(final String relativePath, final Accept accept) {
     return File.separatorChar + version.name() + File.separatorChar + relativePath
-            + (accept == null ? "" : accept.getExtension());
+        + (accept == null ? "" : accept.getExtension());
   }
 
   public final FileObject putInMemory(final InputStream is, final String path) throws IOException {
@@ -112,31 +114,21 @@ public class FSManager {
     return memObject;
   }
 
-  public void putInMemory(final ResWrap<AtomEntityImpl> container, final String relativePath,
-          final DataBinder dataBinder) throws IOException {
-    try {
-      final AtomSerializer atomSerializer = Commons.getAtomSerializer(version);
+  public void putInMemory(final ResWrap<Entity> container, final String relativePath)
+      throws IOException, ODataSerializerException {
+    ByteArrayOutputStream content = new ByteArrayOutputStream();
+    OutputStreamWriter writer = new OutputStreamWriter(content, Constants.ENCODING);
 
-      final ByteArrayOutputStream content = new ByteArrayOutputStream();
-      final OutputStreamWriter writer = new OutputStreamWriter(content, Constants.ENCODING);
+    new AtomSerializer(version, true).write(writer, container);
+    writer.flush();
 
-      atomSerializer.write(writer, container);
-      writer.flush();
+    putInMemory(new ByteArrayInputStream(content.toByteArray()), getAbsolutePath(relativePath, Accept.ATOM));
+    content.reset();
 
-      putInMemory(new ByteArrayInputStream(content.toByteArray()), getAbsolutePath(relativePath, Accept.ATOM));
-      content.reset();
+    new JsonSerializer(version, true).write(writer, container);
+    writer.flush();
 
-      final ObjectMapper mapper = Commons.getJSONMapper(version);
-      mapper.writeValue(
-              writer, new JSONEntryContainer(
-                      container.getContextURL(),
-                      container.getMetadataETag(),
-                      dataBinder.toJSONEntity(container.getPayload())));
-
-      putInMemory(new ByteArrayInputStream(content.toByteArray()), getAbsolutePath(relativePath, Accept.JSON_FULLMETA));
-    } catch (Exception e) {
-      throw new IOException(e);
-    }
+    putInMemory(new ByteArrayInputStream(content.toByteArray()), getAbsolutePath(relativePath, Accept.JSON_FULLMETA));
   }
 
   public InputStream readRes(final String relativePath, final Accept accept) {
@@ -235,4 +227,4 @@ public class FSManager {
       }
     });
   }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/46a34178/fit/src/main/java/org/apache/olingo/fit/utils/JSONUtilities.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/JSONUtilities.java b/fit/src/main/java/org/apache/olingo/fit/utils/JSONUtilities.java
index 7c6a54b..fe3f511 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/JSONUtilities.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/JSONUtilities.java
@@ -18,10 +18,6 @@
  */
 package org.apache.olingo.fit.utils;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.fasterxml.jackson.databind.node.TextNode;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
@@ -33,17 +29,40 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+
 import javax.ws.rs.NotFoundException;
+
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
+import org.apache.olingo.commons.core.op.InjectableSerializerProvider;
 import org.apache.olingo.fit.metadata.Metadata;
 import org.apache.olingo.fit.metadata.NavigationProperty;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.InjectableValues;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.fasterxml.jackson.databind.node.TextNode;
+
 public class JSONUtilities extends AbstractUtilities {
 
+  private final ObjectMapper mapper;
+
   public JSONUtilities(final ODataServiceVersion version, final Metadata metadata) throws Exception {
     super(version, metadata);
+
+    mapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
+    mapper.setInjectableValues(new InjectableValues.Std()
+            .addValue(Boolean.class, Boolean.TRUE)
+            .addValue(ODataServiceVersion.class, version));
+    mapper.setSerializerProvider(new InjectableSerializerProvider(mapper.getSerializerProvider(),
+            mapper.getSerializationConfig()
+            .withAttribute(ODataServiceVersion.class, version)
+            .withAttribute(Boolean.class, Boolean.TRUE),
+            mapper.getSerializerFactory()));
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/46a34178/fit/src/test/java/org/apache/olingo/fit/AbstractBaseTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/AbstractBaseTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/AbstractBaseTestITCase.java
index e606564..d292232 100644
--- a/fit/src/test/java/org/apache/olingo/fit/AbstractBaseTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/AbstractBaseTestITCase.java
@@ -21,6 +21,7 @@ package org.apache.olingo.fit;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.StringWriter;
+
 import org.apache.commons.io.IOUtils;
 import org.apache.olingo.client.api.CommonODataClient;
 import org.apache.olingo.commons.api.data.Entity;
@@ -28,8 +29,9 @@ import org.apache.olingo.commons.api.data.EntitySet;
 import org.apache.olingo.commons.api.domain.CommonODataEntity;
 import org.apache.olingo.commons.api.domain.CommonODataProperty;
 import org.apache.olingo.commons.api.domain.ODataValue;
-import org.apache.olingo.commons.core.data.AtomEntityImpl;
-import org.apache.olingo.commons.core.data.JSONEntityImpl;
+import org.apache.olingo.commons.api.format.ODataFormat;
+import org.apache.olingo.commons.api.format.ODataPubFormat;
+import org.apache.olingo.commons.api.op.ODataSerializerException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -46,7 +48,9 @@ public abstract class AbstractBaseTestITCase {
   protected void debugEntity(final Entity entity, final String message) {
     if (LOG.isDebugEnabled()) {
       final StringWriter writer = new StringWriter();
-      getClient().getSerializer().entity(entity, writer);
+      try {
+        getClient().getSerializer(ODataFormat.JSON).write(writer, entity);
+      } catch (final ODataSerializerException e) {}
       writer.flush();
       LOG.debug(message + "\n{}", writer.toString());
     }
@@ -55,7 +59,9 @@ public abstract class AbstractBaseTestITCase {
   protected void debugEntitySet(final EntitySet entitySet, final String message) {
     if (LOG.isDebugEnabled()) {
       final StringWriter writer = new StringWriter();
-      getClient().getSerializer().entitySet(entitySet, writer);
+      try {
+        getClient().getSerializer(ODataFormat.JSON).write(writer, entitySet);
+      } catch (final ODataSerializerException e) {}
       writer.flush();
       LOG.debug(message + "\n{}", writer.toString());
     }
@@ -72,12 +78,16 @@ public abstract class AbstractBaseTestITCase {
   protected void debugODataEntity(final CommonODataEntity entity, final String message) {
     if (LOG.isDebugEnabled()) {
       StringWriter writer = new StringWriter();
-      getClient().getSerializer().entity(getClient().getBinder().getEntity(entity, AtomEntityImpl.class), writer);
+      try {
+        getClient().getSerializer(ODataPubFormat.ATOM).write(writer, getClient().getBinder().getEntity(entity));
+      } catch (final ODataSerializerException e) {}
       writer.flush();
       LOG.debug(message + " (Atom)\n{}", writer.toString());
 
       writer = new StringWriter();
-      getClient().getSerializer().entity(getClient().getBinder().getEntity(entity, JSONEntityImpl.class), writer);
+      try {
+        getClient().getSerializer(ODataPubFormat.JSON).write(writer, getClient().getBinder().getEntity(entity));
+      } catch (final ODataSerializerException e) {}
       writer.flush();
       LOG.debug(message + " (JSON)\n{}", writer.toString());
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/46a34178/fit/src/test/java/org/apache/olingo/fit/proxy/v4/MediaEntityTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/MediaEntityTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/MediaEntityTestITCase.java
index 0ffe48a..e1df392 100644
--- a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/MediaEntityTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/MediaEntityTestITCase.java
@@ -18,20 +18,21 @@
  */
 package org.apache.olingo.fit.proxy.v4;
 
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Calendar;
 import java.util.UUID;
+
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.olingo.client.api.v4.EdmEnabledODataClient;
 import org.apache.olingo.commons.api.format.ContentType;
 import org.apache.olingo.ext.proxy.EntityContainerFactory;
+import org.apache.olingo.fit.proxy.v4.AbstractTestITCase;
 import org.apache.olingo.fit.proxy.v4.demo.odatademo.DemoService;
 import org.apache.olingo.fit.proxy.v4.demo.odatademo.types.Advertisement;
 import org.junit.Test;
@@ -65,7 +66,7 @@ public class MediaEntityTestITCase extends AbstractTestITCase {
     final UUID uuid = UUID.fromString("f89dee73-af9f-4cd4-b330-db93c25ff3c7");
 
     final Advertisement adv = getContainer().getAdvertisements().get(uuid);
-    assertTrue(adv.getAirDate() instanceof Calendar);
+    assertNotNull(adv.getAirDate());
 
     final InputStream is = adv.getStream();
     assertNotNull(is);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/46a34178/fit/src/test/java/org/apache/olingo/fit/proxy/v4/NonTransactionalMediaEntityTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/NonTransactionalMediaEntityTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/NonTransactionalMediaEntityTestITCase.java
index 1c3c583..2f23551 100644
--- a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/NonTransactionalMediaEntityTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/NonTransactionalMediaEntityTestITCase.java
@@ -18,10 +18,9 @@
  */
 package org.apache.olingo.fit.proxy.v4;
 
+import org.apache.olingo.client.api.v4.EdmEnabledODataClient;
 import org.apache.olingo.commons.api.format.ContentType;
 import org.apache.olingo.ext.proxy.EntityContainerFactory;
-
-import org.apache.olingo.client.api.v4.EdmEnabledODataClient;
 import org.apache.olingo.fit.proxy.v4.demo.odatademo.DemoService;
 
 public class NonTransactionalMediaEntityTestITCase extends MediaEntityTestITCase {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/46a34178/fit/src/test/java/org/apache/olingo/fit/v3/EntityRetrieveTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/v3/EntityRetrieveTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/v3/EntityRetrieveTestITCase.java
index 9314d2a..043e547 100644
--- a/fit/src/test/java/org/apache/olingo/fit/v3/EntityRetrieveTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/v3/EntityRetrieveTestITCase.java
@@ -43,7 +43,6 @@ import org.apache.olingo.commons.api.domain.v3.ODataEntity;
 import org.apache.olingo.commons.api.domain.v3.ODataEntitySet;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
 import org.apache.olingo.commons.api.format.ODataPubFormat;
-import org.apache.olingo.commons.core.op.ResourceFactory;
 import org.junit.Test;
 
 /**
@@ -79,8 +78,7 @@ public class EntityRetrieveTestITCase extends AbstractTestITCase {
         final CommonODataEntity inline = ((ODataInlineEntity) link).getEntity();
         assertNotNull(inline);
 
-        debugEntity(client.getBinder().getEntity(
-                inline, ResourceFactory.entityClassForFormat(format == ODataPubFormat.ATOM)), "Just read");
+        debugEntity(client.getBinder().getEntity(inline), "Just read");
 
         final List<? extends CommonODataProperty> properties = inline.getProperties();
         assertEquals(2, properties.size());
@@ -126,8 +124,7 @@ public class EntityRetrieveTestITCase extends AbstractTestITCase {
         final CommonODataEntitySet inline = ((ODataInlineEntitySet) link).getEntitySet();
         assertNotNull(inline);
 
-        debugEntitySet(client.getBinder().getEntitySet(inline, ResourceFactory.entitySetClassForFormat(
-                format == ODataPubFormat.ATOM)), "Just read");
+        debugEntitySet(client.getBinder().getEntitySet(inline), "Just read");
 
         found = true;
       }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/46a34178/fit/src/test/java/org/apache/olingo/fit/v3/EntitySetTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/v3/EntitySetTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/v3/EntitySetTestITCase.java
index 68fb07d..0f8649c 100644
--- a/fit/src/test/java/org/apache/olingo/fit/v3/EntitySetTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/v3/EntitySetTestITCase.java
@@ -36,7 +36,6 @@ import org.apache.olingo.commons.api.data.ResWrap;
 import org.apache.olingo.commons.api.domain.v3.ODataEntity;
 import org.apache.olingo.commons.api.domain.v3.ODataEntitySet;
 import org.apache.olingo.commons.api.format.ODataPubFormat;
-import org.apache.olingo.commons.core.op.ResourceFactory;
 import org.junit.Test;
 
 /**
@@ -111,8 +110,7 @@ public class EntitySetTestITCase extends AbstractTestITCase {
 
     assertNotNull(feed);
 
-    debugEntitySet(client.getBinder().getEntitySet(feed, ResourceFactory.entitySetClassForFormat(
-            ODataPubFormat.ATOM == format)), "Just retrieved feed");
+    debugEntitySet(client.getBinder().getEntitySet(feed), "Just retrieved feed");
 
     assertEquals(2, feed.getEntities().size());
     assertNotNull(feed.getNext());

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/46a34178/fit/src/test/java/org/apache/olingo/fit/v4/JSONFormatConformanceTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/v4/JSONFormatConformanceTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/v4/JSONFormatConformanceTestITCase.java
index 346a144..7d48860 100644
--- a/fit/src/test/java/org/apache/olingo/fit/v4/JSONFormatConformanceTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/v4/JSONFormatConformanceTestITCase.java
@@ -25,6 +25,7 @@ import static org.junit.Assert.assertTrue;
 
 import java.math.BigDecimal;
 import java.net.URI;
+
 import org.apache.commons.io.IOUtils;
 import org.apache.olingo.client.api.communication.request.retrieve.ODataEntityRequest;
 import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
@@ -116,7 +117,7 @@ public class JSONFormatConformanceTestITCase extends AbstractTestITCase {
    * .
    */
   @Test
-  public void item3() throws EdmPrimitiveTypeException {
+  public void item3() throws Exception {
     final String fromSection71 = "{"
             + "\"NullValue\": null,"
             + "\"TrueValue\": true,"
@@ -202,7 +203,7 @@ public class JSONFormatConformanceTestITCase extends AbstractTestITCase {
    * MUST interpret all odata annotations defined according to the OData-Version header of the payload (section 4.5).
    */
   @Test
-  public void item4() {
+  public void item4() throws Exception {
     final String fromSection45_1 = "{"
             + "\"@odata.context\": \"http://host/service/$metadata#Customers/$entity\","
             + "\"@odata.metadataEtag\": \"W/\\\"A1FF3E230954908F\\\"\","
@@ -218,7 +219,7 @@ public class JSONFormatConformanceTestITCase extends AbstractTestITCase {
             + "}";
 
     final ResWrap<Entity> entity =
-            client.getDeserializer().toEntity(IOUtils.toInputStream(fromSection45_1), ODataPubFormat.JSON);
+            client.getDeserializer(ODataPubFormat.JSON).toEntity(IOUtils.toInputStream(fromSection45_1));
 
     assertEquals("http://host/service/$metadata#Customers/$entity", entity.getContextURL().getURI().toASCIIString());
     assertEquals("W/\"A1FF3E230954908F\"", entity.getMetadataETag());
@@ -240,7 +241,7 @@ public class JSONFormatConformanceTestITCase extends AbstractTestITCase {
             + "}";
 
     final ResWrap<EntitySet> entitySet =
-            client.getDeserializer().toEntitySet(IOUtils.toInputStream(fromSection45_2), ODataPubFormat.JSON);
+            client.getDeserializer(ODataPubFormat.JSON).toEntitySet(IOUtils.toInputStream(fromSection45_2));
 
     assertEquals(5, entitySet.getPayload().getCount(), 0);
     assertEquals("Customers?$expand=Orders&$skipToken=5", entitySet.getPayload().getNext().toASCIIString());
@@ -249,10 +250,10 @@ public class JSONFormatConformanceTestITCase extends AbstractTestITCase {
 
   /**
    * MUST be prepared to receive any annotations, including custom annotations and <tt>odata</tt> annotations not
-   * defined in the <tt>OData-Version</tt> header of the payload (section 20).
+   * defined in the <tt>OData-Version</tt> header of the payload (section 20). 
    */
   @Test
-  public void item5() throws EdmPrimitiveTypeException {
+  public void item5() throws Exception {
     final String sample = "{"
             + "  \"@odata.context\": \"http://host/service/$metadata#Customers\","
             + "  \"@odata.notdefined\": 11,"

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/46a34178/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonODataClient.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonODataClient.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonODataClient.java
index 1a83849..8c398ca 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonODataClient.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonODataClient.java
@@ -26,14 +26,15 @@ import org.apache.olingo.client.api.communication.request.cud.CommonUpdateType;
 import org.apache.olingo.client.api.communication.request.invoke.InvokeRequestFactory;
 import org.apache.olingo.client.api.communication.request.retrieve.CommonRetrieveRequestFactory;
 import org.apache.olingo.client.api.op.ClientODataDeserializer;
-import org.apache.olingo.commons.api.domain.CommonODataObjectFactory;
 import org.apache.olingo.client.api.op.CommonODataBinder;
 import org.apache.olingo.client.api.op.CommonODataReader;
-import org.apache.olingo.commons.api.op.ODataSerializer;
 import org.apache.olingo.client.api.op.ODataWriter;
-import org.apache.olingo.client.api.uri.CommonURIBuilder;
 import org.apache.olingo.client.api.uri.CommonFilterFactory;
+import org.apache.olingo.client.api.uri.CommonURIBuilder;
+import org.apache.olingo.commons.api.domain.CommonODataObjectFactory;
 import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
+import org.apache.olingo.commons.api.format.Format;
+import org.apache.olingo.commons.api.op.ODataSerializer;
 
 /**
  * Generic client interface (common to all supported OData protocol versions).
@@ -54,9 +55,9 @@ public interface CommonODataClient<UT extends CommonUpdateType> {
 
   CommonFilterFactory getFilterFactory();
 
-  ODataSerializer getSerializer();
+  ODataSerializer getSerializer(Format format);
 
-  ClientODataDeserializer getDeserializer();
+  ClientODataDeserializer getDeserializer(Format format);
 
   CommonODataReader getReader();
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/46a34178/lib/client-api/src/main/java/org/apache/olingo/client/api/domain/ODataEntitySetIterator.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/domain/ODataEntitySetIterator.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/domain/ODataEntitySetIterator.java
index f51285d..87cc970 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/domain/ODataEntitySetIterator.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/domain/ODataEntitySetIterator.java
@@ -26,6 +26,7 @@ import java.io.OutputStream;
 import java.net.URI;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
+
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.olingo.client.api.CommonODataClient;
@@ -35,6 +36,7 @@ import org.apache.olingo.commons.api.data.ResWrap;
 import org.apache.olingo.commons.api.domain.CommonODataEntity;
 import org.apache.olingo.commons.api.domain.CommonODataEntitySet;
 import org.apache.olingo.commons.api.format.ODataPubFormat;
+import org.apache.olingo.commons.api.op.ODataDeserializerException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -54,8 +56,6 @@ public class ODataEntitySetIterator<ES extends CommonODataEntitySet, E extends C
    */
   private static final Logger LOG = LoggerFactory.getLogger(ODataEntitySetIterator.class);
 
-  private static final long serialVersionUID = 9039605899821494025L;
-
   private final CommonODataClient odataClient;
 
   private final InputStream stream;
@@ -120,8 +120,12 @@ public class ODataEntitySetIterator<ES extends CommonODataEntitySet, E extends C
 
       if (cached == null) {
         available = false;
-        entitySet = (ES) odataClient.getReader().
-                readEntitySet(new ByteArrayInputStream(osEntitySet.toByteArray()), format);
+        try {
+          entitySet = (ES) odataClient.getReader().
+                  readEntitySet(new ByteArrayInputStream(osEntitySet.toByteArray()), format);
+        } catch (final ODataDeserializerException e) {
+          available = false;
+        }
         close();
       }
     }
@@ -209,8 +213,8 @@ public class ODataEntitySetIterator<ES extends CommonODataEntitySet, E extends C
         }
 
         if (c >= 0) {
-          jsonEntity = odataClient.getDeserializer().toEntity(
-                  new ByteArrayInputStream(entity.toByteArray()), ODataPubFormat.JSON);
+          jsonEntity = odataClient.getDeserializer(ODataPubFormat.JSON).toEntity(
+                  new ByteArrayInputStream(entity.toByteArray()));
         }
       } else {
         while ((c = input.read()) >= 0) {
@@ -238,8 +242,8 @@ public class ODataEntitySetIterator<ES extends CommonODataEntitySet, E extends C
         entity.write(">".getBytes(Constants.UTF8));
 
         if (consume(input, "</entry>", entity, true) >= 0) {
-          atomEntity = odataClient.getDeserializer().
-                  toEntity(new ByteArrayInputStream(entity.toByteArray()), ODataPubFormat.ATOM);
+          atomEntity = odataClient.getDeserializer(ODataPubFormat.ATOM).
+                  toEntity(new ByteArrayInputStream(entity.toByteArray()));
         }
       }
     } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/46a34178/lib/client-api/src/main/java/org/apache/olingo/client/api/op/ClientODataDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/op/ClientODataDeserializer.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/op/ClientODataDeserializer.java
index 9bca91a..f7586bc 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/op/ClientODataDeserializer.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/op/ClientODataDeserializer.java
@@ -19,13 +19,14 @@
 package org.apache.olingo.client.api.op;
 
 import java.io.InputStream;
+
 import org.apache.olingo.client.api.data.ServiceDocument;
 import org.apache.olingo.client.api.edm.xml.XMLMetadata;
 import org.apache.olingo.commons.api.data.ResWrap;
-import org.apache.olingo.commons.api.format.ODataFormat;
-import org.apache.olingo.commons.api.op.CommonODataDeserializer;
+import org.apache.olingo.commons.api.op.ODataDeserializer;
+import org.apache.olingo.commons.api.op.ODataDeserializerException;
 
-public interface ClientODataDeserializer extends CommonODataDeserializer {
+public interface ClientODataDeserializer extends ODataDeserializer {
 
   XMLMetadata toMetadata(InputStream input);
 
@@ -33,8 +34,8 @@ public interface ClientODataDeserializer extends CommonODataDeserializer {
    * Gets the ServiceDocument object represented by the given InputStream.
    *
    * @param input stream to be de-serialized.
-   * @param format OData service document format.
    * @return <tt>ServiceDocument</tt> object.
+   * @throws ODataDeserializerException 
    */
-  ResWrap<ServiceDocument> toServiceDocument(InputStream input, ODataFormat format);
+  ResWrap<ServiceDocument> toServiceDocument(InputStream input) throws ODataDeserializerException;
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/46a34178/lib/client-api/src/main/java/org/apache/olingo/client/api/op/CommonODataBinder.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/op/CommonODataBinder.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/op/CommonODataBinder.java
index cf7dc5c..530177c 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/op/CommonODataBinder.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/op/CommonODataBinder.java
@@ -18,57 +18,52 @@
  */
 package org.apache.olingo.client.api.op;
 
-import java.io.Serializable;
+import org.apache.olingo.client.api.data.ServiceDocument;
 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.Property;
-import org.apache.olingo.client.api.data.ServiceDocument;
 import org.apache.olingo.commons.api.data.ResWrap;
 import org.apache.olingo.commons.api.domain.CommonODataEntity;
 import org.apache.olingo.commons.api.domain.CommonODataEntitySet;
-import org.apache.olingo.commons.api.domain.ODataLink;
 import org.apache.olingo.commons.api.domain.CommonODataProperty;
 import org.apache.olingo.commons.api.domain.ODataComplexValue;
+import org.apache.olingo.commons.api.domain.ODataLink;
 import org.apache.olingo.commons.api.domain.ODataServiceDocument;
 
-public interface CommonODataBinder extends Serializable {
+public interface CommonODataBinder {
 
   /**
    * Gets a <tt>EntitySet</tt> from the given OData entity set.
    *
    * @param entitySet OData entity set.
-   * @param reference reference class.
    * @return {@link EntitySet} object.
    */
-  EntitySet getEntitySet(CommonODataEntitySet entitySet, Class<? extends EntitySet> reference);
+  EntitySet getEntitySet(CommonODataEntitySet entitySet);
 
   /**
    * Gets an <tt>Entity</tt> from the given OData entity.
    *
    * @param entity OData entity.
-   * @param reference reference class.
    * @return {@link Entity} object.
    */
-  Entity getEntity(CommonODataEntity entity, Class<? extends Entity> reference);
+  Entity getEntity(CommonODataEntity entity);
 
   /**
    * Gets a <tt>Link</tt> from the given OData link.
    *
    * @param link OData link.
-   * @param isXML whether it is JSON or XML / Atom
    * @return <tt>Link</tt> object.
    */
-  Link getLink(ODataLink link, boolean isXML);
+  Link getLink(ODataLink link);
 
   /**
    * Gets a <tt>Property</tt> from the given OData property.
    *
    * @param property OData property.
-   * @param reference reference class.
    * @return <tt>Property</tt> object.
    */
-  Property getProperty(CommonODataProperty property, Class<? extends Entity> reference);
+  Property getProperty(CommonODataProperty property);
 
   /**
    * Adds the given property to the given complex value.