You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by il...@apache.org on 2014/03/29 16:58:49 UTC

[2/9] git commit: [OLINGO-200] Introducing interfaces for domain object

[OLINGO-200] Introducing interfaces for domain object


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

Branch: refs/heads/olingo200
Commit: ceda474058f1f7c369ee6f4b52157ee7464aa16c
Parents: e0d1b6f
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Sat Mar 29 14:48:17 2014 +0100
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Sat Mar 29 14:48:17 2014 +0100

----------------------------------------------------------------------
 .../olingo/client/api/CommonODataClient.java    |   3 -
 .../olingo/client/core/AbstractODataClient.java |   8 +-
 .../client/core/op/AbstractODataBinder.java     |  17 +-
 .../client/core/op/AbstractODataReader.java     |   4 +-
 .../client/core/it/AbstractTestITCase.java      |  35 +-
 .../client/core/it/v3/AsyncTestITCase.java      |   2 +-
 .../core/it/v3/EntityCreateTestITCase.java      |  22 +-
 .../core/it/v3/EntityUpdateTestITCase.java      |   2 +-
 .../it/v3/NavigationLinkCreateTestITCase.java   |  43 ++-
 .../client/core/it/v3/OpenTypeTestITCase.java   |  65 ++--
 .../client/core/it/v3/PropertyTestITCase.java   |  10 +-
 .../client/core/v3/PrimitiveValueTest.java      |  62 ++--
 .../olingo/client/core/v3/PropertyTest.java     |  10 +-
 .../client/core/v4/PrimitiveValueTest.java      |   4 +-
 .../commons/api/domain/AbstractODataValue.java  |  14 +
 .../api/domain/ODataCollectionValue.java        |  64 +---
 .../commons/api/domain/ODataComplexValue.java   |  59 +--
 .../olingo/commons/api/domain/ODataEntity.java  | 240 +++---------
 .../commons/api/domain/ODataEntitySet.java      |  81 +---
 .../commons/api/domain/ODataObjectFactory.java  |  11 +-
 .../commons/api/domain/ODataProperty.java       | 104 +-----
 .../olingo/commons/api/domain/ODataValue.java   |   7 +
 .../core/domain/ODataCollectionValueImpl.java   |  90 +++++
 .../core/domain/ODataComplexValueImpl.java      |  89 +++++
 .../commons/core/domain/ODataEntityImpl.java    | 372 +++++++++++++++++++
 .../commons/core/domain/ODataEntitySetImpl.java | 104 ++++++
 .../core/domain/ODataObjectFactoryImpl.java     | 171 +++++++++
 .../core/domain/ODataPrimitiveValueImpl.java    |   9 +
 .../commons/core/domain/ODataPropertyImpl.java  | 172 +++++++++
 .../commons/core/op/ODataObjectFactoryImpl.java | 156 --------
 30 files changed, 1269 insertions(+), 761 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonODataClient.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonODataClient.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonODataClient.java
index e811744..af904b3 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonODataClient.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonODataClient.java
@@ -26,7 +26,6 @@ import org.apache.olingo.client.api.communication.request.retrieve.CommonRetriev
 import org.apache.olingo.client.api.communication.request.streamed.CommonStreamedRequestFactory;
 import org.apache.olingo.client.api.op.ClientODataDeserializer;
 import org.apache.olingo.commons.api.domain.ODataObjectFactory;
-import org.apache.olingo.commons.api.domain.ODataPrimitiveValue;
 import org.apache.olingo.client.api.op.CommonODataBinder;
 import org.apache.olingo.client.api.op.CommonODataReader;
 import org.apache.olingo.commons.api.op.ODataSerializer;
@@ -47,8 +46,6 @@ public interface CommonODataClient {
 
   CommonFilterFactory getFilterFactory();
 
-  ODataPrimitiveValue.Builder getPrimitiveValueBuilder();
-
   ODataSerializer getSerializer();
 
   ClientODataDeserializer getDeserializer();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/client-core/src/main/java/org/apache/olingo/client/core/AbstractODataClient.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/AbstractODataClient.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/AbstractODataClient.java
index 80c8d16..405f95d 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/AbstractODataClient.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/AbstractODataClient.java
@@ -21,8 +21,7 @@ package org.apache.olingo.client.core;
 import org.apache.olingo.client.api.CommonODataClient;
 import org.apache.olingo.commons.api.domain.ODataObjectFactory;
 import org.apache.olingo.client.api.op.ODataWriter;
-import org.apache.olingo.commons.core.domain.ODataPrimitiveValueImpl;
-import org.apache.olingo.commons.core.op.ODataObjectFactoryImpl;
+import org.apache.olingo.commons.core.domain.ODataObjectFactoryImpl;
 import org.apache.olingo.client.core.op.ODataWriterImpl;
 
 public abstract class AbstractODataClient implements CommonODataClient {
@@ -34,11 +33,6 @@ public abstract class AbstractODataClient implements CommonODataClient {
   private final ODataObjectFactory objectFactory = new ODataObjectFactoryImpl(getServiceVersion());
 
   @Override
-  public ODataPrimitiveValueImpl.BuilderImpl getPrimitiveValueBuilder() {
-    return new ODataPrimitiveValueImpl.BuilderImpl(this.getServiceVersion());
-  }
-
-  @Override
   public ODataWriter getWriter() {
     return writer;
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataBinder.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataBinder.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataBinder.java
index 36ff32b..2a0ea4f 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataBinder.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataBinder.java
@@ -42,6 +42,7 @@ import org.apache.olingo.commons.api.domain.ODataInlineEntitySet;
 import org.apache.olingo.commons.api.domain.ODataLink;
 import org.apache.olingo.commons.api.domain.ODataOperation;
 import org.apache.olingo.commons.api.domain.ODataProperty;
+import org.apache.olingo.commons.core.domain.ODataPropertyImpl;
 import org.apache.olingo.commons.api.domain.ODataServiceDocument;
 import org.apache.olingo.commons.api.domain.ODataValue;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
@@ -220,9 +221,9 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
       if (property.hasPrimitiveValue()) {
         propertyResource.setType(property.getPrimitiveValue().getType().toString());
       } else if (property.hasComplexValue()) {
-        propertyResource.setType(property.getComplexValue().getType());
+        propertyResource.setType(property.getComplexValue().getTypeName());
       } else if (property.hasCollectionValue()) {
-        propertyResource.setType(property.getCollectionValue().getType());
+        propertyResource.setType(property.getCollectionValue().getTypeName());
       }
     }
 
@@ -284,7 +285,7 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
     }
 
     for (Entry entryResource : resource.getEntries()) {
-      entitySet.addEntity(getODataEntity(entryResource));
+      entitySet.getEntities().add(getODataEntity(entryResource));
     }
 
     return entitySet;
@@ -369,20 +370,20 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
 
   @Override
   public ODataProperty getODataProperty(final Property property) {
-    return new ODataProperty(property.getName(), getODataValue(property));
+    return new ODataPropertyImpl(property.getName(), getODataValue(property));
   }
 
   private ODataValue getODataValue(final Property resource) {
     ODataValue value = null;
 
     if (resource.getValue().isPrimitive()) {
-      value = client.getPrimitiveValueBuilder().
+      value = client.getObjectFactory().newPrimitiveValueBuilder().
               setText(resource.getValue().asPrimitive().get()).
               setType(resource.getType() == null
                       ? null
                       : EdmPrimitiveTypeKind.valueOfFQN(client.getServiceVersion(), resource.getType())).build();
     } else if (resource.getValue().isGeospatial()) {
-      value = client.getPrimitiveValueBuilder().
+      value = client.getObjectFactory().newPrimitiveValueBuilder().
               setValue(resource.getValue().asGeospatial().get()).
               setType(resource.getType() == null
                       || EdmPrimitiveTypeKind.Geography.getFullQualifiedName().toString().equals(resource.getType())
@@ -390,13 +391,13 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
                       ? resource.getValue().asGeospatial().get().getEdmPrimitiveTypeKind()
                       : EdmPrimitiveTypeKind.valueOfFQN(client.getServiceVersion(), resource.getType())).build();
     } else if (resource.getValue().isComplex()) {
-      value = new ODataComplexValue(resource.getType());
+      value = client.getObjectFactory().newComplexValue(resource.getType());
 
       for (Property property : resource.getValue().asComplex().get()) {
         value.asComplex().add(getODataProperty(property));
       }
     } else if (resource.getValue().isCollection()) {
-      value = new ODataCollectionValue(resource.getType());
+      value = client.getObjectFactory().newCollectionValue(resource.getType());
 
       for (Value _value : resource.getValue().asCollection().get()) {
         final JSONPropertyImpl fake = new JSONPropertyImpl();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataReader.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataReader.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataReader.java
index ffc58e1..f21f16a 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataReader.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/op/AbstractODataReader.java
@@ -126,9 +126,9 @@ public abstract class AbstractODataReader implements CommonODataReader {
                 container.getMetadataETag(),
                 (T) client.getBinder().getODataProperty(container.getObject()));
       } else if (ODataValue.class.isAssignableFrom(reference)) {
-        res = new Container<T>(null, null, (T) client.getPrimitiveValueBuilder().
+        res = new Container<T>(null, null, (T) client.getObjectFactory().newPrimitiveValueBuilder().
                 setType(ODataValueFormat.fromString(format) == ODataValueFormat.TEXT
-                ? EdmPrimitiveTypeKind.String : EdmPrimitiveTypeKind.Stream).
+                        ? EdmPrimitiveTypeKind.String : EdmPrimitiveTypeKind.Stream).
                 setText(IOUtils.toString(src)).
                 build());
       } else if (XMLMetadata.class.isAssignableFrom(reference)) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/client-core/src/test/java/org/apache/olingo/client/core/it/AbstractTestITCase.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/AbstractTestITCase.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/AbstractTestITCase.java
index 73e6f2b..bba68de 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/AbstractTestITCase.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/AbstractTestITCase.java
@@ -213,8 +213,8 @@ public abstract class AbstractTestITCase {
     entity.setMediaEntity(true);
 
     entity.getProperties().add(getClient().getObjectFactory().newPrimitiveProperty("Information",
-            getClient().getPrimitiveValueBuilder().setText(sampleinfo).setType(
-            EdmPrimitiveTypeKind.String).build()));
+            getClient().getObjectFactory().newPrimitiveValueBuilder().setText(sampleinfo).setType(
+                    EdmPrimitiveTypeKind.String).build()));
 
     return entity;
   }
@@ -227,45 +227,48 @@ public abstract class AbstractTestITCase {
 
     // add name attribute
     entity.getProperties().add(getClient().getObjectFactory().newPrimitiveProperty("Name",
-            getClient().getPrimitiveValueBuilder().setText(sampleName).setType(
-            EdmPrimitiveTypeKind.String).build()));
+            getClient().getObjectFactory().newPrimitiveValueBuilder().setText(sampleName).setType(
+                    EdmPrimitiveTypeKind.String).build()));
 
     // add key attribute
     entity.getProperties().add(getClient().getObjectFactory().newPrimitiveProperty("CustomerId",
-            getClient().getPrimitiveValueBuilder().setText(String.valueOf(id)).setType(
-            EdmPrimitiveTypeKind.Int32).build()));
+            getClient().getObjectFactory().newPrimitiveValueBuilder().setText(String.valueOf(id)).setType(
+                    EdmPrimitiveTypeKind.Int32).build()));
 
     // add BackupContactInfo attribute (collection)
-    final ODataCollectionValue backupContactInfoValue = new ODataCollectionValue(
+    final ODataCollectionValue backupContactInfoValue = getClient().getObjectFactory().newCollectionValue(
             "Collection(Microsoft.Test.OData.Services.AstoriaDefaultService.ContactDetails)");
     entity.getProperties().add(getClient().getObjectFactory().newCollectionProperty("BackupContactInfo",
             backupContactInfoValue));
 
     // add BackupContactInfo.ContactDetails attribute (complex)
-    final ODataComplexValue contactDetails = new ODataComplexValue(
+    final ODataComplexValue contactDetails = getClient().getObjectFactory().newComplexValue(
             "Microsoft.Test.OData.Services.AstoriaDefaultService.ContactDetails");
     backupContactInfoValue.add(contactDetails);
 
     // add BackupContactInfo.ContactDetails.AlternativeNames attribute (collection)
-    final ODataCollectionValue altNamesValue = new ODataCollectionValue("Collection(Edm.String)");
-    altNamesValue.add(getClient().getPrimitiveValueBuilder().
+    final ODataCollectionValue altNamesValue = getClient().getObjectFactory().
+            newCollectionValue("Collection(Edm.String)");
+    altNamesValue.add(getClient().getObjectFactory().newPrimitiveValueBuilder().
             setText("myname").setType(EdmPrimitiveTypeKind.String).build());
     contactDetails.add(getClient().getObjectFactory().newCollectionProperty("AlternativeNames", altNamesValue));
 
     // add BackupContactInfo.ContactDetails.EmailBag attribute (collection)
-    final ODataCollectionValue emailBagValue = new ODataCollectionValue("Collection(Edm.String)");
-    emailBagValue.add(getClient().getPrimitiveValueBuilder().
+    final ODataCollectionValue emailBagValue = getClient().getObjectFactory().
+            newCollectionValue("Collection(Edm.String)");
+    emailBagValue.add(getClient().getObjectFactory().newPrimitiveValueBuilder().
             setText("myname@mydomain.com").setType(EdmPrimitiveTypeKind.String).build());
     contactDetails.add(getClient().getObjectFactory().newCollectionProperty("EmailBag", emailBagValue));
 
     // add BackupContactInfo.ContactDetails.ContactAlias attribute (complex)
-    final ODataComplexValue contactAliasValue = new ODataComplexValue(
+    final ODataComplexValue contactAliasValue = getClient().getObjectFactory().newComplexValue(
             "Microsoft.Test.OData.Services.AstoriaDefaultService.Aliases");
     contactDetails.add(getClient().getObjectFactory().newComplexProperty("ContactAlias", contactAliasValue));
 
     // add BackupContactInfo.ContactDetails.ContactAlias.AlternativeNames attribute (collection)
-    final ODataCollectionValue aliasAltNamesValue = new ODataCollectionValue("Collection(Edm.String)");
-    aliasAltNamesValue.add(getClient().getPrimitiveValueBuilder().
+    final ODataCollectionValue aliasAltNamesValue = getClient().getObjectFactory().
+            newCollectionValue("Collection(Edm.String)");
+    aliasAltNamesValue.add(getClient().getObjectFactory().newPrimitiveValueBuilder().
             setText("myAlternativeName").setType(EdmPrimitiveTypeKind.String).build());
     contactAliasValue.add(getClient().getObjectFactory().newCollectionProperty("AlternativeNames", aliasAltNamesValue));
 
@@ -511,7 +514,7 @@ public abstract class AbstractTestITCase {
     assertNotEquals(newm, oldm);
 
     changes.getProperties().add(getClient().getObjectFactory().newPrimitiveProperty(propertyName,
-            getClient().getPrimitiveValueBuilder().setText(newm).build()));
+            getClient().getObjectFactory().newPrimitiveValueBuilder().setText(newm).build()));
 
     update(type, changes, format, etag);
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/AsyncTestITCase.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/AsyncTestITCase.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/AsyncTestITCase.java
index 8b7fa01..b77ebf8 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/AsyncTestITCase.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/AsyncTestITCase.java
@@ -75,7 +75,7 @@ public class AsyncTestITCase extends AbstractTestITCase {
 
     entity.getProperties().remove(entity.getProperty("Description"));
     entity.getProperties().add(client.getObjectFactory().newPrimitiveProperty("Description",
-            client.getPrimitiveValueBuilder().setText("AsyncTest#updateEntity").build()));
+            client.getObjectFactory().newPrimitiveValueBuilder().setText("AsyncTest#updateEntity").build()));
 
     final ODataEntityUpdateRequest updateReq =
             client.getCUDRequestFactory().getEntityUpdateRequest(uri, UpdateType.MERGE, entity);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/EntityCreateTestITCase.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/EntityCreateTestITCase.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/EntityCreateTestITCase.java
index 6e4484c..1ebe190 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/EntityCreateTestITCase.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/EntityCreateTestITCase.java
@@ -291,10 +291,10 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
               client.getObjectFactory().newEntity("Microsoft.Test.OData.Services.AstoriaDefaultService.Order");
 
       order.getProperties().add(client.getObjectFactory().newPrimitiveProperty("OrderId",
-              client.getPrimitiveValueBuilder().setValue(key).setType(EdmPrimitiveTypeKind.Int32)
+              client.getObjectFactory().newPrimitiveValueBuilder().setValue(key).setType(EdmPrimitiveTypeKind.Int32)
               .build()));
       order.getProperties().add(client.getObjectFactory().newPrimitiveProperty("CustomerId",
-              client.getPrimitiveValueBuilder().setValue(id).setType(EdmPrimitiveTypeKind.Int32)
+              client.getObjectFactory().newPrimitiveValueBuilder().setValue(id).setType(EdmPrimitiveTypeKind.Int32)
               .build()));
 
       final ODataEntityCreateRequest createReq = client.getCUDRequestFactory().getEntityCreateRequest(
@@ -388,9 +388,11 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
     ODataEntity order = client.getObjectFactory().newEntity(
             "Microsoft.Test.OData.Services.AstoriaDefaultService.Order");
     order.getProperties().add(client.getObjectFactory().newPrimitiveProperty("CustomerId",
-            client.getPrimitiveValueBuilder().setValue(id).setType(EdmPrimitiveTypeKind.Int32).build()));
+            client.getObjectFactory().newPrimitiveValueBuilder().setValue(id).
+            setType(EdmPrimitiveTypeKind.Int32).build()));
     order.getProperties().add(client.getObjectFactory().newPrimitiveProperty("OrderId",
-            client.getPrimitiveValueBuilder().setValue(id).setType(EdmPrimitiveTypeKind.Int32).build()));
+            client.getObjectFactory().newPrimitiveValueBuilder().setValue(id).
+            setType(EdmPrimitiveTypeKind.Int32).build()));
 
     order.addLink(client.getObjectFactory().newEntityNavigationLink(
             "Customer", URIUtils.getURI(getServiceRoot(), customer.getEditLink().toASCIIString())));
@@ -446,22 +448,22 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
             "Microsoft.Test.OData.Services.AstoriaDefaultService.Message");
 
     message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("MessageId",
-            client.getPrimitiveValueBuilder().setValue(1000).
+            client.getObjectFactory().newPrimitiveValueBuilder().setValue(1000).
             setType(EdmPrimitiveTypeKind.Int32).build()));
     message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("FromUsername",
-            client.getPrimitiveValueBuilder().setValue("1").
+            client.getObjectFactory().newPrimitiveValueBuilder().setValue("1").
             setType(EdmPrimitiveTypeKind.String).build()));
     message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("ToUsername",
-            client.getPrimitiveValueBuilder().setValue("xlodhxzzusxecbzptxlfxprneoxkn").
+            client.getObjectFactory().newPrimitiveValueBuilder().setValue("xlodhxzzusxecbzptxlfxprneoxkn").
             setType(EdmPrimitiveTypeKind.String).build()));
     message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("Subject",
-            client.getPrimitiveValueBuilder().setValue("Test subject").
+            client.getObjectFactory().newPrimitiveValueBuilder().setValue("Test subject").
             setType(EdmPrimitiveTypeKind.String).build()));
     message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("Body",
-            client.getPrimitiveValueBuilder().setValue("Test body").
+            client.getObjectFactory().newPrimitiveValueBuilder().setValue("Test body").
             setType(EdmPrimitiveTypeKind.String).build()));
     message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("IsRead",
-            client.getPrimitiveValueBuilder().setValue(false).
+            client.getObjectFactory().newPrimitiveValueBuilder().setValue(false).
             setType(EdmPrimitiveTypeKind.Boolean).build()));
 
     final CommonURIBuilder<?> builder =

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/EntityUpdateTestITCase.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/EntityUpdateTestITCase.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/EntityUpdateTestITCase.java
index 40afeac..fed9ba4 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/EntityUpdateTestITCase.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/EntityUpdateTestITCase.java
@@ -186,7 +186,7 @@ public class EntityUpdateTestITCase extends AbstractTestITCase {
     final boolean before = message.getProperty("IsRead").getPrimitiveValue().toCastValue(Boolean.class);
     message.getProperties().remove(message.getProperty("IsRead"));
     message.getProperties().add(client.getObjectFactory().newPrimitiveProperty("IsRead",
-            client.getPrimitiveValueBuilder().setValue(!before).
+            client.getObjectFactory().newPrimitiveValueBuilder().setValue(!before).
             setType(EdmPrimitiveTypeKind.Boolean).build()));
 
     return client.getCUDRequestFactory().getEntityUpdateRequest(UpdateType.MERGE, message);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/NavigationLinkCreateTestITCase.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/NavigationLinkCreateTestITCase.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/NavigationLinkCreateTestITCase.java
index b1e385d..5cc8770 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/NavigationLinkCreateTestITCase.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/NavigationLinkCreateTestITCase.java
@@ -210,9 +210,11 @@ public class NavigationLinkCreateTestITCase extends AbstractTestITCase {
                 client.getObjectFactory().newEntity("Microsoft.Test.OData.Services.AstoriaDefaultService.Order");
 
         orderEntity.getProperties().add(client.getObjectFactory().newPrimitiveProperty("OrderId",
-                client.getPrimitiveValueBuilder().setValue(key).setType(EdmPrimitiveTypeKind.Int32).build()));
+                client.getObjectFactory().newPrimitiveValueBuilder().setValue(key).
+                setType(EdmPrimitiveTypeKind.Int32).build()));
         orderEntity.getProperties().add(client.getObjectFactory().newPrimitiveProperty("CustomerId",
-                client.getPrimitiveValueBuilder().setValue(id).setType(EdmPrimitiveTypeKind.Int32).build()));
+                client.getObjectFactory().newPrimitiveValueBuilder().setValue(id).
+                setType(EdmPrimitiveTypeKind.Int32).build()));
 
         final ODataEntityCreateRequest createReq = client.getCUDRequestFactory().getEntityCreateRequest(
                 client.getURIBuilder(testStaticServiceRootURL).appendEntitySetSegment("Order").build(),
@@ -268,48 +270,50 @@ public class NavigationLinkCreateTestITCase extends AbstractTestITCase {
 
     // add name attribute
     entity.getProperties().add(client.getObjectFactory().newPrimitiveProperty("Name",
-            client.getPrimitiveValueBuilder().setText(name).setType(EdmPrimitiveTypeKind.String).build()));
+            client.getObjectFactory().newPrimitiveValueBuilder().setText(name).
+            setType(EdmPrimitiveTypeKind.String).build()));
 
     // add key attribute
     if (id != 0) {
       entity.getProperties().add(client.getObjectFactory().newPrimitiveProperty("CustomerId",
-              client.getPrimitiveValueBuilder().setText(String.valueOf(id)).
+              client.getObjectFactory().newPrimitiveValueBuilder().setText(String.valueOf(id)).
               setType(EdmPrimitiveTypeKind.Int32).build()));
     }
-    final ODataCollectionValue backupContactInfoValue = new ODataCollectionValue(
+    final ODataCollectionValue backupContactInfoValue = getClient().getObjectFactory().newCollectionValue(
             "Collection(Microsoft.Test.OData.Services.AstoriaDefaultService.ContactDetails)");
 
-
-    final ODataComplexValue contactDetails = new ODataComplexValue(
+    final ODataComplexValue contactDetails = getClient().getObjectFactory().newComplexValue(
             "Microsoft.Test.OData.Services.AstoriaDefaultService.ContactDetails");
 
-
-    final ODataCollectionValue altNamesValue = new ODataCollectionValue("Collection(Edm.String)");
-    altNamesValue.add(client.getPrimitiveValueBuilder().
+    final ODataCollectionValue altNamesValue = getClient().getObjectFactory().
+            newCollectionValue("Collection(Edm.String)");
+    altNamesValue.add(client.getObjectFactory().newPrimitiveValueBuilder().
             setText("My Alternative name").setType(EdmPrimitiveTypeKind.String).build());
     contactDetails.add(client.getObjectFactory().newCollectionProperty("AlternativeNames", altNamesValue));
 
-    final ODataCollectionValue emailBagValue = new ODataCollectionValue("Collection(Edm.String)");
-    emailBagValue.add(client.getPrimitiveValueBuilder().
+    final ODataCollectionValue emailBagValue = getClient().getObjectFactory().
+            newCollectionValue("Collection(Edm.String)");
+    emailBagValue.add(client.getObjectFactory().newPrimitiveValueBuilder().
             setText("altname@mydomain.com").setType(EdmPrimitiveTypeKind.String).build());
     contactDetails.add(client.getObjectFactory().newCollectionProperty("EmailBag", emailBagValue));
 
-    final ODataComplexValue contactAliasValue = new ODataComplexValue(
+    final ODataComplexValue contactAliasValue = getClient().getObjectFactory().newComplexValue(
             "Microsoft.Test.OData.Services.AstoriaDefaultService.Aliases");
     contactDetails.add(client.getObjectFactory().newComplexProperty("ContactAlias", contactAliasValue));
 
-    final ODataCollectionValue aliasAltNamesValue = new ODataCollectionValue("Collection(Edm.String)");
-    aliasAltNamesValue.add(client.getPrimitiveValueBuilder().
+    final ODataCollectionValue aliasAltNamesValue = getClient().getObjectFactory().
+            newCollectionValue("Collection(Edm.String)");
+    aliasAltNamesValue.add(client.getObjectFactory().newPrimitiveValueBuilder().
             setText("myAlternativeName").setType(EdmPrimitiveTypeKind.String).build());
     contactAliasValue.add(client.getObjectFactory().newCollectionProperty("AlternativeNames", aliasAltNamesValue));
 
-    final ODataComplexValue homePhone = new ODataComplexValue(
+    final ODataComplexValue homePhone = getClient().getObjectFactory().newComplexValue(
             "Microsoft.Test.OData.Services.AstoriaDefaultService.Phone");
     homePhone.add(client.getObjectFactory().newPrimitiveProperty("PhoneNumber",
-            client.getPrimitiveValueBuilder().setText("8437568356834568").
+            client.getObjectFactory().newPrimitiveValueBuilder().setText("8437568356834568").
             setType(EdmPrimitiveTypeKind.String).build()));
     homePhone.add(client.getObjectFactory().newPrimitiveProperty("Extension",
-            client.getPrimitiveValueBuilder().setText("124365426534621534423ttrf").
+            client.getObjectFactory().newPrimitiveValueBuilder().setText("124365426534621534423ttrf").
             setType(EdmPrimitiveTypeKind.String).
             build()));
     contactDetails.add(client.getObjectFactory().newComplexProperty("HomePhone", homePhone));
@@ -373,7 +377,8 @@ public class NavigationLinkCreateTestITCase extends AbstractTestITCase {
     entity.setMediaEntity(true);
 
     entity.getProperties().add(client.getObjectFactory().newPrimitiveProperty("Information",
-            client.getPrimitiveValueBuilder().setText(info).setType(EdmPrimitiveTypeKind.String).build()));
+            client.getObjectFactory().newPrimitiveValueBuilder().setText(info).
+            setType(EdmPrimitiveTypeKind.String).build()));
     return entity;
   }
   // validate newly created entities

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/OpenTypeTestITCase.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/OpenTypeTestITCase.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/OpenTypeTestITCase.java
index bb507e4..d00bf8b 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/OpenTypeTestITCase.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/OpenTypeTestITCase.java
@@ -93,50 +93,57 @@ public class OpenTypeTestITCase extends AbstractTestITCase {
 
     ODataEntity row = client.getObjectFactory().newEntity("Microsoft.Test.OData.Services.OpenTypesService.Row");
     row.getProperties().add(client.getObjectFactory().newPrimitiveProperty("Id",
-            client.getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Guid).setValue(guid).
+            client.getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.Guid).setValue(guid).
             build()));
     row.getProperties().add(client.getObjectFactory().newPrimitiveProperty("aString",
-            client.getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.String).setValue("string").
+            client.getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.String).setValue("string").
             build()));
     row.getProperties().add(client.getObjectFactory().newPrimitiveProperty("aBoolean",
-            client.getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Boolean).setValue(true).
+            client.getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.Boolean).setValue(true).
             build()));
     row.getProperties().add(client.getObjectFactory().newPrimitiveProperty("aLong",
-            client.getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Int64).setValue(15L).
+            client.getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.Int64).setValue(15L).
             build()));
     row.getProperties().add(client.getObjectFactory().newPrimitiveProperty("aDouble",
-            client.getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Double).setValue(1.5D).
+            client.getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.Double).setValue(1.5D).
             build()));
     row.getProperties().add(client.getObjectFactory().newPrimitiveProperty("aByte",
-            client.getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.SByte).setValue(Byte.MAX_VALUE).
+            client.getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.SByte).setValue(Byte.MAX_VALUE).
             build()));
     row.getProperties().add(client.getObjectFactory().newPrimitiveProperty("aDate",
-            client.getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.DateTime).setValue(new Date()).
+            client.getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.DateTime).setValue(new Date()).
             build()));
 
     final Point point = new Point(Geospatial.Dimension.GEOGRAPHY, null);
     point.setX(1.2);
     point.setY(2.1);
     row.getProperties().add(client.getObjectFactory().newPrimitiveProperty("aPoint",
-            client.getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeographyPoint).
+            client.getObjectFactory().newPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeographyPoint).
             setValue(point).build()));
     final List<Point> points = new ArrayList<Point>();
     points.add(point);
     points.add(point);
     final MultiPoint multipoint = new MultiPoint(Geospatial.Dimension.GEOMETRY, null, points);
     row.getProperties().add(client.getObjectFactory().newPrimitiveProperty("aMultiPoint",
-            client.getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeometryMultiPoint).
+            client.getObjectFactory().newPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeometryMultiPoint).
             setValue(multipoint).build()));
     final LineString lineString = new LineString(Geospatial.Dimension.GEOMETRY, null, points);
     row.getProperties().add(client.getObjectFactory().newPrimitiveProperty("aLineString",
-            client.getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeometryLineString).
+            client.getObjectFactory().newPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeometryLineString).
             setValue(lineString).build()));
     final List<LineString> lineStrings = new ArrayList<LineString>();
     lineStrings.add(lineString);
     lineStrings.add(lineString);
     final MultiLineString multiLineString = new MultiLineString(Geospatial.Dimension.GEOGRAPHY, null, lineStrings);
     row.getProperties().add(client.getObjectFactory().newPrimitiveProperty("aMultiLineString",
-            client.getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeometryMultiLineString).
+            client.getObjectFactory().newPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeometryMultiLineString).
             setValue(multiLineString).build()));
     final Point otherPoint = new Point(Geospatial.Dimension.GEOGRAPHY, null);
     otherPoint.setX(3.4);
@@ -146,14 +153,14 @@ public class OpenTypeTestITCase extends AbstractTestITCase {
     points.add(point);
     final Polygon polygon = new Polygon(Geospatial.Dimension.GEOGRAPHY, null, points, points);
     row.getProperties().add(client.getObjectFactory().newPrimitiveProperty("aPolygon",
-            client.getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeographyPolygon).
+            client.getObjectFactory().newPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeographyPolygon).
             setValue(polygon).build()));
     final List<Polygon> polygons = new ArrayList<Polygon>();
     polygons.add(polygon);
     polygons.add(polygon);
     final MultiPolygon multiPolygon = new MultiPolygon(Geospatial.Dimension.GEOGRAPHY, null, polygons);
     row.getProperties().add(client.getObjectFactory().newPrimitiveProperty("aMultiPolygon",
-            client.getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeographyMultiPolygon).
+            client.getObjectFactory().newPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeographyMultiPolygon).
             setValue(multiPolygon).build()));
     final List<Geospatial> geospatials = new ArrayList<Geospatial>();
     geospatials.add(otherPoint);
@@ -162,46 +169,46 @@ public class OpenTypeTestITCase extends AbstractTestITCase {
     geospatials.add(multiPolygon);
     final GeospatialCollection geoColl = new GeospatialCollection(Geospatial.Dimension.GEOGRAPHY, null, geospatials);
     row.getProperties().add(client.getObjectFactory().newPrimitiveProperty("aCollection",
-            client.getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeographyCollection).
+            client.getObjectFactory().newPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeographyCollection).
             setValue(geoColl).build()));
 
-    final ODataComplexValue contactDetails =
-            new ODataComplexValue("Microsoft.Test.OData.Services.OpenTypesService.ContactDetails");
+    final ODataComplexValue contactDetails = client.getObjectFactory().newComplexValue(
+            "Microsoft.Test.OData.Services.OpenTypesService.ContactDetails");
     contactDetails.add(client.getObjectFactory().newPrimitiveProperty("FirstContacted",
-            client.getPrimitiveValueBuilder().
+            client.getObjectFactory().newPrimitiveValueBuilder().
             setType(EdmPrimitiveTypeKind.Binary).setValue("text".getBytes()).build()));
     contactDetails.add(client.getObjectFactory().newPrimitiveProperty("LastContacted",
-            client.getPrimitiveValueBuilder().
+            client.getObjectFactory().newPrimitiveValueBuilder().
             setType(EdmPrimitiveTypeKind.DateTimeOffset).setText("2001-04-05T05:05:05.001+00:01").build()));
     contactDetails.add(client.getObjectFactory().newPrimitiveProperty("Contacted",
-            client.getPrimitiveValueBuilder().
+            client.getObjectFactory().newPrimitiveValueBuilder().
             setType(EdmPrimitiveTypeKind.DateTime).setText("2001-04-05T05:05:04.001").build()));
     contactDetails.add(client.getObjectFactory().newPrimitiveProperty("GUID",
-            client.getPrimitiveValueBuilder().
+            client.getObjectFactory().newPrimitiveValueBuilder().
             setType(EdmPrimitiveTypeKind.Guid).setValue(UUID.randomUUID()).build()));
     contactDetails.add(client.getObjectFactory().newPrimitiveProperty("PreferedContactTime",
-            client.getPrimitiveValueBuilder().
+            client.getObjectFactory().newPrimitiveValueBuilder().
             setType(EdmPrimitiveTypeKind.Time).setText("-P9DT51M10.5063807S").build()));
     contactDetails.add(client.getObjectFactory().newPrimitiveProperty("Byte",
-            client.getPrimitiveValueBuilder().
+            client.getObjectFactory().newPrimitiveValueBuilder().
             setType(EdmPrimitiveTypeKind.Byte).setValue(Integer.valueOf(241)).build()));
     contactDetails.add(client.getObjectFactory().newPrimitiveProperty("SignedByte",
-            client.getPrimitiveValueBuilder().
+            client.getObjectFactory().newPrimitiveValueBuilder().
             setType(EdmPrimitiveTypeKind.SByte).setValue(Byte.MAX_VALUE).build()));
     contactDetails.add(client.getObjectFactory().newPrimitiveProperty("Double",
-            client.getPrimitiveValueBuilder().
+            client.getObjectFactory().newPrimitiveValueBuilder().
             setType(EdmPrimitiveTypeKind.Double).setValue(Double.MAX_VALUE).build()));
     contactDetails.add(client.getObjectFactory().newPrimitiveProperty("Single",
-            client.getPrimitiveValueBuilder().
+            client.getObjectFactory().newPrimitiveValueBuilder().
             setType(EdmPrimitiveTypeKind.Single).setValue(Float.MAX_VALUE).build()));
     contactDetails.add(client.getObjectFactory().newPrimitiveProperty("Short",
-            client.getPrimitiveValueBuilder().
+            client.getObjectFactory().newPrimitiveValueBuilder().
             setType(EdmPrimitiveTypeKind.Int16).setValue(Short.MAX_VALUE).build()));
     contactDetails.add(client.getObjectFactory().newPrimitiveProperty("Int",
-            client.getPrimitiveValueBuilder().
+            client.getObjectFactory().newPrimitiveValueBuilder().
             setType(EdmPrimitiveTypeKind.Int32).setValue(Integer.MAX_VALUE).build()));
     contactDetails.add(client.getObjectFactory().newPrimitiveProperty("Long",
-            client.getPrimitiveValueBuilder().
+            client.getObjectFactory().newPrimitiveValueBuilder().
             setType(EdmPrimitiveTypeKind.Int64).setValue(Long.MAX_VALUE).build()));
     row.getProperties().add(client.getObjectFactory().newComplexProperty("aContact", contactDetails));
 
@@ -243,7 +250,7 @@ public class OpenTypeTestITCase extends AbstractTestITCase {
     assertEquals(EdmPrimitiveTypeKind.GeographyCollection,
             row.getProperty("aCollection").getPrimitiveValue().getTypeKind());
     assertEquals("Microsoft.Test.OData.Services.OpenTypesService.ContactDetails",
-            row.getProperty("aContact").getComplexValue().getType());
+            row.getProperty("aContact").getComplexValue().getTypeName());
     assertEquals(EdmPrimitiveTypeKind.SByte,
             row.getProperty("aContact").getComplexValue().get("SignedByte").getPrimitiveValue().getTypeKind());
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/PropertyTestITCase.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/PropertyTestITCase.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/PropertyTestITCase.java
index 93384bb..ddcd75f 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/PropertyTestITCase.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/it/v3/PropertyTestITCase.java
@@ -181,7 +181,7 @@ public class PropertyTestITCase extends AbstractTestITCase {
 
     assertNotEquals(newMsg, oldMsg);
 
-    final ODataPrimitiveValue newVal = client.getPrimitiveValueBuilder().setText(newMsg).build();
+    final ODataPrimitiveValue newVal = client.getObjectFactory().newPrimitiveValueBuilder().setText(newMsg).build();
 
     final ODataValueUpdateRequest updateReq =
             client.getCUDRequestFactory().getValueUpdateRequest(uriBuilder.build(), type, newVal);
@@ -222,7 +222,7 @@ public class PropertyTestITCase extends AbstractTestITCase {
 
     final int origSize = originalValue.size();
 
-    originalValue.add(client.getPrimitiveValueBuilder().setText(newItem).build());
+    originalValue.add(client.getObjectFactory().newPrimitiveValueBuilder().setText(newItem).build());
     assertEquals(origSize + 1, originalValue.size());
 
     final ODataPropertyUpdateRequest updateReq = client.getCUDRequestFactory().
@@ -268,12 +268,12 @@ public class PropertyTestITCase extends AbstractTestITCase {
 
     final int origSize = originalValue.size();
 
-    originalValue.add(client.getPrimitiveValueBuilder().setText(newItem).build());
+    originalValue.add(client.getObjectFactory().newPrimitiveValueBuilder().setText(newItem).build());
     assertEquals(origSize + 1, originalValue.size());
 
     final ODataPropertyUpdateRequest updateReq =
             client.getCUDRequestFactory().getPropertyCollectionValueUpdateRequest(uriBuilder.build(),
-            alternativeNames);
+                    alternativeNames);
     if (client.getConfiguration().isUseXHTTPMethod()) {
       assertEquals(HttpMethod.POST, updateReq.getMethod());
     } else {
@@ -315,7 +315,7 @@ public class PropertyTestITCase extends AbstractTestITCase {
     assertNotEquals(newMsg, oldMsg);
 
     phoneNumber = client.getObjectFactory().newPrimitiveProperty("PhoneNumber",
-            client.getPrimitiveValueBuilder().setText(newMsg).build());
+            client.getObjectFactory().newPrimitiveValueBuilder().setText(newMsg).build());
 
     final ODataPropertyUpdateRequest updateReq =
             client.getCUDRequestFactory().getPropertyPrimitiveValueUpdateRequest(uriBuilder.build(), phoneNumber);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/PrimitiveValueTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/PrimitiveValueTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/PrimitiveValueTest.java
index 04f392a..64301df 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/PrimitiveValueTest.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/PrimitiveValueTest.java
@@ -57,24 +57,25 @@ public class PrimitiveValueTest extends AbstractTest {
   @Test
   public void manageInt32() throws EdmPrimitiveTypeException {
     final int primitive = -10;
-    ODataValue value = getClient().getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Int32).
+    ODataValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Int32).
             setValue(primitive).build();
     assertEquals(EdmPrimitiveTypeKind.Int32, value.asPrimitive().getTypeKind());
     assertEquals(Integer.valueOf(primitive), value.asPrimitive().toCastValue(Integer.class));
 
-    value = getClient().getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Int32).setText("9").build();
+    value = getClient().getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.Int32).setText("9").build();
     assertEquals("9", value.asPrimitive().toCastValue(Integer.class).toString());
   }
 
   @Test
   public void manageString() throws EdmPrimitiveTypeException {
     final String primitive = UUID.randomUUID().toString();
-    ODataValue value = getClient().getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.String).
+    ODataValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.String).
             setText(primitive).build();
     assertEquals(EdmPrimitiveTypeKind.String, value.asPrimitive().getTypeKind());
     assertEquals(primitive, value.toString());
 
-    value = getClient().getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.String).
+    value = getClient().getObjectFactory().newPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.String).
             setText("1126a28b-a4af-4bbd-bf0a-2b2c22635565").build();
     assertEquals("1126a28b-a4af-4bbd-bf0a-2b2c22635565", value.asPrimitive().toCastValue(String.class).toString());
   }
@@ -82,12 +83,12 @@ public class PrimitiveValueTest extends AbstractTest {
   @Test
   public void manageDecimal() throws EdmPrimitiveTypeException {
     final BigDecimal primitive = new BigDecimal("-79228162514264337593543950335");
-    ODataValue value = getClient().getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Decimal).
+    ODataValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Decimal).
             setValue(primitive).build();
     assertEquals(EdmPrimitiveTypeKind.Decimal, value.asPrimitive().getTypeKind());
     assertEquals(primitive, value.asPrimitive().toCastValue(BigDecimal.class));
 
-    value = getClient().getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Decimal).
+    value = getClient().getObjectFactory().newPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Decimal).
             setText("-79228162514264337593543950335").build();
     assertEquals("-79228162514264337593543950335", value.asPrimitive().toCastValue(BigDecimal.class).toString());
   }
@@ -99,7 +100,7 @@ public class PrimitiveValueTest extends AbstractTest {
     expected.set(2013, 0, 10, 2, 0, 0);
     expected.set(Calendar.MILLISECOND, 1667673);
 
-    final ODataValue value = getClient().getPrimitiveValueBuilder().
+    final ODataValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().
             setType(EdmPrimitiveTypeKind.DateTime).setValue(expected).build();
     assertEquals(EdmPrimitiveTypeKind.DateTime, value.asPrimitive().getTypeKind());
 
@@ -123,7 +124,7 @@ public class PrimitiveValueTest extends AbstractTest {
   public void manageTime() throws EdmPrimitiveTypeException {
     final String primitive = "-P9DT51M10.5063807S";
     final ODataValue value =
-            getClient().getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Time).
+            getClient().getObjectFactory().newPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Time).
             setText(primitive).build();
     assertEquals(EdmPrimitiveTypeKind.Time, value.asPrimitive().getTypeKind());
     // performed cast to improve the check
@@ -137,7 +138,7 @@ public class PrimitiveValueTest extends AbstractTest {
     expected.setTimeZone(TimeZone.getTimeZone("GMT"));
     expected.set(2013, 0, 10, 2, 0, 0);
 
-    final ODataValue value = getClient().getPrimitiveValueBuilder().
+    final ODataValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().
             setType(EdmPrimitiveTypeKind.DateTimeOffset).setValue(expected).build();
     assertEquals(EdmPrimitiveTypeKind.DateTimeOffset, value.asPrimitive().getTypeKind());
 
@@ -155,12 +156,12 @@ public class PrimitiveValueTest extends AbstractTest {
   @Test
   public void manageGuid() throws EdmPrimitiveTypeException {
     final UUID primitive = UUID.fromString("1126a28b-a4af-4bbd-bf0a-2b2c22635565");
-    ODataValue value = getClient().getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Guid).
+    ODataValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Guid).
             setValue(primitive).build();
     assertEquals(EdmPrimitiveTypeKind.Guid, value.asPrimitive().getTypeKind());
     assertEquals(primitive, value.asPrimitive().toCastValue(UUID.class));
 
-    value = getClient().getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Guid).
+    value = getClient().getObjectFactory().newPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Guid).
             setText("1126a28b-a4af-4bbd-bf0a-2b2c22635565").build();
     assertEquals("1126a28b-a4af-4bbd-bf0a-2b2c22635565", value.asPrimitive().toCastValue(UUID.class).toString());
   }
@@ -168,14 +169,15 @@ public class PrimitiveValueTest extends AbstractTest {
   @Test
   public void manageBinary() throws EdmPrimitiveTypeException {
     final byte[] primitive = UUID.randomUUID().toString().getBytes();
-    ODataValue value = getClient().getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Binary).
+    ODataValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Binary).
             setValue(primitive).build();
     assertEquals(EdmPrimitiveTypeKind.Binary, value.asPrimitive().getTypeKind());
     assertEquals(
             Base64.encodeBase64String(primitive),
             Base64.encodeBase64String(value.asPrimitive().toCastValue(byte[].class)));
 
-    value = getClient().getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.Binary).
+    value = getClient().getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.Binary).
             setText(Base64.encodeBase64String("primitive".getBytes())).build();
     assertEquals("primitive", new String(value.asPrimitive().toCastValue(byte[].class)));
   }
@@ -186,8 +188,8 @@ public class PrimitiveValueTest extends AbstractTest {
     primitive.setX(52.8606);
     primitive.setY(173.334);
 
-    final ODataValue value =
-            getClient().getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeographyPoint).
+    final ODataValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.GeographyPoint).
             setValue(primitive).
             build();
     assertEquals(EdmPrimitiveTypeKind.GeographyPoint, value.asPrimitive().getTypeKind());
@@ -222,8 +224,9 @@ public class PrimitiveValueTest extends AbstractTest {
 
     final LineString primitive = new LineString(Geospatial.Dimension.GEOGRAPHY, null, points);
 
-    final ODataValue value = getClient().getPrimitiveValueBuilder().
-            setType(EdmPrimitiveTypeKind.GeographyLineString).setValue(primitive).build();
+    final ODataValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.GeographyLineString).
+            setValue(primitive).build();
     assertEquals(EdmPrimitiveTypeKind.GeographyLineString, value.asPrimitive().getTypeKind());
 
     final Iterator<Point> iter = value.asPrimitive().toCastValue(LineString.class).iterator();
@@ -247,8 +250,9 @@ public class PrimitiveValueTest extends AbstractTest {
 
     final MultiPoint primitive = new MultiPoint(Geospatial.Dimension.GEOMETRY, null, points);
 
-    final ODataValue value = getClient().getPrimitiveValueBuilder().
-            setType(EdmPrimitiveTypeKind.GeometryMultiPoint).setValue(primitive).build();
+    final ODataValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.GeometryMultiPoint).
+            setValue(primitive).build();
     assertEquals(EdmPrimitiveTypeKind.GeometryMultiPoint, value.asPrimitive().getTypeKind());
 
     final Iterator<Point> iter = value.asPrimitive().toCastValue(MultiPoint.class).iterator();
@@ -307,8 +311,8 @@ public class PrimitiveValueTest extends AbstractTest {
 
     final MultiLineString primitive = new MultiLineString(Geospatial.Dimension.GEOMETRY, null, lines);
 
-    final ODataValue value =
-            getClient().getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeometryMultiLineString).
+    final ODataValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.GeometryMultiLineString).
             setValue(primitive).build();
     assertEquals(EdmPrimitiveTypeKind.GeometryMultiLineString, value.asPrimitive().getTypeKind());
 
@@ -360,8 +364,8 @@ public class PrimitiveValueTest extends AbstractTest {
 
     final Polygon primitive = new Polygon(Geospatial.Dimension.GEOGRAPHY, null, interior, exterior);
 
-    final ODataValue value =
-            getClient().getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeographyPolygon).
+    final ODataValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.GeographyPolygon).
             setValue(primitive).build();
     assertEquals(EdmPrimitiveTypeKind.GeographyPolygon, value.asPrimitive().getTypeKind());
 
@@ -466,8 +470,8 @@ public class PrimitiveValueTest extends AbstractTest {
 
     final MultiPolygon primitive = new MultiPolygon(Geospatial.Dimension.GEOMETRY, null, polygons);
 
-    final ODataValue value =
-            getClient().getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeometryMultiPolygon).
+    final ODataValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.GeometryMultiPolygon).
             setValue(primitive).build();
     assertEquals(EdmPrimitiveTypeKind.GeometryMultiPolygon, value.asPrimitive().getTypeKind());
 
@@ -512,8 +516,8 @@ public class PrimitiveValueTest extends AbstractTest {
 
     final GeospatialCollection primitive = new GeospatialCollection(Geospatial.Dimension.GEOMETRY, null, collection);
 
-    final ODataValue value =
-            getClient().getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeometryCollection).
+    final ODataValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.GeometryCollection).
             setValue(primitive).build();
     assertEquals(EdmPrimitiveTypeKind.GeometryCollection, value.asPrimitive().getTypeKind());
 
@@ -544,8 +548,8 @@ public class PrimitiveValueTest extends AbstractTest {
 
     final GeospatialCollection primitive = new GeospatialCollection(Geospatial.Dimension.GEOGRAPHY, null, collection);
 
-    final ODataValue value =
-            getClient().getPrimitiveValueBuilder().setType(EdmPrimitiveTypeKind.GeographyCollection).
+    final ODataValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().
+            setType(EdmPrimitiveTypeKind.GeographyCollection).
             setValue(primitive).build();
     assertEquals(EdmPrimitiveTypeKind.GeographyCollection, value.asPrimitive().getTypeKind());
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/PropertyTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/PropertyTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/PropertyTest.java
index 597e235..6d46398 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/PropertyTest.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/PropertyTest.java
@@ -49,7 +49,7 @@ public class PropertyTest extends AbstractTest {
   public void readPropertyValue() throws IOException {
     final InputStream input = getClass().getResourceAsStream("Customer_-10_CustomerId_value.txt");
 
-    final ODataPrimitiveValue value = getClient().getPrimitiveValueBuilder().
+    final ODataPrimitiveValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().
             setType(EdmPrimitiveTypeKind.String).
             setText(IOUtils.toString(input)).
             build();
@@ -71,7 +71,7 @@ public class PropertyTest extends AbstractTest {
       comparable = written;
     } else {
       // This is needed because type information gets lost with JSON serialization
-      final ODataPrimitiveValue typedValue = getClient().getPrimitiveValueBuilder().
+      final ODataPrimitiveValue typedValue = getClient().getObjectFactory().newPrimitiveValueBuilder().
               setType(property.getPrimitiveValue().getTypeKind()).
               setText(written.getPrimitiveValue().toString()).
               build();
@@ -107,7 +107,8 @@ public class PropertyTest extends AbstractTest {
       comparable = written;
     } else {
       // This is needed because type information gets lost with JSON serialization
-      final ODataComplexValue typedValue = new ODataComplexValue(property.getComplexValue().getType());
+      final ODataComplexValue typedValue = getClient().getObjectFactory().
+              newComplexValue(property.getComplexValue().getTypeName());
       for (final Iterator<ODataProperty> itor = written.getComplexValue().iterator(); itor.hasNext();) {
         final ODataProperty prop = itor.next();
         typedValue.add(prop);
@@ -144,7 +145,8 @@ public class PropertyTest extends AbstractTest {
       comparable = written;
     } else {
       // This is needed because type information gets lost with JSON serialization
-      final ODataCollectionValue typedValue = new ODataCollectionValue(property.getCollectionValue().getType());
+      final ODataCollectionValue typedValue = getClient().getObjectFactory().
+              newCollectionValue(property.getCollectionValue().getTypeName());
       for (final Iterator<ODataValue> itor = written.getCollectionValue().iterator(); itor.hasNext();) {
         final ODataValue value = itor.next();
         typedValue.add(value);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/PrimitiveValueTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/PrimitiveValueTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/PrimitiveValueTest.java
index 0fc9b18..e61a9df 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/PrimitiveValueTest.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/PrimitiveValueTest.java
@@ -41,7 +41,7 @@ public class PrimitiveValueTest extends AbstractTest {
     expected.clear();
     expected.set(2013, 0, 10, 21, 45, 17);
 
-    final ODataValue value = getClient().getPrimitiveValueBuilder().
+    final ODataValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().
             setType(EdmPrimitiveTypeKind.TimeOfDay).setValue(expected).build();
     assertEquals(EdmPrimitiveTypeKind.TimeOfDay, value.asPrimitive().getTypeKind());
 
@@ -59,7 +59,7 @@ public class PrimitiveValueTest extends AbstractTest {
     expected.clear();
     expected.set(2013, 0, 10);
 
-    final ODataValue value = getClient().getPrimitiveValueBuilder().
+    final ODataValue value = getClient().getObjectFactory().newPrimitiveValueBuilder().
             setType(EdmPrimitiveTypeKind.Date).setValue(expected).build();
     assertEquals(EdmPrimitiveTypeKind.Date, value.asPrimitive().getTypeKind());
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/AbstractODataValue.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/AbstractODataValue.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/AbstractODataValue.java
index 3eb664b..1dbfdf8 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/AbstractODataValue.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/AbstractODataValue.java
@@ -31,6 +31,20 @@ public abstract class AbstractODataValue implements ODataValue {
   private static final long serialVersionUID = 7445422004232581877L;
 
   /**
+   * Type name;
+   */
+  private final String typeName;
+
+  public AbstractODataValue(String typeName) {
+    this.typeName = typeName;
+  }
+
+  @Override
+  public String getTypeName() {
+    return typeName;
+  }
+
+  /**
    * Check is is a primitive value.
    *
    * @return 'TRUE' if primitive; 'FALSE' otherwise.

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataCollectionValue.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataCollectionValue.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataCollectionValue.java
index f583187..d0daf59 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataCollectionValue.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataCollectionValue.java
@@ -18,81 +18,29 @@
  */
 package org.apache.olingo.commons.api.domain;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
 /**
  * OData collection property value.
  */
-public class ODataCollectionValue extends AbstractODataValue implements Iterable<ODataValue> {
-
-  private static final long serialVersionUID = -3665659846001987187L;
-
-  /**
-   * Type name;
-   */
-  private final String typeName;
-
-  /**
-   * Values.
-   */
-  private final List<ODataValue> values = new ArrayList<ODataValue>();
-
-  /**
-   * Constructor.
-   *
-   * @param typeName type name.
-   */
-  public ODataCollectionValue(final String typeName) {
-    this.typeName = typeName;
-  }
+public interface ODataCollectionValue extends ODataValue, Iterable<ODataValue> {
 
   /**
    * Adds a value to the collection.
    *
    * @param value value to be added.
    */
-  public void add(final ODataValue value) {
-    if (value.isPrimitive() || value.isComplex()) {
-      values.add(value);
-    }
-  }
+  void add(ODataValue value);
 
   /**
-   * Value iterator.
-   *
-   * @return value iterator.
-   */
-  @Override
-  public Iterator<ODataValue> iterator() {
-    return values.iterator();
-  }
-
-  /**
-   * Gets value type name.
+   * Checks if collection is empty.
    *
-   * @return value type name.
+   * @return 'TRUE' if empty; 'FALSE' otherwise.
    */
-  public String getType() {
-    return typeName;
-  }
+  boolean isEmpty();
 
   /**
    * Gets collection size.
    *
    * @return collection size.
    */
-  public int size() {
-    return values.size();
-  }
-
-  /**
-   * Checks if collection is empty.
-   *
-   * @return 'TRUE' if empty; 'FALSE' otherwise.
-   */
-  public boolean isEmpty() {
-    return values.isEmpty();
-  }
+  int size();
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataComplexValue.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataComplexValue.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataComplexValue.java
index b973718..ea4d832 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataComplexValue.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataComplexValue.java
@@ -18,44 +18,17 @@
  */
 package org.apache.olingo.commons.api.domain;
 
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
 /**
  * OData complex property value.
  */
-public class ODataComplexValue extends AbstractODataValue implements Iterable<ODataProperty> {
-
-  private static final long serialVersionUID = -1878555027714020431L;
-
-  /**
-   * Type name.
-   */
-  private final String typeName;
-
-  /**
-   * Complex type fields.
-   */
-  private final Map<String, ODataProperty> fields = new LinkedHashMap<String, ODataProperty>();
-
-  /**
-   * Constructor.
-   *
-   * @param type type name.
-   */
-  public ODataComplexValue(final String typeName) {
-    this.typeName = typeName;
-  }
+public interface ODataComplexValue extends ODataValue, Iterable<ODataProperty> {
 
   /**
    * Adds field to the complex type.
    *
    * @param field field to be added.
    */
-  public void add(final ODataProperty field) {
-    fields.put(field.getName(), field);
-  }
+  void add(ODataProperty field);
 
   /**
    * Gets field.
@@ -63,35 +36,13 @@ public class ODataComplexValue extends AbstractODataValue implements Iterable<OD
    * @param name name of the field to be retrieved.
    * @return requested field.
    */
-  public ODataProperty get(final String name) {
-    return fields.get(name);
-  }
-
-  /**
-   * Complex property fields iterator.
-   *
-   * @return fields iterator.
-   */
-  @Override
-  public Iterator<ODataProperty> iterator() {
-    return fields.values().iterator();
-  }
-
-  /**
-   * Gest value type name.
-   *
-   * @return value type name.
-   */
-  public String getType() {
-    return typeName;
-  }
+  ODataProperty get(String name);
 
   /**
    * Gets number of fields.
    *
    * @return number of fields.
    */
-  public int size() {
-    return fields.size();
-  }
+  int size();
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataEntity.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataEntity.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataEntity.java
index a5826d1..44214ac 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataEntity.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataEntity.java
@@ -19,122 +19,30 @@
 package org.apache.olingo.commons.api.domain;
 
 import java.net.URI;
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.lang3.StringUtils;
 
 /**
  * OData entity.
  */
-public class ODataEntity extends AbstractODataPayload implements ODataInvokeResult {
+public interface ODataEntity extends ODataInvokeResult {
 
-  private static final long serialVersionUID = 8360640095932811034L;
+  String getName();
 
-  /**
-   * Entity reference.
-   */
-  private String reference;
-
-  /**
-   * ETag.
-   */
-  private String eTag;
-
-  /**
-   * Media entity flag.
-   */
-  private boolean mediaEntity = false;
-
-  /**
-   * In case of media entity, media content type.
-   */
-  private String mediaContentType;
-
-  /**
-   * In case of media entity, media content source.
-   */
-  private String mediaContentSource;
-
-  /**
-   * Edit link.
-   */
-  protected URI editLink;
-
-  /**
-   * Navigation links (might contain in-line entities or feeds).
-   */
-  protected final List<ODataLink> navigationLinks = new ArrayList<ODataLink>();
-
-  /**
-   * Association links.
-   */
-  protected final List<ODataLink> associationLinks = new ArrayList<ODataLink>();
-
-  /**
-   * Media edit links.
-   */
-  protected final List<ODataLink> editMediaLinks = new ArrayList<ODataLink>();
-
-  /**
-   * Operations (legacy, functions, actions).
-   */
-  protected final List<ODataOperation> operations = new ArrayList<ODataOperation>();
-
-  /**
-   * Entity properties.
-   */
-  protected final List<ODataProperty> properties = new ArrayList<ODataProperty>();
-
-  /**
-   * Constructor.
-   *
-   * @param name OData entity name.
-   */
-  public ODataEntity(final String name) {
-    super(name);
-  }
-
-  /**
-   * To request entity references in place of the actual entities, the client issues a GET request with /$ref appended
-   * to the resource path.
-   * <br />
-   * If the resource path does not identify an entity or a collection of entities, the service returns 404 Not Found.
-   * <br />
-   * If the resource path terminates on a collection, the response MUST be the format-specific representation of a
-   * collection of entity references pointing to the related entities. If no entities are related, the response is the
-   * format-specific representation of an empty collection.
-   * <br />
-   * If the resource path terminates on a single entity, the response MUST be the format-specific representation of an
-   * entity reference pointing to the related single entity. If the resource path terminates on a single entity and no
-   * such entity exists, the service returns 404 Not Found.
-   *
-   * @return entity reference.
-   */
-  public String getReference() {
-    return reference;
-  }
-
-  public void setReference(final String reference) {
-    this.reference = reference;
-  }
+  URI getLink();
 
   /**
    * Gets ETag.
    *
    * @return ETag.
    */
-  public String getETag() {
-    return eTag;
-  }
+  String getETag();
 
   /**
    * Sets ETag.
    *
    * @param eTag ETag.
    */
-  public void setETag(final String eTag) {
-    this.eTag = eTag;
-  }
+  void setETag(String eTag);
 
   /**
    * Searches for operation with given title.
@@ -142,25 +50,14 @@ public class ODataEntity extends AbstractODataPayload implements ODataInvokeResu
    * @param title operation to look for
    * @return operation if found with given title, <tt>null</tt> otherwise
    */
-  public ODataOperation getOperation(final String title) {
-    ODataOperation result = null;
-    for (ODataOperation operation : operations) {
-      if (title.equals(operation.getTitle())) {
-        result = operation;
-      }
-    }
-
-    return result;
-  }
+  ODataOperation getOperation(String title);
 
   /**
    * Gets operations.
    *
    * @return operations.
    */
-  public List<ODataOperation> getOperations() {
-    return this.operations;
-  }
+  List<ODataOperation> getOperations();
 
   /**
    * Searches for property with given name.
@@ -168,28 +65,14 @@ public class ODataEntity extends AbstractODataPayload implements ODataInvokeResu
    * @param name property to look for
    * @return property if found with given name, <tt>null</tt> otherwise
    */
-  public ODataProperty getProperty(final String name) {
-    ODataProperty result = null;
-
-    if (StringUtils.isNotBlank(name)) {
-      for (ODataProperty property : properties) {
-        if (name.equals(property.getName())) {
-          result = property;
-        }
-      }
-    }
-
-    return result;
-  }
+  ODataProperty getProperty(String name);
 
   /**
    * Returns OData entity properties.
    *
    * @return OData entity properties.
    */
-  public List<ODataProperty> getProperties() {
-    return properties;
-  }
+  List<ODataProperty> getProperties();
 
   /**
    * Puts the given link into one of available lists, based on its type.
@@ -197,28 +80,7 @@ public class ODataEntity extends AbstractODataPayload implements ODataInvokeResu
    * @param link to be added
    * @return <tt>true</tt> if the given link was added in one of available lists
    */
-  public boolean addLink(final ODataLink link) {
-    boolean result = false;
-
-    switch (link.getType()) {
-      case ASSOCIATION:
-        result = associationLinks.contains(link) ? false : associationLinks.add(link);
-        break;
-
-      case ENTITY_NAVIGATION:
-      case ENTITY_SET_NAVIGATION:
-        result = navigationLinks.contains(link) ? false : navigationLinks.add(link);
-        break;
-
-      case MEDIA_EDIT:
-        result = editMediaLinks.contains(link) ? false : editMediaLinks.add(link);
-        break;
-
-      default:
-    }
-
-    return result;
-  }
+  boolean addLink(ODataLink link);
 
   /**
    * Removes the given link from any list (association, navigation, edit-media).
@@ -226,120 +88,110 @@ public class ODataEntity extends AbstractODataPayload implements ODataInvokeResu
    * @param link to be removed
    * @return <tt>true</tt> if the given link was contained in one of available lists
    */
-  public boolean removeLink(final ODataLink link) {
-    return associationLinks.remove(link) || navigationLinks.remove(link) || editMediaLinks.remove(link);
-  }
+  boolean removeLink(ODataLink link);
 
   /**
-   * Returns all entity navigation links (including inline entities / feeds).
+   * Returns all entity association links.
    *
    * @return OData entity links.
    */
-  public List<ODataLink> getNavigationLinks() {
-    return navigationLinks;
-  }
+  List<ODataLink> getAssociationLinks();
 
   /**
-   * Returns all entity association links.
+   * Returns all entity navigation links (including inline entities / feeds).
    *
    * @return OData entity links.
    */
-  public List<ODataLink> getAssociationLinks() {
-    return associationLinks;
-  }
+  List<ODataLink> getNavigationLinks();
 
   /**
    * Returns all entity media edit links.
    *
    * @return OData entity links.
    */
-  public List<ODataLink> getEditMediaLinks() {
-    return editMediaLinks;
-  }
+  List<ODataLink> getEditMediaLinks();
 
   /**
    * Returns OData entity edit link.
    *
    * @return entity edit link.
    */
-  public URI getEditLink() {
-    return editLink;
-  }
+  URI getEditLink();
 
   /**
    * Sets OData entity edit link.
    *
    * @param editLink edit link.
    */
-  public void setEditLink(final URI editLink) {
-    this.editLink = editLink;
-  }
-
-  @Override
-  public URI getLink() {
-    return super.getLink() == null ? getEditLink() : super.getLink();
-  }
+  void setEditLink(URI editLink);
 
   /**
    * TRUE if read-only entity.
    *
    * @return TRUE if read-only; FALSE otherwise.
    */
-  public boolean isReadOnly() {
-    return super.getLink() != null;
-  }
+  boolean isReadOnly();
 
   /**
    * Checks if the current entity is a media entity.
    *
    * @return 'TRUE' if media entity; 'FALSE' otherwise.
    */
-  public boolean isMediaEntity() {
-    return mediaEntity;
-  }
+  boolean isMediaEntity();
 
   /**
    * Sets media entity flag.
    *
    * @param isMediaEntity media entity flag value.
    */
-  public void setMediaEntity(final boolean isMediaEntity) {
-    this.mediaEntity = isMediaEntity;
-  }
+  void setMediaEntity(boolean isMediaEntity);
 
   /**
    * Gets media content type.
    *
    * @return media content type.
    */
-  public String getMediaContentType() {
-    return mediaContentType;
-  }
+  String getMediaContentType();
 
   /**
    * Sets media content type.
    *
    * @param mediaContentType media content type.
    */
-  public void setMediaContentType(final String mediaContentType) {
-    this.mediaContentType = mediaContentType;
-  }
+  void setMediaContentType(String mediaContentType);
 
   /**
    * Gets media content source.
    *
    * @return media content source.
    */
-  public String getMediaContentSource() {
-    return mediaContentSource;
-  }
+  String getMediaContentSource();
 
   /**
    * Sets media content source.
    *
    * @param mediaContentSource media content source.
    */
-  public void setMediaContentSource(final String mediaContentSource) {
-    this.mediaContentSource = mediaContentSource;
-  }
+  void setMediaContentSource(String mediaContentSource);
+
+  /**
+   * To request entity references in place of the actual entities, the client issues a GET request with /$ref appended
+   * to the resource path.
+   * <br />
+   * If the resource path does not identify an entity or a collection of entities, the service returns 404 Not Found.
+   * <br />
+   * If the resource path terminates on a collection, the response MUST be the format-specific representation of a
+   * collection of entity references pointing to the related entities. If no entities are related, the response is the
+   * format-specific representation of an empty collection.
+   * <br />
+   * If the resource path terminates on a single entity, the response MUST be the format-specific representation of an
+   * entity reference pointing to the related single entity. If the resource path terminates on a single entity and no
+   * such entity exists, the service returns 404 Not Found.
+   *
+   * @return entity reference.
+   */
+  String getReference();
+
+  void setReference(String reference);
+
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataEntitySet.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataEntitySet.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataEntitySet.java
index 083b7ad..99b6962 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataEntitySet.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataEntitySet.java
@@ -19,102 +19,39 @@
 package org.apache.olingo.commons.api.domain;
 
 import java.net.URI;
-import java.util.ArrayList;
 import java.util.List;
 
 /**
  * OData entity collection. If pagination was used to get this instance, forward page navigation URI will be available.
  */
-public class ODataEntitySet extends AbstractODataPayload implements ODataInvokeResult {
-
-  private static final long serialVersionUID = 9039605899821494024L;
-
-  /**
-   * Link to the next page.
-   */
-  protected URI next;
-
-  /**
-   * Number of ODataEntities contained in this feed. If <tt>$inlinecount</tt> was requested, this value comes from
-   * there.
-   */
-  protected Integer count;
-
-  /**
-   * OData entities contained in this feed.
-   */
-  protected List<ODataEntity> entities = new ArrayList<ODataEntity>();
-
-  /**
-   * Constructor.
-   */
-  public ODataEntitySet() {
-    super(null);
-  }
-
-  /**
-   * Constructor.
-   *
-   * @param next next link.
-   */
-  public ODataEntitySet(final URI next) {
-    super(null);
-    this.next = next;
-  }
+public interface ODataEntitySet extends ODataInvokeResult {
 
   /**
    * Gets next page link.
    *
    * @return next page link; null value if single page or last page reached.
    */
-  public URI getNext() {
-    return next;
-  }
+  URI getNext();
 
   /**
-   * Sets in-line count.
+   * Gets contained entities.
    *
-   * @param count in-line count value.
+   * @return feed entries.
    */
-  public void setCount(final int count) {
-    this.count = count;
-  }
+  List<ODataEntity> getEntities();
 
   /**
    * Gets in-line count.
    *
    * @return in-line count value.
    */
-  public int getCount() {
-    return count == null ? entities.size() : count;
-  }
-
-  /**
-   * Adds entity to the current feed.
-   *
-   * @param entity entity to be added.
-   * @return 'FALSE' if already exists; 'TRUE' otherwise.
-   */
-  public boolean addEntity(final ODataEntity entity) {
-    return entities.contains(entity) ? false : entities.add(entity);
-  }
+  int getCount();
 
   /**
-   * Removes an entity.
+   * Sets in-line count.
    *
-   * @param entity entity to be removed.
-   * @return 'TRUE' in case of success; 'FALSE' otherwise.
+   * @param count in-line count value.
    */
-  public boolean removeEntity(final ODataEntity entity) {
-    return entities.remove(entity);
-  }
+  void setCount(final int count);
 
-  /**
-   * Gets contained entities.
-   *
-   * @return feed entries.
-   */
-  public List<ODataEntity> getEntities() {
-    return entities;
-  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataObjectFactory.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataObjectFactory.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataObjectFactory.java
index d8cbbbc..7114c5b 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataObjectFactory.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataObjectFactory.java
@@ -22,11 +22,6 @@ import java.net.URI;
 
 /**
  * Entry point for generating OData domain objects.
- *
- * @see ODataEntitySet
- * @see ODataEntity
- * @see ODataProperty
- * @see ODataLink
  */
 public interface ODataObjectFactory {
 
@@ -180,6 +175,12 @@ public interface ODataObjectFactory {
    */
   ODataLink newMediaEditLink(String name, URI baseURI, String href);
 
+  ODataPrimitiveValue.Builder newPrimitiveValueBuilder();
+
+  ODataComplexValue newComplexValue(String typeName);
+
+  ODataCollectionValue newCollectionValue(String typeName);
+
   /**
    * Instantiates a new primitive property.
    *

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataProperty.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataProperty.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataProperty.java
index e43f68c..4cfa303 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataProperty.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataProperty.java
@@ -19,141 +19,73 @@
 package org.apache.olingo.commons.api.domain;
 
 import java.io.Serializable;
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
 
 /**
  * OData entity property.
  */
-public class ODataProperty implements Serializable, ODataInvokeResult {
-
-  private static final long serialVersionUID = 926939448778950450L;
-
-  /**
-   * Property name.
-   */
-  private final String name;
-
-  /**
-   * Property value.
-   */
-  private ODataValue value;
-
-  /**
-   * Constructor.
-   *
-   * @param name property name.
-   * @param value property value.
-   */
-  public ODataProperty(final String name, final ODataValue value) {
-    this.name = name;
-    this.value = value;
-  }
+public interface ODataProperty extends ODataInvokeResult, Serializable {
 
   /**
    * Returns property name.
    *
    * @return property name.
    */
-  public String getName() {
-    return name;
-  }
-
-  /**
-   * Returns property value.
-   *
-   * @return property value.
-   */
-  public ODataValue getValue() {
-    return value;
-  }
+  String getName();
 
   /**
    * Checks if has null value.
    *
    * @return 'TRUE' if has null value; 'FALSE' otherwise.
    */
-  public boolean hasNullValue() {
-    return this.value == null;
-  }
+  boolean hasNullValue();
 
   /**
    * Checks if has primitive value.
    *
    * @return 'TRUE' if has primitive value; 'FALSE' otherwise.
    */
-  public boolean hasPrimitiveValue() {
-    return !hasNullValue() && this.value.isPrimitive();
-  }
+  boolean hasPrimitiveValue();
 
   /**
    * Gets primitive value.
    *
    * @return primitive value if exists; null otherwise.
    */
-  public ODataPrimitiveValue getPrimitiveValue() {
-    return hasPrimitiveValue() ? this.value.asPrimitive() : null;
-  }
+  ODataPrimitiveValue getPrimitiveValue();
 
   /**
-   * Checks if has complex value.
-   *
-   * @return 'TRUE' if has complex value; 'FALSE' otherwise.
-   */
-  public boolean hasComplexValue() {
-    return !hasNullValue() && this.value.isComplex();
-  }
-
-  /**
-   * Gets complex value.
+   * Returns property value.
    *
-   * @return complex value if exists; null otherwise.
+   * @return property value.
    */
-  public ODataComplexValue getComplexValue() {
-    return hasComplexValue() ? this.value.asComplex() : null;
-  }
+  ODataValue getValue();
 
   /**
    * Checks if has collection value.
    *
    * @return 'TRUE' if has collection value; 'FALSE' otherwise.
    */
-  public boolean hasCollectionValue() {
-    return !hasNullValue() && this.value.isCollection();
-  }
+  boolean hasCollectionValue();
 
   /**
    * Gets collection value.
    *
    * @return collection value if exists; null otherwise.
    */
-  public ODataCollectionValue getCollectionValue() {
-    return hasCollectionValue() ? this.value.asCollection() : null;
-  }
+  ODataCollectionValue getCollectionValue();
 
   /**
-   * {@inheritDoc }
+   * Checks if has complex value.
+   *
+   * @return 'TRUE' if has complex value; 'FALSE' otherwise.
    */
-  @Override
-  public boolean equals(final Object obj) {
-    return EqualsBuilder.reflectionEquals(this, obj);
-  }
+  boolean hasComplexValue();
 
   /**
-   * {@inheritDoc }
+   * Gets complex value.
+   *
+   * @return complex value if exists; null otherwise.
    */
-  @Override
-  public int hashCode() {
-    return HashCodeBuilder.reflectionHashCode(this);
-  }
+  ODataComplexValue getComplexValue();
 
-  /**
-   * {@inheritDoc }
-   */
-  @Override
-  public String toString() {
-    return ReflectionToStringBuilder.toString(this, ToStringStyle.MULTI_LINE_STYLE);
-  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ceda4740/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataValue.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataValue.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataValue.java
index b427e8f..6db4b2b 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataValue.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/ODataValue.java
@@ -26,6 +26,13 @@ import java.io.Serializable;
 public interface ODataValue extends Serializable {
 
   /**
+   * Gets value type name.
+   *
+   * @return value type name.
+   */
+  String getTypeName();
+
+  /**
    * Check is is a primitive value.
    *
    * @return 'TRUE' if primitive; 'FALSE' otherwise.