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/05/02 18:02:05 UTC

git commit: [OLINGO-261] Missing V3 implementation of EdmNavigationProperty

Repository: olingo-odata4
Updated Branches:
  refs/heads/master 66a8f99b4 -> 6e72b1f3d


[OLINGO-261] Missing V3 implementation of EdmNavigationProperty


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

Branch: refs/heads/master
Commit: 6e72b1f3da79da657d6fa75efbe542be4e68bb91
Parents: 66a8f99
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Fri May 2 18:01:38 2014 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Fri May 2 18:01:38 2014 +0200

----------------------------------------------------------------------
 .../api/edm/xml/CommonNavigationProperty.java   |   2 +
 .../api/edm/xml/v4/NavigationProperty.java      |   6 +-
 .../response/AbstractODataResponse.java         |   3 +-
 .../olingo/client/core/edm/EdmClientImpl.java   |   4 +-
 .../client/core/edm/EdmComplexTypeImpl.java     |  10 +-
 .../client/core/edm/EdmEntityContainerImpl.java |   5 +-
 .../client/core/edm/EdmEntityTypeImpl.java      |  11 +-
 .../core/edm/EdmNavigationPropertyImpl.java     |  16 +-
 .../olingo/client/core/edm/EdmSchemaImpl.java   |   4 +-
 .../core/edm/EdmStructuredTypeHelperImpl.java   |  20 ++-
 .../client/core/edm/v3/EdmEntitySetProxy.java   |  36 ++--
 .../core/edm/v3/EdmNavigationPropertyProxy.java | 168 +++++++++++++++++++
 .../edm/xml/AbstractNavigationProperty.java     |  12 ++
 .../edm/xml/v3/AssociationDeserializer.java     |   4 +-
 .../core/edm/xml/v4/NavigationPropertyImpl.java |  11 --
 .../olingo/client/core/v3/MetadataTest.java     |  66 +++++++-
 .../apache/olingo/client/core/v4/JSONTest.java  |   1 -
 .../core/edm/EdmReferentialConstraintImpl.java  |   3 +-
 18 files changed, 316 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e72b1f3/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/CommonNavigationProperty.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/CommonNavigationProperty.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/CommonNavigationProperty.java
index 20eb9de..ae66b4e 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/CommonNavigationProperty.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/CommonNavigationProperty.java
@@ -19,4 +19,6 @@
 package org.apache.olingo.client.api.edm.xml;
 
 public interface CommonNavigationProperty extends Named {
+
+  boolean isContainsTarget();
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e72b1f3/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/NavigationProperty.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/NavigationProperty.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/NavigationProperty.java
index e0885fe..b6e2fcc 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/NavigationProperty.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/edm/xml/v4/NavigationProperty.java
@@ -21,9 +21,9 @@ package org.apache.olingo.client.api.edm.xml.v4;
 import org.apache.olingo.client.api.edm.xml.OnDelete;
 
 import java.util.List;
+import org.apache.olingo.client.api.edm.xml.CommonNavigationProperty;
 
-public interface NavigationProperty
-        extends org.apache.olingo.client.api.edm.xml.CommonNavigationProperty, AnnotatedEdmItem {
+public interface NavigationProperty extends CommonNavigationProperty, AnnotatedEdmItem {
 
   String getType();
 
@@ -31,8 +31,6 @@ public interface NavigationProperty
 
   String getPartner();
 
-  boolean isContainsTarget();
-
   List<ReferentialConstraint> getReferentialConstraints();
 
   OnDelete getOnDelete();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e72b1f3/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/response/AbstractODataResponse.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/response/AbstractODataResponse.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/response/AbstractODataResponse.java
index fe8fa52..2109d96 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/response/AbstractODataResponse.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/response/AbstractODataResponse.java
@@ -42,6 +42,7 @@ import org.apache.olingo.client.core.communication.request.batch.ODataBatchContr
 import org.apache.olingo.client.core.communication.request.batch.ODataBatchLineIteratorImpl;
 import org.apache.olingo.client.core.communication.request.batch.ODataBatchUtilities;
 import org.apache.olingo.commons.api.Constants;
+import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
@@ -52,7 +53,7 @@ public abstract class AbstractODataResponse implements ODataResponse {
   /**
    * Logger.
    */
-  protected static final org.slf4j.Logger LOG = LoggerFactory.getLogger(ODataResponse.class);
+  protected static final Logger LOG = LoggerFactory.getLogger(ODataResponse.class);
 
   /**
    * HTTP client.

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e72b1f3/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmClientImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmClientImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmClientImpl.java
index 58e8963..ae6c377 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmClientImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmClientImpl.java
@@ -157,7 +157,7 @@ public class EdmClientImpl extends AbstractEdm {
     if (schema != null) {
       final EntityType xmlEntityType = schema.getEntityType(entityTypeName.getName());
       if (xmlEntityType != null) {
-        result = EdmEntityTypeImpl.getInstance(this, entityTypeName, xmlEntityType);
+        result = EdmEntityTypeImpl.getInstance(this, entityTypeName, xmlSchemas, xmlEntityType);
       }
     }
 
@@ -172,7 +172,7 @@ public class EdmClientImpl extends AbstractEdm {
     if (schema != null) {
       final ComplexType xmlComplexType = schema.getComplexType(complexTypeName.getName());
       if (xmlComplexType != null) {
-        result = EdmComplexTypeImpl.getInstance(this, complexTypeName, xmlComplexType);
+        result = EdmComplexTypeImpl.getInstance(this, complexTypeName, xmlSchemas, xmlComplexType);
       }
     }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e72b1f3/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmComplexTypeImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmComplexTypeImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmComplexTypeImpl.java
index 325473b..1ccc8d5 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmComplexTypeImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmComplexTypeImpl.java
@@ -18,9 +18,11 @@
  */
 package org.apache.olingo.client.core.edm;
 
+import java.util.List;
 import org.apache.olingo.commons.core.edm.EdmTypeInfo;
 import java.util.Map;
 import org.apache.olingo.client.api.edm.xml.ComplexType;
+import org.apache.olingo.client.api.edm.xml.Schema;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
 import org.apache.olingo.commons.api.edm.EdmProperty;
@@ -33,7 +35,7 @@ public class EdmComplexTypeImpl extends AbstractEdmComplexType {
   private final EdmStructuredTypeHelper helper;
 
   public static EdmComplexTypeImpl getInstance(final Edm edm, final FullQualifiedName fqn,
-          final ComplexType complexType) {
+          final List<? extends Schema> xmlSchemas, final ComplexType complexType) {
 
     FullQualifiedName baseTypeName = null;
     if (complexType instanceof org.apache.olingo.client.api.edm.xml.v4.ComplexType) {
@@ -41,17 +43,17 @@ public class EdmComplexTypeImpl extends AbstractEdmComplexType {
       baseTypeName = baseType == null
               ? null : new EdmTypeInfo.Builder().setTypeExpression(baseType).build().getFullQualifiedName();
     }
-    final EdmComplexTypeImpl instance = new EdmComplexTypeImpl(edm, fqn, baseTypeName, complexType);
+    final EdmComplexTypeImpl instance = new EdmComplexTypeImpl(edm, fqn, baseTypeName, xmlSchemas, complexType);
     instance.baseType = instance.buildBaseType(baseTypeName);
 
     return instance;
   }
 
   private EdmComplexTypeImpl(final Edm edm, final FullQualifiedName fqn, final FullQualifiedName baseTypeName,
-          final ComplexType complexType) {
+          final List<? extends Schema> xmlSchemas, final ComplexType complexType) {
 
     super(edm, fqn, baseTypeName);
-    this.helper = new EdmStructuredTypeHelperImpl(edm, complexType);
+    this.helper = new EdmStructuredTypeHelperImpl(edm, xmlSchemas, complexType);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e72b1f3/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityContainerImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityContainerImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityContainerImpl.java
index fba22a8..cf846f7 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityContainerImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityContainerImpl.java
@@ -140,9 +140,8 @@ public class EdmEntityContainerImpl extends AbstractEdmEntityContainer {
         final FullQualifiedName entityType = new EdmTypeInfo.Builder().setTypeExpression(entitySet.getEntityType()).
                 setDefaultNamespace(entityContainerName.getNamespace()).build().getFullQualifiedName();
         if (entitySet instanceof org.apache.olingo.client.api.edm.xml.v4.EntitySet) {
-          edmSet =
-                  new EdmEntitySetImpl(edm, this, entitySet.getName(), entityType,
-                          (org.apache.olingo.client.api.edm.xml.v4.EntitySet) entitySet);
+          edmSet = new EdmEntitySetImpl(edm, this, entitySet.getName(), entityType,
+                  (org.apache.olingo.client.api.edm.xml.v4.EntitySet) entitySet);
         } else {
           edmSet = new EdmEntitySetProxy(edm, this, entitySet.getName(), entityType, xmlSchemas);
         }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e72b1f3/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityTypeImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityTypeImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityTypeImpl.java
index 02814a3..c7dc7fd 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityTypeImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityTypeImpl.java
@@ -25,6 +25,7 @@ import java.util.Map;
 
 import org.apache.olingo.client.api.edm.xml.EntityType;
 import org.apache.olingo.client.api.edm.xml.PropertyRef;
+import org.apache.olingo.client.api.edm.xml.Schema;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmEntityType;
 import org.apache.olingo.commons.api.edm.EdmKeyPropertyRef;
@@ -38,11 +39,13 @@ public class EdmEntityTypeImpl extends AbstractEdmEntityType {
 
   private final EdmStructuredTypeHelper helper;
 
-  public static EdmEntityTypeImpl getInstance(final Edm edm, final FullQualifiedName fqn, final EntityType entityType) {
+  public static EdmEntityTypeImpl getInstance(final Edm edm, final FullQualifiedName fqn, 
+          final List<? extends Schema> xmlSchemas, final EntityType entityType) {
+    
     final FullQualifiedName baseTypeName = entityType.getBaseType() == null
             ? null
             : new EdmTypeInfo.Builder().setTypeExpression(entityType.getBaseType()).build().getFullQualifiedName();
-    final EdmEntityTypeImpl instance = new EdmEntityTypeImpl(edm, fqn, baseTypeName, entityType);
+    final EdmEntityTypeImpl instance = new EdmEntityTypeImpl(edm, fqn, baseTypeName, xmlSchemas, entityType);
     instance.baseType = instance.buildBaseType(baseTypeName);
 
     if (instance.baseType == null) {
@@ -62,10 +65,10 @@ public class EdmEntityTypeImpl extends AbstractEdmEntityType {
   }
 
   private EdmEntityTypeImpl(final Edm edm, final FullQualifiedName fqn, final FullQualifiedName baseTypeName,
-          final EntityType entityType) {
+          final List<? extends Schema> xmlSchemas, final EntityType entityType) {
 
     super(edm, fqn, baseTypeName, entityType.isHasStream());
-    this.helper = new EdmStructuredTypeHelperImpl(edm, entityType);
+    this.helper = new EdmStructuredTypeHelperImpl(edm, xmlSchemas, entityType);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e72b1f3/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmNavigationPropertyImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmNavigationPropertyImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmNavigationPropertyImpl.java
index 6ea464b..08abd9c 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmNavigationPropertyImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmNavigationPropertyImpl.java
@@ -71,14 +71,14 @@ public class EdmNavigationPropertyImpl extends AbstractEdmNavigationProperty {
 
   @Override
   public String getReferencingPropertyName(final String referencedPropertyName) {
-    final List<? extends ReferentialConstraint> referentialConstraints = navigationProperty.getReferentialConstraints();
-    if (referentialConstraints != null) {
-      for (ReferentialConstraint constraint : referentialConstraints) {
-        if (constraint.getReferencedProperty().equals(referencedPropertyName)) {
-          return constraint.getProperty();
-        }
+    final List<? extends ReferentialConstraint> _referentialConstraints =
+            navigationProperty.getReferentialConstraints();
+    for (ReferentialConstraint constraint : _referentialConstraints) {
+      if (constraint.getReferencedProperty().equals(referencedPropertyName)) {
+        return constraint.getProperty();
       }
     }
+
     return null;
   }
 
@@ -89,8 +89,8 @@ public class EdmNavigationPropertyImpl extends AbstractEdmNavigationProperty {
       referentialConstraints = new ArrayList<EdmReferentialConstraint>();
       if (providerConstraints != null) {
         for (ReferentialConstraint constraint : providerConstraints) {
-          referentialConstraints.add(new EdmReferentialConstraintImpl(constraint.getProperty(), constraint
-                  .getReferencedProperty()));
+          referentialConstraints.add(
+                  new EdmReferentialConstraintImpl(constraint.getProperty(), constraint.getReferencedProperty()));
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e72b1f3/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmSchemaImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmSchemaImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmSchemaImpl.java
index 5ee3461..8e0f9d6 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmSchemaImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmSchemaImpl.java
@@ -150,7 +150,7 @@ public class EdmSchemaImpl extends AbstractEdmSchema {
     if (providerEntityTypes != null) {
       for (EntityType entityType : providerEntityTypes) {
         entityTypes.add(EdmEntityTypeImpl.getInstance(edm,
-                new FullQualifiedName(namespace, entityType.getName()), entityType));
+                new FullQualifiedName(namespace, entityType.getName()), xmlSchemas, entityType));
       }
     }
     return entityTypes;
@@ -163,7 +163,7 @@ public class EdmSchemaImpl extends AbstractEdmSchema {
     if (providerComplexTypes != null) {
       for (ComplexType complexType : providerComplexTypes) {
         complexTypes.add(EdmComplexTypeImpl.getInstance(edm, new FullQualifiedName(namespace, complexType.getName()),
-                complexType));
+                xmlSchemas, complexType));
       }
     }
     return complexTypes;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e72b1f3/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmStructuredTypeHelperImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmStructuredTypeHelperImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmStructuredTypeHelperImpl.java
index 45bd2c1..77d92df 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmStructuredTypeHelperImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmStructuredTypeHelperImpl.java
@@ -19,13 +19,15 @@
 package org.apache.olingo.client.core.edm;
 
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.olingo.client.api.edm.xml.CommonNavigationProperty;
 import org.apache.olingo.client.api.edm.xml.CommonProperty;
 import org.apache.olingo.client.api.edm.xml.ComplexType;
 import org.apache.olingo.client.api.edm.xml.EntityType;
-import org.apache.olingo.client.api.edm.xml.v4.NavigationProperty;
+import org.apache.olingo.client.api.edm.xml.Schema;
+import org.apache.olingo.client.core.edm.v3.EdmNavigationPropertyProxy;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
 import org.apache.olingo.commons.api.edm.EdmProperty;
@@ -37,13 +39,18 @@ public class EdmStructuredTypeHelperImpl implements EdmStructuredTypeHelper {
 
   private final ComplexType complexType;
 
+  private final List<? extends Schema> xmlSchemas;
+
   private Map<String, EdmProperty> properties;
 
   private Map<String, EdmNavigationProperty> navigationProperties;
 
-  public EdmStructuredTypeHelperImpl(final Edm edm, final ComplexType complexType) {
+  public EdmStructuredTypeHelperImpl(
+          final Edm edm, final List<? extends Schema> xmlSchemas, final ComplexType complexType) {
+
     this.edm = edm;
     this.complexType = complexType;
+    this.xmlSchemas = xmlSchemas;
   }
 
   @Override
@@ -62,9 +69,12 @@ public class EdmStructuredTypeHelperImpl implements EdmStructuredTypeHelper {
     if (navigationProperties == null) {
       navigationProperties = new LinkedHashMap<String, EdmNavigationProperty>();
       for (CommonNavigationProperty navigationProperty : complexType.getNavigationProperties()) {
-        if (navigationProperty instanceof NavigationProperty) {
-          navigationProperties.put(navigationProperty.getName(),
-                  new EdmNavigationPropertyImpl(edm, (NavigationProperty) navigationProperty));
+        if (navigationProperty instanceof org.apache.olingo.client.api.edm.xml.v4.NavigationProperty) {
+          navigationProperties.put(navigationProperty.getName(), new EdmNavigationPropertyImpl(
+                  edm, (org.apache.olingo.client.api.edm.xml.v4.NavigationProperty) navigationProperty));
+        } else if (navigationProperty instanceof org.apache.olingo.client.api.edm.xml.v3.NavigationProperty) {
+          navigationProperties.put(navigationProperty.getName(), new EdmNavigationPropertyProxy(
+                  edm, xmlSchemas, (org.apache.olingo.client.api.edm.xml.v3.NavigationProperty) navigationProperty));
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e72b1f3/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmEntitySetProxy.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmEntitySetProxy.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmEntitySetProxy.java
index 1303fef..1af4889 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmEntitySetProxy.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmEntitySetProxy.java
@@ -18,9 +18,10 @@
  */
 package org.apache.olingo.client.core.edm.v3;
 
-import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
-
+import java.util.Map;
 import org.apache.olingo.client.api.edm.xml.EntityContainer;
 import org.apache.olingo.client.api.edm.xml.Schema;
 import org.apache.olingo.client.api.edm.xml.v3.Association;
@@ -49,7 +50,8 @@ public class EdmEntitySetProxy extends AbstractEdmBindingTarget implements EdmEn
 
   @Override
   public EdmBindingTarget getRelatedBindingTarget(final String path) {
-    final List<AssociationSet> candidateAssociationSets = new ArrayList<AssociationSet>();
+    final Map<AssociationSet, FullQualifiedName> candidateAssociationSets =
+            new HashMap<AssociationSet, FullQualifiedName>();
     for (Schema schema : xmlSchemas) {
       for (EntityContainer _entityContainer : schema.getEntityContainers()) {
         final EntityContainerImpl entityContainer = (EntityContainerImpl) _entityContainer;
@@ -57,7 +59,8 @@ public class EdmEntitySetProxy extends AbstractEdmBindingTarget implements EdmEn
           if (getName().equals(associationSet.getEnds().get(0).getEntitySet())
                   || getName().equals(associationSet.getEnds().get(1).getEntitySet())) {
 
-            candidateAssociationSets.add(associationSet);
+            candidateAssociationSets.put(associationSet,
+                    new FullQualifiedName(schema.getNamespace(), entityContainer.getName()));
           }
         }
       }
@@ -66,34 +69,33 @@ public class EdmEntitySetProxy extends AbstractEdmBindingTarget implements EdmEn
       throw new EdmException("Cannot find any AssociationSet with first End: " + getName());
     }
 
-    Schema targetSchema = null;
+    FullQualifiedName targetEntityContainer = null;
     String targetEntitySet = null;
-    for (AssociationSet associationSet : candidateAssociationSets) {
+    for (Map.Entry<AssociationSet, FullQualifiedName> entry : candidateAssociationSets.entrySet()) {
       for (Schema schema : xmlSchemas) {
         for (Association association : ((SchemaImpl) schema).getAssociations()) {
           final FullQualifiedName associationName = new FullQualifiedName(schema.getNamespace(), association.getName());
-          if (associationName.getFullQualifiedNameAsString().equals(associationSet.getAssociation())
+          if (associationName.getFullQualifiedNameAsString().equals(entry.getKey().getAssociation())
                   && (path.equals(association.getEnds().get(0).getRole())
                   || path.equals(association.getEnds().get(1).getRole()))) {
 
-            targetSchema = schema;
-            if (getName().equals(associationSet.getEnds().get(0).getEntitySet())) {
-              targetEntitySet = associationSet.getEnds().get(1).getEntitySet();
+            targetEntityContainer = entry.getValue();
+            if (getName().equals(entry.getKey().getEnds().get(0).getEntitySet())) {
+              targetEntitySet = entry.getKey().getEnds().get(1).getEntitySet();
             } else {
-              targetEntitySet = associationSet.getEnds().get(0).getEntitySet();
+              targetEntitySet = entry.getKey().getEnds().get(0).getEntitySet();
             }
           }
         }
       }
     }
-    if (targetSchema == null || targetEntitySet == null) {
+    if (targetEntityContainer == null || targetEntitySet == null) {
       throw new EdmException("Cannot find Association for candidate AssociationSets and given Role");
     }
 
-    final FullQualifiedName relatedFQN = new FullQualifiedName(targetSchema.getNamespace(), targetEntitySet);
-    final EdmEntityContainer entityContainer = edm.getEntityContainer(relatedFQN);
+    final EdmEntityContainer entityContainer = edm.getEntityContainer(targetEntityContainer);
     if (entityContainer == null) {
-      throw new EdmException("Cannot find EntityContainer with name: " + relatedFQN);
+      throw new EdmException("Cannot find EntityContainer with name: " + targetEntityContainer);
     }
 
     return entityContainer.getEntitySet(targetEntitySet);
@@ -107,8 +109,8 @@ public class EdmEntitySetProxy extends AbstractEdmBindingTarget implements EdmEn
 
   @Override
   public List<EdmNavigationPropertyBinding> getNavigationPropertyBindings() {
-    //There are no navigation property bindings in V3 so we will deliver an empty list
-    return new ArrayList<EdmNavigationPropertyBinding>();
+    // There are no navigation property bindings in V3 so we will deliver an empty list
+    return Collections.emptyList();
   }
 
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e72b1f3/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmNavigationPropertyProxy.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmNavigationPropertyProxy.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmNavigationPropertyProxy.java
new file mode 100644
index 0000000..cadb3ae
--- /dev/null
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/v3/EdmNavigationPropertyProxy.java
@@ -0,0 +1,168 @@
+/*
+ * 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.edm.v3;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.olingo.client.api.edm.xml.Schema;
+import org.apache.olingo.client.api.edm.xml.v3.Association;
+import org.apache.olingo.client.api.edm.xml.v3.AssociationEnd;
+import org.apache.olingo.client.api.edm.xml.v3.NavigationProperty;
+import org.apache.olingo.client.api.edm.xml.v3.ReferentialConstraint;
+import org.apache.olingo.client.core.edm.xml.v3.SchemaImpl;
+import org.apache.olingo.commons.api.edm.Edm;
+import org.apache.olingo.commons.api.edm.EdmEntityType;
+import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
+import org.apache.olingo.commons.api.edm.EdmReferentialConstraint;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.core.edm.AbstractEdmNavigationProperty;
+import org.apache.olingo.commons.core.edm.EdmReferentialConstraintImpl;
+
+public class EdmNavigationPropertyProxy extends AbstractEdmNavigationProperty {
+
+  private final List<? extends Schema> xmlSchemas;
+
+  private final NavigationProperty navigationProperty;
+
+  private final FullQualifiedName typeFQN;
+
+  private final boolean isCollection;
+
+  private final boolean isNullable;
+
+  private EdmNavigationProperty partner;
+
+  private final ReferentialConstraint constraint;
+
+  private List<EdmReferentialConstraint> referentialConstraints;
+
+  public EdmNavigationPropertyProxy(final Edm edm, final List<? extends Schema> xmlSchemas,
+          final NavigationProperty navigationProperty) {
+
+    super(edm, navigationProperty.getName());
+    this.xmlSchemas = xmlSchemas;
+    this.navigationProperty = navigationProperty;
+
+    final FullQualifiedName relFQN = new FullQualifiedName(navigationProperty.getRelationship());
+    Schema associationSchema = null;
+    for (Schema schema : xmlSchemas) {
+      if (schema.getNamespace().equals(relFQN.getNamespace())) {
+        associationSchema = schema;
+      }
+    }
+    if (!(associationSchema instanceof SchemaImpl)) {
+      throw new IllegalArgumentException("Could not find schema for Association " + relFQN);
+    }
+
+    final Association association = ((SchemaImpl) associationSchema).getAssociation(relFQN.getName());
+    if (association == null) {
+      throw new IllegalArgumentException("Could not find Association " + relFQN.getName());
+    }
+
+    AssociationEnd thisEnd = null;
+    AssociationEnd partnerEnd = null;
+    for (AssociationEnd _end : association.getEnds()) {
+      if (_end.getRole().equals(navigationProperty.getToRole())) {
+        thisEnd = _end;
+      } else {
+        partnerEnd = _end;
+      }
+    }
+    if (thisEnd == null || partnerEnd == null) {
+      throw new IllegalArgumentException("Could not find AssociationEnd for role " + navigationProperty.getToRole());
+    }
+
+    typeFQN = new FullQualifiedName(thisEnd.getType());
+    isCollection = "*".equals(thisEnd.getMultiplicity());
+    isNullable = thisEnd.getMultiplicity().charAt(0) == '0';
+    constraint = association.getReferentialConstraint();
+
+    final EdmEntityType partnerEntity = edm.getEntityType(new FullQualifiedName(thisEnd.getType()));
+    for (String navPropName : partnerEntity.getNavigationPropertyNames()) {
+      final EdmNavigationPropertyProxy navProp =
+              (EdmNavigationPropertyProxy) partnerEntity.getNavigationProperty(navPropName);
+      if (partnerEnd.getRole().equals(navProp.getXMLNavigationProperty().getToRole())) {
+        partner = navProp;
+      }
+    }
+  }
+
+  protected NavigationProperty getXMLNavigationProperty() {
+    return navigationProperty;
+  }
+
+  @Override
+  protected FullQualifiedName getTypeFQN() {
+    return typeFQN;
+  }
+
+  @Override
+  protected String internatGetPartner() {
+    // not used
+    return null;
+  }
+
+  @Override
+  public EdmNavigationProperty getPartner() {
+    return partner == null ? this: partner;
+  }
+
+  @Override
+  public String getReferencingPropertyName(final String referencedPropertyName) {
+    if (constraint != null) {
+      for (int i = 0; i < constraint.getPrincipal().getPropertyRefs().size(); i++) {
+        if (referencedPropertyName.equals(constraint.getPrincipal().getPropertyRefs().get(i).getName())) {
+          return constraint.getDependent().getPropertyRefs().get(i).getName();
+        }
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public boolean isCollection() {
+    return isCollection;
+  }
+
+  @Override
+  public Boolean isNullable() {
+    return isNullable;
+  }
+
+  @Override
+  public Boolean containsTarget() {
+    return navigationProperty.isContainsTarget();
+  }
+
+  @Override
+  public List<EdmReferentialConstraint> getReferentialConstraints() {
+    if (referentialConstraints == null) {
+      referentialConstraints = new ArrayList<EdmReferentialConstraint>();
+      if (constraint != null) {
+        for (int i = 0; i < constraint.getPrincipal().getPropertyRefs().size(); i++) {
+          referentialConstraints.add(new EdmReferentialConstraintImpl(
+                  constraint.getPrincipal().getPropertyRefs().get(i).getName(),
+                  constraint.getDependent().getPropertyRefs().get(i).getName()));
+        }
+      }
+    }
+    return referentialConstraints;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e72b1f3/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractNavigationProperty.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractNavigationProperty.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractNavigationProperty.java
index 65c9a8f..74882cc 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractNavigationProperty.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/AbstractNavigationProperty.java
@@ -29,6 +29,9 @@ public class AbstractNavigationProperty extends AbstractEdmItem implements Commo
   @JsonProperty(value = "Name", required = true)
   private String name;
 
+  @JsonProperty(value = "ContainsTarget")
+  private boolean containsTarget = false;
+
   @Override
   public String getName() {
     return name;
@@ -37,4 +40,13 @@ public class AbstractNavigationProperty extends AbstractEdmItem implements Commo
   public void setName(final String name) {
     this.name = name;
   }
+
+  @Override
+  public boolean isContainsTarget() {
+    return containsTarget;
+  }
+
+  public void setContainsTarget(final boolean containsTarget) {
+    this.containsTarget = containsTarget;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e72b1f3/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v3/AssociationDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v3/AssociationDeserializer.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v3/AssociationDeserializer.java
index c1d422d..51dc42a 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v3/AssociationDeserializer.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v3/AssociationDeserializer.java
@@ -42,10 +42,10 @@ public class AssociationDeserializer extends AbstractEdmDeserializer<Association
           association.setName(jp.nextTextValue());
         } else if ("ReferentialConstraint".equals(jp.getCurrentName())) {
           jp.nextToken();
-          association.setReferentialConstraint(jp.readValueAs( ReferentialConstraintImpl.class));
+          association.setReferentialConstraint(jp.readValueAs(ReferentialConstraintImpl.class));
         } else if ("End".equals(jp.getCurrentName())) {
           jp.nextToken();
-          association.getEnds().add(jp.readValueAs( AssociationEndImpl.class));
+          association.getEnds().add(jp.readValueAs(AssociationEndImpl.class));
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e72b1f3/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/NavigationPropertyImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/NavigationPropertyImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/NavigationPropertyImpl.java
index 6d186e0..364a80e 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/NavigationPropertyImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/xml/v4/NavigationPropertyImpl.java
@@ -40,8 +40,6 @@ public class NavigationPropertyImpl extends AbstractNavigationProperty implement
 
   private String partner;
 
-  private boolean containsTarget = false;
-
   private final List<ReferentialConstraint> referentialConstraints = new ArrayList<ReferentialConstraint>();
 
   private OnDelete onDelete;
@@ -76,15 +74,6 @@ public class NavigationPropertyImpl extends AbstractNavigationProperty implement
   }
 
   @Override
-  public boolean isContainsTarget() {
-    return containsTarget;
-  }
-
-  public void setContainsTarget(final boolean containsTarget) {
-    this.containsTarget = containsTarget;
-  }
-
-  @Override
   public List<ReferentialConstraint> getReferentialConstraints() {
     return referentialConstraints;
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e72b1f3/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/MetadataTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/MetadataTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/MetadataTest.java
index ac4fffe..303d18a 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/MetadataTest.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/v3/MetadataTest.java
@@ -49,6 +49,7 @@ import org.apache.olingo.commons.api.edm.EdmEntityType;
 import org.apache.olingo.commons.api.edm.EdmFunction;
 import org.apache.olingo.commons.api.edm.EdmFunctionImport;
 import org.apache.olingo.commons.api.edm.EdmFunctionImportInfo;
+import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
 import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
@@ -62,7 +63,69 @@ public class MetadataTest extends AbstractTest {
   }
 
   @Test
-  public void parse() {
+  public void parseWithEdm() {
+    final Edm edm = getClient().getReader().readMetadata(getClass().getResourceAsStream("metadata.xml"));
+    assertNotNull(edm);
+
+    // 1. Complex
+    final EdmComplexType responseStatus = edm.getComplexType(
+            new FullQualifiedName("Microsoft.Test.OData.Services.AstoriaDefaultService", "ContactDetails"));
+    assertNotNull(responseStatus);
+    assertTrue(responseStatus.getNavigationPropertyNames().isEmpty());
+    assertEquals(EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.String),
+            responseStatus.getProperty("EmailBag").getType());
+
+    // 2. Entity
+    final EdmEntityType product = edm.getEntityType(
+            new FullQualifiedName("Microsoft.Test.OData.Services.AstoriaDefaultService", "Product"));
+    assertNotNull(product);
+    assertFalse(product.getPropertyNames().isEmpty());
+    assertFalse(product.getNavigationPropertyNames().isEmpty());
+    
+    final EdmNavigationProperty detail = product.getNavigationProperty("Detail");
+    assertNotNull(detail);
+    assertEquals("Product", detail.getPartner().getName());
+    assertFalse(detail.isCollection());
+    assertTrue(detail.isNullable());
+
+    final EdmNavigationProperty relatedProducts = product.getNavigationProperty("RelatedProducts");
+    assertNotNull(relatedProducts);
+    assertEquals("RelatedProducts", relatedProducts.getPartner().getName());
+    assertTrue(relatedProducts.isCollection());
+    assertFalse(relatedProducts.isNullable());
+
+    final EdmEntityType order = edm.getEntityType(
+            new FullQualifiedName("Microsoft.Test.OData.Services.AstoriaDefaultService", "Order"));
+    assertFalse(order.getPropertyNames().isEmpty());
+    assertFalse(order.getNavigationPropertyNames().isEmpty());
+
+    final EdmEntityType customer = edm.getEntityType(
+            new FullQualifiedName("Microsoft.Test.OData.Services.AstoriaDefaultService", "Customer"));
+    assertEquals(order, customer.getNavigationProperty("Orders").getType());
+
+    // 3. Action
+    final EdmAction sack = edm.getBoundAction(
+            new FullQualifiedName("Microsoft.Test.OData.Services.AstoriaDefaultService", "Sack"),
+            new FullQualifiedName("Microsoft.Test.OData.Services.AstoriaDefaultService", "Employee"),
+            false);
+    assertNotNull(sack);
+    assertTrue(sack.isBound());
+    assertEquals(1, sack.getParameterNames().size());
+
+    // 4. EntityContainer
+    final EdmEntityContainer container = edm.getEntityContainer(
+            new FullQualifiedName("Microsoft.Test.OData.Services.AstoriaDefaultService", "DefaultContainer"));
+    assertNotNull(container);
+    final EdmEntitySet logins = container.getEntitySet("Login");
+    assertNotNull(logins);
+    assertEquals(edm.getEntityType(new FullQualifiedName(container.getNamespace(), "Login")), logins.getEntityType());
+    assertEquals(container.getEntitySet("Customer").getEntityContainer().getFullQualifiedName(),
+            logins.getRelatedBindingTarget("Customer").getEntityContainer().getFullQualifiedName());
+    assertEquals(container.getEntitySet("Customer").getName(), logins.getRelatedBindingTarget("Customer").getName());
+  }
+
+  @Test
+  public void parseWithXMLMetadata() {
     final XMLMetadata metadata = getClient().getDeserializer().
             toMetadata(getClass().getResourceAsStream("metadata.xml"));
     assertNotNull(metadata);
@@ -70,6 +133,7 @@ public class MetadataTest extends AbstractTest {
     final EntityType order = metadata.getSchemas().get(0).getEntityType("Order");
     assertNotNull(order);
     assertEquals("Order", order.getName());
+    assertFalse(order.getNavigationProperties().isEmpty());
 
     @SuppressWarnings("unchecked")
     final List<FunctionImport> functionImports = (List<FunctionImport>) metadata.getSchemas().get(0).

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e72b1f3/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/JSONTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/JSONTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/JSONTest.java
index efc7dac..65d85e2 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/JSONTest.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/v4/JSONTest.java
@@ -27,7 +27,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import java.io.ByteArrayInputStream;
 import java.io.StringWriter;
-import java.net.URI;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/6e72b1f3/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmReferentialConstraintImpl.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmReferentialConstraintImpl.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmReferentialConstraintImpl.java
index 93e1519..ed3f5c3 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmReferentialConstraintImpl.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmReferentialConstraintImpl.java
@@ -23,9 +23,10 @@ import org.apache.olingo.commons.api.edm.EdmReferentialConstraint;
 public class EdmReferentialConstraintImpl implements EdmReferentialConstraint {
 
   private final String property;
+
   private final String referencedProperty;
 
-  public EdmReferentialConstraintImpl(String property, String referencedProperty) {
+  public EdmReferentialConstraintImpl(final String property, final String referencedProperty) {
     this.property = property;
     this.referencedProperty = referencedProperty;
   }