You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by sk...@apache.org on 2014/04/04 07:26:16 UTC

[12/51] [abbrv] git commit: [OLINGO-200] More V4 Enum tests

[OLINGO-200] More V4 Enum tests


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

Branch: refs/heads/olingo-206-validator
Commit: 117cf6f0d0099ef5d553e2a46b359d0e38222996
Parents: cd7ede0
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Sun Mar 30 16:12:17 2014 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Sun Mar 30 16:12:17 2014 +0200

----------------------------------------------------------------------
 .../retrieve/CommonRetrieveRequestFactory.java  |  12 +-
 .../retrieve/v3/RetrieveRequestFactory.java     |   2 +-
 .../AbstractRetrieveRequestFactory.java         |   8 +-
 .../retrieve/v3/RetrieveRequestFactoryImpl.java |  19 ++-
 .../retrieve/v4/RetrieveRequestFactoryImpl.java |  19 ++-
 .../client/core/op/AbstractODataBinder.java     |  35 +++--
 .../client/core/op/impl/v4/ODataBinderImpl.java |  45 +++++++
 .../core/it/v3/EntityCreateTestITCase.java      |   4 +-
 .../it/v3/NavigationLinkCreateTestITCase.java   |   2 +-
 .../olingo/client/core/v3/EntityTest.java       |   5 +-
 .../apache/olingo/client/core/v3/JSONTest.java  |   4 +-
 .../olingo/client/core/v4/EntityTest.java       | 133 +++++++++++++++++++
 .../api/domain/CommonODataObjectFactory.java    |   4 +-
 .../api/domain/v4/ODataObjectFactory.java       |   2 +
 .../core/domain/AbstractODataObjectFactory.java |   4 +-
 .../core/domain/v4/ODataEnumValueImpl.java      |  50 +++++++
 .../core/domain/v4/ODataObjectFactoryImpl.java  |   5 +
 17 files changed, 298 insertions(+), 55 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/117cf6f0/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/request/retrieve/CommonRetrieveRequestFactory.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/request/retrieve/CommonRetrieveRequestFactory.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/request/retrieve/CommonRetrieveRequestFactory.java
index f8d48b3..69e53e7 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/request/retrieve/CommonRetrieveRequestFactory.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/request/retrieve/CommonRetrieveRequestFactory.java
@@ -60,7 +60,7 @@ public interface CommonRetrieveRequestFactory extends Serializable {
   ODataServiceDocumentRequest getServiceDocumentRequest(String serviceRoot);
 
   /**
-   * Gets a query request returning a set of one or more OData entities.
+   * Gets a uri request returning a set of one or more OData entities.
    *
    * @param <T> concrete ODataEntitySet implementation.
    * @param uri request URI.
@@ -69,7 +69,7 @@ public interface CommonRetrieveRequestFactory extends Serializable {
   <T extends CommonODataEntitySet> ODataEntitySetRequest<T> getEntitySetRequest(URI uri);
 
   /**
-   * Gets a query request returning a set of one or more OData entities.
+   * Gets a uri request returning a set of one or more OData entities.
    * <br/>
    * Returned request gives the possibility to consume entities iterating on them without parsing and loading in memory
    * the entire entity set.
@@ -83,7 +83,7 @@ public interface CommonRetrieveRequestFactory extends Serializable {
           ODataEntitySetIteratorRequest<ES, E> getEntitySetIteratorRequest(URI uri);
 
   /**
-   * Gets a query request returning a single OData entity.
+   * Gets a uri request returning a single OData entity.
    *
    * @param <T> concrete ODataEntity implementation.
    * @param uri request URI.
@@ -92,7 +92,7 @@ public interface CommonRetrieveRequestFactory extends Serializable {
   <T extends CommonODataEntity> ODataEntityRequest<T> getEntityRequest(URI uri);
 
   /**
-   * Gets a query request returning a single OData entity property.
+   * Gets a uri request returning a single OData entity property.
    *
    * @param <T> concrete ODataProperty implementation.
    * @param uri request URI.
@@ -101,7 +101,7 @@ public interface CommonRetrieveRequestFactory extends Serializable {
   <T extends CommonODataProperty> ODataPropertyRequest<T> getPropertyRequest(URI uri);
 
   /**
-   * Gets a query request returning a single OData entity property value.
+   * Gets a uri request returning a single OData entity property value.
    *
    * @param uri request URI.
    * @return new {@link ODataValueRequest} instance.
@@ -109,7 +109,7 @@ public interface CommonRetrieveRequestFactory extends Serializable {
   ODataValueRequest getValueRequest(URI uri);
 
   /**
-   * Gets a query request returning a media stream.
+   * Gets a uri request returning a media stream.
    *
    * @param uri request URI.
    * @return new {@link ODataMediaRequest} instance.

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/117cf6f0/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/request/retrieve/v3/RetrieveRequestFactory.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/request/retrieve/v3/RetrieveRequestFactory.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/request/retrieve/v3/RetrieveRequestFactory.java
index 00568bd..0d133cb 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/request/retrieve/v3/RetrieveRequestFactory.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/request/retrieve/v3/RetrieveRequestFactory.java
@@ -47,7 +47,7 @@ public interface RetrieveRequestFactory extends CommonRetrieveRequestFactory {
   ODataPropertyRequest<ODataProperty> getPropertyRequest(URI uri);
 
   /**
-   * Gets a query request returning a single OData link.
+   * Gets a uri request returning a single OData link.
    *
    * @param targetURI target URI.
    * @param linkName link name.

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/117cf6f0/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/AbstractRetrieveRequestFactory.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/AbstractRetrieveRequestFactory.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/AbstractRetrieveRequestFactory.java
index a801953..d5e0319 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/AbstractRetrieveRequestFactory.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/AbstractRetrieveRequestFactory.java
@@ -39,13 +39,13 @@ public abstract class AbstractRetrieveRequestFactory implements CommonRetrieveRe
   }
 
   @Override
-  public ODataValueRequest getValueRequest(final URI query) {
-    return new ODataValueRequestImpl(client, query);
+  public ODataValueRequest getValueRequest(final URI uri) {
+    return new ODataValueRequestImpl(client, uri);
   }
 
   @Override
-  public ODataMediaRequest getMediaRequest(final URI query) {
-    return new ODataMediaRequestImpl(client, query);
+  public ODataMediaRequest getMediaRequest(final URI uri) {
+    return new ODataMediaRequestImpl(client, uri);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/117cf6f0/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v3/RetrieveRequestFactoryImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v3/RetrieveRequestFactoryImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v3/RetrieveRequestFactoryImpl.java
index 3943747..0e8db34 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v3/RetrieveRequestFactoryImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v3/RetrieveRequestFactoryImpl.java
@@ -36,6 +36,7 @@ import org.apache.olingo.commons.api.domain.v3.ODataEntity;
 import org.apache.olingo.commons.api.domain.v3.ODataEntitySet;
 import org.apache.olingo.commons.api.domain.v3.ODataProperty;
 
+@SuppressWarnings("unchecked")
 public class RetrieveRequestFactoryImpl extends AbstractRetrieveRequestFactory
         implements RetrieveRequestFactory {
 
@@ -56,27 +57,23 @@ public class RetrieveRequestFactoryImpl extends AbstractRetrieveRequestFactory
     return new ODataLinkCollectionRequestImpl((ODataClient) client, targetURI, linkName);
   }
 
-  @SuppressWarnings("unchecked")
   @Override
-  public ODataEntitySetRequest<ODataEntitySet> getEntitySetRequest(final URI query) {
-    return new ODataEntitySetRequestImpl<ODataEntitySet>(client, query);
+  public ODataEntitySetRequest<ODataEntitySet> getEntitySetRequest(final URI uri) {
+    return new ODataEntitySetRequestImpl<ODataEntitySet>(client, uri);
   }
 
-  @SuppressWarnings("unchecked")
   @Override
-  public ODataEntitySetIteratorRequest<ODataEntitySet, ODataEntity> getEntitySetIteratorRequest(URI uri) {
+  public ODataEntitySetIteratorRequest<ODataEntitySet, ODataEntity> getEntitySetIteratorRequest(final URI uri) {
     return new ODataEntitySetIteratorRequestImpl<ODataEntitySet, ODataEntity>(client, uri);
   }
 
-  @SuppressWarnings("unchecked")
   @Override
-  public ODataEntityRequest<ODataEntity> getEntityRequest(final URI query) {
-    return new ODataEntityRequestImpl<ODataEntity>(client, query);
+  public ODataEntityRequest<ODataEntity> getEntityRequest(final URI uri) {
+    return new ODataEntityRequestImpl<ODataEntity>(client, uri);
   }
 
-  @SuppressWarnings("unchecked")
   @Override
-  public ODataPropertyRequest<ODataProperty> getPropertyRequest(final URI query) {
-    return new ODataPropertyRequestImpl<ODataProperty>(client, query);
+  public ODataPropertyRequest<ODataProperty> getPropertyRequest(final URI uri) {
+    return new ODataPropertyRequestImpl<ODataProperty>(client, uri);
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/117cf6f0/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v4/RetrieveRequestFactoryImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v4/RetrieveRequestFactoryImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v4/RetrieveRequestFactoryImpl.java
index 96419c2..879417b 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v4/RetrieveRequestFactoryImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/retrieve/v4/RetrieveRequestFactoryImpl.java
@@ -35,6 +35,7 @@ import org.apache.olingo.commons.api.domain.v4.ODataEntity;
 import org.apache.olingo.commons.api.domain.v4.ODataEntitySet;
 import org.apache.olingo.commons.api.domain.v4.ODataProperty;
 
+@SuppressWarnings("unchecked")
 public class RetrieveRequestFactoryImpl extends AbstractRetrieveRequestFactory
         implements RetrieveRequestFactory {
 
@@ -50,27 +51,23 @@ public class RetrieveRequestFactoryImpl extends AbstractRetrieveRequestFactory
             client.getURIBuilder(serviceRoot).appendMetadataSegment().build());
   }
 
-  @SuppressWarnings("unchecked")
   @Override
-  public ODataEntitySetRequest<ODataEntitySet> getEntitySetRequest(final URI query) {
-    return new ODataEntitySetRequestImpl<ODataEntitySet>(client, query);
+  public ODataEntitySetRequest<ODataEntitySet> getEntitySetRequest(final URI uri) {
+    return new ODataEntitySetRequestImpl<ODataEntitySet>(client, uri);
   }
 
-  @SuppressWarnings("unchecked")
   @Override
-  public ODataEntitySetIteratorRequest<ODataEntitySet, ODataEntity> getEntitySetIteratorRequest(URI uri) {
+  public ODataEntitySetIteratorRequest<ODataEntitySet, ODataEntity> getEntitySetIteratorRequest(final URI uri) {
     return new ODataEntitySetIteratorRequestImpl<ODataEntitySet, ODataEntity>(client, uri);
   }
 
-  @SuppressWarnings("unchecked")
   @Override
-  public ODataEntityRequest<ODataEntity> getEntityRequest(final URI query) {
-    return new ODataEntityRequestImpl<ODataEntity>(client, query);
+  public ODataEntityRequest<ODataEntity> getEntityRequest(final URI uri) {
+    return new ODataEntityRequestImpl<ODataEntity>(client, uri);
   }
 
-  @SuppressWarnings("unchecked")
   @Override
-  public ODataPropertyRequest<ODataProperty> getPropertyRequest(final URI query) {
-    return new ODataPropertyRequestImpl<ODataProperty>(client, query);
+  public ODataPropertyRequest<ODataProperty> getPropertyRequest(final URI uri) {
+    return new ODataPropertyRequestImpl<ODataProperty>(client, uri);
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/117cf6f0/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 4c86604..13a49fb 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.CommonODataProperty;
+import org.apache.olingo.commons.api.domain.ODataLinkType;
 import org.apache.olingo.commons.api.domain.ODataServiceDocument;
 import org.apache.olingo.commons.api.domain.ODataValue;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
@@ -54,6 +55,7 @@ import org.apache.olingo.commons.core.data.JSONPropertyImpl;
 import org.apache.olingo.commons.core.data.LinkImpl;
 import org.apache.olingo.commons.core.data.NullValueImpl;
 import org.apache.olingo.commons.core.data.PrimitiveValueImpl;
+import org.apache.olingo.commons.core.edm.EdmTypeInfo;
 import org.apache.olingo.commons.core.op.ResourceFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -228,7 +230,7 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
     return propertyResource;
   }
 
-  private Value getValue(final ODataValue value, final Class<? extends Entry> reference, final boolean setType) {
+  protected Value getValue(final ODataValue value, final Class<? extends Entry> reference, final boolean setType) {
     Value valueResource = null;
 
     if (value == null) {
@@ -329,8 +331,12 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
       final Feed inlineFeed = link.getInlineFeed();
 
       if (inlineEntry == null && inlineFeed == null) {
-        entity.addLink(
-                client.getObjectFactory().newEntityNavigationLink(link.getTitle(), base, link.getHref()));
+        final ODataLinkType linkType = link.getType() == null
+                ? ODataLinkType.ENTITY_NAVIGATION
+                : ODataLinkType.fromString(client.getServiceVersion(), link.getRel(), link.getType());
+        entity.addLink(linkType == ODataLinkType.ENTITY_NAVIGATION
+                ? client.getObjectFactory().newEntityNavigationLink(link.getTitle(), base, link.getHref())
+                : client.getObjectFactory().newEntitySetNavigationLink(link.getTitle(), base, link.getHref()));
       } else if (inlineEntry != null) {
         entity.addLink(client.getObjectFactory().newInlineEntity(
                 link.getTitle(), base, link.getHref(),
@@ -369,28 +375,35 @@ public abstract class AbstractODataBinder implements CommonODataBinder {
   protected ODataValue getODataValue(final Property resource) {
     ODataValue value = null;
 
+    final EdmTypeInfo typeInfo = resource.getType() == null
+            ? null
+            : new EdmTypeInfo.Builder().setTypeExpression(resource.getType()).build();
     if (resource.getValue().isPrimitive()) {
       value = client.getObjectFactory().newPrimitiveValueBuilder().
               setText(resource.getValue().asPrimitive().get()).
-              setType(resource.getType() == null
+              setType(typeInfo == null
                       ? null
-                      : EdmPrimitiveTypeKind.valueOfFQN(client.getServiceVersion(), resource.getType())).build();
+                      : EdmPrimitiveTypeKind.valueOfFQN(
+                              client.getServiceVersion(), typeInfo.getFullQualifiedName().toString())).build();
     } else if (resource.getValue().isGeospatial()) {
       value = client.getObjectFactory().newPrimitiveValueBuilder().
               setValue(resource.getValue().asGeospatial().get()).
-              setType(resource.getType() == null
-                      || EdmPrimitiveTypeKind.Geography.getFullQualifiedName().toString().equals(resource.getType())
-                      || EdmPrimitiveTypeKind.Geometry.getFullQualifiedName().toString().equals(resource.getType())
+              setType(typeInfo == null
+                      || EdmPrimitiveTypeKind.Geography.getFullQualifiedName().equals(typeInfo.getFullQualifiedName())
+                      || EdmPrimitiveTypeKind.Geometry.getFullQualifiedName().equals(typeInfo.getFullQualifiedName())
                       ? resource.getValue().asGeospatial().get().getEdmPrimitiveTypeKind()
-                      : EdmPrimitiveTypeKind.valueOfFQN(client.getServiceVersion(), resource.getType())).build();
+                      : EdmPrimitiveTypeKind.valueOfFQN(
+                              client.getServiceVersion(), typeInfo.getFullQualifiedName().toString())).build();
     } else if (resource.getValue().isComplex()) {
-      value = client.getObjectFactory().newComplexValue(resource.getType());
+      value = client.getObjectFactory().newComplexValue(typeInfo == null
+              ? null : typeInfo.getFullQualifiedName().toString());
 
       for (Property property : resource.getValue().asComplex().get()) {
         value.asComplex().add(getODataProperty(property));
       }
     } else if (resource.getValue().isCollection()) {
-      value = client.getObjectFactory().newCollectionValue(resource.getType());
+      value = client.getObjectFactory().newCollectionValue(typeInfo == null
+              ? null : "Collection(" + typeInfo.getFullQualifiedName().toString() + ")");
 
       for (Value _value : resource.getValue().asCollection().get()) {
         final JSONPropertyImpl fake = new JSONPropertyImpl();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/117cf6f0/lib/client-core/src/main/java/org/apache/olingo/client/core/op/impl/v4/ODataBinderImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/op/impl/v4/ODataBinderImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/op/impl/v4/ODataBinderImpl.java
index 0acc7d1..e85b34e 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/op/impl/v4/ODataBinderImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/op/impl/v4/ODataBinderImpl.java
@@ -29,13 +29,17 @@ import org.apache.olingo.client.core.op.AbstractODataBinder;
 import org.apache.olingo.commons.api.data.Entry;
 import org.apache.olingo.commons.api.data.Feed;
 import org.apache.olingo.commons.api.data.Property;
+import org.apache.olingo.commons.api.data.Value;
 import org.apache.olingo.commons.api.domain.CommonODataEntity;
 import org.apache.olingo.commons.api.domain.CommonODataEntitySet;
 import org.apache.olingo.commons.api.domain.CommonODataProperty;
+import org.apache.olingo.commons.api.domain.ODataValue;
 import org.apache.olingo.commons.api.domain.v4.ODataEntity;
 import org.apache.olingo.commons.api.domain.v4.ODataEntitySet;
 import org.apache.olingo.commons.api.domain.v4.ODataProperty;
+import org.apache.olingo.commons.core.data.EnumValueImpl;
 import org.apache.olingo.commons.core.domain.v4.ODataPropertyImpl;
+import org.apache.olingo.commons.core.edm.EdmTypeInfo;
 
 public class ODataBinderImpl extends AbstractODataBinder implements ODataBinder {
 
@@ -86,6 +90,31 @@ public class ODataBinderImpl extends AbstractODataBinder implements ODataBinder
   }
 
   @Override
+  public Property getProperty(final CommonODataProperty property, final Class<? extends Entry> reference,
+          final boolean setType) {
+
+    final Property propertyResource = super.getProperty(property, reference, setType);
+    if (property instanceof ODataProperty && ((ODataProperty) property).hasEnumValue() && setType) {
+      propertyResource.setType(((ODataProperty) property).getEnumValue().getTypeName());
+    }
+    return propertyResource;
+  }
+
+  @Override
+  protected Value getValue(final ODataValue value, final Class<? extends Entry> reference, final boolean setType) {
+    Value valueResource;
+    if (value instanceof org.apache.olingo.commons.api.domain.v4.ODataValue
+            && ((org.apache.olingo.commons.api.domain.v4.ODataValue) value).isEnum()) {
+
+      valueResource = new EnumValueImpl(
+              ((org.apache.olingo.commons.api.domain.v4.ODataValue) value).asEnum().getValue());
+    } else {
+      valueResource = super.getValue(value, reference, setType);
+    }
+    return valueResource;
+  }
+
+  @Override
   public ODataEntitySet getODataEntitySet(final Feed resource) {
     return (ODataEntitySet) super.getODataEntitySet(resource);
   }
@@ -112,4 +141,20 @@ public class ODataBinderImpl extends AbstractODataBinder implements ODataBinder
     return new ODataPropertyImpl(property.getName(), getODataValue(property));
   }
 
+  @Override
+  protected ODataValue getODataValue(final Property resource) {
+    ODataValue value;
+    if (resource.getValue().isEnum()) {
+      final EdmTypeInfo typeInfo = resource.getType() == null
+              ? null
+              : new EdmTypeInfo.Builder().setTypeExpression(resource.getType()).build();
+      value = ((ODataClient) client).getObjectFactory().newEnumValue(
+              typeInfo == null ? null : typeInfo.getFullQualifiedName().toString(),
+              resource.getValue().asEnum().get());
+    } else {
+      value = super.getODataValue(resource);
+    }
+
+    return value;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/117cf6f0/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 bd1419f..2a4efee 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
@@ -305,7 +305,7 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
               client.getURIBuilder(getServiceRoot()).appendEntitySetSegment("Order").build(), order);
       createReq.setFormat(format);
 
-      original.addLink(client.getObjectFactory().newFeedNavigationLink(
+      original.addLink(client.getObjectFactory().newEntitySetNavigationLink(
               "Orders",
               createReq.execute().getBody().getEditLink()));
     }
@@ -409,7 +409,7 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
     ODataEntity changes = client.getObjectFactory().newEntity(
             "Microsoft.Test.OData.Services.AstoriaDefaultService.Customer");
     changes.setEditLink(customer.getEditLink());
-    changes.addLink(client.getObjectFactory().newFeedNavigationLink(
+    changes.addLink(client.getObjectFactory().newEntitySetNavigationLink(
             "Orders", URIUtils.getURI(getServiceRoot(), order.getEditLink().toASCIIString())));
     update(UpdateType.PATCH, changes, format, null);
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/117cf6f0/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 fcbbe80..3b518d9 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
@@ -223,7 +223,7 @@ public class NavigationLinkCreateTestITCase extends AbstractTestITCase {
                 orderEntity);
         createReq.setFormat(format);
         createReq.setContentType(contentType);
-        original.addLink(client.getObjectFactory().newFeedNavigationLink(
+        original.addLink(client.getObjectFactory().newEntitySetNavigationLink(
                 "Orders",
                 createReq.execute().getBody().getEditLink()));
       }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/117cf6f0/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/EntityTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/EntityTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/EntityTest.java
index fe5b148..41da651 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/EntityTest.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/EntityTest.java
@@ -29,6 +29,7 @@ import org.apache.olingo.commons.api.domain.ODataLink;
 import org.apache.olingo.commons.api.domain.CommonODataProperty;
 import org.apache.olingo.commons.api.format.ODataPubFormat;
 import org.apache.olingo.client.core.AbstractTest;
+import org.apache.olingo.commons.api.domain.v3.ODataEntity;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
 import org.apache.olingo.commons.core.op.ResourceFactory;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
@@ -45,7 +46,7 @@ public class EntityTest extends AbstractTest {
 
   private void readAndWrite(final ODataPubFormat format) {
     final InputStream input = getClass().getResourceAsStream("Customer_-10." + getSuffix(format));
-    final CommonODataEntity entity = getClient().getBinder().getODataEntity(
+    final ODataEntity entity = getClient().getBinder().getODataEntity(
             getClient().getDeserializer().toEntry(input, format).getObject());
     assertNotNull(entity);
 
@@ -64,7 +65,7 @@ public class EntityTest extends AbstractTest {
 
     assertTrue(check);
 
-    final CommonODataEntity written = getClient().getBinder().getODataEntity(getClient().getBinder().
+    final ODataEntity written = getClient().getBinder().getODataEntity(getClient().getBinder().
             getEntry(entity, ResourceFactory.entryClassForFormat(format == ODataPubFormat.ATOM)));
     assertEquals(entity, written);
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/117cf6f0/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/JSONTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/JSONTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/JSONTest.java
index bae0bdd..522e686 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/JSONTest.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/JSONTest.java
@@ -1,5 +1,3 @@
-package org.apache.olingo.client.core.v3;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,8 @@ package org.apache.olingo.client.core.v3;
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.olingo.client.core.v3;
+
 import static org.junit.Assert.assertEquals;
 
 import com.fasterxml.jackson.databind.JsonNode;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/117cf6f0/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/EntityTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/EntityTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/EntityTest.java
new file mode 100644
index 0000000..f9c57c2
--- /dev/null
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/EntityTest.java
@@ -0,0 +1,133 @@
+/*
+ * 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.client.core.v4;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.InputStream;
+import java.util.Iterator;
+import org.apache.olingo.client.api.v4.ODataClient;
+import org.apache.olingo.client.core.AbstractTest;
+import org.apache.olingo.commons.api.domain.ODataLink;
+import org.apache.olingo.commons.api.domain.ODataLinkType;
+import org.apache.olingo.commons.api.domain.ODataValue;
+import org.apache.olingo.commons.api.domain.v4.ODataEntity;
+import org.apache.olingo.commons.api.domain.v4.ODataProperty;
+import org.apache.olingo.commons.api.format.ODataPubFormat;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmDateTimeOffset;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmDuration;
+import org.apache.olingo.commons.core.op.ResourceFactory;
+import org.junit.Test;
+
+public class EntityTest extends AbstractTest {
+
+  @Override
+  protected ODataClient getClient() {
+    return v4Client;
+  }
+
+  private void singleton(final ODataPubFormat format) {
+    final InputStream input = getClass().getResourceAsStream("VipCustomer." + getSuffix(format));
+    final ODataEntity entity = getClient().getBinder().getODataEntity(
+            getClient().getDeserializer().toEntry(input, format).getObject());
+    assertNotNull(entity);
+
+    assertEquals("#Microsoft.Test.OData.Services.ODataWCFService.Customer", entity.getName());
+
+    final ODataProperty birthday = entity.getProperty("Birthday");
+    assertTrue(birthday.hasPrimitiveValue());
+    assertEquals(EdmDateTimeOffset.getInstance(), birthday.getPrimitiveValue().getType());
+
+    final ODataProperty timeBetweenLastTwoOrders = entity.getProperty("TimeBetweenLastTwoOrders");
+    assertTrue(timeBetweenLastTwoOrders.hasPrimitiveValue());
+    assertEquals(EdmDuration.getInstance(), timeBetweenLastTwoOrders.getPrimitiveValue().getType());
+
+    int checked = 0;
+    for (ODataLink link : entity.getNavigationLinks()) {
+      if ("Parent".equals(link.getName())) {
+        checked++;
+        assertEquals(ODataLinkType.ENTITY_NAVIGATION, link.getType());
+      }
+      if ("Orders".equals(link.getName())) {
+        checked++;
+        if (format == ODataPubFormat.ATOM) {
+          assertEquals(ODataLinkType.ENTITY_SET_NAVIGATION, link.getType());
+        }
+      }
+      if ("Company".equals(link.getName())) {
+        checked++;
+        assertEquals(ODataLinkType.ENTITY_NAVIGATION, link.getType());
+      }
+    }
+    assertEquals(3, checked);
+
+    // operations won't get serialized
+    entity.getOperations().clear();
+    final ODataEntity written = getClient().getBinder().getODataEntity(getClient().getBinder().
+            getEntry(entity, ResourceFactory.entryClassForFormat(format == ODataPubFormat.ATOM)));
+    assertEquals(entity, written);
+  }
+
+  @Test
+  public void atomSingleton() {
+    singleton(ODataPubFormat.ATOM);
+  }
+
+  @Test
+  public void jsonSingleton() {
+    singleton(ODataPubFormat.JSON_FULL_METADATA);
+  }
+
+  private void withEnums(final ODataPubFormat format) {
+    final InputStream input = getClass().getResourceAsStream("Products_5." + getSuffix(format));
+    final ODataEntity entity = getClient().getBinder().getODataEntity(
+            getClient().getDeserializer().toEntry(input, format).getObject());
+    assertNotNull(entity);
+
+    final ODataProperty skinColor = entity.getProperty("SkinColor");
+    assertTrue(skinColor.hasEnumValue());
+    assertEquals("Microsoft.Test.OData.Services.ODataWCFService.Color", skinColor.getEnumValue().getTypeName());
+    assertEquals("Red", skinColor.getEnumValue().getValue());
+
+//    final ODataProperty coverColors = entity.getProperty("CoverColors");
+//    assertTrue(coverColors.hasCollectionValue());
+//    for (final Iterator<ODataValue> itor = coverColors.getCollectionValue().iterator(); itor.hasNext();) {
+//      final ODataValue item = itor.next();
+//      assertTrue(item.isEnum());
+//    }
+
+    // operations won't get serialized
+    entity.getOperations().clear();    
+    final ODataEntity written = getClient().getBinder().getODataEntity(getClient().getBinder().
+            getEntry(entity, ResourceFactory.entryClassForFormat(format == ODataPubFormat.ATOM)));
+    assertEquals(entity, written);
+  }
+
+  @Test
+  public void atomWithEnums() {
+    withEnums(ODataPubFormat.ATOM);
+  }
+
+  @Test
+  public void jsonWithEnums() {
+    withEnums(ODataPubFormat.JSON_FULL_METADATA);
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/117cf6f0/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/CommonODataObjectFactory.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/CommonODataObjectFactory.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/CommonODataObjectFactory.java
index 525dc9d..40ffda9 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/CommonODataObjectFactory.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/CommonODataObjectFactory.java
@@ -125,7 +125,7 @@ public interface CommonODataObjectFactory {
    * @param link link.
    * @return entity set navigation link.
    */
-  ODataLink newFeedNavigationLink(String name, URI link);
+  ODataLink newEntitySetNavigationLink(String name, URI link);
 
   /**
    * Instantiates a new entity set navigation link.
@@ -135,7 +135,7 @@ public interface CommonODataObjectFactory {
    * @param href href.
    * @return entity set navigation link.
    */
-  ODataLink newFeedNavigationLink(String name, URI baseURI, String href);
+  ODataLink newEntitySetNavigationLink(String name, URI baseURI, String href);
 
   /**
    * Instantiates a new association link.

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/117cf6f0/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/v4/ODataObjectFactory.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/v4/ODataObjectFactory.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/v4/ODataObjectFactory.java
index 8b43bc1..d12f0dc 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/v4/ODataObjectFactory.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/domain/v4/ODataObjectFactory.java
@@ -38,6 +38,8 @@ public interface ODataObjectFactory extends CommonODataObjectFactory {
   @Override
   ODataEntity newEntity(String name, URI link);
 
+  ODataEnumValue newEnumValue(String typeName, String value);
+
   @Override
   ODataProperty newPrimitiveProperty(String name, ODataPrimitiveValue value);
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/117cf6f0/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataObjectFactory.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataObjectFactory.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataObjectFactory.java
index ea73910..a3133cd 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataObjectFactory.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/AbstractODataObjectFactory.java
@@ -80,13 +80,13 @@ public abstract class AbstractODataObjectFactory implements CommonODataObjectFac
   }
 
   @Override
-  public ODataLink newFeedNavigationLink(final String name, final URI link) {
+  public ODataLink newEntitySetNavigationLink(final String name, final URI link) {
     return new ODataLink.Builder().setVersion(version).setURI(link).
             setType(ODataLinkType.ENTITY_SET_NAVIGATION).setTitle(name).build();
   }
 
   @Override
-  public ODataLink newFeedNavigationLink(final String name, final URI baseURI, final String href) {
+  public ODataLink newEntitySetNavigationLink(final String name, final URI baseURI, final String href) {
     return new ODataLink.Builder().setVersion(version).setURI(baseURI, href).
             setType(ODataLinkType.ENTITY_SET_NAVIGATION).setTitle(name).build();
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/117cf6f0/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/v4/ODataEnumValueImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/v4/ODataEnumValueImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/v4/ODataEnumValueImpl.java
new file mode 100644
index 0000000..ee21018
--- /dev/null
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/v4/ODataEnumValueImpl.java
@@ -0,0 +1,50 @@
+/*
+ * 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.commons.core.domain.v4;
+
+import org.apache.olingo.commons.api.domain.AbstractODataValue;
+import org.apache.olingo.commons.api.domain.v4.ODataEnumValue;
+
+public class ODataEnumValueImpl extends AbstractODataValue implements ODataEnumValue {
+
+  private static final long serialVersionUID = 5830261159033325828L;
+
+  private final String value;
+
+  public ODataEnumValueImpl(final String typeName, final String value) {
+    super(typeName);
+    this.value = value;
+  }
+
+  @Override
+  public String getValue() {
+    return value;
+  }
+
+  @Override
+  public boolean isEnum() {
+    return true;
+  }
+
+  @Override
+  public ODataEnumValue asEnum() {
+    return this;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/117cf6f0/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/v4/ODataObjectFactoryImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/v4/ODataObjectFactoryImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/v4/ODataObjectFactoryImpl.java
index 1b6428f..0a84407 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/v4/ODataObjectFactoryImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/domain/v4/ODataObjectFactoryImpl.java
@@ -59,6 +59,11 @@ public class ODataObjectFactoryImpl extends AbstractODataObjectFactory implement
   }
 
   @Override
+  public ODataEnumValue newEnumValue(final String typeName, final String value) {
+    return new ODataEnumValueImpl(typeName, value);
+  }
+
+  @Override
   public ODataProperty newPrimitiveProperty(final String name, final ODataPrimitiveValue value) {
     return new ODataPropertyImpl(name, value);
   }