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/05/19 15:28:13 UTC

[24/50] [abbrv] git commit: [OLINGO-260] (Proxy) context tests

[OLINGO-260] (Proxy) context 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/ad770860
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/ad770860
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/ad770860

Branch: refs/heads/master
Commit: ad770860869de24e4311699d78a50f08aa222cc0
Parents: 42c29de
Author: Francesco Chicchiriccò <--global>
Authored: Tue May 13 15:56:11 2014 +0200
Committer: Stephan Klevenz <st...@sap.com>
Committed: Mon May 19 14:32:16 2014 +0200

----------------------------------------------------------------------
 .../proxy/commons/ComplexInvocationHandler.java |  94 ++++++++---
 .../proxy/commons/EntityInvocationHandler.java  | 168 ++++++++++---------
 .../java/org/apache/olingo/fit/V3Services.java  |  18 +-
 .../olingo/fit/utils/AbstractUtilities.java     |   1 +
 .../olingo/fit/proxy/v3/ContextTestITCase.java  |  92 +++++-----
 5 files changed, 210 insertions(+), 163 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ad770860/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java
index b85452d..28bf280 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ComplexInvocationHandler.java
@@ -20,6 +20,7 @@ package org.apache.olingo.ext.proxy.commons;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Proxy;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
@@ -31,6 +32,7 @@ import org.apache.olingo.client.api.CommonEdmEnabledODataClient;
 import org.apache.olingo.commons.api.domain.CommonODataProperty;
 import org.apache.olingo.commons.api.domain.ODataComplexValue;
 import org.apache.olingo.commons.api.domain.ODataLinked;
+import org.apache.olingo.commons.api.domain.ODataValue;
 import org.apache.olingo.commons.api.edm.EdmElement;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.core.edm.EdmTypeInfo;
@@ -41,16 +43,17 @@ import org.apache.olingo.ext.proxy.context.AttachedEntityStatus;
 import org.apache.olingo.ext.proxy.utils.ClassUtils;
 import org.apache.olingo.ext.proxy.utils.CoreUtils;
 
-public class ComplexInvocationHandler extends AbstractStructuredInvocationHandler {
+public class ComplexTypeInvocationHandler<C extends CommonEdmEnabledODataClient<?>>
+        extends AbstractTypeInvocationHandler<C> {
 
   private static final long serialVersionUID = 2629912294765040037L;
 
-  public static ComplexInvocationHandler getInstance(
+  public static ComplexTypeInvocationHandler<?> getInstance(
           final CommonEdmEnabledODataClient<?> client,
           final String propertyName,
           final Class<?> reference,
-          final EntityInvocationHandler handler) {
-
+          final EntityTypeInvocationHandler<?> handler) {
+    
     final Class<?> complexTypeRef;
     if (Collection.class.isAssignableFrom(reference)) {
       complexTypeRef = ClassUtils.extractTypeArg(reference);
@@ -69,28 +72,38 @@ public class ComplexInvocationHandler extends AbstractStructuredInvocationHandle
     final ODataComplexValue<? extends CommonODataProperty> complex =
             client.getObjectFactory().newComplexValue(typeName.toString());
 
-    return (ComplexInvocationHandler) ComplexInvocationHandler.getInstance(
+    return (ComplexTypeInvocationHandler<?>) ComplexTypeInvocationHandler.getInstance(
             client, complex, complexTypeRef, handler);
   }
 
-  public static ComplexInvocationHandler getInstance(
+  @SuppressWarnings({"unchecked", "rawtypes"})
+  static ComplexTypeInvocationHandler<?> getInstance(
           final CommonEdmEnabledODataClient<?> client,
           final ODataComplexValue<?> complex,
           final Class<?> typeRef,
-          final EntityInvocationHandler handler) {
+          final EntityTypeInvocationHandler<?> handler) {
 
-    return new ComplexInvocationHandler(client, complex, typeRef, handler);
+    return new ComplexTypeInvocationHandler(client, complex, typeRef, handler);
   }
 
-  public ComplexInvocationHandler(
-          final CommonEdmEnabledODataClient<?> client,
+  public ComplexTypeInvocationHandler(
+          final C client,
           final ODataComplexValue<?> complex,
           final Class<?> typeRef,
-          final EntityInvocationHandler handler) {
+          final EntityTypeInvocationHandler<C> handler) {
 
     super(client, typeRef, complex, handler);
   }
 
+  public void setComplex(final ODataComplexValue<?> complex) {
+    this.internal = complex;
+  }
+
+  @Override
+  public FullQualifiedName getName() {
+    return new FullQualifiedName(((ODataComplexValue<?>) this.internal).getTypeName());
+  }
+
   @SuppressWarnings("unchecked")
   public ODataComplexValue<CommonODataProperty> getComplex() {
     return (ODataComplexValue<CommonODataProperty>) this.internal;
@@ -99,7 +112,48 @@ public class ComplexInvocationHandler extends AbstractStructuredInvocationHandle
   @Override
   protected Object getPropertyValue(final String name, final Type type) {
     try {
-      return CoreUtils.getValueFromProperty(client, getComplex().get(name), type, getEntityHandler());
+      final Object res;
+
+      final CommonODataProperty property = getComplex().get(name);
+      if (property == null) {
+        res = null;
+      } else if (property.hasComplexValue()) {
+        res = Proxy.newProxyInstance(
+                Thread.currentThread().getContextClassLoader(),
+                new Class<?>[] {(Class<?>) type},
+                ComplexTypeInvocationHandler.getInstance(
+                client, property.getValue().asComplex(), (Class<?>) type, targetHandler));
+
+      } else if (property.hasCollectionValue()) {
+        final ParameterizedType collType = (ParameterizedType) type;
+        final Class<?> collItemClass = (Class<?>) collType.getActualTypeArguments()[0];
+
+        final ArrayList<Object> collection = new ArrayList<Object>();
+
+        final Iterator<ODataValue> collPropItor = property.getValue().asCollection().iterator();
+        while (collPropItor.hasNext()) {
+          final ODataValue value = collPropItor.next();
+          if (value.isPrimitive()) {
+            collection.add(CoreUtils.primitiveValueToObject(value.asPrimitive()));
+          } else if (value.isComplex()) {
+            final Object collItem = Proxy.newProxyInstance(
+                    Thread.currentThread().getContextClassLoader(),
+                    new Class<?>[] {collItemClass},
+                    ComplexTypeInvocationHandler.getInstance(
+                    client, value.asComplex(), collItemClass, targetHandler));
+
+            collection.add(collItem);
+          }
+        }
+
+        res = collection;
+      } else {
+        res = type == null
+                ? CoreUtils.getValueFromProperty(client, property)
+                : CoreUtils.getValueFromProperty(client, property, type);
+      }
+
+      return res;
     } catch (Exception e) {
       throw new IllegalArgumentException("Error getting value for property '" + name + "'", e);
     }
@@ -117,7 +171,7 @@ public class ComplexInvocationHandler extends AbstractStructuredInvocationHandle
       }
     }
 
-    for (final Iterator<? extends CommonODataProperty> itor = getComplex().iterator(); itor.hasNext();) {
+    for (Iterator<? extends CommonODataProperty> itor = getComplex().iterator(); itor.hasNext();) {
       final CommonODataProperty property = itor.next();
       if (!propertyNames.contains(property.getName())) {
         res.add(property.getName());
@@ -150,13 +204,15 @@ public class ComplexInvocationHandler extends AbstractStructuredInvocationHandle
       toBeAdded = value;
     }
 
-    final EdmTypeInfo type = new EdmTypeInfo.Builder().setEdm(client.getCachedEdm()).setTypeExpression(
+    final EdmTypeInfo type = new EdmTypeInfo.Builder().
+            setEdm(client.getCachedEdm()).setTypeExpression(
             edmProperty.isCollection() ? "Collection(" + property.type() + ")" : property.type()).build();
 
-    client.getBinder().add(getComplex(), CoreUtils.getODataProperty(client, property.name(), type, toBeAdded));
+    client.getBinder().add(
+            getComplex(), CoreUtils.getODataProperty(client, property.name(), type, toBeAdded));
 
-    if (getEntityHandler() != null && !entityContext.isAttached(getEntityHandler())) {
-      entityContext.attach(getEntityHandler(), AttachedEntityStatus.CHANGED);
+    if (targetHandler != null && !entityContext.isAttached(targetHandler)) {
+      entityContext.attach(targetHandler, AttachedEntityStatus.CHANGED);
     }
   }
 
@@ -166,7 +222,7 @@ public class ComplexInvocationHandler extends AbstractStructuredInvocationHandle
       throw new UnsupportedOperationException("Internal object is not navigable");
     }
 
-    return retrieveNavigationProperty(property, getter, containerHandler.getFactory().getServiceRoot());
+    return retriveNavigationProperty(property, getter);
   }
 
   @Override
@@ -181,6 +237,6 @@ public class ComplexInvocationHandler extends AbstractStructuredInvocationHandle
 
   @Override
   public boolean isChanged() {
-    return getEntityHandler() == null ? false : getEntityHandler().isChanged();
+    return targetHandler == null ? false : targetHandler.isChanged();
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ad770860/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityInvocationHandler.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityInvocationHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityInvocationHandler.java
index 6b1f08b..0e093b4 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityInvocationHandler.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityInvocationHandler.java
@@ -20,26 +20,29 @@ package org.apache.olingo.ext.proxy.commons;
 
 import java.io.InputStream;
 import java.lang.annotation.Annotation;
-import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Proxy;
 import java.lang.reflect.Type;
 import java.net.URI;
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.olingo.client.api.CommonEdmEnabledODataClient;
 import org.apache.olingo.client.api.communication.request.retrieve.ODataMediaRequest;
 import org.apache.olingo.client.core.uri.URIUtils;
 import org.apache.olingo.commons.api.domain.CommonODataEntity;
 import org.apache.olingo.commons.api.domain.CommonODataProperty;
 import org.apache.olingo.commons.api.domain.ODataLinked;
+import org.apache.olingo.commons.api.domain.ODataValue;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.format.ODataMediaFormat;
 import org.apache.olingo.ext.proxy.api.annotations.EntityType;
 import org.apache.olingo.ext.proxy.api.annotations.NavigationProperty;
@@ -48,12 +51,11 @@ import org.apache.olingo.ext.proxy.context.AttachedEntityStatus;
 import org.apache.olingo.ext.proxy.context.EntityUUID;
 import org.apache.olingo.ext.proxy.utils.CoreUtils;
 
-public class EntityInvocationHandler extends AbstractStructuredInvocationHandler {
+public class EntityTypeInvocationHandler<C extends CommonEdmEnabledODataClient<?>>
+        extends AbstractTypeInvocationHandler<C> {
 
   private static final long serialVersionUID = 2629912294765040037L;
 
-  private final URI entityURI;
-
   protected Map<String, Object> propertyChanges = new HashMap<String, Object>();
 
   protected Map<NavigationProperty, Object> linkChanges = new HashMap<NavigationProperty, Object>();
@@ -68,46 +70,42 @@ public class EntityInvocationHandler extends AbstractStructuredInvocationHandler
 
   private EntityUUID uuid;
 
-  static EntityInvocationHandler getInstance(
-          final URI entityURI,
+  static EntityTypeInvocationHandler<?> getInstance(
           final CommonODataEntity entity,
-          final EntitySetInvocationHandler<?, ?, ?> entitySet,
+          final EntitySetInvocationHandler<?, ?, ?, ?> entitySet,
           final Class<?> typeRef) {
 
     return getInstance(
-            entityURI,
             entity,
-            entitySet.getEntitySetURI(),
+            entitySet.getEntitySetName(),
             typeRef,
             entitySet.containerHandler);
   }
 
-  static EntityInvocationHandler getInstance(
-          final URI entityURI,
+  @SuppressWarnings({"unchecked", "rawtypes"})
+  static EntityTypeInvocationHandler<?> getInstance(
           final CommonODataEntity entity,
-          final URI entitySetURI,
+          final String entitySetName,
           final Class<?> typeRef,
-          final EntityContainerInvocationHandler containerHandler) {
+          final EntityContainerInvocationHandler<?> containerHandler) {
 
-    return new EntityInvocationHandler(entityURI, entity, entitySetURI, typeRef, containerHandler);
+    return new EntityTypeInvocationHandler(entity, entitySetName, typeRef, containerHandler);
   }
 
-  private EntityInvocationHandler(
-          final URI entityURI,
+  private EntityTypeInvocationHandler(
           final CommonODataEntity entity,
-          final URI entitySetURI,
+          final String entitySetName,
           final Class<?> typeRef,
-          final EntityContainerInvocationHandler containerHandler) {
+          final EntityContainerInvocationHandler<C> containerHandler) {
 
     super(containerHandler.getClient(), typeRef, (ODataLinked) entity, containerHandler);
 
-    this.entityURI = entityURI;
     this.internal = entity;
     getEntity().setMediaEntity(typeRef.getAnnotation(EntityType.class).hasStream());
 
     this.uuid = new EntityUUID(
             containerHandler.getEntityContainerName(),
-            entitySetURI,
+            entitySetName,
             typeRef,
             CoreUtils.getKey(client, typeRef, entity));
   }
@@ -118,13 +116,13 @@ public class EntityInvocationHandler extends AbstractStructuredInvocationHandler
 
     this.uuid = new EntityUUID(
             getUUID().getContainerName(),
-            getUUID().getEntitySetURI(),
+            getUUID().getEntitySetName(),
             getUUID().getType(),
             CoreUtils.getKey(client, typeRef, entity));
 
-    this.streamedPropertyChanges.clear();
     this.propertyChanges.clear();
     this.linkChanges.clear();
+    this.streamedPropertyChanges.clear();
     this.propertiesTag = 0;
     this.linksTag = 0;
   }
@@ -133,22 +131,23 @@ public class EntityInvocationHandler extends AbstractStructuredInvocationHandler
     return uuid;
   }
 
+  @Override
+  public FullQualifiedName getName() {
+    return getEntity().getTypeName();
+  }
+
   public String getEntityContainerName() {
     return uuid.getContainerName();
   }
 
-  public URI getEntitySetURI() {
-    return uuid.getEntitySetURI();
+  public String getEntitySetName() {
+    return uuid.getEntitySetName();
   }
 
   public final CommonODataEntity getEntity() {
     return (CommonODataEntity) internal;
   }
 
-  public URI getEntityURI() {
-    return entityURI;
-  }
-
   /**
    * Gets the current ETag defined into the wrapped entity.
    *
@@ -190,24 +189,57 @@ public class EntityInvocationHandler extends AbstractStructuredInvocationHandler
   @Override
   protected Object getPropertyValue(final String name, final Type type) {
     try {
-      if (!(type instanceof ParameterizedType) && (Class<?>) type == InputStream.class) {
-        return getStreamedProperty(name);
-      } else {
-        final CommonODataProperty property = getEntity().getProperty(name);
-
-        Object res;
-        if (propertyChanges.containsKey(name)) {
-          res = propertyChanges.get(name);
-        } else {
-          res = CoreUtils.getValueFromProperty(client, property, type, this);
-
-          if (res != null) {
-            chacheProperty(name, res);
+      final CommonODataProperty property = getEntity().getProperty(name);
+
+      Object res;
+      if (propertyChanges.containsKey(name)) {
+        res = propertyChanges.get(name);
+      } else if (property == null) {
+        res = null;
+      } else if (property.hasComplexValue()) {
+        res = Proxy.newProxyInstance(
+                Thread.currentThread().getContextClassLoader(),
+                new Class<?>[] {(Class<?>) type},
+                ComplexTypeInvocationHandler.getInstance(
+                        client, property.getValue().asComplex(), (Class<?>) type, this));
+
+        addPropertyChanges(name, res);
+      } else if (property.hasCollectionValue()) {
+        final ParameterizedType collType = (ParameterizedType) type;
+        final Class<?> collItemClass = (Class<?>) collType.getActualTypeArguments()[0];
+
+        final ArrayList<Object> collection = new ArrayList<Object>();
+
+        final Iterator<ODataValue> collPropItor = property.getValue().asCollection().iterator();
+        while (collPropItor.hasNext()) {
+          final ODataValue value = collPropItor.next();
+          if (value.isPrimitive()) {
+            collection.add(CoreUtils.primitiveValueToObject(value.asPrimitive()));
+          } else if (value.isComplex()) {
+            final Object collItem = Proxy.newProxyInstance(
+                    Thread.currentThread().getContextClassLoader(),
+                    new Class<?>[] {collItemClass},
+                    ComplexTypeInvocationHandler.getInstance(
+                            client, value.asComplex(), collItemClass, this));
+
+            collection.add(collItem);
           }
         }
 
-        return res;
+        res = collection;
+
+        addPropertyChanges(name, res);
+      } else {
+        res = type == null
+                ? CoreUtils.getValueFromProperty(client, property)
+                : CoreUtils.getValueFromProperty(client, property, type);
+
+        if (res != null) {
+          addPropertyChanges(name, res);
+        }
       }
+
+      return res;
     } catch (Exception e) {
       throw new IllegalArgumentException("Error getting value for property '" + name + "'", e);
     }
@@ -238,33 +270,12 @@ public class EntityInvocationHandler extends AbstractStructuredInvocationHandler
   }
 
   @Override
-  @SuppressWarnings("unchecked")
   protected void setPropertyValue(final Property property, final Object value) {
-    if (property.type().equalsIgnoreCase("Edm." + EdmPrimitiveTypeKind.Stream.toString())) {
+    if (property.type().equalsIgnoreCase(EdmPrimitiveTypeKind.Stream.toString())) {
       setStreamedProperty(property, (InputStream) value);
     } else {
       addPropertyChanges(property.name(), value);
-
-      if (value != null) {
-        final Collection<?> coll;
-        if (Collection.class.isAssignableFrom(value.getClass())) {
-          coll = Collection.class.cast(value);
-        } else {
-          coll = Collections.singleton(value);
-        }
-
-        for (Object item : coll) {
-          if (item instanceof Proxy) {
-            final InvocationHandler handler = Proxy.getInvocationHandler(item);
-            if ((handler instanceof ComplexInvocationHandler)
-                    && ((ComplexInvocationHandler) handler).getEntityHandler() == null) {
-              ((ComplexInvocationHandler) handler).setEntityHandler(this);
-            }
-          }
-        }
-      }
     }
-
     attach(AttachedEntityStatus.CHANGED);
   }
 
@@ -293,6 +304,7 @@ public class EntityInvocationHandler extends AbstractStructuredInvocationHandler
   }
 
   public InputStream getStream() {
+
     final URI contentSource = getEntity().getMediaContentSource();
 
     if (this.stream == null
@@ -311,15 +323,15 @@ public class EntityInvocationHandler extends AbstractStructuredInvocationHandler
     return this.stream;
   }
 
-  public Object getStreamedProperty(final String name) {
+  public Object getStreamedProperty(final Property property) {
 
-    InputStream res = streamedPropertyChanges.get(name);
+    InputStream res = streamedPropertyChanges.get(property.name());
 
     try {
       if (res == null) {
         final URI link = URIUtils.getURI(
                 containerHandler.getFactory().getServiceRoot(),
-                CoreUtils.getMediaEditLink(name, getEntity()).toASCIIString());
+                CoreUtils.getEditMediaLink(property.name(), getEntity()).toASCIIString());
 
         final ODataMediaRequest req = client.getRetrieveRequestFactory().getMediaRequest(link);
         res = req.execute().getBody();
@@ -334,8 +346,8 @@ public class EntityInvocationHandler extends AbstractStructuredInvocationHandler
   }
 
   private void setStreamedProperty(final Property property, final InputStream input) {
-    final Object obj = streamedPropertyChanges.get(property.name());
-    if (obj instanceof InputStream) {
+    final Object obj = propertyChanges.get(property.name());
+    if (obj != null && obj instanceof InputStream) {
       IOUtils.closeQuietly((InputStream) obj);
     }
 
@@ -349,11 +361,11 @@ public class EntityInvocationHandler extends AbstractStructuredInvocationHandler
     if (linkChanges.containsKey(property)) {
       navPropValue = linkChanges.get(property);
     } else {
-      navPropValue = retrieveNavigationProperty(property, getter, containerHandler.getFactory().getServiceRoot());
+      navPropValue = retriveNavigationProperty(property, getter);
     }
 
     if (navPropValue != null) {
-      cacheLink(property, navPropValue);
+      addLinkChanges(property, navPropValue);
     }
 
     return navPropValue;
@@ -361,10 +373,6 @@ public class EntityInvocationHandler extends AbstractStructuredInvocationHandler
 
   @Override
   protected void addPropertyChanges(final String name, final Object value) {
-    propertyChanges.put(name, value);
-  }
-
-  protected void chacheProperty(final String name, final Object value) {
     final int checkpoint = propertyChanges.hashCode();
     propertyChanges.put(name, value);
     updatePropertiesTag(checkpoint);
@@ -372,10 +380,6 @@ public class EntityInvocationHandler extends AbstractStructuredInvocationHandler
 
   @Override
   protected void addLinkChanges(final NavigationProperty navProp, final Object value) {
-    linkChanges.put(navProp, value);
-  }
-
-  protected void cacheLink(final NavigationProperty navProp, final Object value) {
     final int checkpoint = linkChanges.hashCode();
     linkChanges.put(navProp, value);
     updateLinksTag(checkpoint);
@@ -393,7 +397,7 @@ public class EntityInvocationHandler extends AbstractStructuredInvocationHandler
 
   @Override
   public boolean equals(final Object obj) {
-    return obj instanceof EntityInvocationHandler
-            && ((EntityInvocationHandler) obj).getUUID().equals(uuid);
+    return obj instanceof EntityTypeInvocationHandler
+            && ((EntityTypeInvocationHandler) obj).getUUID().equals(uuid);
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ad770860/fit/src/main/java/org/apache/olingo/fit/V3Services.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/V3Services.java b/fit/src/main/java/org/apache/olingo/fit/V3Services.java
index 0a0eb09..45642c3 100644
--- a/fit/src/main/java/org/apache/olingo/fit/V3Services.java
+++ b/fit/src/main/java/org/apache/olingo/fit/V3Services.java
@@ -156,7 +156,7 @@ public class V3Services extends AbstractServices {
               addChangesetItemIntro(chbos, lastContebtID, cboundary);
 
               res = bodyPartRequest(new MimeBodyPart(part.getInputStream()), references);
-              if (res==null || res.getStatus() >= 400) {
+              if (res.getStatus() >= 400) {
                 throw new Exception("Failure processing changeset");
               }
 
@@ -211,22 +211,6 @@ public class V3Services extends AbstractServices {
   }
 
   @GET
-  @Path("/Car/{type:.*}")
-  public Response filterCar(
-          @Context UriInfo uriInfo,
-          @HeaderParam("Accept") @DefaultValue(StringUtils.EMPTY) String accept,
-          @QueryParam("$top") @DefaultValue(StringUtils.EMPTY) String top,
-          @QueryParam("$skip") @DefaultValue(StringUtils.EMPTY) String skip,
-          @QueryParam("$format") @DefaultValue(StringUtils.EMPTY) String format,
-          @QueryParam("$inlinecount") @DefaultValue(StringUtils.EMPTY) String count,
-          @QueryParam("$filter") @DefaultValue(StringUtils.EMPTY) String filter,
-          @QueryParam("$orderby") @DefaultValue(StringUtils.EMPTY) String orderby,
-          @QueryParam("$skiptoken") @DefaultValue(StringUtils.EMPTY) String skiptoken) {
-    
-    return super.getEntitySet(uriInfo, accept, "Car", top, skip, format, count, filter, orderby, skiptoken);
-  }  
-  
-  @GET
   @Path("/Login({entityId})")
   public Response getLogin(
           @Context UriInfo uriInfo,

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ad770860/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java b/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
index 00259321..77c24d6 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/AbstractUtilities.java
@@ -41,6 +41,7 @@ import javax.ws.rs.NotFoundException;
 import javax.ws.rs.core.Response;
 import javax.xml.stream.XMLStreamException;
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.vfs2.FileObject;
 import org.apache.olingo.commons.api.data.Entity;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ad770860/fit/src/test/java/org/apache/olingo/fit/proxy/v3/ContextTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v3/ContextTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/ContextTestITCase.java
index df6ef13..c7e2948 100644
--- a/fit/src/test/java/org/apache/olingo/fit/proxy/v3/ContextTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/ContextTestITCase.java
@@ -34,7 +34,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import org.apache.olingo.ext.proxy.api.annotations.NavigationProperty;
-import org.apache.olingo.ext.proxy.commons.EntityInvocationHandler;
+import org.apache.olingo.ext.proxy.commons.EntityTypeInvocationHandler;
 import org.apache.olingo.ext.proxy.context.AttachedEntityStatus;
 import org.apache.olingo.fit.proxy.v3.staticservice.microsoft.test.odata.services.astoriadefaultservice.types.
         ContactDetails;
@@ -62,10 +62,10 @@ public class ContextTestITCase extends AbstractTestITCase {
     final Customer customer1 = container.getCustomer().newCustomer();
     final Customer customer2 = container.getCustomer().newCustomer();
 
-    final EntityInvocationHandler source1 =
-            (EntityInvocationHandler) Proxy.getInvocationHandler(customer1);
-    final EntityInvocationHandler source2 =
-            (EntityInvocationHandler) Proxy.getInvocationHandler(customer2);
+    final EntityTypeInvocationHandler source1 =
+            (EntityTypeInvocationHandler) Proxy.getInvocationHandler(customer1);
+    final EntityTypeInvocationHandler source2 =
+            (EntityTypeInvocationHandler) Proxy.getInvocationHandler(customer2);
 
     assertTrue(entityContext.isAttached(source1));
     assertTrue(entityContext.isAttached(source2));
@@ -85,12 +85,12 @@ public class ContextTestITCase extends AbstractTestITCase {
     final Customer customer2 = container.getCustomer().get(-9);
     final Customer customer3 = container.getCustomer().get(-10);
 
-    final EntityInvocationHandler source1 =
-            (EntityInvocationHandler) Proxy.getInvocationHandler(customer1);
-    final EntityInvocationHandler source2 =
-            (EntityInvocationHandler) Proxy.getInvocationHandler(customer2);
-    final EntityInvocationHandler source3 =
-            (EntityInvocationHandler) Proxy.getInvocationHandler(customer3);
+    final EntityTypeInvocationHandler source1 =
+            (EntityTypeInvocationHandler) Proxy.getInvocationHandler(customer1);
+    final EntityTypeInvocationHandler source2 =
+            (EntityTypeInvocationHandler) Proxy.getInvocationHandler(customer2);
+    final EntityTypeInvocationHandler source3 =
+            (EntityTypeInvocationHandler) Proxy.getInvocationHandler(customer3);
 
     assertFalse(entityContext.isAttached(source1));
     assertFalse(entityContext.isAttached(source2));
@@ -133,10 +133,10 @@ public class ContextTestITCase extends AbstractTestITCase {
 
     assertNotNull(customer.getInfo());
 
-    final EntityInvocationHandler source =
-            (EntityInvocationHandler) Proxy.getInvocationHandler(customer);
-    final EntityInvocationHandler target =
-            (EntityInvocationHandler) Proxy.getInvocationHandler(customerInfo);
+    final EntityTypeInvocationHandler source =
+            (EntityTypeInvocationHandler) Proxy.getInvocationHandler(customer);
+    final EntityTypeInvocationHandler target =
+            (EntityTypeInvocationHandler) Proxy.getInvocationHandler(customerInfo);
 
     assertTrue(entityContext.isAttached(source));
     assertEquals(AttachedEntityStatus.NEW, entityContext.getStatus(source));
@@ -160,10 +160,10 @@ public class ContextTestITCase extends AbstractTestITCase {
 
     assertNotNull(customer.getInfo());
 
-    final EntityInvocationHandler source =
-            (EntityInvocationHandler) Proxy.getInvocationHandler(customer);
-    final EntityInvocationHandler target =
-            (EntityInvocationHandler) Proxy.getInvocationHandler(customerInfo);
+    final EntityTypeInvocationHandler source =
+            (EntityTypeInvocationHandler) Proxy.getInvocationHandler(customer);
+    final EntityTypeInvocationHandler target =
+            (EntityTypeInvocationHandler) Proxy.getInvocationHandler(customerInfo);
 
     assertTrue(entityContext.isAttached(source));
     assertEquals(AttachedEntityStatus.CHANGED, entityContext.getStatus(source));
@@ -187,10 +187,10 @@ public class ContextTestITCase extends AbstractTestITCase {
 
     assertNotNull(customer.getInfo());
 
-    final EntityInvocationHandler source =
-            (EntityInvocationHandler) Proxy.getInvocationHandler(customer);
-    final EntityInvocationHandler target =
-            (EntityInvocationHandler) Proxy.getInvocationHandler(customerInfo);
+    final EntityTypeInvocationHandler source =
+            (EntityTypeInvocationHandler) Proxy.getInvocationHandler(customer);
+    final EntityTypeInvocationHandler target =
+            (EntityTypeInvocationHandler) Proxy.getInvocationHandler(customerInfo);
 
     assertTrue(entityContext.isAttached(source));
     assertEquals(AttachedEntityStatus.CHANGED, entityContext.getStatus(source));
@@ -218,14 +218,16 @@ public class ContextTestITCase extends AbstractTestITCase {
     assertNotNull(customer.getOrders());
     assertEquals(3, customer.getOrders().size());
 
-    final EntityInvocationHandler source = (EntityInvocationHandler) Proxy.getInvocationHandler(customer);
+    final EntityTypeInvocationHandler<?> source =
+            (EntityTypeInvocationHandler<?>) Proxy.getInvocationHandler(customer);
 
     assertTrue(entityContext.isAttached(source));
     assertEquals(AttachedEntityStatus.NEW, entityContext.getStatus(source));
     assertEquals(3, ((Collection) (source.getLinkChanges().entrySet().iterator().next().getValue())).size());
 
     for (Order order : toBeLinked) {
-      final EntityInvocationHandler target = (EntityInvocationHandler) Proxy.getInvocationHandler(order);
+      final EntityTypeInvocationHandler<?> target =
+              (EntityTypeInvocationHandler<?>) Proxy.getInvocationHandler(order);
 
       assertTrue(entityContext.isAttached(target));
       assertEquals(AttachedEntityStatus.NEW, entityContext.getStatus(target));
@@ -237,7 +239,7 @@ public class ContextTestITCase extends AbstractTestITCase {
     assertFalse(entityContext.isAttached(source));
 
     for (Order order : toBeLinked) {
-      assertFalse(entityContext.isAttached((EntityInvocationHandler) Proxy.getInvocationHandler(order)));
+      assertFalse(entityContext.isAttached((EntityTypeInvocationHandler) Proxy.getInvocationHandler(order)));
     }
   }
 
@@ -263,7 +265,7 @@ public class ContextTestITCase extends AbstractTestITCase {
     assertEquals(2, customer.getBackupContactInfo().iterator().next().getAlternativeNames().size());
     assertTrue(customer.getBackupContactInfo().iterator().next().getAlternativeNames().contains("alternative4"));
 
-    final EntityInvocationHandler source = (EntityInvocationHandler) Proxy.getInvocationHandler(customer);
+    final EntityTypeInvocationHandler source = (EntityTypeInvocationHandler) Proxy.getInvocationHandler(customer);
 
     assertTrue(entityContext.isAttached(source));
     assertEquals(AttachedEntityStatus.NEW, entityContext.getStatus(source));
@@ -320,7 +322,7 @@ public class ContextTestITCase extends AbstractTestITCase {
   public void checkContextInCaseOfErrors() {
     final Login login = container.getLogin().newLogin();
 
-    final EntityInvocationHandler handler = (EntityInvocationHandler) Proxy.getInvocationHandler(login);
+    final EntityTypeInvocationHandler handler = (EntityTypeInvocationHandler) Proxy.getInvocationHandler(login);
 
     assertTrue(entityContext.isAttached(handler));
 
@@ -387,18 +389,18 @@ public class ContextTestITCase extends AbstractTestITCase {
     customer.setPrimaryContactInfo(cd);
     customer.setBackupContactInfo(Collections.<ContactDetails>singletonList(bcd));
 
-    assertTrue(entityContext.isAttached((EntityInvocationHandler) Proxy.getInvocationHandler(customerInfo)));
-    assertTrue(entityContext.isAttached((EntityInvocationHandler) Proxy.getInvocationHandler(customer)));
+    assertTrue(entityContext.isAttached((EntityTypeInvocationHandler) Proxy.getInvocationHandler(customerInfo)));
+    assertTrue(entityContext.isAttached((EntityTypeInvocationHandler) Proxy.getInvocationHandler(customer)));
     for (Order linked : toBeLinked) {
-      assertTrue(entityContext.isAttached((EntityInvocationHandler) Proxy.getInvocationHandler(linked)));
+      assertTrue(entityContext.isAttached((EntityTypeInvocationHandler) Proxy.getInvocationHandler(linked)));
     }
 
     container.flush();
 
-    assertFalse(entityContext.isAttached((EntityInvocationHandler) Proxy.getInvocationHandler(customerInfo)));
-    assertFalse(entityContext.isAttached((EntityInvocationHandler) Proxy.getInvocationHandler(customer)));
+    assertFalse(entityContext.isAttached((EntityTypeInvocationHandler) Proxy.getInvocationHandler(customerInfo)));
+    assertFalse(entityContext.isAttached((EntityTypeInvocationHandler) Proxy.getInvocationHandler(customer)));
     for (Order linked : toBeLinked) {
-      assertFalse(entityContext.isAttached((EntityInvocationHandler) Proxy.getInvocationHandler(linked)));
+      assertFalse(entityContext.isAttached((EntityTypeInvocationHandler) Proxy.getInvocationHandler(linked)));
     }
 
     assertEquals("some new info ...", container.getCustomerInfo().get(16).getInformation());
@@ -406,22 +408,22 @@ public class ContextTestITCase extends AbstractTestITCase {
     container.getOrder().delete(toBeLinked);
     container.getCustomer().delete(customer.getCustomerId());
 
-    assertTrue(entityContext.isAttached((EntityInvocationHandler) Proxy.getInvocationHandler(customer)));
+    assertTrue(entityContext.isAttached((EntityTypeInvocationHandler) Proxy.getInvocationHandler(customer)));
     for (Order linked : toBeLinked) {
-      assertTrue(entityContext.isAttached((EntityInvocationHandler) Proxy.getInvocationHandler(linked)));
+      assertTrue(entityContext.isAttached((EntityTypeInvocationHandler) Proxy.getInvocationHandler(linked)));
     }
 
     container.flush();
 
-    assertFalse(entityContext.isAttached((EntityInvocationHandler) Proxy.getInvocationHandler(customer)));
+    assertFalse(entityContext.isAttached((EntityTypeInvocationHandler) Proxy.getInvocationHandler(customer)));
     for (Order linked : toBeLinked) {
-      assertFalse(entityContext.isAttached((EntityInvocationHandler) Proxy.getInvocationHandler(linked)));
+      assertFalse(entityContext.isAttached((EntityTypeInvocationHandler) Proxy.getInvocationHandler(linked)));
     }
   }
 
   private void checkUnlink(
           final String sourceName,
-          final EntityInvocationHandler source) {
+          final EntityTypeInvocationHandler<?> source) {
 
     boolean found = false;
     for (Map.Entry<NavigationProperty, Object> property : source.getLinkChanges().entrySet()) {
@@ -434,8 +436,8 @@ public class ContextTestITCase extends AbstractTestITCase {
 
   private void checkLink(
           final String sourceName,
-          final EntityInvocationHandler source,
-          final EntityInvocationHandler target,
+          final EntityTypeInvocationHandler<?> source,
+          final EntityTypeInvocationHandler<?> target,
           final boolean isCollection) {
 
     boolean found = false;
@@ -444,13 +446,13 @@ public class ContextTestITCase extends AbstractTestITCase {
         if (isCollection) {
           found = false;
           for (Object proxy : (Collection) property.getValue()) {
-            if (target.equals((EntityInvocationHandler) Proxy.getInvocationHandler(proxy))) {
+            if (target.equals((EntityTypeInvocationHandler) Proxy.getInvocationHandler(proxy))) {
               found = true;
             }
           }
         } else {
           found = target.equals(
-                  (EntityInvocationHandler) Proxy.getInvocationHandler(property.getValue()));
+                  (EntityTypeInvocationHandler) Proxy.getInvocationHandler(property.getValue()));
         }
       }
     }
@@ -459,9 +461,9 @@ public class ContextTestITCase extends AbstractTestITCase {
 
   private void checkUnidirectional(
           final String sourceName,
-          final EntityInvocationHandler source,
+          final EntityTypeInvocationHandler<?> source,
           final String targetName,
-          final EntityInvocationHandler target,
+          final EntityTypeInvocationHandler<?> target,
           final boolean isCollection) {
 
     checkLink(sourceName, source, target, isCollection);