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

[7/7] git commit: [OLINGO-169] Now able to use commons Edm interfaces with v3

[OLINGO-169] Now able to use commons Edm interfaces with v3


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

Branch: refs/heads/olingo169
Commit: 31b6c8c09a34ea1871c4bf4edd3335f4ae23fc14
Parents: d1b341d
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Fri Mar 7 10:04:24 2014 +0100
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Fri Mar 7 10:04:24 2014 +0100

----------------------------------------------------------------------
 .../client/api/edm/xml/BindingTarget.java       |  29 ------
 .../odata4/client/api/edm/xml/EntitySet.java    |   4 +-
 .../client/api/edm/xml/v4/BindingTarget.java    |  27 +++++
 .../odata4/client/api/edm/xml/v4/EntitySet.java |   2 +-
 .../odata4/client/api/edm/xml/v4/Singleton.java |   4 +-
 .../client/core/edm/EdmBindingTargetImpl.java   |  40 ++++----
 .../odata4/client/core/edm/EdmClientImpl.java   |   4 +-
 .../client/core/edm/EdmEntityContainerImpl.java |  25 +++--
 .../client/core/edm/EdmEntitySetImpl.java       |   2 +-
 .../client/core/edm/v3/EdmEntitySetProxy.java   | 101 +++++++++++++++++++
 .../core/edm/v4/EdmServiceMetadataImpl.java     |  10 +-
 .../client/core/edm/xml/v3/EntitySetImpl.java   |   8 --
 .../core/edm/xml/v4/TermDeserializer.java       |   1 -
 .../client/core/edm/xml/v4/XMLMetadataImpl.java |   6 ++
 .../odata4/client/core/v3/MetadataTest.java     |  23 +++++
 15 files changed, 209 insertions(+), 77 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/31b6c8c0/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/BindingTarget.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/BindingTarget.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/BindingTarget.java
deleted file mode 100644
index c996f71..0000000
--- a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/BindingTarget.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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.odata4.client.api.edm.xml;
-
-import java.util.List;
-import org.apache.olingo.odata4.client.api.edm.xml.v4.NavigationPropertyBinding;
-
-public interface BindingTarget extends Named {
-
-  String getEntityType();
-
-  List<? extends NavigationPropertyBinding> getNavigationPropertyBindings();
-}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/31b6c8c0/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/EntitySet.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/EntitySet.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/EntitySet.java
index 659480b..3807294 100644
--- a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/EntitySet.java
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/EntitySet.java
@@ -18,6 +18,8 @@
  */
 package org.apache.olingo.odata4.client.api.edm.xml;
 
-public interface EntitySet extends BindingTarget {
+public interface EntitySet extends Named {
+
+  String getEntityType();
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/31b6c8c0/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/BindingTarget.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/BindingTarget.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/BindingTarget.java
new file mode 100644
index 0000000..10f6007
--- /dev/null
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/BindingTarget.java
@@ -0,0 +1,27 @@
+/*
+ * 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.odata4.client.api.edm.xml.v4;
+
+import java.util.List;
+import org.apache.olingo.odata4.client.api.edm.xml.Named;
+
+public interface BindingTarget extends Named, AnnotatedEdmItem {
+
+  List<? extends NavigationPropertyBinding> getNavigationPropertyBindings();
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/31b6c8c0/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/EntitySet.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/EntitySet.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/EntitySet.java
index a48b358..b44bee2 100644
--- a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/EntitySet.java
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/EntitySet.java
@@ -18,7 +18,7 @@
  */
 package org.apache.olingo.odata4.client.api.edm.xml.v4;
 
-public interface EntitySet extends org.apache.olingo.odata4.client.api.edm.xml.EntitySet, AnnotatedEdmItem {
+public interface EntitySet extends org.apache.olingo.odata4.client.api.edm.xml.EntitySet, BindingTarget {
 
   boolean isIncludeInServiceDocument();
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/31b6c8c0/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/Singleton.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/Singleton.java b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/Singleton.java
index 589ee9f..1bc6135 100644
--- a/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/Singleton.java
+++ b/odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/Singleton.java
@@ -18,8 +18,8 @@
  */
 package org.apache.olingo.odata4.client.api.edm.xml.v4;
 
-import org.apache.olingo.odata4.client.api.edm.xml.BindingTarget;
+import org.apache.olingo.odata4.client.api.edm.xml.EntitySet;
 
-public interface Singleton extends BindingTarget, AnnotatedEdmItem {
+public interface Singleton extends EntitySet, BindingTarget {
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/31b6c8c0/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmBindingTargetImpl.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmBindingTargetImpl.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmBindingTargetImpl.java
index d27260b..fd4c66a 100644
--- a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmBindingTargetImpl.java
+++ b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmBindingTargetImpl.java
@@ -20,7 +20,7 @@ package org.apache.olingo.odata4.client.core.edm;
 
 import java.util.Iterator;
 import java.util.List;
-import org.apache.olingo.odata4.client.api.edm.xml.BindingTarget;
+import org.apache.olingo.odata4.client.api.edm.xml.v4.BindingTarget;
 import org.apache.olingo.odata4.client.api.edm.xml.v4.NavigationPropertyBinding;
 import org.apache.olingo.odata4.commons.api.edm.Edm;
 import org.apache.olingo.odata4.commons.api.edm.EdmBindingTarget;
@@ -46,30 +46,28 @@ public abstract class EdmBindingTargetImpl extends AbstractEdmBindingTarget {
     EdmBindingTarget bindingTarget = null;
 
     final List<? extends NavigationPropertyBinding> navigationPropertyBindings = target.getNavigationPropertyBindings();
-    if (navigationPropertyBindings != null) {
-      boolean found = false;
-      for (final Iterator<? extends NavigationPropertyBinding> itor = navigationPropertyBindings.iterator();
-              itor.hasNext() && !found;) {
+    boolean found = false;
+    for (final Iterator<? extends NavigationPropertyBinding> itor = navigationPropertyBindings.iterator();
+            itor.hasNext() && !found;) {
 
-        final NavigationPropertyBinding binding = itor.next();
-        if (binding.getPath().equals(path)) {
-          final Target edmTarget = new Target.Builder(binding.getTarget(), container).build();
+      final NavigationPropertyBinding binding = itor.next();
+      if (binding.getPath().equals(path)) {
+        final Target edmTarget = new Target.Builder(binding.getTarget(), container).build();
 
-          final EdmEntityContainer entityContainer = edm.getEntityContainer(edmTarget.getEntityContainer());
-          if (entityContainer == null) {
-            throw new EdmException("Cant find entity container with name: " + edmTarget.getEntityContainer());
-          }
-          bindingTarget = entityContainer.getEntitySet(edmTarget.getTargetName());
+        final EdmEntityContainer entityContainer = edm.getEntityContainer(edmTarget.getEntityContainer());
+        if (entityContainer == null) {
+          throw new EdmException("Cannot find entity container with name: " + edmTarget.getEntityContainer());
+        }
+        bindingTarget = entityContainer.getEntitySet(edmTarget.getTargetName());
+        if (bindingTarget == null) {
+          bindingTarget = entityContainer.getSingleton(edmTarget.getTargetName());
           if (bindingTarget == null) {
-            bindingTarget = entityContainer.getSingleton(edmTarget.getTargetName());
-            if (bindingTarget == null) {
-              throw new EdmException("Cant find target with name: " + edmTarget.getTargetName());
-            }
-
-            found = true;
-          } else {
-            found = true;
+            throw new EdmException("Cannot find target with name: " + edmTarget.getTargetName());
           }
+
+          found = true;
+        } else {
+          found = true;
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/31b6c8c0/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmClientImpl.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmClientImpl.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmClientImpl.java
index a89bf16..905a310 100644
--- a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmClientImpl.java
+++ b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmClientImpl.java
@@ -96,9 +96,9 @@ public class EdmClientImpl extends AbstractEdmImpl {
 
     final Schema schema = xmlMetadata.getSchema(containerName.getNamespace());
     if (schema != null) {
-      final EntityContainer xmlEntityContainer = (EntityContainer) schema.getDefaultEntityContainer();
+      final EntityContainer xmlEntityContainer = schema.getDefaultEntityContainer();
       if (xmlEntityContainer != null) {
-        result = new EdmEntityContainerImpl(this, containerName, xmlEntityContainer);
+        result = new EdmEntityContainerImpl(this, containerName, xmlEntityContainer, xmlMetadata);
       }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/31b6c8c0/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmEntityContainerImpl.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmEntityContainerImpl.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmEntityContainerImpl.java
index 2f9ac88..9cde1b1 100644
--- a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmEntityContainerImpl.java
+++ b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmEntityContainerImpl.java
@@ -25,8 +25,10 @@ import org.apache.olingo.odata4.client.api.edm.xml.v4.Singleton;
 import org.apache.olingo.odata4.client.api.utils.EdmTypeInfo;
 import org.apache.olingo.odata4.client.api.UnsupportedInV3Exception;
 import org.apache.olingo.odata4.client.api.edm.xml.EntityContainer;
+import org.apache.olingo.odata4.client.api.edm.xml.XMLMetadata;
 import org.apache.olingo.odata4.client.api.edm.xml.v3.FunctionImport;
 import org.apache.olingo.odata4.client.core.edm.v3.EdmActionImportProxy;
+import org.apache.olingo.odata4.client.core.edm.v3.EdmEntitySetProxy;
 import org.apache.olingo.odata4.client.core.edm.v3.EdmFunctionImportProxy;
 import org.apache.olingo.odata4.commons.api.edm.Edm;
 import org.apache.olingo.odata4.commons.api.edm.EdmActionImport;
@@ -41,11 +43,15 @@ public class EdmEntityContainerImpl extends AbstractEdmEntityContainer {
 
   private final EntityContainer xmlEntityContainer;
 
+  private final XMLMetadata xmlMetadata;
+
   public EdmEntityContainerImpl(final Edm edm, final FullQualifiedName entityContainerName,
-          final EntityContainer xmlEntityContainer) {
+          final EntityContainer xmlEntityContainer, final XMLMetadata xmlMetadata) {
 
     super(edm, entityContainerName);
+
     this.xmlEntityContainer = xmlEntityContainer;
+    this.xmlMetadata = xmlMetadata;
   }
 
   @Override
@@ -70,9 +76,16 @@ public class EdmEntityContainerImpl extends AbstractEdmEntityContainer {
     if (entitySet == null) {
       throw new EdmException("EntitySet named '" + entitySetName + "' not found in " + entityContainerName);
     }
-    return new EdmEntitySetImpl(edm, this, entitySetName,
-            new EdmTypeInfo(entitySet.getEntityType(), entityContainerName.getNamespace()).getFullQualifiedName(),
-            entitySet);
+
+    if (entitySet instanceof org.apache.olingo.odata4.client.api.edm.xml.v4.EntitySet) {
+      return new EdmEntitySetImpl(edm, this, entitySetName,
+              new EdmTypeInfo(entitySet.getEntityType(), entityContainerName.getNamespace()).getFullQualifiedName(),
+              (org.apache.olingo.odata4.client.api.edm.xml.v4.EntitySet) entitySet);
+    } else {
+      return new EdmEntitySetProxy(edm, this, entitySetName,
+              new EdmTypeInfo(entitySet.getEntityType(), entityContainerName.getNamespace()).getFullQualifiedName(),
+              xmlMetadata);
+    }
   }
 
   @Override
@@ -90,7 +103,7 @@ public class EdmEntityContainerImpl extends AbstractEdmEntityContainer {
       if (functionImport == null) {
         throw new EdmException("FunctionImport named '" + actionImportName + "' not found in " + entityContainerName);
       }
-      return new EdmActionImportProxy(edm, this, actionImportName, (FunctionImport) functionImport);
+      return new EdmActionImportProxy(edm, this, actionImportName, functionImport);
     }
   }
 
@@ -105,7 +118,7 @@ public class EdmEntityContainerImpl extends AbstractEdmEntityContainer {
       return new EdmFunctionImportImpl(edm, this, functionImportName,
               (org.apache.olingo.odata4.client.api.edm.xml.v4.FunctionImport) functionImport);
     } else {
-      return new EdmFunctionImportProxy(edm, this, functionImportName, 
+      return new EdmFunctionImportProxy(edm, this, functionImportName,
               (org.apache.olingo.odata4.client.api.edm.xml.v3.FunctionImport) functionImport);
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/31b6c8c0/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmEntitySetImpl.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmEntitySetImpl.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmEntitySetImpl.java
index 14e1eb4..669e431 100644
--- a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmEntitySetImpl.java
+++ b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/EdmEntitySetImpl.java
@@ -18,7 +18,7 @@
  */
 package org.apache.olingo.odata4.client.core.edm;
 
-import org.apache.olingo.odata4.client.api.edm.xml.EntitySet;
+import org.apache.olingo.odata4.client.api.edm.xml.v4.EntitySet;
 import org.apache.olingo.odata4.commons.api.edm.Edm;
 import org.apache.olingo.odata4.commons.api.edm.EdmEntityContainer;
 import org.apache.olingo.odata4.commons.api.edm.EdmEntitySet;

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/31b6c8c0/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/v3/EdmEntitySetProxy.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/v3/EdmEntitySetProxy.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/v3/EdmEntitySetProxy.java
new file mode 100644
index 0000000..518eb6e
--- /dev/null
+++ b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/v3/EdmEntitySetProxy.java
@@ -0,0 +1,101 @@
+/*
+ * 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.odata4.client.core.edm.v3;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.olingo.odata4.client.api.edm.xml.EntityContainer;
+import org.apache.olingo.odata4.client.api.edm.xml.Schema;
+import org.apache.olingo.odata4.client.api.edm.xml.XMLMetadata;
+import org.apache.olingo.odata4.client.api.edm.xml.v3.Association;
+import org.apache.olingo.odata4.client.api.edm.xml.v3.AssociationSet;
+import org.apache.olingo.odata4.client.core.edm.xml.v3.EntityContainerImpl;
+import org.apache.olingo.odata4.client.core.edm.xml.v3.SchemaImpl;
+import org.apache.olingo.odata4.commons.api.edm.Edm;
+import org.apache.olingo.odata4.commons.api.edm.EdmBindingTarget;
+import org.apache.olingo.odata4.commons.api.edm.EdmEntityContainer;
+import org.apache.olingo.odata4.commons.api.edm.EdmEntitySet;
+import org.apache.olingo.odata4.commons.api.edm.EdmException;
+import org.apache.olingo.odata4.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.odata4.commons.core.edm.AbstractEdmBindingTarget;
+
+public class EdmEntitySetProxy extends AbstractEdmBindingTarget implements EdmEntitySet {
+
+  private final XMLMetadata xmlMetadata;
+
+  public EdmEntitySetProxy(final Edm edm, final EdmEntityContainer container, final String name,
+          final FullQualifiedName type, final XMLMetadata xmlMetadata) {
+
+    super(edm, container, name, type);
+    this.xmlMetadata = xmlMetadata;
+  }
+
+  @Override
+  public EdmBindingTarget getRelatedBindingTarget(final String path) {
+    final List<AssociationSet> candidateAssociationSets = new ArrayList<AssociationSet>();
+    for (Schema schema : xmlMetadata.getSchemas()) {
+      for (EntityContainer _entityContainer : schema.getEntityContainers()) {
+        final EntityContainerImpl entityContainer = (EntityContainerImpl) _entityContainer;
+        for (AssociationSet associationSet : entityContainer.getAssociationSets()) {
+          if (getName().equals(associationSet.getEnds().get(0).getEntitySet())
+                  || getName().equals(associationSet.getEnds().get(1).getEntitySet())) {
+
+            candidateAssociationSets.add(associationSet);
+          }
+        }
+      }
+    }
+    if (candidateAssociationSets.isEmpty()) {
+      throw new EdmException("Cannot find any AssociationSet with first End: " + getName());
+    }
+
+    Schema targetSchema = null;
+    String targetEntitySet = null;
+    for (AssociationSet associationSet : candidateAssociationSets) {
+      for (Schema schema : xmlMetadata.getSchemas()) {
+        for (Association association : ((SchemaImpl) schema).getAssociations()) {
+          final FullQualifiedName associationName = new FullQualifiedName(schema.getNamespace(), association.getName());
+          if (associationName.getFullQualifiedNameAsString().equals(associationSet.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();
+            } else {
+              targetEntitySet = associationSet.getEnds().get(0).getEntitySet();
+            }
+          }
+        }
+      }
+    }
+    if (targetSchema == 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);
+    if (entityContainer == null) {
+      throw new EdmException("Cannot find EntityContainer with name: " + relatedFQN);
+    }
+
+    return entityContainer.getEntitySet(targetEntitySet);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/31b6c8c0/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/v4/EdmServiceMetadataImpl.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/v4/EdmServiceMetadataImpl.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/v4/EdmServiceMetadataImpl.java
index dfcc38b..e077e3a 100644
--- a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/v4/EdmServiceMetadataImpl.java
+++ b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/v4/EdmServiceMetadataImpl.java
@@ -21,7 +21,7 @@ package org.apache.olingo.odata4.client.core.edm.v4;
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.olingo.odata4.client.api.edm.xml.CommonFunctionImport;
-import org.apache.olingo.odata4.client.api.edm.xml.Schema;
+import org.apache.olingo.odata4.client.api.edm.xml.v4.Schema;
 import org.apache.olingo.odata4.client.api.edm.xml.v4.ActionImport;
 import org.apache.olingo.odata4.client.api.edm.xml.v4.EntityContainer;
 import org.apache.olingo.odata4.client.api.edm.xml.v4.Singleton;
@@ -57,7 +57,7 @@ public class EdmServiceMetadataImpl extends AbstractEdmServiceMetadataImpl {
     synchronized (this) {
       if (singletonInfos == null) {
         singletonInfos = new ArrayList<EdmSingletonInfo>();
-        for (Schema schema : xmlMetadata.getSchemas()) {
+        for (Schema schema : ((XMLMetadataImpl) xmlMetadata).getSchemas()) {
           final EntityContainer entityContainer = (EntityContainer) schema.getDefaultEntityContainer();
           for (Singleton singleton : entityContainer.getSingletons()) {
             singletonInfos.add(new EdmSingletonInfoImpl(entityContainer.getName(), singleton.getName()));
@@ -73,8 +73,8 @@ public class EdmServiceMetadataImpl extends AbstractEdmServiceMetadataImpl {
     synchronized (this) {
       if (functionImportInfos == null) {
         functionImportInfos = new ArrayList<EdmFunctionImportInfo>();
-        for (Schema schema : xmlMetadata.getSchemas()) {
-          for (org.apache.olingo.odata4.client.api.edm.xml.EntityContainer entityContainer : schema.getEntityContainers()) {
+        for (Schema schema : ((XMLMetadataImpl) xmlMetadata).getSchemas()) {
+          for (EntityContainer entityContainer : schema.getEntityContainers()) {
             for (CommonFunctionImport functionImport : entityContainer.getFunctionImports()) {
               functionImportInfos.add(
                       new EdmFunctionImportInfoImpl(entityContainer.getName(), functionImport.getName()));
@@ -91,7 +91,7 @@ public class EdmServiceMetadataImpl extends AbstractEdmServiceMetadataImpl {
     synchronized (this) {
       if (actionImportInfos == null) {
         actionImportInfos = new ArrayList<EdmActionImportInfo>();
-        for (Schema schema : xmlMetadata.getSchemas()) {
+        for (Schema schema : ((XMLMetadataImpl) xmlMetadata).getSchemas()) {
           final EntityContainer entityContainer = (EntityContainer) schema.getDefaultEntityContainer();
           for (ActionImport actionImport : entityContainer.getActionImports()) {
             actionImportInfos.add(new EdmActionImportInfoImpl(entityContainer.getName(), actionImport.getName()));

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/31b6c8c0/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/xml/v3/EntitySetImpl.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/xml/v3/EntitySetImpl.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/xml/v3/EntitySetImpl.java
index a859d88..bc28cc6 100644
--- a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/xml/v3/EntitySetImpl.java
+++ b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/xml/v3/EntitySetImpl.java
@@ -18,18 +18,10 @@
  */
 package org.apache.olingo.odata4.client.core.edm.xml.v3;
 
-import java.util.List;
-import org.apache.olingo.odata4.client.api.edm.xml.v4.NavigationPropertyBinding;
-import org.apache.olingo.odata4.client.api.UnsupportedInV3Exception;
 import org.apache.olingo.odata4.client.core.edm.xml.AbstractEntitySet;
 
 public class EntitySetImpl extends AbstractEntitySet {
 
   private static final long serialVersionUID = 5570833733884884012L;
 
-  @Override
-  public List<? extends NavigationPropertyBinding> getNavigationPropertyBindings() {
-    throw new UnsupportedInV3Exception();
-  }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/31b6c8c0/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/xml/v4/TermDeserializer.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/xml/v4/TermDeserializer.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/xml/v4/TermDeserializer.java
index 9de5318..c8fed65 100644
--- a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/xml/v4/TermDeserializer.java
+++ b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/xml/v4/TermDeserializer.java
@@ -23,7 +23,6 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.JsonToken;
 import com.fasterxml.jackson.databind.DeserializationContext;
 import java.io.IOException;
-import java.math.BigInteger;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.olingo.odata4.client.api.edm.xml.v4.CSDLElement;

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/31b6c8c0/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/xml/v4/XMLMetadataImpl.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/xml/v4/XMLMetadataImpl.java b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/xml/v4/XMLMetadataImpl.java
index 9aef820..0d74c12 100644
--- a/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/xml/v4/XMLMetadataImpl.java
+++ b/odata4-lib/odata4-client-core/src/main/java/org/apache/olingo/odata4/client/core/edm/xml/v4/XMLMetadataImpl.java
@@ -33,6 +33,12 @@ public class XMLMetadataImpl extends AbstractXMLMetadata {
   }
 
   @Override
+  @SuppressWarnings("unchecked")
+  public List<Schema> getSchemas() {
+    return (List<Schema>) super.getSchemas();
+  }
+
+  @Override
   public Schema getSchema(final int index) {
     return (Schema) super.getSchema(index);
   }

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata4/blob/31b6c8c0/odata4-lib/odata4-client-core/src/test/java/org/apache/olingo/odata4/client/core/v3/MetadataTest.java
----------------------------------------------------------------------
diff --git a/odata4-lib/odata4-client-core/src/test/java/org/apache/olingo/odata4/client/core/v3/MetadataTest.java b/odata4-lib/odata4-client-core/src/test/java/org/apache/olingo/odata4/client/core/v3/MetadataTest.java
index 5efb1d3..337eadc 100644
--- a/odata4-lib/odata4-client-core/src/test/java/org/apache/olingo/odata4/client/core/v3/MetadataTest.java
+++ b/odata4-lib/odata4-client-core/src/test/java/org/apache/olingo/odata4/client/core/v3/MetadataTest.java
@@ -40,8 +40,10 @@ import org.apache.olingo.odata4.commons.api.edm.Edm;
 import org.apache.olingo.odata4.commons.api.edm.EdmAction;
 import org.apache.olingo.odata4.commons.api.edm.EdmActionImport;
 import org.apache.olingo.odata4.commons.api.edm.EdmActionImportInfo;
+import org.apache.olingo.odata4.commons.api.edm.EdmBindingTarget;
 import org.apache.olingo.odata4.commons.api.edm.EdmComplexType;
 import org.apache.olingo.odata4.commons.api.edm.EdmEntityContainer;
+import org.apache.olingo.odata4.commons.api.edm.EdmEntitySet;
 import org.apache.olingo.odata4.commons.api.edm.EdmEntityType;
 import org.apache.olingo.odata4.commons.api.edm.EdmFunction;
 import org.apache.olingo.odata4.commons.api.edm.EdmFunctionImport;
@@ -197,4 +199,25 @@ public class MetadataTest extends AbstractTest {
             new FullQualifiedName(container.getNamespace(), "ResetDataSource"), null, Boolean.FALSE);
     assertNotNull(resetDataSource2);
   }
+
+  @Test
+  public void navigation() {
+    final Edm metadata = getClient().getReader().
+            readMetadata(getClass().getResourceAsStream("metadata.xml"));
+    assertNotNull(metadata);
+
+    final EdmEntityContainer container = metadata.getEntityContainer(
+            new FullQualifiedName("Microsoft.Test.OData.Services.AstoriaDefaultService", "DefaultContainer"));
+    assertNotNull(container);
+
+    final EdmEntitySet customer = container.getEntitySet("Customer");
+    assertNotNull(customer);
+
+    final EdmBindingTarget order = customer.getRelatedBindingTarget("Orders");
+    assertNotNull(order);
+    assertTrue(order instanceof EdmEntitySet);
+
+    final EdmBindingTarget customerBindingTarget = ((EdmEntitySet) order).getRelatedBindingTarget("Customer");
+    assertEquals(customer.getEntityType().getName(), customerBindingTarget.getEntityType().getName());
+  }
 }