You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by fm...@apache.org on 2014/04/29 10:33:36 UTC

[1/2] git commit: provided complex type BATCH update + removed aalto transitive dependency exclusion

Repository: olingo-odata4
Updated Branches:
  refs/heads/master e8ac1c749 -> 639941c00


provided complex type BATCH update + removed aalto transitive dependency exclusion


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

Branch: refs/heads/master
Commit: f79db0b3c7724a17349c265de55f2caf1372d77d
Parents: 0b05798
Author: fmartelli <fa...@gmail.com>
Authored: Tue Apr 29 10:12:22 2014 +0200
Committer: fmartelli <fa...@gmail.com>
Committed: Tue Apr 29 10:12:22 2014 +0200

----------------------------------------------------------------------
 fit/pom.xml                                     |  14 ---
 .../org/apache/olingo/fit/AbstractServices.java | 113 ++++++++++++-------
 .../java/org/apache/olingo/fit/V3OpenType.java  |   3 +-
 .../java/org/apache/olingo/fit/V4OpenType.java  |   2 +-
 .../apache/olingo/fit/metadata/Metadata.java    |  50 +++++---
 .../olingo/fit/utils/AbstractUtilities.java     |  72 ++++++------
 .../org/apache/olingo/fit/utils/Commons.java    |   6 +-
 .../apache/olingo/fit/utils/ConstantKey.java    |   3 +
 .../org/apache/olingo/fit/utils/Constants.java  |  12 ++
 .../org/apache/olingo/fit/utils/XMLElement.java |   5 +-
 .../olingo/fit/utils/XMLEventReaderWrapper.java |  29 ++---
 .../apache/olingo/fit/utils/XMLUtilities.java   |  73 ++++++------
 fit/src/main/resources/V30/openTypeMetadata.xml |   2 +-
 .../client/core/it/v4/PropertyTestITCase.java   |  57 +++++++++-
 14 files changed, 270 insertions(+), 171 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/pom.xml
----------------------------------------------------------------------
diff --git a/fit/pom.xml b/fit/pom.xml
index b7e4043..699541c 100644
--- a/fit/pom.xml
+++ b/fit/pom.xml
@@ -44,22 +44,8 @@
       <groupId>org.apache.olingo</groupId>
       <artifactId>olingo-commons-core</artifactId>
       <version>${project.version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>com.fasterxml</groupId>
-          <artifactId>aalto-xml</artifactId>
-        </exclusion>
-      </exclusions>
     </dependency>
 
-    <!-- Stax -->
-    <dependency>
-      <groupId>stax</groupId>
-      <artifactId>stax-api</artifactId>
-      <version>1.0.1</version>
-    </dependency>
-    <!-- /Stax -->
-
     <!-- REST services CXF -->
     <dependency>
       <groupId>org.apache.cxf</groupId>

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/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 a3a414d..021de16 100644
--- a/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
+++ b/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
@@ -67,6 +67,7 @@ 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.ResWrap;
 import org.apache.olingo.commons.api.data.Entry;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
@@ -411,7 +412,7 @@ public abstract class AbstractServices {
       } else {
         final ResWrap<JSONEntryImpl> jcont = mapper.readValue(IOUtils.toInputStream(changes, Constants.ENCODING),
                 new TypeReference<JSONEntryImpl>() {
-                });
+        });
 
         entryChanges = dataBinder.toAtomEntry(jcont.getPayload());
       }
@@ -593,8 +594,8 @@ public abstract class AbstractServices {
         } else {
           final ResWrap<JSONEntryImpl> jcontainer =
                   mapper.readValue(IOUtils.toInputStream(entity, Constants.ENCODING),
-                          new TypeReference<JSONEntryImpl>() {
-                          });
+                  new TypeReference<JSONEntryImpl>() {
+          });
 
           entry = dataBinder.toAtomEntry(jcontainer.getPayload());
 
@@ -621,7 +622,7 @@ public abstract class AbstractServices {
       ResWrap<AtomEntryImpl> result = atomDeserializer.read(serialization, AtomEntryImpl.class);
       result = new ResWrap<AtomEntryImpl>(
               URI.create(Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX)
-                      + entitySetName + Constants.get(version, ConstantKey.ODATA_METADATA_ENTITY_SUFFIX)),
+              + entitySetName + Constants.get(version, ConstantKey.ODATA_METADATA_ENTITY_SUFFIX)),
               null, result.getPayload());
 
       final String path = Commons.getEntityBasePath(entitySetName, entityKey);
@@ -684,13 +685,13 @@ public abstract class AbstractServices {
               replaceAll("\"Salary\":[0-9]*,", "\"Salary\":0,").
               replaceAll("\"Title\":\".*\"", "\"Title\":\"[Sacked]\"").
               replaceAll("\\<d:Salary m:type=\"Edm.Int32\"\\>.*\\</d:Salary\\>",
-                      "<d:Salary m:type=\"Edm.Int32\">0</d:Salary>").
+              "<d:Salary m:type=\"Edm.Int32\">0</d:Salary>").
               replaceAll("\\<d:Title\\>.*\\</d:Title\\>", "<d:Title>[Sacked]</d:Title>");
 
       final FSManager fsManager = FSManager.instance(version);
       fsManager.putInMemory(IOUtils.toInputStream(newContent, Constants.ENCODING),
               fsManager.getAbsolutePath(Commons.getEntityBasePath("Person", entityId) + Constants.get(version,
-                              ConstantKey.ENTITY), utils.getKey()));
+              ConstantKey.ENTITY), utils.getKey()));
 
       return utils.getValue().createResponse(null, null, null, utils.getKey(), Response.Status.NO_CONTENT);
     } catch (Exception e) {
@@ -742,9 +743,9 @@ public abstract class AbstractServices {
         final Long newSalary = Long.valueOf(salaryMatcher.group(1)) + n;
         newContent = newContent.
                 replaceAll("\"Salary\":" + salaryMatcher.group(1) + ",",
-                        "\"Salary\":" + newSalary + ",").
+                "\"Salary\":" + newSalary + ",").
                 replaceAll("\\<d:Salary m:type=\"Edm.Int32\"\\>" + salaryMatcher.group(1) + "</d:Salary\\>",
-                        "<d:Salary m:type=\"Edm.Int32\">" + newSalary + "</d:Salary>");
+                "<d:Salary m:type=\"Edm.Int32\">" + newSalary + "</d:Salary>");
       }
 
       FSManager.instance(version).putInMemory(IOUtils.toInputStream(newContent, Constants.ENCODING),
@@ -893,7 +894,7 @@ public abstract class AbstractServices {
         } else {
           mapper.writeValue(
                   writer, new JSONFeedContainer(container.getContextURL(), container.getMetadataETag(),
-                          dataBinder.toJSONFeed(container.getPayload())));
+                  dataBinder.toJSONFeed(container.getPayload())));
         }
 
         return xml.createResponse(
@@ -1135,6 +1136,7 @@ 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,
@@ -1143,31 +1145,62 @@ public abstract class AbstractServices {
           final String changes,
           final boolean justValue) {
 
+    // if the given path is not about any link then search for property
+    LOG.info("Retrieve property {}", path);
+
     try {
-      Accept acceptType = null;
-      if (StringUtils.isNotBlank(format)) {
-        acceptType = Accept.valueOf(format.toUpperCase());
-      } else if (StringUtils.isNotBlank(accept)) {
-        acceptType = Accept.parse(accept, version, null);
+      final FSManager fsManager = FSManager.instance(version);
+
+      final String basePath = Commons.getEntityBasePath(entitySetName, entityId);
+      final ResWrap<AtomEntryImpl> container = xml.readContainerEntry(Accept.ATOM,
+              fsManager.readFile(basePath + Constants.get(version, ConstantKey.ENTITY), Accept.ATOM));
+
+      final AtomEntryImpl entry = container.getPayload();
+
+      Property toBeReplaced = null;
+      for (String element : path.split("/")) {
+        if (toBeReplaced == null) {
+          toBeReplaced = entry.getProperty(element.trim());
+        } else {
+          ComplexValue value = toBeReplaced.getValue().asComplex();
+          for (Property field : value.get()) {
+            if (field.getName().equalsIgnoreCase(element)) {
+              toBeReplaced = field;
+            }
+          }
+        }
       }
 
-      // if the given path is not about any link then search for property
-      LOG.info("Retrieve property {}", path);
+      if (toBeReplaced == null) {
+        throw new NotFoundException();
+      }
 
-      final AbstractUtilities utils = getUtilities(acceptType);
+      if (justValue) {
+        // just for primitive values
+        toBeReplaced.setValue(new PrimitiveValueImpl(changes));
+      } else {
+        final AtomPropertyImpl pchanges = xml.readProperty(
+                Accept.parse(contentType, version),
+                IOUtils.toInputStream(changes, Constants.ENCODING),
+                entry.getType());
 
-      utils.replaceProperty(
-              entitySetName,
-              entityId,
-              IOUtils.toInputStream(changes, Constants.ENCODING),
-              Arrays.asList(path.split("/")),
-              acceptType,
-              justValue);
+        toBeReplaced.setValue(pchanges.getValue());
+      }
+
+      fsManager.putInMemory(xml.writeEntry(Accept.ATOM, container),
+              fsManager.getAbsolutePath(basePath + Constants.get(version, ConstantKey.ENTITY), Accept.ATOM));
 
       final Response response;
       if ("return-content".equalsIgnoreCase(prefer)) {
         response = getEntityInternal(location, accept, entitySetName, entityId, format, null, null, false);
       } else {
+        Accept acceptType = null;
+        if (StringUtils.isNotBlank(format)) {
+          acceptType = Accept.valueOf(format.toUpperCase());
+        } else if (StringUtils.isNotBlank(accept)) {
+          acceptType = Accept.parse(accept, version, null);
+        }
+
         response = xml.createResponse(null, null, null, acceptType, Response.Status.NO_CONTENT);
       }
 
@@ -1242,6 +1275,7 @@ public abstract class AbstractServices {
   public Response replacePropertyValue(
           @Context UriInfo uriInfo,
           @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
+          @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) String contentType,
           @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) String prefer,
           @PathParam("entitySetName") String entitySetName,
           @PathParam("entityId") String entityId,
@@ -1250,7 +1284,7 @@ public abstract class AbstractServices {
           final String changes) {
 
     return replaceProperty(uriInfo.getRequestUri().toASCIIString(),
-            accept, prefer, entitySetName, entityId, path, format, changes, true);
+            accept, contentType, prefer, entitySetName, entityId, path, format, changes, true);
   }
 
   /**
@@ -1269,6 +1303,7 @@ public abstract class AbstractServices {
   public Response mergeProperty(
           @Context UriInfo uriInfo,
           @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
+          @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) String contentType,
           @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) String prefer,
           @PathParam("entitySetName") String entitySetName,
           @PathParam("entityId") String entityId,
@@ -1277,7 +1312,7 @@ public abstract class AbstractServices {
           final String changes) {
 
     return replaceProperty(uriInfo.getRequestUri().toASCIIString(),
-            accept, prefer, entitySetName, entityId, path, format, changes, false);
+            accept, contentType, prefer, entitySetName, entityId, path, format, changes, false);
   }
 
   /**
@@ -1296,6 +1331,7 @@ public abstract class AbstractServices {
   public Response patchProperty(
           @Context UriInfo uriInfo,
           @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
+          @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) String contentType,
           @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) String prefer,
           @PathParam("entitySetName") String entitySetName,
           @PathParam("entityId") String entityId,
@@ -1304,7 +1340,7 @@ public abstract class AbstractServices {
           final String changes) {
 
     return replaceProperty(uriInfo.getRequestUri().toASCIIString(),
-            accept, prefer, entitySetName, entityId, path, format, changes, false);
+            accept, contentType, prefer, entitySetName, entityId, path, format, changes, false);
   }
 
   @PUT
@@ -1363,6 +1399,7 @@ public abstract class AbstractServices {
   public Response replaceProperty(
           @Context UriInfo uriInfo,
           @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
+          @HeaderParam("Content-Type") @DefaultValue(StringUtils.EMPTY) String contentType,
           @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) String prefer,
           @PathParam("entitySetName") String entitySetName,
           @PathParam("entityId") String entityId,
@@ -1374,7 +1411,7 @@ public abstract class AbstractServices {
       return replaceMediaProperty(prefer, entitySetName, entityId, path, changes);
     } else {
       return replaceProperty(uriInfo.getRequestUri().toASCIIString(),
-              accept, prefer, entitySetName, entityId, path, format, changes, false);
+              accept, contentType, prefer, entitySetName, entityId, path, format, changes, false);
     }
   }
 
@@ -1518,8 +1555,8 @@ public abstract class AbstractServices {
               mapper.writeValue(
                       writer,
                       new JSONFeedContainer(container.getContextURL(),
-                              container.getMetadataETag(),
-                              dataBinder.toJSONFeed((AtomFeedImpl) container.getPayload())));
+                      container.getMetadataETag(),
+                      dataBinder.toJSONFeed((AtomFeedImpl) container.getPayload())));
             }
           } else {
             final ResWrap<Entry> container = atomDeserializer.<Entry, AtomEntryImpl>read(stream, AtomEntryImpl.class);
@@ -1531,8 +1568,8 @@ public abstract class AbstractServices {
               mapper.writeValue(
                       writer,
                       new JSONEntryContainer(container.getContextURL(),
-                              container.getMetadataETag(),
-                              dataBinder.toJSONEntry((AtomEntryImpl) container.getPayload())));
+                      container.getMetadataETag(),
+                      dataBinder.toJSONEntry((AtomEntryImpl) container.getPayload())));
             }
           }
 
@@ -1602,9 +1639,9 @@ public abstract class AbstractServices {
 
     final ResWrap<AtomPropertyImpl> container = new ResWrap<AtomPropertyImpl>(
             URI.create(Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX)
-                    + (version.compareTo(ODataServiceVersion.V40) >= 0
-                    ? entitySetName + "(" + entityId + ")/" + path
-                    : property.getType())),
+            + (version.compareTo(ODataServiceVersion.V40) >= 0
+            ? entitySetName + "(" + entityId + ")/" + path
+            : property.getType())),
             entryContainer.getMetadataETag(),
             property);
 
@@ -1612,9 +1649,9 @@ public abstract class AbstractServices {
             null,
             searchForValue
             ? IOUtils.toInputStream(
-                    container.getPayload().getValue() == null || container.getPayload().getValue().isNull()
-                    ? StringUtils.EMPTY
-                    : container.getPayload().getValue().asPrimitive().get(), Constants.ENCODING)
+            container.getPayload().getValue() == null || container.getPayload().getValue().isNull()
+            ? StringUtils.EMPTY
+            : container.getPayload().getValue().asPrimitive().get(), Constants.ENCODING)
             : utils.writeProperty(acceptType, container),
             Commons.getETag(Commons.getEntityBasePath(entitySetName, entityId), version),
             acceptType);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/V3OpenType.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/V3OpenType.java b/fit/src/main/java/org/apache/olingo/fit/V3OpenType.java
index 43e1201..32e0073 100644
--- a/fit/src/main/java/org/apache/olingo/fit/V3OpenType.java
+++ b/fit/src/main/java/org/apache/olingo/fit/V3OpenType.java
@@ -60,9 +60,8 @@ public class V3OpenType {
   public V3OpenType() throws Exception {
     this.openMetadata = new Metadata(FSManager.instance(ODataServiceVersion.V30).
             readFile("openType" + StringUtils.capitalize(Constants.get(ODataServiceVersion.V30, ConstantKey.METADATA)),
-                    Accept.XML));
+            Accept.XML), ODataServiceVersion.V30);
     this.services = new V3Services() {
-
       @Override
       protected Metadata getMetadataObj() {
         return openMetadata;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/V4OpenType.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/V4OpenType.java b/fit/src/main/java/org/apache/olingo/fit/V4OpenType.java
index c9690f4..7eb99d9 100644
--- a/fit/src/main/java/org/apache/olingo/fit/V4OpenType.java
+++ b/fit/src/main/java/org/apache/olingo/fit/V4OpenType.java
@@ -56,7 +56,7 @@ public class V4OpenType {
   public V4OpenType() throws Exception {
     this.openMetadata = new Metadata(FSManager.instance(ODataServiceVersion.V40).
             readFile("openType" + StringUtils.capitalize(Constants.get(ODataServiceVersion.V40, ConstantKey.METADATA)),
-                    Accept.XML));
+            Accept.XML), ODataServiceVersion.V40);
     this.services = new V4Services() {
       @Override
       protected Metadata getMetadataObj() {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/metadata/Metadata.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/metadata/Metadata.java b/fit/src/main/java/org/apache/olingo/fit/metadata/Metadata.java
index ebd599b..846a86b 100644
--- a/fit/src/main/java/org/apache/olingo/fit/metadata/Metadata.java
+++ b/fit/src/main/java/org/apache/olingo/fit/metadata/Metadata.java
@@ -31,6 +31,9 @@ import javax.xml.stream.events.Attribute;
 import javax.xml.stream.events.StartElement;
 import javax.xml.stream.events.XMLEvent;
 import org.apache.commons.io.IOUtils;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
+import org.apache.olingo.fit.utils.ConstantKey;
+import org.apache.olingo.fit.utils.Constants;
 import org.codehaus.plexus.util.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,21 +45,26 @@ public class Metadata extends AbstractMetadataElement {
    */
   protected static final Logger LOG = LoggerFactory.getLogger(Metadata.class);
 
+  protected final ODataServiceVersion version;
+
   private final Map<String, Schema> schemas;
 
-  public Metadata(final InputStream is) {
+  private final String DEF_NS;
+
+  public Metadata(final InputStream is, final ODataServiceVersion version) {
+    this.version = version;
+    this.DEF_NS = Constants.get(version, ConstantKey.EDM_NS);
     this.schemas = new HashMap<String, Schema>();
 
     try {
       final XMLInputFactory ifactory = XMLInputFactory.newInstance();
-      ifactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, false);
-      final XMLEventReader reader = ifactory.createXMLEventReader(is, "UTF-8");
+      final XMLEventReader reader = ifactory.createXMLEventReader(is, org.apache.olingo.commons.api.Constants.UTF8);
 
       try {
         while (reader.hasNext()) {
           final XMLEvent event = reader.nextEvent();
 
-          if (event.isStartElement() && event.asStartElement().getName().equals(new QName("Schema"))) {
+          if (event.isStartElement() && event.asStartElement().getName().equals(new QName(DEF_NS, "Schema"))) {
             final Schema schema = getSchema(event.asStartElement(), reader);
             schemas.put(schema.getNamespace(), schema);
           }
@@ -175,14 +183,15 @@ public class Metadata extends AbstractMetadataElement {
     while (!completed && reader.hasNext()) {
       XMLEvent event = reader.nextEvent();
 
-      if (event.isStartElement() && event.asStartElement().getName().equals(new QName("EntityType"))
-              || event.isStartElement() && event.asStartElement().getName().equals(new QName("ComplexType"))) {
+      if (event.isStartElement() && event.asStartElement().getName().equals(new QName(DEF_NS, "EntityType"))
+              || event.isStartElement() && event.asStartElement().getName().equals(new QName(DEF_NS, "ComplexType"))) {
         final EntityType entityType = getEntityType(event.asStartElement(), reader);
         schema.addEntityType(entityType.getName(), entityType);
-      } else if (event.isStartElement() && event.asStartElement().getName().equals(new QName("EntityContainer"))) {
+      } else if (event.isStartElement()
+              && event.asStartElement().getName().equals(new QName(DEF_NS, "EntityContainer"))) {
         final org.apache.olingo.fit.metadata.Container container = getContainer(event.asStartElement(), reader);
         schema.addContainer(container.getName(), container);
-      } else if (event.isStartElement() && event.asStartElement().getName().equals(new QName("Association"))) {
+      } else if (event.isStartElement() && event.asStartElement().getName().equals(new QName(DEF_NS, "Association"))) {
         // just for V3
         final Association association = getAssociation(event.asStartElement(), reader);
         schema.addAssociation(association.getName(), association);
@@ -205,11 +214,12 @@ public class Metadata extends AbstractMetadataElement {
       XMLEvent event = reader.nextEvent();
 
       if (event.isStartElement()
-              && (event.asStartElement().getName().equals(new QName("EntitySet"))
-              || event.asStartElement().getName().equals(new QName("Singleton")))) {
+              && (event.asStartElement().getName().equals(new QName(DEF_NS, "EntitySet"))
+              || event.asStartElement().getName().equals(new QName(DEF_NS, "Singleton")))) {
         final EntitySet entitySet = getEntitySet(event.asStartElement(), reader);
         container.addEntitySet(entitySet.getName(), entitySet);
-      } else if (event.isStartElement() && event.asStartElement().getName().equals(new QName("AssociationSet"))) {
+      } else if (event.isStartElement()
+              && event.asStartElement().getName().equals(new QName(DEF_NS, "AssociationSet"))) {
         // just for V3
         final AssociationSet associationSet = getAssociationSet(event.asStartElement(), reader);
         container.addAssociationSet(associationSet.getAssociation(), associationSet);
@@ -230,10 +240,11 @@ public class Metadata extends AbstractMetadataElement {
     while (!completed && reader.hasNext()) {
       XMLEvent event = reader.nextEvent();
 
-      if (event.isStartElement() && event.asStartElement().getName().equals(new QName("End"))) {
+      if (event.isStartElement() && event.asStartElement().getName().equals(new QName(DEF_NS, "End"))) {
         final String role = event.asStartElement().getAttributeByName(new QName("Role")).getValue();
         final String type = event.asStartElement().getAttributeByName(new QName("Type")).getValue();
-        final String multiplicity = event.asStartElement().getAttributeByName(new QName("Multiplicity")).getValue();
+        final String multiplicity =
+                event.asStartElement().getAttributeByName(new QName("Multiplicity")).getValue();
         association.addRole(role, type, multiplicity);
       } else if (event.isEndElement() && event.asEndElement().getName().equals(start.getName())) {
         completed = true;
@@ -254,7 +265,7 @@ public class Metadata extends AbstractMetadataElement {
     while (!completed && reader.hasNext()) {
       XMLEvent event = reader.nextEvent();
 
-      if (event.isStartElement() && event.asStartElement().getName().equals(new QName("End"))) {
+      if (event.isStartElement() && event.asStartElement().getName().equals(new QName(DEF_NS, "End"))) {
         final String role = event.asStartElement().getAttributeByName(new QName("Role")).getValue();
         final String entitySet = event.asStartElement().getAttributeByName(new QName("EntitySet")).getValue();
         associationSet.addRole(role, entitySet);
@@ -274,10 +285,11 @@ public class Metadata extends AbstractMetadataElement {
     while (!completed && reader.hasNext()) {
       XMLEvent event = reader.nextEvent();
 
-      if (event.isStartElement() && event.asStartElement().getName().equals(new QName("Property"))) {
+      if (event.isStartElement() && event.asStartElement().getName().equals(new QName(DEF_NS, "Property"))) {
         final org.apache.olingo.fit.metadata.Property property = getProperty(event.asStartElement());
         entityType.addProperty(property.getName(), property);
-      } else if (event.isStartElement() && event.asStartElement().getName().equals(new QName("NavigationProperty"))) {
+      } else if (event.isStartElement()
+              && event.asStartElement().getName().equals(new QName(DEF_NS, "NavigationProperty"))) {
         final NavigationProperty property = getNavigationProperty(event.asStartElement());
         entityType.addNavigationProperty(property.getName(), property);
       } else if (event.isEndElement() && event.asEndElement().getName().equals(start.getName())) {
@@ -302,7 +314,8 @@ public class Metadata extends AbstractMetadataElement {
   }
 
   private NavigationProperty getNavigationProperty(final StartElement start) throws XMLStreamException {
-    final NavigationProperty property = new NavigationProperty(start.getAttributeByName(new QName("Name")).getValue());
+    final NavigationProperty property =
+            new NavigationProperty(start.getAttributeByName(new QName("Name")).getValue());
 
     final Attribute type = start.getAttributeByName(new QName("Type"));
     if (type != null) {
@@ -340,7 +353,8 @@ public class Metadata extends AbstractMetadataElement {
     while (!completed && reader.hasNext()) {
       XMLEvent event = reader.nextEvent();
 
-      if (event.isStartElement() && event.asStartElement().getName().equals(new QName("NavigationPropertyBinding"))) {
+      if (event.isStartElement()
+              && event.asStartElement().getName().equals(new QName(DEF_NS, "NavigationPropertyBinding"))) {
         final String path = event.asStartElement().getAttributeByName(new QName("Path")).getValue();
         final String target = event.asStartElement().getAttributeByName(new QName("Target")).getValue();
         entitySet.addBinding(path, target);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/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 c017186..bf1e4e3 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
@@ -26,7 +26,6 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.StringWriter;
-import java.net.URI;
 import java.util.AbstractMap.SimpleEntry;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -551,28 +550,35 @@ public abstract class AbstractUtilities {
     } else {
       mapper.writeValue(
               writer, new JSONFeedContainer(container.getContextURL(),
-                      container.getMetadataETag(), dataBinder.toJSONFeed(container.getPayload())));
+              container.getMetadataETag(), dataBinder.toJSONFeed(container.getPayload())));
     }
 
     return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
   }
 
-  public AtomEntryImpl readEntry(final Accept accept, final InputStream entity)
+  public ResWrap<AtomEntryImpl> readContainerEntry(final Accept accept, final InputStream entity)
           throws XMLStreamException, IOException {
-
-    final AtomEntryImpl entry;
+    final ResWrap<AtomEntryImpl> container;
 
     if (accept == Accept.ATOM || accept == Accept.XML) {
-      final ResWrap<AtomEntryImpl> container = atomDeserializer.read(entity, AtomEntryImpl.class);
-      entry = container.getPayload();
+      container = atomDeserializer.read(entity, AtomEntryImpl.class);
     } else {
-      final ResWrap<JSONEntryImpl> container =
+      final ResWrap<JSONEntryImpl> jcontainer =
               mapper.readValue(entity, new TypeReference<JSONEntryImpl>() {
-              });
-      entry = dataBinder.toAtomEntry(container.getPayload());
+      });
+      container = new ResWrap<AtomEntryImpl>(
+              jcontainer.getContextURL(),
+              jcontainer.getMetadataETag(),
+              dataBinder.toAtomEntry(jcontainer.getPayload()));
     }
 
-    return entry;
+    return container;
+  }
+
+  public AtomEntryImpl readEntry(final Accept accept, final InputStream entity)
+          throws XMLStreamException, IOException {
+    return readContainerEntry(accept, entity).getPayload();
+
   }
 
   public InputStream writeEntry(final Accept accept, final ResWrap<AtomEntryImpl> container)
@@ -584,7 +590,7 @@ public abstract class AbstractUtilities {
     } else {
       mapper.writeValue(
               writer, new JSONEntryContainer(container.getContextURL(), container.getMetadataETag(),
-                      dataBinder.toJSONEntry(container.getPayload())));
+              dataBinder.toJSONEntry(container.getPayload())));
     }
 
     return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
@@ -605,6 +611,23 @@ public abstract class AbstractUtilities {
     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 InputStream writeProperty(final Accept accept, final ResWrap<AtomPropertyImpl> container)
           throws XMLStreamException, IOException {
 
@@ -614,7 +637,7 @@ public abstract class AbstractUtilities {
     } else {
       mapper.writeValue(
               writer, new JSONPropertyContainer(container.getContextURL(), container.getMetadataETag(),
-                      dataBinder.toJSONProperty(container.getPayload())));
+              dataBinder.toJSONProperty(container.getPayload())));
     }
 
     return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
@@ -816,29 +839,6 @@ public abstract class AbstractUtilities {
     // --------------------------------
   }
 
-  public void replaceProperty(
-          final String entitySetName,
-          final String entityId,
-          final InputStream changes,
-          final List<String> path,
-          final Accept accept,
-          final boolean justValue) 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;
-
-    InputStream stream = fsManager.readFile(basePath + Constants.get(version, ConstantKey.ENTITY), acceptType);
-    stream = replaceProperty(stream, changes, path, justValue);
-
-    final AtomEntryImpl entry = readEntry(acceptType, stream);
-    final ResWrap<AtomEntryImpl> container = new ResWrap<AtomEntryImpl>((URI) null, null, entry);
-
-    fsManager.putInMemory(writeEntry(Accept.ATOM, container),
-            fsManager.getAbsolutePath(basePath + Constants.get(version, ConstantKey.ENTITY), Accept.ATOM));
-  }
-
   public InputStream deleteProperty(
           final String entitySetName,
           final String entityId,

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/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 af15f2d..bab6a0d 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
@@ -135,7 +135,7 @@ public abstract class Commons {
     if (!METADATA.containsKey(version)) {
       final InputStream is = Commons.class.getResourceAsStream("/" + version.name() + "/metadata.xml");
 
-      METADATA.put(version, new Metadata(is));
+      METADATA.put(version, new Metadata(is, version));
     }
 
     return METADATA.get(version);
@@ -180,7 +180,7 @@ public abstract class Commons {
     try {
       return FSManager.instance(version)
               .getAbsolutePath(basePath + Constants.get(version, ConstantKey.LINKS_FILE_PATH)
-                      + File.separatorChar + linkName, accept);
+              + File.separatorChar + linkName, accept);
     } catch (Exception e) {
       throw new IOException(e);
     }
@@ -208,7 +208,7 @@ public abstract class Commons {
 
     final StringBuilder builder = new StringBuilder();
     builder.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
-    builder.append("<links xmlns=\"" + Constants.get(version, ConstantKey.DATASERVICES_NS) + "\">");
+    builder.append("<links xmlns=\"").append(Constants.get(version, ConstantKey.DATASERVICES_NS)).append("\">");
 
     for (String uri : link.getValue()) {
       builder.append("<uri>");

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/utils/ConstantKey.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/ConstantKey.java b/fit/src/main/java/org/apache/olingo/fit/utils/ConstantKey.java
index 40b030d..7ff1bd4 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/ConstantKey.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/ConstantKey.java
@@ -43,6 +43,9 @@ public enum ConstantKey {
   LINK,
   DATASERVICES_NS,
   METADATA_NS,
+  GEORSS_NS,
+  GML_NS,
+  EDM_NS,
   METADATA,
   SERVICES,
   FEED,

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/utils/Constants.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/Constants.java b/fit/src/main/java/org/apache/olingo/fit/utils/Constants.java
index 1d79c91..44bbe11 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/Constants.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/Constants.java
@@ -19,6 +19,8 @@
 package org.apache.olingo.fit.utils;
 
 import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CodingErrorAction;
 import java.util.EnumMap;
 import java.util.Map;
 import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
@@ -36,7 +38,11 @@ public class Constants {
 
   public static final Charset ENCODING = Charset.forName("UTF-8");
 
+  public static final CharsetDecoder DECODER = ENCODING.newDecoder();
+
   static {
+    DECODER.onMalformedInput(CodingErrorAction.IGNORE);
+    DECODER.onUnmappableCharacter(CodingErrorAction.IGNORE);
 
     // -----------------------------
     // V4 only 
@@ -46,6 +52,9 @@ public class Constants {
     v4constants.put(ConstantKey.JSON_NAVIGATION_SUFFIX, "@odata.navigationLink");
     v4constants.put(ConstantKey.DATASERVICES_NS, "http://docs.oasis-open.org/odata/ns/dataservices");
     v4constants.put(ConstantKey.METADATA_NS, "http://docs.oasis-open.org/odata/ns/metadata");
+    v4constants.put(ConstantKey.GEORSS_NS, "http://www.georss.org/georss");
+    v4constants.put(ConstantKey.GML_NS, "http://www.opengis.net/gml");
+    v4constants.put(ConstantKey.EDM_NS, "http://docs.oasis-open.org/odata/ns/edm");
     v4constants.put(ConstantKey.ATOM_LINK_REL, "http://docs.oasis-open.org/odata/ns/related/");
     v4constants.put(ConstantKey.ODATA_SERVICE_VERSION, "OData-Version");
     v4constants.put(ConstantKey.DEFAULT_SERVICE_URL, "http://localhost:9080/StaticService/V40/Static.svc/");
@@ -79,6 +88,9 @@ public class Constants {
     constants.put(ConstantKey.LINK, "link");
     constants.put(ConstantKey.METADATA_NS, "http://schemas.microsoft.com/ado/2007/08/dataservices/metadta");
     constants.put(ConstantKey.DATASERVICES_NS, "http://schemas.microsoft.com/ado/2007/08/dataservices");
+    constants.put(ConstantKey.GEORSS_NS, "http://www.georss.org/georss");
+    constants.put(ConstantKey.GML_NS, "http://www.opengis.net/gml");
+    constants.put(ConstantKey.EDM_NS, "http://schemas.microsoft.com/ado/2009/11/edm");
     constants.put(ConstantKey.METADATA, "metadata");
     constants.put(ConstantKey.SERVICES, "services");
     constants.put(ConstantKey.FEED, "feed");

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/utils/XMLElement.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/XMLElement.java b/fit/src/main/java/org/apache/olingo/fit/utils/XMLElement.java
index 304b8ff..b412ba3 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/XMLElement.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/XMLElement.java
@@ -29,6 +29,7 @@ import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.events.EndElement;
 import javax.xml.stream.events.StartElement;
 import org.apache.commons.io.IOUtils;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -65,8 +66,8 @@ public class XMLElement {
     return new ByteArrayInputStream(content.toByteArray());
   }
 
-  public XMLEventReader getContentReader() throws Exception {
-    return new XMLEventReaderWrapper(getContent());
+  public XMLEventReader getContentReader(final ODataServiceVersion version) throws Exception {
+    return new XMLEventReaderWrapper(getContent(), version);
   }
 
   public void setContent(final InputStream content) throws IOException {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/utils/XMLEventReaderWrapper.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/XMLEventReaderWrapper.java b/fit/src/main/java/org/apache/olingo/fit/utils/XMLEventReaderWrapper.java
index 5c88a42..7bae6d8 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/XMLEventReaderWrapper.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/XMLEventReaderWrapper.java
@@ -22,21 +22,20 @@ import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.CodingErrorAction;
 import javax.xml.stream.XMLEventReader;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.events.XMLEvent;
 import org.apache.commons.io.IOUtils;
+import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
 
 public class XMLEventReaderWrapper implements XMLEventReader {
 
-  private static final Charset ENCODING = Charset.forName("UTF-8");
+  private static final Charset ENCODING = Charset.forName(org.apache.olingo.commons.api.Constants.UTF8);
 
   public final static String CONTENT = "CONTENT_TAG";
 
-  public final static String CONTENT_STAG = "<" + CONTENT + ">";
+  public final String CONTENT_STAG;
 
   public final static String CONTENT_ETAG = "</" + CONTENT + ">";
 
@@ -44,20 +43,24 @@ public class XMLEventReaderWrapper implements XMLEventReader {
 
   private XMLEvent nextGivenEvent = null;
 
-  public XMLEventReaderWrapper(final InputStream stream) throws Exception {
-    final XMLInputFactory factory = XMLInputFactory.newInstance();
-    factory.setProperty(XMLInputFactory.IS_VALIDATING, false);
-    factory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, false);
+  public XMLEventReaderWrapper(final InputStream stream, final ODataServiceVersion version) throws Exception {
+    final StringBuilder startBuilder = new StringBuilder();
+    startBuilder.append("<").append(CONTENT).
+            append(" xmlns:m").append("=\"").append(Constants.get(version, ConstantKey.METADATA_NS)).append("\"").
+            append(" xmlns:d").append("=\"").append(Constants.get(version, ConstantKey.DATASERVICES_NS)).append("\"").
+            append(" xmlns:georss").append("=\"").append(Constants.get(version, ConstantKey.GEORSS_NS)).append("\"").
+            append(" xmlns:gml").append("=\"").append(Constants.get(version, ConstantKey.GML_NS)).append("\"").
+            append(">");
+
+    CONTENT_STAG = startBuilder.toString();
 
-    final CharsetDecoder decoder = ENCODING.newDecoder();
-    decoder.onMalformedInput(CodingErrorAction.IGNORE);
-    decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
+    final XMLInputFactory factory = XMLInputFactory.newInstance();
 
     final InputStreamReader reader = new InputStreamReader(
-            new ByteArrayInputStream((XMLEventReaderWrapper.CONTENT_STAG
+            new ByteArrayInputStream((CONTENT_STAG
             + IOUtils.toString(stream, ENCODING).replaceAll("^<\\?xml.*\\?>", "")
             + XMLEventReaderWrapper.CONTENT_ETAG).getBytes(ENCODING)),
-            decoder);
+            Constants.DECODER);
 
     this.wrapped = factory.createXMLEventReader(reader);
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/java/org/apache/olingo/fit/utils/XMLUtilities.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/XMLUtilities.java b/fit/src/main/java/org/apache/olingo/fit/utils/XMLUtilities.java
index 162221a..ccc02fe 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/XMLUtilities.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/XMLUtilities.java
@@ -22,6 +22,7 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.nio.charset.Charset;
@@ -75,8 +76,8 @@ public class XMLUtilities extends AbstractUtilities {
     if (ifactory == null) {
       ifactory = XMLInputFactory.newInstance();
     }
-    ifactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, false);
-    return ifactory.createXMLEventReader(is, "UTF-8");
+
+    return ifactory.createXMLEventReader(new InputStreamReader(is, Constants.DECODER));
   }
 
   protected static XMLEventWriter getEventWriter(final OutputStream os) throws XMLStreamException {
@@ -168,7 +169,7 @@ public class XMLUtilities extends AbstractUtilities {
       writer.add(eventFactory.createEndElement(new QName(Constants.get(version, ConstantKey.LINK)), null));
     }
 
-    writer.add(entry.getValue().getContentReader());
+    writer.add(entry.getValue().getContentReader(version));
     writer.add(entry.getValue().getEnd());
     writer.add(reader);
     IOUtils.closeQuietly(is);
@@ -196,7 +197,7 @@ public class XMLUtilities extends AbstractUtilities {
       while (true) {
         final Map.Entry<Integer, XMLElement> linkInfo =
                 extractElement(reader, null,
-                        Collections.<String>singletonList(Constants.get(version, ConstantKey.LINK)), startDepth, 2, 2);
+                Collections.<String>singletonList(Constants.get(version, ConstantKey.LINK)), startDepth, 2, 2);
 
         startDepth = linkInfo.getKey();
 
@@ -246,10 +247,10 @@ public class XMLUtilities extends AbstractUtilities {
 
         try {
           final XMLElement inlineElement =
-                  extractElement(link.getContentReader(), null,
-                          Collections.<String>singletonList(Constants.get(version, ConstantKey.INLINE)), 0, -1, -1).
+                  extractElement(link.getContentReader(version), null,
+                  Collections.<String>singletonList(Constants.get(version, ConstantKey.INLINE)), 0, -1, -1).
                   getValue();
-          final XMLEventReader inlineReader = inlineElement.getContentReader();
+          final XMLEventReader inlineReader = inlineElement.getContentReader(version);
 
           try {
             while (true) {
@@ -373,7 +374,7 @@ public class XMLUtilities extends AbstractUtilities {
     final XMLElement res = new XMLElement();
     res.setStart(start);
 
-    final Charset encoding = Charset.forName("UTF-8");
+    final Charset encoding = Charset.forName(org.apache.olingo.commons.api.Constants.UTF8);
     final ByteArrayOutputStream content = new ByteArrayOutputStream();
     final OutputStreamWriter writer = new OutputStreamWriter(content, encoding);
 
@@ -451,7 +452,7 @@ public class XMLUtilities extends AbstractUtilities {
       // check edit link existence
       extractElement(reader, writer, Collections.<String>singletonList(Constants.get(version, ConstantKey.LINK)),
               Collections.<Map.Entry<String, String>>singletonList(
-                      new AbstractMap.SimpleEntry<String, String>("rel", "edit")), false, 0, -1, -1);
+              new AbstractMap.SimpleEntry<String, String>("rel", "edit")), false, 0, -1, -1);
 
       addAtomElement(IOUtils.toInputStream(editLinkElement, Constants.ENCODING), writer);
       writer.add(reader);
@@ -470,7 +471,7 @@ public class XMLUtilities extends AbstractUtilities {
 
       addAtomElement(IOUtils.toInputStream(editLinkElement, Constants.ENCODING), writer);
 
-      writer.add(entryElement.getContentReader());
+      writer.add(entryElement.getContentReader(version));
       writer.add(entryElement.getEnd());
 
       writer.add(reader);
@@ -518,7 +519,7 @@ public class XMLUtilities extends AbstractUtilities {
       XMLElement contentElement =
               extractElement(reader, writer, Collections.<String>singletonList("content"), 0, 2, 2).getValue();
       writer.add(contentElement.getStart());
-      writer.add(contentElement.getContentReader());
+      writer.add(contentElement.getContentReader(version));
       writer.add(contentElement.getEnd());
       writer.add(reader);
     } catch (Exception e) {
@@ -533,7 +534,7 @@ public class XMLUtilities extends AbstractUtilities {
                 extractElement(reader, writer, Collections.<String>singletonList("entry"), 0, 1, 1).getValue();
 
         writer.add(entryElement.getStart());
-        writer.add(entryElement.getContentReader());
+        writer.add(entryElement.getContentReader(version));
 
         addAtomElement(
                 IOUtils.toInputStream(String.format("<content type=\"*/*\" src=\"%s/$value\" />", href)),
@@ -544,14 +545,14 @@ public class XMLUtilities extends AbstractUtilities {
         try {
           final XMLElement entryElement =
                   extractElement(reader, writer, Collections.<String>singletonList(
-                                  Constants.get(version, ConstantKey.PROPERTIES)), 0, 2, 3).getValue();
+                  Constants.get(version, ConstantKey.PROPERTIES)), 0, 2, 3).getValue();
 
           addAtomElement(
                   IOUtils.toInputStream("<content type=\"application/xml\">"),
                   writer);
 
           writer.add(entryElement.getStart());
-          writer.add(entryElement.getContentReader());
+          writer.add(entryElement.getContentReader(version));
           writer.add(entryElement.getEnd());
 
           addAtomElement(
@@ -567,7 +568,7 @@ public class XMLUtilities extends AbstractUtilities {
           final XMLElement entryElement =
                   extractElement(reader, writer, Collections.<String>singletonList("entry"), 0, 1, 1).getValue();
           writer.add(entryElement.getStart());
-          writer.add(entryElement.getContentReader());
+          writer.add(entryElement.getContentReader(version));
 
           addAtomElement(
                   IOUtils.toInputStream("<content type=\"application/xml\"/>"),
@@ -742,7 +743,7 @@ public class XMLUtilities extends AbstractUtilities {
 
       writer.add(feedElement.getStart());
       addAtomElement(IOUtils.toInputStream(String.format("<m:count>%d</m:count>", count), Constants.ENCODING), writer);
-      writer.add(feedElement.getContentReader());
+      writer.add(feedElement.getContentReader(version));
       writer.add(feedElement.getEnd());
 
       while (reader.hasNext()) {
@@ -780,7 +781,7 @@ public class XMLUtilities extends AbstractUtilities {
       if (event.getEventType() == XMLStreamConstants.START_ELEMENT
               && Constants.get(version, ConstantKey.LINK).equals(event.asStartElement().getName().getLocalPart())
               && !fieldToBeSaved.contains(
-                      event.asStartElement().getAttributeByName(new QName("title")).getValue())
+              event.asStartElement().getAttributeByName(new QName("title")).getValue())
               && !"edit".equals(event.asStartElement().getAttributeByName(new QName("rel")).getValue())) {
         writeCurrent = false;
       } else if (event.getEventType() == XMLStreamConstants.END_ELEMENT
@@ -788,13 +789,13 @@ public class XMLUtilities extends AbstractUtilities {
         writeNext = true;
       } else if (event.getEventType() == XMLStreamConstants.START_ELEMENT
               && (Constants.get(version, ConstantKey.PROPERTIES)).equals(
-                      event.asStartElement().getName().getLocalPart())) {
+              event.asStartElement().getName().getLocalPart())) {
         writeCurrent = true;
         writeNext = false;
         inProperties = true;
       } else if (event.getEventType() == XMLStreamConstants.END_ELEMENT
               && (Constants.get(version, ConstantKey.PROPERTIES)).equals(
-                      event.asEndElement().getName().getLocalPart())) {
+              event.asEndElement().getName().getLocalPart())) {
         writeCurrent = true;
       } else if (inProperties) {
         if (event.getEventType() == XMLStreamConstants.START_ELEMENT) {
@@ -811,7 +812,7 @@ public class XMLUtilities extends AbstractUtilities {
         } else if (event.getEventType() == XMLStreamConstants.END_ELEMENT
                 && StringUtils.isNotBlank(currentName)
                 && (Constants.get(version, ConstantKey.ATOM_PROPERTY_PREFIX) + currentName.trim()).equals(
-                        event.asEndElement().getName().getLocalPart())) {
+                event.asEndElement().getName().getLocalPart())) {
           writeNext = false;
           currentName = null;
         }
@@ -879,10 +880,10 @@ public class XMLUtilities extends AbstractUtilities {
 
         final XMLElement entry =
                 extractElement(
-                        getEventReader(readEntity(uri.getKey(), uri.getValue(), Accept.ATOM).getValue()),
-                        null,
-                        Collections.<String>singletonList("entry"),
-                        0, 1, 1).getValue();
+                getEventReader(readEntity(uri.getKey(), uri.getValue(), Accept.ATOM).getValue()),
+                null,
+                Collections.<String>singletonList("entry"),
+                0, 1, 1).getValue();
 
         IOUtils.copy(entry.toStream(), writer, encoding);
       } catch (Exception e) {
@@ -919,10 +920,10 @@ public class XMLUtilities extends AbstractUtilities {
 
     final Map.Entry<Integer, XMLElement> propertyElement =
             extractElement(reader, null,
-                    Collections.<String>singletonList(Constants.get(version, ConstantKey.PROPERTIES)), 0, 2, 3);
+            Collections.<String>singletonList(Constants.get(version, ConstantKey.PROPERTIES)), 0, 2, 3);
     reader.close();
 
-    reader = propertyElement.getValue().getContentReader();
+    reader = propertyElement.getValue().getContentReader(version);
 
     try {
       while (true) {
@@ -943,7 +944,7 @@ public class XMLUtilities extends AbstractUtilities {
       while (true) {
         final Map.Entry<Integer, XMLElement> linkElement =
                 extractElement(reader, null,
-                        Collections.<String>singletonList(Constants.get(version, ConstantKey.LINK)), pos, 2, 2);
+                Collections.<String>singletonList(Constants.get(version, ConstantKey.LINK)), pos, 2, 2);
 
         res.put("[Constants.get(version, ConstantKey.LINK)]"
                 + linkElement.getValue().getStart().getAttributeByName(new QName("title")).getValue(),
@@ -973,9 +974,9 @@ public class XMLUtilities extends AbstractUtilities {
     try {
       final XMLElement linkElement =
               extractElement(reader, writer,
-                      Collections.<String>singletonList(Constants.get(version, ConstantKey.LINK)),
-                      Collections.<Map.Entry<String, String>>singletonList(
-                              new SimpleEntry<String, String>("title", linkName)), false, 0, -1, -1).getValue();
+              Collections.<String>singletonList(Constants.get(version, ConstantKey.LINK)),
+              Collections.<Map.Entry<String, String>>singletonList(
+              new SimpleEntry<String, String>("title", linkName)), false, 0, -1, -1).getValue();
       writer.add(linkElement.getStart());
 
       // ------------------------------------------
@@ -1068,7 +1069,7 @@ public class XMLUtilities extends AbstractUtilities {
       writer.add(element.getValue().getStart());
     }
 
-    final XMLEventReader changesReader = new XMLEventReaderWrapper(replacement);
+    final XMLEventReader changesReader = new XMLEventReaderWrapper(replacement, version);
 
     while (changesReader.hasNext()) {
       final XMLEvent event = changesReader.nextEvent();
@@ -1100,21 +1101,13 @@ public class XMLUtilities extends AbstractUtilities {
 
   @Override
   public InputStream deleteProperty(final InputStream src, final List<String> path) throws Exception {
-    final List<String> pathElements = new ArrayList<String>();
-
-    for (String element : path) {
-      pathElements.add(Constants.get(version, ConstantKey.ATOM_PROPERTY_PREFIX) + element);
-    }
-
     final XMLEventReader reader = getEventReader(src);
 
     final ByteArrayOutputStream bos = new ByteArrayOutputStream();
     final XMLEventWriter writer = getEventWriter(bos);
 
-    final Map.Entry<Integer, XMLElement> element = extractElement(reader, writer, pathElements, 0, 3, 4);
-
     final XMLEventReader changesReader = new XMLEventReaderWrapper(IOUtils.toInputStream(
-            String.format("<%s m:null=\"true\" />", path.get(path.size() - 1)), Constants.ENCODING));
+            String.format("<%s m:null=\"true\" />", path.get(path.size() - 1)), Constants.ENCODING), version);
 
     writer.add(changesReader);
     changesReader.close();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/fit/src/main/resources/V30/openTypeMetadata.xml
----------------------------------------------------------------------
diff --git a/fit/src/main/resources/V30/openTypeMetadata.xml b/fit/src/main/resources/V30/openTypeMetadata.xml
index 42a7dea..5c9da36 100644
--- a/fit/src/main/resources/V30/openTypeMetadata.xml
+++ b/fit/src/main/resources/V30/openTypeMetadata.xml
@@ -21,7 +21,7 @@
 -->
 <edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
   <edmx:DataServices m:DataServiceVersion="1.0" m:MaxDataServiceVersion="3.0" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
-    <Schema Namespace="Microsoft.Test.OData.Services.OpenTypesService" xmlns="http://schemas.microsoft.com/ado/2008/01/edm">
+    <Schema Namespace="Microsoft.Test.OData.Services.OpenTypesService" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
       <ComplexType Name="ContactDetails">
         <Property Name="FirstContacted" Type="Edm.Binary"/>
         <Property Name="LastContacted" Type="Edm.DateTimeOffset" Nullable="false"/>

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f79db0b3/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/PropertyTestITCase.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/PropertyTestITCase.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/PropertyTestITCase.java
index 00247ae..78605bf 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/PropertyTestITCase.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v4/PropertyTestITCase.java
@@ -18,10 +18,16 @@
  */
 package org.apache.olingo.client.core.it.v4;
 
+import java.io.IOException;
+import org.apache.olingo.client.api.communication.request.cud.ODataPropertyUpdateRequest;
+import org.apache.olingo.client.api.communication.request.cud.v4.UpdateType;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
 import org.apache.olingo.client.api.communication.request.retrieve.ODataPropertyRequest;
+import org.apache.olingo.client.api.communication.response.ODataPropertyUpdateResponse;
+import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
+import org.apache.olingo.client.api.http.HttpMethod;
 import org.apache.olingo.client.api.uri.v4.URIBuilder;
 import org.apache.olingo.client.api.v4.ODataClient;
 import org.apache.olingo.commons.api.domain.v4.ODataProperty;
@@ -29,7 +35,7 @@ import org.apache.olingo.commons.api.format.ODataFormat;
 import org.junit.Test;
 
 public class PropertyTestITCase extends AbstractTestITCase {
-  
+
   private void _enum(final ODataClient client, final ODataFormat format) {
     final URIBuilder uriBuilder = client.getURIBuilder(testStaticServiceRootURL).
             appendEntitySetSegment("Products").appendKeySegment(5).appendPropertySegment("CoverColors");
@@ -39,7 +45,7 @@ public class PropertyTestITCase extends AbstractTestITCase {
 
     final ODataProperty prop = req.execute().getBody();
     assertNotNull(prop);
-    assertEquals("Collection(Microsoft.Test.OData.Services.ODataWCFService.Color)", prop.getValue().getTypeName());    
+    assertEquals("Collection(Microsoft.Test.OData.Services.ODataWCFService.Color)", prop.getValue().getTypeName());
   }
 
   @Test
@@ -56,7 +62,7 @@ public class PropertyTestITCase extends AbstractTestITCase {
   public void enumFromFullJSON() {
     _enum(client, ODataFormat.JSON_FULL_METADATA);
   }
-  
+
   private void geospatial(final ODataClient client, final ODataFormat format) {
     final URIBuilder uriBuilder = client.getURIBuilder(testStaticServiceRootURL).
             appendEntitySetSegment("People").appendKeySegment(5).appendPropertySegment("Home");
@@ -110,4 +116,49 @@ public class PropertyTestITCase extends AbstractTestITCase {
   public void complexFromFullJSON() {
     complex(client, ODataFormat.JSON_FULL_METADATA);
   }
+
+  @Test
+  public void patchComplexPropertyAsJSON() throws IOException {
+    updateComplexProperty(ODataFormat.JSON_FULL_METADATA, UpdateType.PATCH);
+  }
+
+  private void updateComplexProperty(final ODataFormat format, final UpdateType type) throws IOException {
+    final URIBuilder uriBuilder = client.getURIBuilder(testStaticServiceRootURL).
+            appendEntitySetSegment("Customers").appendKeySegment(1).appendPropertySegment("HomeAddress");
+
+    ODataPropertyRequest<ODataProperty> retrieveReq =
+            client.getRetrieveRequestFactory().getPropertyRequest(uriBuilder.build());
+    retrieveReq.setFormat(format);
+
+    ODataRetrieveResponse<ODataProperty> retrieveRes = retrieveReq.execute();
+    assertEquals(200, retrieveRes.getStatusCode());
+
+    ODataProperty homeAddress =
+            client.getObjectFactory().newComplexProperty("HomeAddress",
+            client.getObjectFactory().newComplexValue(retrieveRes.getBody().getComplexValue().getTypeName()));
+
+    homeAddress.getComplexValue().add(client.getObjectFactory().
+            newPrimitiveProperty("City", client.getObjectFactory().newPrimitiveValueBuilder().buildString("Pescara")));
+
+    final ODataPropertyUpdateRequest updateReq = client.getCUDRequestFactory().
+            getPropertyComplexValueUpdateRequest(uriBuilder.build(), type, homeAddress);
+    if (client.getConfiguration().isUseXHTTPMethod()) {
+      assertEquals(HttpMethod.POST, updateReq.getMethod());
+    } else {
+      assertEquals(type.getMethod(), updateReq.getMethod());
+    }
+    updateReq.setFormat(format);
+
+    final ODataPropertyUpdateResponse updateRes = updateReq.execute();
+    assertEquals(204, updateRes.getStatusCode());
+
+    retrieveReq = client.getRetrieveRequestFactory().getPropertyRequest(uriBuilder.build());
+    retrieveReq.setFormat(format);
+
+    retrieveRes = retrieveReq.execute();
+    assertEquals(200, retrieveRes.getStatusCode());
+
+    homeAddress = retrieveRes.getBody();
+    assertEquals("Pescara", homeAddress.getComplexValue().get("City").getPrimitiveValue().toString());
+  }
 }


[2/2] git commit: merge

Posted by fm...@apache.org.
merge


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

Branch: refs/heads/master
Commit: 639941c00eca9742a28e9297329cf909bd34f91c
Parents: f79db0b e8ac1c7
Author: fmartelli <fa...@gmail.com>
Authored: Tue Apr 29 10:27:30 2014 +0200
Committer: fmartelli <fa...@gmail.com>
Committed: Tue Apr 29 10:27:30 2014 +0200

----------------------------------------------------------------------
 .../org/apache/olingo/fit/AbstractServices.java | 113 +++++-----
 .../apache/olingo/fit/V3ActionOverloading.java  |   4 +-
 .../java/org/apache/olingo/fit/V3Services.java  |   6 +-
 .../java/org/apache/olingo/fit/V4Services.java  | 126 +++++++----
 .../apache/olingo/fit/metadata/Metadata.java    |   2 +-
 .../olingo/fit/metadata/NavigationProperty.java |  10 +-
 .../fit/serializer/JSONEntryContainer.java      |  14 +-
 .../fit/serializer/JSONFeedContainer.java       |  14 +-
 .../olingo/fit/utils/AbstractUtilities.java     |  64 +++---
 .../org/apache/olingo/fit/utils/DataBinder.java | 153 +++++++------
 .../org/apache/olingo/fit/utils/FSManager.java  |   6 +-
 .../apache/olingo/fit/utils/XMLUtilities.java   |   2 +-
 fit/src/main/resources/V40/delta.full.json      |  39 ++++
 fit/src/main/resources/V40/delta.xml            |  87 ++++++++
 .../client/api/CommonEdmEnabledODataClient.java |   1 -
 .../request/retrieve/ODataEntityRequest.java    |   2 +-
 .../request/retrieve/v4/ODataDeltaRequest.java  |  29 +++
 .../retrieve/v4/RetrieveRequestFactory.java     |   2 +
 .../request/v4/AsyncRequestFactory.java         |   1 -
 .../api/domain/ODataEntitySetIterator.java      |  77 +++----
 .../olingo/client/api/op/CommonODataBinder.java |  32 +--
 .../olingo/client/api/op/CommonODataReader.java |   6 +-
 .../olingo/client/api/op/v3/ODataBinder.java    |   8 +-
 .../olingo/client/api/op/v4/ODataBinder.java    |  12 +-
 .../client/api/op/v4/ODataDeserializer.java     |  11 +
 .../cud/ODataEntityCreateRequestImpl.java       |   6 +-
 .../cud/ODataEntityUpdateRequestImpl.java       |   6 +-
 .../retrieve/ODataEntityRequestImpl.java        |   6 +-
 .../ODataEntitySetIteratorRequestImpl.java      |  10 +-
 .../retrieve/ODataEntitySetRequestImpl.java     |   6 +-
 .../retrieve/ODataPropertyRequestImpl.java      |   8 +-
 .../retrieve/v4/ODataDeltaRequestImpl.java      |  81 +++++++
 .../retrieve/v4/RetrieveRequestFactoryImpl.java |   6 +
 .../ODataMediaEntityCreateRequestImpl.java      |   4 +-
 .../ODataMediaEntityUpdateRequestImpl.java      |   4 +-
 .../request/v4/AsyncRequestFactoryImpl.java     |   3 +-
 .../client/core/op/AbstractODataBinder.java     | 132 +++++------
 .../client/core/op/AbstractODataReader.java     |   9 +-
 .../olingo/client/core/op/ODataWriterImpl.java  |   6 +-
 .../client/core/op/impl/v3/ODataBinderImpl.java |  10 +-
 .../client/core/op/impl/v3/ODataReaderImpl.java |   4 +-
 .../client/core/op/impl/v4/ODataBinderImpl.java |  79 ++++++-
 .../core/op/impl/v4/ODataDeserializerImpl.java  |  12 +
 .../client/core/op/impl/v4/ODataReaderImpl.java |   4 +-
 .../client/core/it/AbstractBaseTestITCase.java  |  20 +-
 .../core/it/v3/EntityRetrieveTestITCase.java    |   6 +-
 .../client/core/it/v3/EntitySetTestITCase.java  |   2 +-
 .../core/it/v3/QueryOptionsTestITCase.java      |  10 +-
 .../client/core/it/v4/DeltaTestITCase.java      |  78 +++++++
 .../apache/olingo/client/core/v3/AtomTest.java  |  30 +--
 .../olingo/client/core/v3/EntitySetTest.java    |  10 +-
 .../olingo/client/core/v3/EntityTest.java       |  32 +--
 .../apache/olingo/client/core/v4/AtomTest.java  |   2 +-
 .../olingo/client/core/v4/EntitySetTest.java    |  18 +-
 .../olingo/client/core/v4/EntityTest.java       |  51 +++--
 .../apache/olingo/client/core/v4/JSONTest.java  |  97 ++++++---
 .../apache/olingo/client/core/v4/Customers.json |   2 +-
 .../org/apache/olingo/client/core/v4/delta.json |  39 ++++
 .../org/apache/olingo/client/core/v4/delta.xml  |  87 ++++++++
 .../apache/olingo/commons/api/Constants.java    |  22 +-
 .../olingo/commons/api/data/ContextURL.java     |  52 ++++-
 .../olingo/commons/api/data/DeletedEntity.java  |  36 +++
 .../apache/olingo/commons/api/data/Delta.java   |  45 ++++
 .../olingo/commons/api/data/DeltaLink.java      |  36 +++
 .../apache/olingo/commons/api/data/Entity.java  | 174 +++++++++++++++
 .../olingo/commons/api/data/EntitySet.java      |  74 +++++++
 .../apache/olingo/commons/api/data/Entry.java   | 174 ---------------
 .../apache/olingo/commons/api/data/Feed.java    |  74 -------
 .../apache/olingo/commons/api/data/Link.java    |  24 +-
 .../api/domain/CommonODataEntitySet.java        |   2 +-
 .../olingo/commons/api/domain/ODataLinked.java  |   2 +-
 .../commons/api/domain/v4/ODataDelta.java       |  48 ++++
 .../api/domain/v4/ODataObjectFactory.java       |   4 +
 .../api/edm/constants/ODataServiceVersion.java  |  12 +
 .../commons/api/op/CommonODataDeserializer.java |  18 +-
 .../olingo/commons/api/op/ODataSerializer.java  |  20 +-
 .../olingo/commons/api/data/ContextURLTest.java |  33 +++
 .../commons/core/data/AbstractAtomDealer.java   |  20 +-
 .../olingo/commons/core/data/AbstractDelta.java |  65 ++++++
 .../commons/core/data/AbstractEntity.java       | 171 +++++++++++++++
 .../commons/core/data/AbstractEntitySet.java    |  61 ++++++
 .../olingo/commons/core/data/AbstractEntry.java | 171 ---------------
 .../core/data/AbstractJsonDeserializer.java     |  20 +-
 .../core/data/AbstractJsonSerializer.java       |  18 +-
 .../olingo/commons/core/data/AtomDeltaImpl.java |  25 +++
 .../commons/core/data/AtomDeserializer.java     | 218 ++++++++++++++-----
 .../commons/core/data/AtomEntityImpl.java       |  25 +++
 .../commons/core/data/AtomEntitySetImpl.java    |  28 +++
 .../olingo/commons/core/data/AtomEntryImpl.java |  25 ---
 .../olingo/commons/core/data/AtomFeedImpl.java  |  66 ------
 .../commons/core/data/AtomSerializer.java       | 154 ++++++-------
 .../commons/core/data/DeletedEntityImpl.java    |  50 +++++
 .../olingo/commons/core/data/DeltaLinkImpl.java |  64 ++++++
 .../core/data/JSONDeltaDeserializer.java        |  93 ++++++++
 .../olingo/commons/core/data/JSONDeltaImpl.java |  28 +++
 .../core/data/JSONEntityDeserializer.java       | 200 +++++++++++++++++
 .../commons/core/data/JSONEntityImpl.java       |  33 +++
 .../commons/core/data/JSONEntitySerializer.java | 123 +++++++++++
 .../core/data/JSONEntitySetDeserializer.java    |  93 ++++++++
 .../commons/core/data/JSONEntitySetImpl.java    |  35 +++
 .../core/data/JSONEntitySetSerializer.java      |  82 +++++++
 .../core/data/JSONEntryDeserializer.java        | 200 -----------------
 .../olingo/commons/core/data/JSONEntryImpl.java |  33 ---
 .../commons/core/data/JSONEntrySerializer.java  | 123 -----------
 .../commons/core/data/JSONFeedDeserializer.java |  90 --------
 .../olingo/commons/core/data/JSONFeedImpl.java  |  99 ---------
 .../commons/core/data/JSONFeedSerializer.java   |  82 -------
 .../olingo/commons/core/data/LinkImpl.java      |  24 +-
 .../core/data/ODataJacksonDeserializer.java     |   9 +
 .../core/data/v3/JSONLinkCollectionImpl.java    |   2 +-
 .../core/domain/AbstractODataEntity.java        |   2 +-
 .../core/domain/AbstractODataEntitySet.java     |   5 +-
 .../core/domain/v4/ODataComplexValueImpl.java   |   2 +-
 .../commons/core/domain/v4/ODataDeltaImpl.java  |  73 +++++++
 .../core/domain/v4/ODataObjectFactoryImpl.java  |  11 +
 .../core/edm/AbstractEdmNavigationProperty.java |   1 -
 .../core/op/AbstractODataDeserializer.java      |  24 +-
 .../core/op/AbstractODataSerializer.java        |  36 +--
 .../olingo/commons/core/op/ResourceFactory.java |  84 +++----
 119 files changed, 3343 insertions(+), 1976 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/639941c0/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
----------------------------------------------------------------------
diff --cc fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
index 021de16,202d118..5ce5790
--- a/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
+++ b/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
@@@ -67,12 -67,11 +67,12 @@@ import org.apache.cxf.jaxrs.client.WebC
  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.ResWrap;
- import org.apache.olingo.commons.api.data.Entry;
+ import org.apache.olingo.commons.api.data.Entity;
  import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
  import org.apache.olingo.commons.api.format.ContentType;
- import org.apache.olingo.commons.api.data.Feed;
+ 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.edm.constants.ODataServiceVersion;
@@@ -407,17 -405,17 +406,17 @@@ public abstract class AbstractServices 
        if (contentTypeValue == Accept.XML || contentTypeValue == Accept.TEXT) {
          throw new UnsupportedMediaTypeException("Unsupported media type");
        } else if (contentTypeValue == Accept.ATOM) {
-         entryChanges = atomDeserializer.<AtomEntryImpl, AtomEntryImpl>read(
-                 IOUtils.toInputStream(changes, Constants.ENCODING), AtomEntryImpl.class).getPayload();
+         entryChanges = atomDeserializer.<AtomEntityImpl, AtomEntityImpl>read(
+                 IOUtils.toInputStream(changes, Constants.ENCODING), AtomEntityImpl.class).getPayload();
        } else {
-         final ResWrap<JSONEntryImpl> jcont = mapper.readValue(IOUtils.toInputStream(changes, Constants.ENCODING),
-                 new TypeReference<JSONEntryImpl>() {
+         final ResWrap<JSONEntityImpl> jcont = mapper.readValue(IOUtils.toInputStream(changes, Constants.ENCODING),
+                 new TypeReference<JSONEntityImpl>() {
 -                });
 +        });
  
-         entryChanges = dataBinder.toAtomEntry(jcont.getPayload());
+         entryChanges = dataBinder.toAtomEntity(jcont.getPayload());
        }
  
-       final ResWrap<AtomEntryImpl> container = atomDeserializer.read(entityInfo.getValue(), AtomEntryImpl.class);
+       final ResWrap<AtomEntityImpl> container = atomDeserializer.read(entityInfo.getValue(), AtomEntityImpl.class);
  
        for (Property property : entryChanges.getProperties()) {
          container.getPayload().getProperty(property.getName()).setValue(property.getValue());
@@@ -589,17 -587,17 +588,17 @@@
        } else {
          final Accept contentTypeValue = Accept.parse(contentType, version);
          if (Accept.ATOM == contentTypeValue) {
-           container = atomDeserializer.read(IOUtils.toInputStream(entity, Constants.ENCODING), AtomEntryImpl.class);
+           container = atomDeserializer.read(IOUtils.toInputStream(entity, Constants.ENCODING), AtomEntityImpl.class);
            entry = container.getPayload();
          } else {
-           final ResWrap<JSONEntryImpl> jcontainer =
+           final ResWrap<JSONEntityImpl> jcontainer =
                    mapper.readValue(IOUtils.toInputStream(entity, Constants.ENCODING),
-                   new TypeReference<JSONEntryImpl>() {
 -                          new TypeReference<JSONEntityImpl>() {
 -                          });
++                  new TypeReference<JSONEntityImpl>() {
 +          });
  
-           entry = dataBinder.toAtomEntry(jcontainer.getPayload());
+           entry = dataBinder.toAtomEntity(jcontainer.getPayload());
  
-           container = new ResWrap<AtomEntryImpl>(
+           container = new ResWrap<AtomEntityImpl>(
                    jcontainer.getContextURL(),
                    jcontainer.getMetadataETag(),
                    entry);
@@@ -619,10 -617,10 +618,10 @@@
        final InputStream serialization =
                xml.addOrReplaceEntity(null, entitySetName, new ByteArrayInputStream(content.toByteArray()), entry);
  
-       ResWrap<AtomEntryImpl> result = atomDeserializer.read(serialization, AtomEntryImpl.class);
-       result = new ResWrap<AtomEntryImpl>(
+       ResWrap<AtomEntityImpl> result = atomDeserializer.read(serialization, AtomEntityImpl.class);
+       result = new ResWrap<AtomEntityImpl>(
                URI.create(Constants.get(version, ConstantKey.ODATA_METADATA_PREFIX)
 -                      + entitySetName + Constants.get(version, ConstantKey.ODATA_METADATA_ENTITY_SUFFIX)),
 +              + entitySetName + Constants.get(version, ConstantKey.ODATA_METADATA_ENTITY_SUFFIX)),
                null, result.getPayload());
  
        final String path = Commons.getEntityBasePath(entitySetName, entityKey);
@@@ -894,7 -892,7 +893,7 @@@
          } else {
            mapper.writeValue(
                    writer, new JSONFeedContainer(container.getContextURL(), container.getMetadataETag(),
-                   dataBinder.toJSONFeed(container.getPayload())));
 -                          dataBinder.toJSONEntitySet(container.getPayload())));
++                  dataBinder.toJSONEntitySet(container.getPayload())));
          }
  
          return xml.createResponse(
@@@ -1145,50 -1142,26 +1144,50 @@@
            final String changes,
            final boolean justValue) {
  
 +    // if the given path is not about any link then search for property
 +    LOG.info("Retrieve property {}", path);
 +
      try {
 -      Accept acceptType = null;
 -      if (StringUtils.isNotBlank(format)) {
 -        acceptType = Accept.valueOf(format.toUpperCase());
 -      } else if (StringUtils.isNotBlank(accept)) {
 -        acceptType = Accept.parse(accept, version, null);
 +      final FSManager fsManager = FSManager.instance(version);
 +
 +      final String basePath = Commons.getEntityBasePath(entitySetName, entityId);
-       final ResWrap<AtomEntryImpl> container = xml.readContainerEntry(Accept.ATOM,
++      final ResWrap<AtomEntityImpl> container = xml.readContainerEntry(Accept.ATOM,
 +              fsManager.readFile(basePath + Constants.get(version, ConstantKey.ENTITY), Accept.ATOM));
 +
-       final AtomEntryImpl entry = container.getPayload();
++      final AtomEntityImpl entry = container.getPayload();
 +
 +      Property toBeReplaced = null;
 +      for (String element : path.split("/")) {
 +        if (toBeReplaced == null) {
 +          toBeReplaced = entry.getProperty(element.trim());
 +        } else {
 +          ComplexValue value = toBeReplaced.getValue().asComplex();
 +          for (Property field : value.get()) {
 +            if (field.getName().equalsIgnoreCase(element)) {
 +              toBeReplaced = field;
 +            }
 +          }
 +        }
        }
  
 -      // if the given path is not about any link then search for property
 -      LOG.info("Retrieve property {}", path);
 +      if (toBeReplaced == null) {
 +        throw new NotFoundException();
 +      }
  
 -      final AbstractUtilities utils = getUtilities(acceptType);
 +      if (justValue) {
 +        // just for primitive values
 +        toBeReplaced.setValue(new PrimitiveValueImpl(changes));
 +      } else {
 +        final AtomPropertyImpl pchanges = xml.readProperty(
 +                Accept.parse(contentType, version),
 +                IOUtils.toInputStream(changes, Constants.ENCODING),
 +                entry.getType());
  
 -      utils.replaceProperty(
 -              entitySetName,
 -              entityId,
 -              IOUtils.toInputStream(changes, Constants.ENCODING),
 -              Arrays.asList(path.split("/")),
 -              acceptType,
 -              justValue);
 +        toBeReplaced.setValue(pchanges.getValue());
 +      }
 +
 +      fsManager.putInMemory(xml.writeEntry(Accept.ATOM, container),
 +              fsManager.getAbsolutePath(basePath + Constants.get(version, ConstantKey.ENTITY), Accept.ATOM));
  
        final Response response;
        if ("return-content".equalsIgnoreCase(prefer)) {
@@@ -1545,7 -1507,8 +1544,8 @@@
            final OutputStreamWriter writer = new OutputStreamWriter(content, Constants.ENCODING);
  
            if (linkInfo.isFeed()) {
-             final ResWrap<Feed> container = atomDeserializer.<Feed, AtomFeedImpl>read(stream, AtomFeedImpl.class);
 -            final ResWrap<EntitySet> container = 
++            final ResWrap<EntitySet> container =
+                     atomDeserializer.<EntitySet, AtomEntitySetImpl>read(stream, AtomEntitySetImpl.class);
  
              if (acceptType == Accept.ATOM) {
                atomSerializer.write(writer, container);
@@@ -1555,11 -1518,12 +1555,12 @@@
                mapper.writeValue(
                        writer,
                        new JSONFeedContainer(container.getContextURL(),
 -                              container.getMetadataETag(),
 -                              dataBinder.toJSONEntitySet((AtomEntitySetImpl) container.getPayload())));
 +                      container.getMetadataETag(),
-                       dataBinder.toJSONFeed((AtomFeedImpl) container.getPayload())));
++                      dataBinder.toJSONEntitySet((AtomEntitySetImpl) container.getPayload())));
              }
            } else {
-             final ResWrap<Entry> container = atomDeserializer.<Entry, AtomEntryImpl>read(stream, AtomEntryImpl.class);
 -            final ResWrap<Entity> container = 
++            final ResWrap<Entity> container =
+                     atomDeserializer.<Entity, AtomEntityImpl>read(stream, AtomEntityImpl.class);
              if (acceptType == Accept.ATOM) {
                atomSerializer.write(writer, container);
                writer.flush();
@@@ -1568,8 -1532,8 +1569,8 @@@
                mapper.writeValue(
                        writer,
                        new JSONEntryContainer(container.getContextURL(),
 -                              container.getMetadataETag(),
 -                              dataBinder.toJSONEntityType((AtomEntityImpl) container.getPayload())));
 +                      container.getMetadataETag(),
-                       dataBinder.toJSONEntry((AtomEntryImpl) container.getPayload())));
++                      dataBinder.toJSONEntityType((AtomEntityImpl) container.getPayload())));
              }
            }
  

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/639941c0/fit/src/main/java/org/apache/olingo/fit/metadata/Metadata.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/639941c0/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
----------------------------------------------------------------------
diff --cc fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
index bf1e4e3,57e2049..2882784
--- a/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
@@@ -550,38 -551,31 +550,38 @@@ public abstract class AbstractUtilitie
      } else {
        mapper.writeValue(
                writer, new JSONFeedContainer(container.getContextURL(),
-               container.getMetadataETag(), dataBinder.toJSONFeed(container.getPayload())));
 -                      container.getMetadataETag(), dataBinder.toJSONEntitySet(container.getPayload())));
++              container.getMetadataETag(), dataBinder.toJSONEntitySet(container.getPayload())));
      }
  
      return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);
    }
  
-   public ResWrap<AtomEntryImpl> readContainerEntry(final Accept accept, final InputStream entity)
 -  public AtomEntityImpl readEntry(final Accept accept, final InputStream entity)
++  public ResWrap<AtomEntityImpl> readContainerEntry(final Accept accept, final InputStream entity)
            throws XMLStreamException, IOException {
-     final ResWrap<AtomEntryImpl> container;
 -
 -    final AtomEntityImpl entry;
++    final ResWrap<AtomEntityImpl> container;
  
      if (accept == Accept.ATOM || accept == Accept.XML) {
-       container = atomDeserializer.read(entity, AtomEntryImpl.class);
 -      final ResWrap<AtomEntityImpl> container = atomDeserializer.read(entity, AtomEntityImpl.class);
 -      entry = container.getPayload();
++      container = atomDeserializer.read(entity, AtomEntityImpl.class);
      } else {
-       final ResWrap<JSONEntryImpl> jcontainer =
-               mapper.readValue(entity, new TypeReference<JSONEntryImpl>() {
 -      final ResWrap<JSONEntityImpl> container =
++      final ResWrap<JSONEntityImpl> jcontainer =
+               mapper.readValue(entity, new TypeReference<JSONEntityImpl>() {
 -              });
 -      entry = dataBinder.toAtomEntity(container.getPayload());
 +      });
-       container = new ResWrap<AtomEntryImpl>(
++      container = new ResWrap<AtomEntityImpl>(
 +              jcontainer.getContextURL(),
 +              jcontainer.getMetadataETag(),
-               dataBinder.toAtomEntry(jcontainer.getPayload()));
++              dataBinder.toAtomEntity(jcontainer.getPayload()));
      }
  
 -    return entry;
 +    return container;
 +  }
 +
-   public AtomEntryImpl readEntry(final Accept accept, final InputStream entity)
++  public AtomEntityImpl readEntry(final Accept accept, final InputStream entity)
 +          throws XMLStreamException, IOException {
 +    return readContainerEntry(accept, entity).getPayload();
 +
    }
  
-   public InputStream writeEntry(final Accept accept, final ResWrap<AtomEntryImpl> container)
+   public InputStream writeEntry(final Accept accept, final ResWrap<AtomEntityImpl> container)
            throws XMLStreamException, IOException {
  
      final StringWriter writer = new StringWriter();
@@@ -590,7 -584,7 +590,7 @@@
      } else {
        mapper.writeValue(
                writer, new JSONEntryContainer(container.getContextURL(), container.getMetadataETag(),
-               dataBinder.toJSONEntry(container.getPayload())));
 -                      dataBinder.toJSONEntityType(container.getPayload())));
++              dataBinder.toJSONEntityType(container.getPayload())));
      }
  
      return IOUtils.toInputStream(writer.toString(), Constants.ENCODING);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/639941c0/fit/src/main/java/org/apache/olingo/fit/utils/XMLUtilities.java
----------------------------------------------------------------------