You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ra...@apache.org on 2015/07/15 04:36:52 UTC

[3/8] olingo-odata4 git commit: OLINGO-640: Adding support for ATOM+XML Serializer and De-Serializer

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b99eb7b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java
----------------------------------------------------------------------
diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java
index 759516c..ce5daf3 100644
--- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java
+++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java
@@ -19,6 +19,7 @@
 package org.apache.olingo.server.tecsvc.data;
 
 import java.math.BigDecimal;
+import java.net.URI;
 import java.nio.charset.Charset;
 import java.sql.Timestamp;
 import java.util.ArrayList;
@@ -37,6 +38,10 @@ import org.apache.olingo.commons.api.data.EntityCollection;
 import org.apache.olingo.commons.api.data.Link;
 import org.apache.olingo.commons.api.data.Property;
 import org.apache.olingo.commons.api.data.ValueType;
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmEntityType;
+import org.apache.olingo.commons.api.edm.EdmKeyPropertyRef;
+import org.apache.olingo.server.tecsvc.provider.EntityTypeProvider;
 
 public class DataCreator {
 
@@ -44,28 +49,28 @@ public class DataCreator {
 
   private final Map<String, EntityCollection> data;
 
-  public DataCreator() {
+  public DataCreator(Edm edm) {
     data = new HashMap<String, EntityCollection>();
-    data.put("ESTwoPrim", createESTwoPrim());
-    data.put("ESAllPrim", createESAllPrim());
-    data.put("ESCompAllPrim", createESCompAllPrim());
-    data.put("ESCollAllPrim", createESCollAllPrim());
-    data.put("ESMixPrimCollComp", createESMixPrimCollComp());
-    data.put("ESAllKey", createESAllKey());
-    data.put("ESCompComp", createESCompComp());
-    data.put("ESMedia", createESMedia());
-    data.put("ESKeyNav", createESKeyNav());
-    data.put("ESTwoKeyNav", createESTwoKeyNav());
-    data.put("ESCompCollComp", createESCompCollComp());
-    data.put("ESServerSidePaging", createESServerSidePaging());
-    data.put("ESTwoKeyTwoPrim", createESTwoKeyTwoPrim());
-    data.put("ESAllNullable", createESAllNullable());
-    data.put("ESTwoBase", createESTwoBase());
-    data.put("ESBaseTwoKeyNav", createESBaseTwoKeyNav());
-    data.put("ESCompCollAllPrim", createESCompCollAllPrim());
-    data.put("ESFourKeyAlias", createESFourKeyAlias());
-    data.put("ESBase", createESBase());
-    data.put("ESCompMixPrimCollComp", createESCompMixPrimCollComp());
+    data.put("ESTwoPrim", createESTwoPrim(edm));
+    data.put("ESAllPrim", createESAllPrim(edm));
+    data.put("ESCompAllPrim", createESCompAllPrim(edm));
+    data.put("ESCollAllPrim", createESCollAllPrim(edm));
+    data.put("ESMixPrimCollComp", createESMixPrimCollComp(edm));
+    data.put("ESAllKey", createESAllKey(edm));
+    data.put("ESCompComp", createESCompComp(edm));
+    data.put("ESMedia", createESMedia(edm));
+    data.put("ESKeyNav", createESKeyNav(edm));
+    data.put("ESTwoKeyNav", createESTwoKeyNav(edm));
+    data.put("ESCompCollComp", createESCompCollComp(edm));
+    data.put("ESServerSidePaging", createESServerSidePaging(edm));
+    data.put("ESTwoKeyTwoPrim", createESTwoKeyTwoPrim(edm));
+    data.put("ESAllNullable", createESAllNullable(edm));
+    data.put("ESTwoBase", createESTwoBase(edm));
+    data.put("ESBaseTwoKeyNav", createESBaseTwoKeyNav(edm));
+    data.put("ESCompCollAllPrim", createESCompCollAllPrim(edm));
+    data.put("ESFourKeyAlias", createESFourKeyAlias(edm));
+    data.put("ESBase", createESBase(edm));
+    data.put("ESCompMixPrimCollComp", createESCompMixPrimCollComp(edm));
 
     linkESTwoPrim(data);
     linkESAllPrim(data);
@@ -73,13 +78,17 @@ public class DataCreator {
     linkESTwoKeyNav(data);
   }
 
-  private EntityCollection createESCompMixPrimCollComp() {
+  private EntityCollection createESCompMixPrimCollComp(Edm edm) {
     final EntityCollection entityCollection = new EntityCollection();
     
     entityCollection.getEntities().add(createETCompMixPrimCollComp((short) 1));
     entityCollection.getEntities().add(createETCompMixPrimCollComp((short) 2));
     entityCollection.getEntities().add(createETCompMixPrimCollComp((short) 3));
 
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETCompMixPrimCollComp);
+    setEntityType(entityCollection, type);
+    createEntityId("ESCompMixPrimCollComp", entityCollection, type.getKeyPropertyRefs());
+    
     return entityCollection;
   }
   
@@ -111,7 +120,7 @@ public class DataCreator {
        ));
   }
   
-  private EntityCollection createESBase() {
+  private EntityCollection createESBase(Edm edm) {
     final EntityCollection entityCollection = new EntityCollection();
     
     entityCollection.getEntities().add(new Entity()
@@ -129,11 +138,14 @@ public class DataCreator {
         .addProperty(createPrimitive("PropertyString", "TEST C"))
         .addProperty(createPrimitive("AdditionalPropertyString_5", "TEST E 0815")));
 
-    
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETBase);
+    setEntityType(entityCollection, type);
+    createEntityId("ESBase", entityCollection, type.getKeyPropertyRefs());
+
     return entityCollection;
   }
 
-  private EntityCollection createESFourKeyAlias() {
+  private EntityCollection createESFourKeyAlias(Edm edm) {
     final EntityCollection entityCollection = new EntityCollection();
     
     entityCollection.getEntities().add(new Entity()
@@ -150,16 +162,22 @@ public class DataCreator {
         ))
     );
     
-    
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETFourKeyAlias);
+    setEntityType(entityCollection, type);
+    createEntityId("ESFourKeyAlias", entityCollection, type.getKeyPropertyRefs());
+
     return entityCollection;
   }
 
-  private EntityCollection createESCompCollAllPrim() {
+  private EntityCollection createESCompCollAllPrim(Edm edm) {
     final EntityCollection entityCollection = new EntityCollection();
     
     entityCollection.getEntities().add(createETCompCollAllPrim((short) 5678));
     entityCollection.getEntities().add(createETCompCollAllPrim((short) 12326));
     
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETCompCollAllPrim);
+    setEntityType(entityCollection, type);
+    createEntityId("ESCompCollAllPrim", entityCollection, type.getKeyPropertyRefs());    
     return entityCollection;
   }
   
@@ -244,7 +262,7 @@ public class DataCreator {
         ));
   }
   
-  private EntityCollection createESBaseTwoKeyNav() {
+  private EntityCollection createESBaseTwoKeyNav(Edm edm) {
     final EntityCollection entityCollection = new EntityCollection();
     entityCollection.getEntities().add(
         createESTwoKeyNavEntity((short) 1, "1")
@@ -261,10 +279,15 @@ public class DataCreator {
     entityCollection.getEntities().add(
         createESTwoKeyNavEntity((short) 3, "1")
           .addProperty(createPrimitive("PropertyDate", getDateTime(2013, 12, 12, 0, 0, 0))));
+    
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETBaseTwoKeyNav);
+    setEntityType(entityCollection, type);
+    createEntityId("ESBaseTwoKeyNav", entityCollection, type.getKeyPropertyRefs());
+    
     return entityCollection;
   }
 
-  private EntityCollection createESTwoBase() {
+  private EntityCollection createESTwoBase(Edm edm) {
     final EntityCollection entityCollection = new EntityCollection();
     entityCollection.getEntities().add(new Entity()
         .addProperty(createPrimitive("PropertyInt16",(short) 111))
@@ -284,10 +307,14 @@ public class DataCreator {
         .addProperty(createPrimitive("AdditionalPropertyString_5", "TEST E 0815"))
         .addProperty(createPrimitive("AdditionalPropertyString_6", "TEST F 0815")));
 
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETTwoBase);
+    setEntityType(entityCollection, type);
+    createEntityId("ESTwoBase", entityCollection, type.getKeyPropertyRefs());
+
     return entityCollection;
   }
 
-  private EntityCollection createESAllNullable() {
+  private EntityCollection createESAllNullable(Edm edm) {
     final EntityCollection entityCollection = new EntityCollection();
     entityCollection.getEntities().add(
         new Entity()
@@ -374,7 +401,9 @@ public class DataCreator {
             getTime(0, 37, 13))
         ));
     
-    
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETAllNullable);
+    setEntityType(entityCollection, type);
+    createEntityId("ESAllNullable", entityCollection, type.getKeyPropertyRefs());
     return entityCollection;
   }
 
@@ -382,11 +411,16 @@ public class DataCreator {
     return data;
   }
 
-  private EntityCollection createESTwoKeyTwoPrim() {
+  private EntityCollection createESTwoKeyTwoPrim(Edm edm) {
     EntityCollection entityCollection = new EntityCollection();
     entityCollection.getEntities().add(createETTwoKeyTwoPrimEntity((short) 32767, "Test String1"));
     entityCollection.getEntities().add(createETTwoKeyTwoPrimEntity((short) -365, "Test String2"));
     entityCollection.getEntities().add(createETTwoKeyTwoPrimEntity((short) -32766, "Test String3"));
+    
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETTwoKeyTwoPrim);
+    setEntityType(entityCollection, type);
+    createEntityId("ESTwoKeyTwoPrim", entityCollection, type.getKeyPropertyRefs());
+    
     return entityCollection;
   }
 
@@ -396,7 +430,7 @@ public class DataCreator {
         .addProperty(createPrimitive("PropertyString", propertyString));
   }
 
-  private EntityCollection createESServerSidePaging() {
+  private EntityCollection createESServerSidePaging(Edm  edm) {
     EntityCollection entityCollection = new EntityCollection();
 
     for (short i = 1; i <= 503; i++) {
@@ -405,16 +439,24 @@ public class DataCreator {
       	.addProperty(createPrimitive("PropertyString", "Number:" + i)));
     }
 
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETServerSidePaging);
+    setEntityType(entityCollection, type);
+    createEntityId("ESServerSidePaging", entityCollection, type.getKeyPropertyRefs());
+
     return entityCollection;
   }
 
-  private EntityCollection createESKeyNav() {
+  private EntityCollection createESKeyNav(Edm edm) {
     final EntityCollection entityCollection = new EntityCollection();
 
     entityCollection.getEntities().add(createETKeyNavEntity((short) 1, "I am String Property 1"));
     entityCollection.getEntities().add(createETKeyNavEntity((short) 2, "I am String Property 2"));
     entityCollection.getEntities().add(createETKeyNavEntity((short) 3, "I am String Property 3"));
 
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETKeyNav);
+    setEntityType(entityCollection, type);
+    createEntityId("ESKeyNav", entityCollection, type.getKeyPropertyRefs());
+
     return entityCollection;
   }
 
@@ -453,7 +495,7 @@ public class DataCreator {
         		    createPrimitive("PropertyInt16",(short) 1))));
   }
 
-  private EntityCollection createESTwoKeyNav() {
+  private EntityCollection createESTwoKeyNav(Edm edm) {
     final EntityCollection entityCollection = new EntityCollection();
 
     entityCollection.getEntities().add(createESTwoKeyNavEntity((short) 1, "1"));
@@ -461,6 +503,10 @@ public class DataCreator {
     entityCollection.getEntities().add(createESTwoKeyNavEntity((short) 2, "1"));
     entityCollection.getEntities().add(createESTwoKeyNavEntity((short) 3, "1"));
 
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETTwoKeyNav);
+    setEntityType(entityCollection, type);
+    createEntityId("ESTwoKeyNav", entityCollection, type.getKeyPropertyRefs());
+
     return entityCollection;
   }
 
@@ -521,7 +567,7 @@ public class DataCreator {
   }
 
   @SuppressWarnings("unchecked")
-  private EntityCollection createESCompCollComp() {
+  private EntityCollection createESCompCollComp(Edm edm) {
     final EntityCollection entityCollection = new EntityCollection();
 
     entityCollection.getEntities().add(new Entity()
@@ -552,10 +598,14 @@ public class DataCreator {
               createPrimitive("PropertyInt16",(short) 0),
               createPrimitive("PropertyString", "13 Test Complex in Complex Property"))))));
 
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETCompCollComp);
+    setEntityType(entityCollection, type);
+    createEntityId("ESCompCollComp", entityCollection, type.getKeyPropertyRefs());
+
     return entityCollection;
   }
 
-  private EntityCollection createESTwoPrim() {
+  private EntityCollection createESTwoPrim(Edm edm) {
     EntityCollection entityCollection = new EntityCollection();
 
     entityCollection.getEntities().add(new Entity()
@@ -574,10 +624,19 @@ public class DataCreator {
     	.addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE))
       .addProperty(createPrimitive("PropertyString", "Test String4")));
 
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETTwoPrim);
+    setEntityType(entityCollection, type);
+    createEntityId("ESTwoPrim", entityCollection, type.getKeyPropertyRefs());
     return entityCollection;
   }
 
-  private EntityCollection createESAllPrim() {
+  private void setEntityType(EntityCollection entityCollection, EdmEntityType type) {
+    for (Entity entity:entityCollection.getEntities()) {
+      entity.setType(type.getFullQualifiedName().getFullQualifiedNameAsString());
+    }
+  }
+
+  private EntityCollection createESAllPrim(Edm edm) {
     EntityCollection entityCollection = new EntityCollection();
 
     entityCollection.getEntities().add(new Entity()
@@ -636,10 +695,14 @@ public class DataCreator {
         .addProperty(createPrimitive("PropertyGuid", UUID.fromString("76543201-23ab-cdef-0123-456789cccddd")))
         .addProperty(createPrimitive("PropertyTimeOfDay", getTime(0, 1, 1))));
 
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETAllPrim);
+    setEntityType(entityCollection, type);
+    createEntityId("ESAllPrim", entityCollection, type.getKeyPropertyRefs());
+
     return entityCollection;
   }
 
-  private EntityCollection createESCompAllPrim() {
+  private EntityCollection createESCompAllPrim(Edm edm) {
     EntityCollection entityCollection = new EntityCollection();
 
     Entity entity = new Entity()
@@ -730,19 +793,27 @@ public class DataCreator {
       createPrimitive("PropertyInt64", null),
       createPrimitive("PropertySByte", null), 
       createPrimitive("PropertyTimeOfDay", null)));
-  entity.setETag("W/\"-32768\"");
-  entityCollection.getEntities().add(entity);
-    
+    entity.setETag("W/\"-32768\"");
+    entityCollection.getEntities().add(entity);
+
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETCompAllPrim);
+    setEntityType(entityCollection, type);
+    createEntityId("ESCompAllPrim", entityCollection, type.getKeyPropertyRefs());
+
     return entityCollection;
   }
 
-  private EntityCollection createESCollAllPrim() {
+  private EntityCollection createESCollAllPrim(Edm edm) {
     EntityCollection entityCollection = new EntityCollection();
 
     entityCollection.getEntities().add(createETCollAllPrim((short) 1));
     entityCollection.getEntities().add(createETCollAllPrim((short) 2));
     entityCollection.getEntities().add(createETCollAllPrim((short) 3));
 
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETCollAllPrim);
+    setEntityType(entityCollection, type);
+    createEntityId("ESCollAllPrim", entityCollection, type.getKeyPropertyRefs());
+
     return entityCollection;
   }
   
@@ -815,7 +886,7 @@ public class DataCreator {
             getTime(1, 12, 33)));
   }
   
-  private EntityCollection createESMixPrimCollComp() {
+  private EntityCollection createESMixPrimCollComp(Edm edm) {
     EntityCollection entityCollection = new EntityCollection();
 
     entityCollection.getEntities().add(new Entity()
@@ -841,7 +912,7 @@ public class DataCreator {
       .addProperty(createColPropertyComp()));
 
     entityCollection.getEntities().add(new Entity()
-    	.addProperty(createPrimitive("PropertyInt16", 0))
+    	.addProperty(createPrimitive("PropertyInt16", (short)0))
     	.addProperty(createPrimitiveCollection("CollPropertyString", 
     	    "Employee1@company.example", 
     	    "Employee2@company.example",
@@ -851,6 +922,10 @@ public class DataCreator {
         createPrimitive("PropertyString", "TEST C")))
       .addProperty(createColPropertyComp()));
 
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETMixPrimCollComp);
+    setEntityType(entityCollection, type);
+    createEntityId("ESMixPrimCollComp", entityCollection, type.getKeyPropertyRefs());
+    
     return entityCollection;
   }
   
@@ -868,7 +943,7 @@ public class DataCreator {
 				createPrimitive("PropertyString", "TEST 3")));
 	}
   
-	private EntityCollection createESAllKey() {
+	private EntityCollection createESAllKey(Edm edm) {
     EntityCollection entityCollection = new EntityCollection();
 
     entityCollection.getEntities().add(new Entity()
@@ -900,11 +975,15 @@ public class DataCreator {
         .addProperty(createPrimitive("PropertyDuration", BigDecimal.valueOf(6)))
         .addProperty(createPrimitive("PropertyGuid", GUID))
         .addProperty(createPrimitive("PropertyTimeOfDay", getTime(2, 48, 21))));
+    
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETAllKey);
+    setEntityType(entityCollection, type);
+    createEntityId("ESAllKey", entityCollection, type.getKeyPropertyRefs());
 
     return entityCollection;
   }
 
-  private EntityCollection createESCompComp() {
+  private EntityCollection createESCompComp(Edm edm) {
     EntityCollection entityCollection = new EntityCollection();
 
     Entity entity = new Entity();
@@ -923,10 +1002,14 @@ public class DataCreator {
             createPrimitive("PropertyString", "String 2"))));
     entityCollection.getEntities().add(entity);
 
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETCompComp);
+    setEntityType(entityCollection, type);
+    createEntityId("ESCompComp", entityCollection, type.getKeyPropertyRefs());
+
     return entityCollection;
   }
 
-  private EntityCollection createESMedia() {
+  private EntityCollection createESMedia(Edm edm) {
     EntityCollection entityCollection = new EntityCollection();
 
     Entity entity = new Entity()
@@ -934,6 +1017,7 @@ public class DataCreator {
       .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("darkturquoise")));
     entity.setMediaContentType("image/svg+xml");
     entity.setMediaETag("W/\"1\"");
+    entity.getMediaEditLinks().add(buildMediaLink("ESMedia", "ESMedia(1)/$value"));
     entityCollection.getEntities().add(entity);
 
     entity = new Entity()
@@ -941,6 +1025,7 @@ public class DataCreator {
       .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("royalblue")));
     entity.setMediaContentType("image/svg+xml");
     entity.setMediaETag("W/\"2\"");
+    entity.getMediaEditLinks().add(buildMediaLink("ESMedia", "ESMedia(2)/$value"));
     entityCollection.getEntities().add(entity);
 
     entity = new Entity()
@@ -948,6 +1033,7 @@ public class DataCreator {
       .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("crimson")));
     entity.setMediaContentType("image/svg+xml");
     entity.setMediaETag("W/\"3\"");
+    entity.getMediaEditLinks().add(buildMediaLink("ESMedia", "ESMedia(3)/$value"));
     entityCollection.getEntities().add(entity);
 
     entity = new Entity()
@@ -955,8 +1041,13 @@ public class DataCreator {
       .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("black")));
     entity.setMediaContentType("image/svg+xml");
     entity.setMediaETag("W/\"4\"");
+    entity.getMediaEditLinks().add(buildMediaLink("ESMedia", "ESMedia(4)/$value"));
     entityCollection.getEntities().add(entity);
 
+    EdmEntityType type = edm.getEntityType(EntityTypeProvider.nameETMedia);
+    setEntityType(entityCollection, type);
+    createEntityId("ESMedia", entityCollection, type.getKeyPropertyRefs());
+
     return entityCollection;
   }
 
@@ -1116,12 +1207,22 @@ public class DataCreator {
     return timestamp;
   }
 
+  protected static Link buildMediaLink(String title, String href) {
+    Link link = new Link();
+    link.setRel("edit-media");
+    link.setTitle(title);
+    link.setHref(href);
+    return link;
+  }
+  
   protected static void setLink(final Entity entity, final String navigationPropertyName, final Entity target) {
     Link link = entity.getNavigationLink(navigationPropertyName);
     if (link == null) {
       link = new Link();
+      link.setRel("http://docs.oasis-open.org/odata/ns/related/"+navigationPropertyName);
       link.setType(Constants.ENTITY_NAVIGATION_LINK_TYPE);
       link.setTitle(navigationPropertyName);
+      link.setHref(target.getId().toASCIIString());
       entity.getNavigationLinks().add(link);
     }
     link.setInlineEntity(target);
@@ -1131,14 +1232,42 @@ public class DataCreator {
     Link link = entity.getNavigationLink(navigationPropertyName);
     if (link == null) {
       link = new Link();
+      link.setRel("http://docs.oasis-open.org/odata/ns/related/"+navigationPropertyName);
       link.setType(Constants.ENTITY_SET_NAVIGATION_LINK_TYPE);
       link.setTitle(navigationPropertyName);
       EntityCollection target = new EntityCollection();
       target.getEntities().addAll(Arrays.asList(targets));
       link.setInlineEntitySet(target);
+      link.setHref(entity.getId().toASCIIString()+"/"+navigationPropertyName);
       entity.getNavigationLinks().add(link);
     } else {
       link.getInlineEntitySet().getEntities().addAll(Arrays.asList(targets));
     }
   }
+  
+  protected static void createEntityId (String esName, EntityCollection entities, List<EdmKeyPropertyRef> keys) {
+    for (Entity entity:entities.getEntities()) {
+      createEntityId(esName, entity, keys);
+    }
+  }  
+  protected static void createEntityId (String esName, Entity entity, List<EdmKeyPropertyRef> keys) {
+    try {
+      if(keys.size() == 1) {
+        entity.setId(URI.create(esName+"("+entity.getProperty(keys.get(0).getName()).asPrimitive()+")"));
+      } else {
+        StringBuilder sb = new StringBuilder();
+        sb.append(esName).append("(");
+        for (int i = 0; i < keys.size(); i++) {
+          if (i != 0) {
+            sb.append(",");
+          }
+          sb.append(keys.get(i)).append("=").append(entity.getProperty(keys.get(i).getName()).asPrimitive());
+        }
+        sb.append(")");
+        entity.setId(URI.create(sb.toString()));
+      }
+    } catch (Exception e) {
+      entity.setId(URI.create("id"));
+    }
+  }  
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b99eb7b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java
----------------------------------------------------------------------
diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java
index 79313e6..95cdf9a 100644
--- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java
+++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataProvider.java
@@ -63,12 +63,9 @@ public class DataProvider {
   private Edm edm;
   private OData odata;
 
-  public DataProvider() {
-    data = new DataCreator().getData();
-  }
-
-  public void setEdm(final Edm edm) {
+  public DataProvider(final Edm edm) {
     this.edm = edm;
+    data = new DataCreator(edm).getData();
   }
 
   public void setOData(final OData odata) {
@@ -153,6 +150,7 @@ public class DataProvider {
     }
 
     createProperties(edmEntityType, newEntity.getProperties());
+    DataCreator.createEntityId(edmEntitySet.getName(), newEntity, edmEntityType.getKeyPropertyRefs());
     entities.add(newEntity);
 
     return newEntity;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b99eb7b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/RequestValidator.java
----------------------------------------------------------------------
diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/RequestValidator.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/RequestValidator.java
index fbe21b5..baf2f40 100644
--- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/RequestValidator.java
+++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/RequestValidator.java
@@ -139,11 +139,13 @@ public class RequestValidator {
 
     if (edmProperty.isCollection()) {
       final EntityCollection inlineEntitySet = navigationLink.getInlineEntitySet();
-      if (!isInsert && inlineEntitySet.getEntities().size() > 0) {
-        throw new DataProvider.DataProviderException("Deep update is not allowed", HttpStatusCode.BAD_REQUEST);
-      } else {
-        for (final Entity entity : navigationLink.getInlineEntitySet().getEntities()) {
-          validate(edmBindingTarget, entity);
+      if (inlineEntitySet != null) {
+        if (!isInsert && inlineEntitySet.getEntities().size() > 0) {
+          throw new DataProvider.DataProviderException("Deep update is not allowed", HttpStatusCode.BAD_REQUEST);
+        } else {
+          for (final Entity entity : navigationLink.getInlineEntitySet().getEntities()) {
+            validate(edmBindingTarget, entity);
+          }
         }
       }
     } else {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b99eb7b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java
----------------------------------------------------------------------
diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java
index cba853d..06f450d 100644
--- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java
+++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java
@@ -513,12 +513,12 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
     expandHandler.applyExpandQueryOptions(entitySetSerialization, edmEntitySet, expand);
     final CountOption countOption = uriInfo.getCountOption();
 
+    final String id = request.getRawBaseUri()+edmEntitySet.getName();
     // Serialize
     final SerializerResult serializerResult = (isReference) ? 
         serializeReferenceCollection(entitySetSerialization, edmEntitySet, requestedContentType, countOption) :
         serializeEntityCollection(entitySetSerialization, edmEntitySet, edmEntityType, requestedContentType,
-            expand, select, countOption);
-
+            expand, select, countOption, id);
     response.setContent(serializerResult.getContent());
     response.setStatusCode(HttpStatusCode.OK.getStatusCode());
     response.setHeader(HttpHeader.CONTENT_TYPE, requestedContentType.toContentTypeString());
@@ -530,7 +530,7 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
 
   private SerializerResult serializeEntityCollection(final EntityCollection entityCollection,
       final EdmEntitySet edmEntitySet, final EdmEntityType edmEntityType, final ContentType requestedFormat,
-      final ExpandOption expand, final SelectOption select, final CountOption countOption)
+      final ExpandOption expand, final SelectOption select, final CountOption countOption, String id)
       throws ODataLibraryException {
     
     return odata.createSerializer(requestedFormat).entityCollection(
@@ -542,6 +542,7 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
                 getContextUrl(edmEntitySet, edmEntityType, false, expand, select))
             .count(countOption)
             .expand(expand).select(select)
+            .setId(id)
             .build());
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b99eb7b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
----------------------------------------------------------------------
diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
index e0dd7dd..cb77b43 100644
--- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
+++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
@@ -68,7 +68,6 @@ public abstract class TechnicalProcessor implements Processor {
     this.odata = odata;
     this.serviceMetadata = serviceMetadata;
     dataProvider.setOData(odata);
-    dataProvider.setEdm(serviceMetadata.getEdm());
   }
 
   protected EdmEntitySet getEdmEntitySet(final UriInfoResource uriInfo) throws ODataApplicationException {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b99eb7b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/ExpandSystemQueryOptionHandler.java
----------------------------------------------------------------------
diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/ExpandSystemQueryOptionHandler.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/ExpandSystemQueryOptionHandler.java
index c641516..e8c3a80 100644
--- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/ExpandSystemQueryOptionHandler.java
+++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/ExpandSystemQueryOptionHandler.java
@@ -202,7 +202,7 @@ public class ExpandSystemQueryOptionHandler {
     newLink.setTitle(link.getTitle());
     newLink.setType(link.getType());
     newLink.setRel(link.getRel());
-
+    newLink.setHref(link.getHref());
     return newLink;
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b99eb7b/lib/server-tecsvc/src/test/java/org/apache/olingo/server/tecsvc/data/DataProviderTest.java
----------------------------------------------------------------------
diff --git a/lib/server-tecsvc/src/test/java/org/apache/olingo/server/tecsvc/data/DataProviderTest.java b/lib/server-tecsvc/src/test/java/org/apache/olingo/server/tecsvc/data/DataProviderTest.java
index 1d29a8e..dab178c 100644
--- a/lib/server-tecsvc/src/test/java/org/apache/olingo/server/tecsvc/data/DataProviderTest.java
+++ b/lib/server-tecsvc/src/test/java/org/apache/olingo/server/tecsvc/data/DataProviderTest.java
@@ -55,7 +55,7 @@ public class DataProviderTest {
 
   @Test
   public void esAllPrimEntity() throws Exception {
-    final DataProvider dataProvider = new DataProvider();
+    final DataProvider dataProvider = new DataProvider(edm);
     final Entity entity = dataProvider.readAll(esAllPrim).getEntities().get(2);
     Assert.assertEquals(16, entity.getProperties().size());
 
@@ -65,7 +65,7 @@ public class DataProviderTest {
 
   @Test
   public void esAllKeyEntity() throws Exception {
-    final DataProvider dataProvider = new DataProvider();
+    final DataProvider dataProvider = new DataProvider(edm);
     final Entity entity = dataProvider.readAll(esAllKey).getEntities().get(0);
     Assert.assertEquals(13, entity.getProperties().size());
 
@@ -87,7 +87,7 @@ public class DataProviderTest {
 
   @Test
   public void esAllPrim() throws Exception {
-    final DataProvider data = new DataProvider();
+    final DataProvider data = new DataProvider(edm);
     EntityCollection outSet = data.readAll(esAllPrim);
 
     Assert.assertEquals(3, outSet.getEntities().size());
@@ -107,7 +107,8 @@ public class DataProviderTest {
 
   @Test
   public void esCollAllPrim() throws Exception {
-    EntityCollection outSet = new DataProvider().readAll(esCollAllPrim);
+    final DataProvider dataProvider = new DataProvider(edm);
+    EntityCollection outSet = dataProvider.readAll(esCollAllPrim);
 
     Assert.assertEquals(3, outSet.getEntities().size());
     Assert.assertEquals(17, outSet.getEntities().get(0).getProperties().size());
@@ -120,7 +121,9 @@ public class DataProviderTest {
 
   @Test
   public void esCompAllPrim() throws Exception {
-    EntityCollection outSet = new DataProvider().readAll(esCompAllPrim);
+    final DataProvider dataProvider = new DataProvider(edm);
+    
+    EntityCollection outSet = dataProvider.readAll(esCompAllPrim);
 
     Assert.assertEquals(4, outSet.getEntities().size());
     Assert.assertEquals(2, outSet.getEntities().get(0).getProperties().size());
@@ -133,7 +136,9 @@ public class DataProviderTest {
 
   @Test
   public void esMixPrimCollComp() throws Exception {
-    EntityCollection outSet = new DataProvider().readAll(esMixPrimCollComp);
+    final DataProvider dataProvider = new DataProvider(edm);
+    
+    EntityCollection outSet = dataProvider.readAll(esMixPrimCollComp);
 
     Assert.assertEquals(3, outSet.getEntities().size());
     Assert.assertEquals(4, outSet.getEntities().get(0).getProperties().size());
@@ -156,7 +161,8 @@ public class DataProviderTest {
 
   @Test
   public void esMedia() throws Exception {
-    DataProvider dataProvider = new DataProvider();
+    DataProvider dataProvider = new DataProvider(edm);
+    
     Entity entity = dataProvider.read(esMedia, Arrays.asList(mockParameter("PropertyInt16", "3")));
     Assert.assertNotNull(dataProvider.readMedia(entity));
     dataProvider.delete(esMedia, entity);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b99eb7b/lib/server-test/pom.xml
----------------------------------------------------------------------
diff --git a/lib/server-test/pom.xml b/lib/server-test/pom.xml
index d715698..3173137 100644
--- a/lib/server-test/pom.xml
+++ b/lib/server-test/pom.xml
@@ -68,6 +68,11 @@
       <artifactId>commons-io</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>xmlunit</groupId>
+      <artifactId>xmlunit</artifactId>
+      <scope>test</scope>
+    </dependency>    
   </dependencies>
 
   <build>

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b99eb7b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java
index ca070a9..572e71a 100644
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java
+++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java
@@ -69,7 +69,7 @@ public class ODataJsonSerializerTest {
   private static final ServiceMetadata metadata = new ServiceMetadataImpl(
       new EdmTechProvider(), Collections.<EdmxReference> emptyList(), new MetadataETagSupport("W/\"metadataETag\""));
   private static final EdmEntityContainer entityContainer = metadata.getEdm().getEntityContainer();
-  private final DataProvider data = new DataProvider();
+  private final DataProvider data = new DataProvider(metadata.getEdm());
   private final ODataSerializer serializer = new ODataJsonSerializer(ContentType.JSON);
   private final ODataSerializer serializerNoMetadata = new ODataJsonSerializer(ContentType.JSON_NO_METADATA);
   private final ODataSerializer serializerIEEECompatible =
@@ -341,7 +341,9 @@ public class ODataJsonSerializerTest {
             .build()).getContent());
     final String expectedResult = "{\"@odata.context\":\"$metadata#ESMedia/$entity\","
         + "\"@odata.metadataEtag\":\"W/\\\"metadataETag\\\"\","
-        + "\"@odata.mediaEtag\":\"W/\\\"1\\\"\",\"@odata.mediaContentType\":\"image/svg+xml\","
+        + "\"@odata.mediaEtag\":\"W/\\\"1\\\"\","
+        + "\"@odata.mediaContentType\":\"image/svg+xml\","
+        + "\"@odata.mediaEditLink\":\"ESMedia(1)/$value\","
         + "\"PropertyInt16\":1}";
     Assert.assertEquals(expectedResult, resultString);
   }
@@ -357,10 +359,14 @@ public class ODataJsonSerializerTest {
     final String expectedResult = "{\"@odata.context\":\"$metadata#ESMedia\","
         + "\"@odata.metadataEtag\":\"W/\\\"metadataETag\\\"\","
         + "\"value\":["
-        + "{\"@odata.mediaEtag\":\"W/\\\"1\\\"\",\"@odata.mediaContentType\":\"image/svg+xml\",\"PropertyInt16\":1},"
-        + "{\"@odata.mediaEtag\":\"W/\\\"2\\\"\",\"@odata.mediaContentType\":\"image/svg+xml\",\"PropertyInt16\":2},"
-        + "{\"@odata.mediaEtag\":\"W/\\\"3\\\"\",\"@odata.mediaContentType\":\"image/svg+xml\",\"PropertyInt16\":3},"
-        + "{\"@odata.mediaEtag\":\"W/\\\"4\\\"\",\"@odata.mediaContentType\":\"image/svg+xml\",\"PropertyInt16\":4}]}";
+        + "{\"@odata.mediaEtag\":\"W/\\\"1\\\"\",\"@odata.mediaContentType\":\"image/svg+xml\","
+        + "\"@odata.mediaEditLink\":\"ESMedia(1)/$value\",\"PropertyInt16\":1},"
+        + "{\"@odata.mediaEtag\":\"W/\\\"2\\\"\",\"@odata.mediaContentType\":\"image/svg+xml\","
+        + "\"@odata.mediaEditLink\":\"ESMedia(2)/$value\",\"PropertyInt16\":2},"
+        + "{\"@odata.mediaEtag\":\"W/\\\"3\\\"\",\"@odata.mediaContentType\":\"image/svg+xml\","
+        + "\"@odata.mediaEditLink\":\"ESMedia(3)/$value\",\"PropertyInt16\":3},"
+        + "{\"@odata.mediaEtag\":\"W/\\\"4\\\"\",\"@odata.mediaContentType\":\"image/svg+xml\","
+        + "\"@odata.mediaEditLink\":\"ESMedia(4)/$value\",\"PropertyInt16\":4}]}";
     Assert.assertEquals(expectedResult, resultString);
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b99eb7b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/ODataXmlDeserializerTest.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/ODataXmlDeserializerTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/ODataXmlDeserializerTest.java
new file mode 100644
index 0000000..fb7e7ff
--- /dev/null
+++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/ODataXmlDeserializerTest.java
@@ -0,0 +1,630 @@
+/*
+ * 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.server.core.serializer.xml;
+
+import java.io.ByteArrayInputStream;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.olingo.commons.api.data.ComplexValue;
+import org.apache.olingo.commons.api.data.Entity;
+import org.apache.olingo.commons.api.data.Link;
+import org.apache.olingo.commons.api.data.Property;
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmComplexType;
+import org.apache.olingo.commons.api.edm.EdmEntityContainer;
+import org.apache.olingo.commons.api.edm.EdmEntitySet;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
+import org.apache.olingo.commons.api.edm.EdmProperty;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.edm.provider.CsdlComplexType;
+import org.apache.olingo.commons.api.edm.provider.CsdlProperty;
+import org.apache.olingo.commons.core.edm.EdmComplexTypeImpl;
+import org.apache.olingo.commons.core.edm.EdmPropertyImpl;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmBinary;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmByte;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmDate;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmDateTimeOffset;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmDecimal;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmDouble;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmDuration;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmGuid;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmInt16;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmInt32;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmInt64;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmSByte;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmSingle;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmTimeOfDay;
+import org.apache.olingo.server.api.ServiceMetadata;
+import org.apache.olingo.server.api.deserializer.ODataDeserializer;
+import org.apache.olingo.server.api.edmx.EdmxReference;
+import org.apache.olingo.server.core.ServiceMetadataImpl;
+import org.apache.olingo.server.core.deserializer.xml.ODataXmlDeserializer;
+import org.apache.olingo.server.tecsvc.MetadataETagSupport;
+import org.apache.olingo.server.tecsvc.provider.EdmTechProvider;
+import org.custommonkey.xmlunit.XMLUnit;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class ODataXmlDeserializerTest {
+  
+  private static final ServiceMetadata metadata = new ServiceMetadataImpl(
+      new EdmTechProvider(), Collections.<EdmxReference> emptyList(), new MetadataETagSupport("WmetadataETag"));
+  private static final EdmEntityContainer entityContainer = metadata.getEdm().getEntityContainer();
+  private final ODataDeserializer serializer = new ODataXmlDeserializer();
+  
+  @BeforeClass
+  public static void setup() {
+    XMLUnit.setIgnoreComments(true);
+    XMLUnit.setIgnoreAttributeOrder(true);
+    XMLUnit.setIgnoreWhitespace(true);
+    XMLUnit.setNormalizeWhitespace(true);
+    XMLUnit.setCompareUnmatched(false);
+  }
+  
+  private Object edmInt16(String value) throws EdmPrimitiveTypeException {
+    return EdmInt16.getInstance().valueOfString(value, true, 10, 10, 10, true, 
+        EdmInt16.getInstance().getDefaultType()); 
+  }
+  private Object edmInt32(String value) throws EdmPrimitiveTypeException {
+    return EdmInt32.getInstance().valueOfString(value, true, 10, 10, 10, true, 
+        EdmInt32.getInstance().getDefaultType()); 
+  }
+  private Object edmInt64(String value) throws EdmPrimitiveTypeException {
+    return EdmInt64.getInstance().valueOfString(value, true, 10, 10, 10, true, 
+        EdmInt64.getInstance().getDefaultType()); 
+  }
+  private Object edmSingle(String value) throws EdmPrimitiveTypeException {
+    return EdmSingle.getInstance().valueOfString(value, true, 10, 10, 10, true, 
+        EdmSingle.getInstance().getDefaultType()); 
+  }
+  private Object edmDouble(String value) throws EdmPrimitiveTypeException {
+    return EdmDouble.getInstance().valueOfString(value, true, 10, 10, 10, true, 
+        EdmDouble.getInstance().getDefaultType()); 
+  }
+  private Object edmSByte(String value) throws EdmPrimitiveTypeException {
+    return EdmSByte.getInstance().valueOfString(value, true, 10, 10, 10, true, 
+        EdmSByte.getInstance().getDefaultType()); 
+  }
+  private Object edmByte(String value) throws EdmPrimitiveTypeException {
+    return EdmByte.getInstance().valueOfString(value, true, 10, 10, 10, true, 
+        EdmByte.getInstance().getDefaultType()); 
+  }  
+  private Object edmDecimal(String value) throws EdmPrimitiveTypeException {
+    return EdmDecimal.getInstance().valueOfString(value, true, 10, 10, 10, true, 
+        EdmDecimal.getInstance().getDefaultType()); 
+  }
+  private Object edmBinary(String value) throws EdmPrimitiveTypeException {
+    return EdmBinary.getInstance().valueOfString(value, true, 10, 10, 10, true, 
+        EdmBinary.getInstance().getDefaultType()); 
+  }
+  private Object edmDate(String value) throws EdmPrimitiveTypeException {
+    return EdmDate.getInstance().valueOfString(value, true, 10, 10, 10, true, 
+        EdmDate.getInstance().getDefaultType()); 
+  }
+  private Object edmDateTimeOffset(String value) throws EdmPrimitiveTypeException {
+    return EdmDateTimeOffset.getInstance().valueOfString(value, true, 10, 10, 10, true, 
+        EdmDateTimeOffset.getInstance().getDefaultType()); 
+  }  
+  private Object edmDuration(String value) throws EdmPrimitiveTypeException {
+    return EdmDuration.getInstance().valueOfString(value, true, 10, 10, 10, true, 
+        EdmDuration.getInstance().getDefaultType()); 
+  }   
+  private Object edmGUID(String value) throws EdmPrimitiveTypeException {
+    return EdmGuid.getInstance().valueOfString(value, true, 10, 10, 10, true, 
+        EdmGuid.getInstance().getDefaultType()); 
+  }  
+  private Object edmTimeOfDay(String value) throws EdmPrimitiveTypeException {
+    return EdmTimeOfDay.getInstance().valueOfString(value, true, 10, 10, 10, true, 
+        EdmTimeOfDay.getInstance().getDefaultType()); 
+  }
+  
+  @Test
+  public void entitySimple() throws Exception {
+    final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim");
+    
+    String payload = "<?xml version='1.0' encoding='UTF-8'?>\n" + 
+        "<atom:entry xmlns:atom=\"http://www.w3.org/2005/Atom\"\n" + 
+        "  xmlns:metadata=\"http://docs.oasis-open.org/odata/ns/metadata\"\n" + 
+        "  xmlns:data=\"http://docs.oasis-open.org/odata/ns/data\"> " +        
+        "  <atom:link\n" + 
+        "    rel=\"http://docs.oasis-open.org/odata/ns/related/NavPropertyETTwoPrimMany\"\n" + 
+        "    type=\"application/atom+xml;type=feed\" title=\"NavPropertyETTwoPrimMany\"\n" + 
+        "    href=\"id\" />\n" + 
+        "  <atom:link\n" + 
+        "    rel=\"http://docs.oasis-open.org/odata/ns/related/NavPropertyETTwoPrimOne\"\n" + 
+        "    type=\"application/atom+xml;type=entry\" title=\"NavPropertyETTwoPrimOne\"\n" + 
+        "    href=\"id\" />\n" + 
+        "  <atom:category scheme=\"http://docs.oasis-open.org/odata/ns/scheme\"\n" + 
+        "    term=\"#olingo.odata.test1.ETAllPrim\" />\n" + 
+        "  <atom:content type=\"application/xml\">\n" + 
+        "    <metadata:properties>\n" + 
+        "      <data:PropertyInt16>32767</data:PropertyInt16>\n" + 
+        "      <data:PropertyString>First Resource - positive values</data:PropertyString>\n" + 
+        "      <data:PropertyBoolean>true</data:PropertyBoolean>\n" + 
+        "      <data:PropertyByte>255</data:PropertyByte>\n" + 
+        "      <data:PropertySByte>127</data:PropertySByte>\n" + 
+        "      <data:PropertyInt32>2147483647</data:PropertyInt32>\n" + 
+        "      <data:PropertyInt64>9223372036854775807</data:PropertyInt64>\n" + 
+        "      <data:PropertySingle>1.79E20</data:PropertySingle>\n" + 
+        "      <data:PropertyDouble>-1.79E19</data:PropertyDouble>\n" + 
+        "      <data:PropertyDecimal>34</data:PropertyDecimal>\n" + 
+        "      <data:PropertyBinary>ASNFZ4mrze8=</data:PropertyBinary>\n" + 
+        "      <data:PropertyDate>2012-12-03</data:PropertyDate>\n" + 
+        "      <data:PropertyDateTimeOffset>2012-12-03T07:16:23Z</data:PropertyDateTimeOffset>\n" + 
+        "      <data:PropertyDuration>PT6S</data:PropertyDuration>\n" + 
+        "      <data:PropertyGuid>01234567-89ab-cdef-0123-456789abcdef</data:PropertyGuid>\n" + 
+        "      <data:PropertyTimeOfDay>03:26:05</data:PropertyTimeOfDay>\n" + 
+        "    </metadata:properties>\n" + 
+        "  </atom:content>\n" + 
+        "</atom:entry>\n"; 
+    
+    Entity result = serializer.entity(new ByteArrayInputStream(payload.getBytes()), 
+        edmEntitySet.getEntityType()).getEntity();
+
+    Assert.assertEquals(16, result.getProperties().size());
+    Assert.assertEquals(2, result.getNavigationBindings().size());
+    
+    Assert.assertEquals(edmInt16("32767"), result.getProperty("PropertyInt16").asPrimitive());
+    Assert.assertEquals("First Resource - positive values", result.getProperty("PropertyString").asPrimitive());
+    Assert.assertEquals(edmByte("255"), result.getProperty("PropertyByte").asPrimitive());
+    Assert.assertEquals(edmSByte("127"), result.getProperty("PropertySByte").asPrimitive());
+    Assert.assertEquals(edmInt32("2147483647"), result.getProperty("PropertyInt32").asPrimitive());
+    Assert.assertEquals(edmInt64("9223372036854775807"), result.getProperty("PropertyInt64").asPrimitive());
+    Assert.assertEquals(edmSingle("1.79E20"), result.getProperty("PropertySingle").asPrimitive());
+    Assert.assertEquals(edmDouble("-1.79E19"), result.getProperty("PropertyDouble").asPrimitive());
+    Assert.assertEquals(edmDecimal("34"), result.getProperty("PropertyDecimal").asPrimitive());
+//    Assert.assertEquals(edmBinary("ASNFZ4mrze8="), result.getProperty("PropertyBinary").asPrimitive());
+    Assert.assertEquals(edmDate("2012-12-03"), result.getProperty("PropertyDate").asPrimitive());
+    Assert.assertEquals(edmDateTimeOffset("2012-12-03T07:16:23Z"), result.getProperty("PropertyDateTimeOffset")
+        .asPrimitive());
+    Assert.assertEquals(edmDuration("PT6S"), result.getProperty("PropertyDuration")
+        .asPrimitive());
+    Assert.assertEquals(edmGUID("01234567-89ab-cdef-0123-456789abcdef"), result.getProperty("PropertyGuid")
+        .asPrimitive());
+    Assert.assertEquals(edmTimeOfDay("03:26:05"), result.getProperty("PropertyTimeOfDay").asPrimitive());
+  }
+  
+  @Test
+  public void entitySimpleWithTypes() throws Exception {
+    final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim");
+    
+    String payload = "<?xml version='1.0' encoding='UTF-8'?>\n" + 
+        "<atom:entry xmlns:atom=\"http://www.w3.org/2005/Atom\"\n" + 
+        "  xmlns:metadata=\"http://docs.oasis-open.org/odata/ns/metadata\"\n" + 
+        "  xmlns:data=\"http://docs.oasis-open.org/odata/ns/data\"> " +        
+        "  <atom:link\n" + 
+        "    rel=\"http://docs.oasis-open.org/odata/ns/related/NavPropertyETTwoPrimMany\"\n" + 
+        "    type=\"application/atom+xml;type=feed\" title=\"NavPropertyETTwoPrimMany\"\n" + 
+        "    href=\"id\" />\n" + 
+        "  <atom:link\n" + 
+        "    rel=\"http://docs.oasis-open.org/odata/ns/related/NavPropertyETTwoPrimOne\"\n" + 
+        "    type=\"application/atom+xml;type=entry\" title=\"NavPropertyETTwoPrimOne\"\n" + 
+        "    href=\"id\" />\n" + 
+        "  <atom:category scheme=\"http://docs.oasis-open.org/odata/ns/scheme\"\n" + 
+        "    term=\"#olingo.odata.test1.ETAllPrim\" />\n" + 
+        "  <atom:content type=\"application/xml\">\n" + 
+        "    <metadata:properties>\n" + 
+        "      <data:PropertyInt16 metadata:type=\"Int16\">32767</data:PropertyInt16>\n" + 
+        "      <data:PropertyString>First Resource - positive values</data:PropertyString>\n" + 
+        "      <data:PropertyBoolean metadata:type=\"Boolean\">true</data:PropertyBoolean>\n" + 
+        "      <data:PropertyByte metadata:type=\"Byte\">255</data:PropertyByte>\n" + 
+        "      <data:PropertySByte metadata:type=\"SByte\">127</data:PropertySByte>\n" + 
+        "      <data:PropertyInt32 metadata:type=\"Int32\">2147483647</data:PropertyInt32>\n" + 
+        "      <data:PropertyInt64 metadata:type=\"Int64\">9223372036854775807</data:PropertyInt64>\n" + 
+        "      <data:PropertySingle metadata:type=\"Single\">1.79E20</data:PropertySingle>\n" + 
+        "      <data:PropertyDouble metadata:type=\"Double\">-1.79E19</data:PropertyDouble>\n" + 
+        "      <data:PropertyDecimal metadata:type=\"Decimal\">34</data:PropertyDecimal>\n" + 
+        "      <data:PropertyBinary metadata:type=\"Binary\">ASNFZ4mrze8=</data:PropertyBinary>\n" + 
+        "      <data:PropertyDate metadata:type=\"Date\">2012-12-03</data:PropertyDate>\n" + 
+        "      <data:PropertyDateTimeOffset metadata:type=\"DateTimeOffset\">2012-12-03T07:16:23Z"
+        + "</data:PropertyDateTimeOffset>\n" + 
+        "      <data:PropertyDuration metadata:type=\"Duration\">PT6S</data:PropertyDuration>\n" + 
+        "      <data:PropertyGuid metadata:type=\"GUID\">01234567-89ab-cdef-0123-456789abcdef"
+        + "</data:PropertyGuid>\n" + 
+        "      <data:PropertyTimeOfDay metadata:type=\"TimeOfDay\">03:26:05</data:PropertyTimeOfDay>\n" + 
+        "    </metadata:properties>\n" + 
+        "  </atom:content>\n" + 
+        "</atom:entry>\n"; 
+    
+    Entity result = serializer.entity(new ByteArrayInputStream(payload.getBytes()), 
+        edmEntitySet.getEntityType()).getEntity();
+
+    Assert.assertEquals(16, result.getProperties().size());
+    Assert.assertEquals(2, result.getNavigationBindings().size());
+    
+    Assert.assertEquals(edmInt16("32767"), result.getProperty("PropertyInt16").asPrimitive());
+    Assert.assertEquals("First Resource - positive values", result.getProperty("PropertyString").asPrimitive());
+    Assert.assertEquals(edmByte("255"), result.getProperty("PropertyByte").asPrimitive());
+    Assert.assertEquals(edmSByte("127"), result.getProperty("PropertySByte").asPrimitive());
+    Assert.assertEquals(edmInt32("2147483647"), result.getProperty("PropertyInt32").asPrimitive());
+    Assert.assertEquals(edmInt64("9223372036854775807"), result.getProperty("PropertyInt64").asPrimitive());
+    Assert.assertEquals(edmSingle("1.79E20"), result.getProperty("PropertySingle").asPrimitive());
+    Assert.assertEquals(edmDouble("-1.79E19"), result.getProperty("PropertyDouble").asPrimitive());
+    Assert.assertEquals(edmDecimal("34"), result.getProperty("PropertyDecimal").asPrimitive());
+//    Assert.assertEquals(edmBinary("ASNFZ4mrze8="), result.getProperty("PropertyBinary").asPrimitive());
+    Assert.assertEquals(edmDate("2012-12-03"), result.getProperty("PropertyDate").asPrimitive());
+    Assert.assertEquals(edmDateTimeOffset("2012-12-03T07:16:23Z"), result.getProperty("PropertyDateTimeOffset")
+        .asPrimitive());
+    Assert.assertEquals(edmDuration("PT6S"), result.getProperty("PropertyDuration")
+        .asPrimitive());
+    Assert.assertEquals(edmGUID("01234567-89ab-cdef-0123-456789abcdef"), result.getProperty("PropertyGuid")
+        .asPrimitive());
+    Assert.assertEquals(edmTimeOfDay("03:26:05"), result.getProperty("PropertyTimeOfDay").asPrimitive());
+  }  
+  
+  @Test
+  public void entityCompAllPrim() throws Exception {
+    final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESCompAllPrim");
+
+    String payload = "<?xml version='1.0' encoding='UTF-8'?>"
+        + "<atom:entry xmlns:atom=\"http://www.w3.org/2005/Atom\" "
+        + "xmlns:metadata=\"http://docs.oasis-open.org/odata/ns/metadata\" "
+        + "xmlns:data=\"http://docs.oasis-open.org/odata/ns/data\" "
+        + "metadata:etag=\"W/&quot;32767&quot;\">"
+          + "<atom:category scheme=\"http://docs.oasis-open.org/odata/ns/scheme\" "
+          + "term=\"#olingo.odata.test1.ETCompAllPrim\"/>"
+          + "<atom:content type=\"application/xml\">"
+            + "<metadata:properties>"
+              + "<data:PropertyInt16>32767</data:PropertyInt16>"
+              + "<data:PropertyComp metadata:type=\"#olingo.odata.test1.CTAllPrim\">"
+                + "<data:PropertyString>First Resource - first</data:PropertyString>"
+                + "<data:PropertyBinary>ASNFZ4mrze8=</data:PropertyBinary>"
+                + "<data:PropertyBoolean>true</data:PropertyBoolean>"
+                + "<data:PropertyByte>255</data:PropertyByte>"
+                + "<data:PropertyDate>2012-10-03</data:PropertyDate>"
+                + "<data:PropertyDateTimeOffset>2012-10-03T07:16:23.1234567Z</data:PropertyDateTimeOffset>"
+                + "<data:PropertyDecimal>34.27</data:PropertyDecimal>"
+                + "<data:PropertySingle>1.79E20</data:PropertySingle>"
+                + "<data:PropertyDouble>-1.79E19</data:PropertyDouble>"
+                + "<data:PropertyDuration>PT6S</data:PropertyDuration>"
+                + "<data:PropertyGuid>01234567-89ab-cdef-0123-456789abcdef</data:PropertyGuid>"
+                + "<data:PropertyInt16>32767</data:PropertyInt16>"
+                + "<data:PropertyInt32>2147483647</data:PropertyInt32>"
+                + "<data:PropertyInt64>9223372036854775807</data:PropertyInt64>"
+                + "<data:PropertySByte>127</data:PropertySByte>"
+                + "<data:PropertyTimeOfDay>01:00:01</data:PropertyTimeOfDay>"
+              + "</data:PropertyComp>"
+            + "</metadata:properties>"
+          + "</atom:content>"
+        + "</atom:entry>";
+    
+    Entity result = serializer.entity(new ByteArrayInputStream(payload.getBytes()), 
+        edmEntitySet.getEntityType()).getEntity();
+
+    Assert.assertEquals("olingo.odata.test1.ETCompAllPrim",result.getType());
+    
+    Assert.assertEquals(2, result.getProperties().size());
+    Assert.assertEquals(0, result.getNavigationLinks().size());
+
+    Assert.assertEquals(edmInt16("32767"), result.getProperty("PropertyInt16").asPrimitive());
+    
+    Assert.assertNotNull(result.getProperty("PropertyComp"));
+    Property comp = result.getProperty("PropertyComp");
+    Assert.assertEquals("olingo.odata.test1.CTAllPrim", comp.getType());
+    ComplexValue cv = (ComplexValue)comp.getValue();
+    
+    Assert.assertEquals(16, cv.getValue().size());
+    
+    Assert.assertEquals(edmInt16("32767"), getCVProperty(cv, "PropertyInt16").asPrimitive());
+    Assert.assertEquals("First Resource - first", getCVProperty(cv, "PropertyString").asPrimitive());
+    Assert.assertEquals(edmByte("255"), getCVProperty(cv, "PropertyByte").asPrimitive());
+    Assert.assertEquals(edmSByte("127"), getCVProperty(cv, "PropertySByte").asPrimitive());
+    Assert.assertEquals(edmInt32("2147483647"), getCVProperty(cv, "PropertyInt32").asPrimitive());
+    Assert.assertEquals(edmInt64("9223372036854775807"), getCVProperty(cv, "PropertyInt64").asPrimitive());
+  }  
+  
+  private Property getCVProperty(ComplexValue cv, String name) {
+    for (Property p:cv.getValue()) {
+      if (p.getName().equals(name)) {
+        return p;
+      }
+    }
+    return null;
+  }
+  
+  @Test
+  public void entityMixPrimCollComp() throws Exception {
+    final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESMixPrimCollComp");
+    final String payload = "<?xml version='1.0' encoding='UTF-8'?>\n" + 
+        "<atom:entry xmlns:atom=\"http://www.w3.org/2005/Atom\"\n" + 
+        "  xmlns:metadata=\"http://docs.oasis-open.org/odata/ns/metadata\"\n" + 
+        "  xmlns:data=\"http://docs.oasis-open.org/odata/ns/data\" \n" + 
+        "  metadata:metadata-etag=\"WmetadataETag\">\n" + 
+        "  <atom:category scheme=\"http://docs.oasis-open.org/odata/ns/scheme\"\n" + 
+        "    term=\"#olingo.odata.test1.ETMixPrimCollComp\" />\n" + 
+        "  <atom:content type=\"application/xml\">\n" + 
+        "    <metadata:properties>\n" + 
+        "      <data:PropertyInt16>32767</data:PropertyInt16>\n" + 
+        "      <data:CollPropertyString type=\"#Collection(String)\">\n" + 
+        "        <metadata:element>Employee1@company.example</metadata:element>\n" + 
+        "        <metadata:element>Employee2@company.example</metadata:element>\n" + 
+        "        <metadata:element>Employee3@company.example</metadata:element>\n" + 
+        "      </data:CollPropertyString>\n" + 
+        "      <data:PropertyComp metadata:type=\"#olingo.odata.test1.CTTwoPrim\">\n" + 
+        "        <data:PropertyInt16>111</data:PropertyInt16>\n" + 
+        "        <data:PropertyString>TEST A</data:PropertyString>\n" + 
+        "      </data:PropertyComp>\n" + 
+        "       <data:CollPropertyComp metadata:type=\"#Collection(olingo.odata.test1.CTTwoPrim)\">\n" + 
+        "          <metadata:element>\n" + 
+        "            <data:PropertyInt16>123</data:PropertyInt16>\n" + 
+        "            <data:PropertyString>TEST 1</data:PropertyString>\n" + 
+        "          </metadata:element>\n" + 
+        "          <metadata:element>\n" + 
+        "            <data:PropertyInt16>456</data:PropertyInt16>\n" + 
+        "            <data:PropertyString>TEST 2</data:PropertyString>\n" + 
+        "          </metadata:element>\n" + 
+        "          <metadata:element>\n" + 
+        "            <data:PropertyInt16>789</data:PropertyInt16>\n" + 
+        "            <data:PropertyString>TEST 3</data:PropertyString>\n" + 
+        "          </metadata:element>\n" + 
+        "        </data:CollPropertyComp>\n" + 
+        "    </metadata:properties>\n" + 
+        "  </atom:content>\n" + 
+        "</atom:entry>\n"; 
+
+    Entity result = serializer.entity(new ByteArrayInputStream(payload.getBytes()), 
+        edmEntitySet.getEntityType()).getEntity();
+
+    Assert.assertEquals(4, result.getProperties().size());
+    Assert.assertEquals(0, result.getNavigationLinks().size());
+
+    Assert.assertEquals(Arrays.asList("Employee1@company.example", "Employee2@company.example",
+        "Employee3@company.example"), result.getProperty("CollPropertyString").getValue());
+
+    Property comp = result.getProperty("PropertyComp");
+    Assert.assertEquals("olingo.odata.test1.CTTwoPrim", comp.getType());
+    ComplexValue cv = (ComplexValue)comp.getValue();
+    
+    Assert.assertEquals(2, cv.getValue().size());
+    Assert.assertEquals(edmInt16("111"), getCVProperty(cv, "PropertyInt16").asPrimitive());
+    Assert.assertEquals("TEST A", getCVProperty(cv, "PropertyString").asPrimitive());
+    
+    comp = result.getProperty("CollPropertyComp");
+    Assert.assertEquals("Collection(olingo.odata.test1.CTTwoPrim)", comp.getType());
+    List<ComplexValue> properties = (List<ComplexValue>)comp.getValue();
+    
+    Assert.assertEquals(3, properties.size());
+    
+    Assert.assertEquals(edmInt16("123"), getCVProperty(properties.get(0), "PropertyInt16")
+        .asPrimitive());
+    Assert.assertEquals("TEST 1", getCVProperty(properties.get(0), "PropertyString")
+        .asPrimitive());
+
+    Assert.assertEquals(edmInt16("789"), getCVProperty(properties.get(2), "PropertyInt16")
+        .asPrimitive());
+    Assert.assertEquals("TEST 3", getCVProperty(properties.get(2), "PropertyString")
+        .asPrimitive());    
+  }
+  
+  @Test
+  public void entityWithNavigation() throws Exception {
+    final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESTwoPrim");
+
+    final String payload  = "<?xml version='1.0' encoding='UTF-8'?>\n" + 
+        "<atom:entry xmlns:atom=\"http://www.w3.org/2005/Atom\"\n" + 
+        "  xmlns:metadata=\"http://docs.oasis-open.org/odata/ns/metadata\"\n" + 
+        "  xmlns:data=\"http://docs.oasis-open.org/odata/ns/data\">" + 
+        "  <atom:link\n" + 
+        "    rel=\"http://docs.oasis-open.org/odata/ns/related/NavPropertyETAllPrimOne\"\n" + 
+        "    type=\"application/atom+xml;type=entry\" title=\"NavPropertyETAllPrimOne\"\n" + 
+        "    href=\"id\">\n" + 
+        "    <metadata:inline>\n" + 
+        "      <atom:entry>\n" + 
+        "        <atom:link\n" + 
+        "          rel=\"http://docs.oasis-open.org/odata/ns/related/NavPropertyETTwoPrimMany\"\n" + 
+        "          type=\"application/atom+xml;type=feed\" title=\"NavPropertyETTwoPrimMany\"\n" + 
+        "          href=\"id\" />\n" + 
+        "        <atom:link\n" + 
+        "          rel=\"http://docs.oasis-open.org/odata/ns/related/NavPropertyETTwoPrimOne\"\n" + 
+        "          type=\"application/atom+xml;type=entry\" title=\"NavPropertyETTwoPrimOne\"\n" + 
+        "          href=\"id\" />\n" + 
+        "        <atom:category scheme=\"http://docs.oasis-open.org/odata/ns/scheme\"\n" + 
+        "          term=\"#olingo.odata.test1.ETAllPrim\" />\n" + 
+        "        <atom:content type=\"application/xml\">\n" + 
+        "          <metadata:properties>\n" + 
+        "            <data:PropertyDate>2012-12-03</data:PropertyDate>\n" + 
+        "          </metadata:properties>\n" + 
+        "        </atom:content>\n" + 
+        "      </atom:entry>\n" + 
+        "    </metadata:inline>\n" + 
+        "  </atom:link>\n" + 
+        "  <atom:category scheme=\"http://docs.oasis-open.org/odata/ns/scheme\"\n" + 
+        "    term=\"#olingo.odata.test1.ETTwoPrim\" />\n" + 
+        "  <atom:content type=\"application/xml\">\n" + 
+        "    <metadata:properties>\n" + 
+        "      <data:PropertyInt16>32767</data:PropertyInt16>\n" + 
+        "      <data:PropertyString>Test String4</data:PropertyString>\n" + 
+        "    </metadata:properties>\n" + 
+        "  </atom:content>\n" + 
+        "</atom:entry>\n" + 
+        "";
+    
+    Entity result = serializer.entity(new ByteArrayInputStream(payload.getBytes()), 
+        edmEntitySet.getEntityType()).getEntity();
+
+    Assert.assertEquals(2, result.getProperties().size());
+    Assert.assertEquals(1, result.getNavigationLinks().size());
+    
+    Assert.assertEquals(edmInt16("32767"), result.getProperty("PropertyInt16").asPrimitive());
+    Assert.assertEquals("Test String4", result.getProperty("PropertyString").asPrimitive());    
+    
+    Assert.assertEquals(1, result.getNavigationLinks().size());
+    Link navLink = result.getNavigationLinks().get(0);
+    Assert.assertEquals("http://docs.oasis-open.org/odata/ns/related/NavPropertyETAllPrimOne", navLink.getRel());
+    Assert.assertEquals("id", navLink.getBindingLink());
+    Assert.assertEquals("NavPropertyETAllPrimOne", navLink.getTitle());
+    
+    Entity inline = navLink.getInlineEntity();
+    Assert.assertEquals(1, inline.getProperties().size());
+    Assert.assertEquals(2, inline.getNavigationBindings().size());
+    Assert.assertEquals(edmDate("2012-12-03"), inline.getProperty("PropertyDate").asPrimitive());
+  } 
+  
+  @Test
+  public void primitiveProperty() throws Exception {
+    final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim");
+    final EdmProperty edmProperty = (EdmProperty) edmEntitySet.getEntityType().getProperty("PropertyInt16");
+   
+    String payload = "<?xml version='1.0' encoding='UTF-8'?>"
+        + "<metadata:value xmlns:metadata=\"http://docs.oasis-open.org/odata/ns/metadata\">"
+        + "234</metadata:value>";
+
+    Property result = serializer.property(new ByteArrayInputStream(payload.getBytes()), edmProperty).getProperty();    
+    Assert.assertEquals(edmInt16("234"), result.getValue()); 
+  }
+
+  @Test
+  public void primitivePropertyNull() throws Exception {
+    final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim");
+    final EdmProperty edmProperty = (EdmProperty) edmEntitySet.getEntityType().getProperty("PropertyString");
+    String payload = "<?xml version='1.0' encoding='UTF-8'?>"
+        + "<metadata:value xmlns:metadata=\"http://docs.oasis-open.org/odata/ns/metadata\" "
+        + "metadata:null=\"true\"/>";
+
+    Property result = serializer.property(new ByteArrayInputStream(payload.getBytes()), edmProperty).getProperty();    
+    Assert.assertNull(result.getValue());    
+  }
+  
+  @Test
+  public void primitiveCollectionProperty() throws Exception {
+    final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESCollAllPrim");
+    final EdmProperty edmProperty = (EdmProperty) edmEntitySet.getEntityType().getProperty("CollPropertyString");
+    String payload = "<?xml version='1.0' encoding='UTF-8'?>"
+        + "<metadata:value xmlns:metadata=\"http://docs.oasis-open.org/odata/ns/metadata\"> "
+        + "<metadata:element>Employee1@company.example</metadata:element>"
+        + "<metadata:element>Employee2@company.example</metadata:element>"
+        + "<metadata:element>Employee3@company.example</metadata:element>"
+        + "</metadata:value>";
+    Property result = serializer.property(new ByteArrayInputStream(payload.getBytes()), edmProperty).getProperty();    
+    Assert.assertEquals(Arrays.asList("Employee1@company.example", "Employee2@company.example",
+        "Employee3@company.example"), result.getValue());
+    
+  }
+  
+  @Test
+  public void complexProperty() throws Exception {
+    Edm edm = Mockito.mock(Edm.class);
+
+    CsdlProperty street = new CsdlProperty().setName("Street")
+        .setType(EdmPrimitiveTypeKind.String.getFullQualifiedName());
+    CsdlProperty city = new CsdlProperty().setName("City")
+        .setType(EdmPrimitiveTypeKind.String.getFullQualifiedName());
+    CsdlProperty region = new CsdlProperty().setName("Region")
+        .setType(EdmPrimitiveTypeKind.String.getFullQualifiedName());
+    CsdlProperty postalcode = new CsdlProperty().setName("PostalCode")
+        .setType(EdmPrimitiveTypeKind.Int64.getFullQualifiedName());
+    
+    CsdlComplexType ct = new CsdlComplexType()
+        .setName("Model.Address")
+        .setProperties(Arrays.asList(street, city, region, postalcode));
+    EdmComplexTypeImpl complexType = new EdmComplexTypeImpl(edm, new FullQualifiedName("Model.Address"), ct);
+    
+    Mockito.stub(edm.getComplexType(new FullQualifiedName("Model.Address"))).toReturn(complexType);
+    
+    CsdlProperty prop = new CsdlProperty();
+    prop.setName("ShipTo");
+    prop.setType(new FullQualifiedName("Model.Address"));
+    EdmPropertyImpl edmProperty = new EdmPropertyImpl(edm, null, prop);
+
+    String payload = "<data:ShipTo xmlns:data=\"http://docs.oasis-open.org/odata/ns/data\" " +
+        " xmlns:metadata=\"http://docs.oasis-open.org/odata/ns/metadata\"\n" +
+        " metadata:type=\"#Model.Address\">\n" + 
+        "  <data:Street>Obere Str. 57</data:Street>\n" + 
+        "  <data:City>Berlin</data:City>\n" + 
+        "  <data:Region metadata:null=\"true\"/>\n" + 
+        "  <data:PostalCode>12209</data:PostalCode>\n" + 
+        "</data:ShipTo>";
+    
+    Property result = serializer.property(new ByteArrayInputStream(payload.getBytes()), edmProperty).getProperty();    
+
+    Assert.assertEquals("ShipTo", result.getName());
+    Assert.assertTrue(result.getValue() instanceof ComplexValue);
+    ComplexValue cv = (ComplexValue)result.getValue();
+    Assert.assertEquals("Model.Address", result.getType());
+    Assert.assertEquals("Berlin", getCVProperty(cv, "City").asPrimitive());
+    Assert.assertEquals("Obere Str. 57", getCVProperty(cv, "Street").asPrimitive());    
+  }
+  
+  @Test
+  public void complexCollectionProperty() throws Exception {
+    final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESMixPrimCollComp");
+    final EdmProperty edmProperty = (EdmProperty) edmEntitySet.getEntityType().getProperty("CollPropertyComp");
+    String payload = "<metadata:value xmlns:metadata=\"http://docs.oasis-open.org/odata/ns/metadata\"\n" + 
+        "xmlns:data=\"http://docs.oasis-open.org/odata/ns/data\" "
+        + "metadata:type=\"#Collection(olingo.odata.test1.CTTwoPrim)\">\n"+ 
+        "  <metadata:element>\n" + 
+        "    <data:PropertyInt16>123</data:PropertyInt16>\n" + 
+        "    <data:PropertyString>TEST 1</data:PropertyString>\n" + 
+        "  </metadata:element>\n" + 
+        "  <metadata:element>\n" + 
+        "    <data:PropertyInt16>456</data:PropertyInt16>\n" + 
+        "    <data:PropertyString>TEST 2</data:PropertyString>\n" + 
+        "  </metadata:element>\n" + 
+        "  <metadata:element>\n" + 
+        "    <data:PropertyInt16>789</data:PropertyInt16>\n" + 
+        "    <data:PropertyString>TEST 3</data:PropertyString>\n" + 
+        "  </metadata:element>\n" + 
+        "</metadata:value>";
+    Property result = serializer.property(new ByteArrayInputStream(payload.getBytes()), edmProperty).getProperty();    
+
+    List<ComplexValue> complex = (List<ComplexValue>)result.getValue();
+    
+    Assert.assertEquals(3, complex.size());
+    Assert.assertEquals("Collection(olingo.odata.test1.CTTwoPrim)", result.getType());
+    Assert.assertEquals(edmInt16("123"), getCVProperty(complex.get(0), "PropertyInt16").asPrimitive());
+    Assert.assertEquals("TEST 1", getCVProperty(complex.get(0), "PropertyString").asPrimitive());
+    Assert.assertEquals(edmInt16("789"), getCVProperty(complex.get(2), "PropertyInt16").asPrimitive());
+    Assert.assertEquals("TEST 3", getCVProperty(complex.get(2), "PropertyString").asPrimitive());
+  }
+  
+  @Test
+  public void entityReference() throws Exception {
+    String payload = "<metadata:ref xmlns:metadata=\"http://docs.oasis-open.org/odata/ns/metadata\"\n" + 
+        "              metadata:context=\"http://host/service/$metadata#$ref\"\n" + 
+        "              xmlns=\"http://www.w3.org/2005/Atom\" "+
+        "              id=\"http://host/service/Orders(10643)\" />";
+    
+    List<URI> result = serializer.entityReferences(new ByteArrayInputStream(payload.getBytes()))
+        .getEntityReferences();    
+    Assert.assertEquals(1, result.size());
+    Assert.assertEquals("http://host/service/Orders(10643)", result.get(0).toASCIIString());
+  }
+  
+  @Test
+  public void entityReferences() throws Exception {
+    String payload = "<feed xmlns=\"http://www.w3.org/2005/Atom\"\n" + 
+        "      xmlns:metadata=\"http://docs.oasis-open.org/odata/ns/metadata\"\n" + 
+        "      metadata:context=\"http://host/service/$metadata#Collection($ref)\" >\n" + 
+        "  <metadata:ref id=\"http://host/service/Orders(10643)\" />\n" + 
+        "  <metadata:ref id=\"http://host/service/Orders(10759)\" />\n" + 
+        "</feed>";
+    
+    List<URI> result = serializer.entityReferences(new ByteArrayInputStream(payload.getBytes()))
+        .getEntityReferences();    
+    Assert.assertEquals(2, result.size());
+    Assert.assertEquals("http://host/service/Orders(10643)", result.get(0).toASCIIString());
+    Assert.assertEquals("http://host/service/Orders(10759)", result.get(1).toASCIIString());
+  }  
+}