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 659480b51..380729436 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(); } 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/v4/BindingTarget.java similarity index 81% rename from odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/BindingTarget.java rename to odata4-lib/odata4-client-api/src/main/java/org/apache/olingo/odata4/client/api/edm/xml/v4/BindingTarget.java index c996f7157..10f60070d 100644 --- 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/v4/BindingTarget.java @@ -16,14 +16,12 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.olingo.odata4.client.api.edm.xml; +package org.apache.olingo.odata4.client.api.edm.xml.v4; import java.util.List; -import org.apache.olingo.odata4.client.api.edm.xml.v4.NavigationPropertyBinding; +import org.apache.olingo.odata4.client.api.edm.xml.Named; -public interface BindingTarget extends Named { - - String getEntityType(); +public interface BindingTarget extends Named, AnnotatedEdmItem { List getNavigationPropertyBindings(); } 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 a48b35859..b44bee28a 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(); } 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 589ee9f8f..1bc6135bd 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 { } 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 d27260b65..fd4c66ad5 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 navigationPropertyBindings = target.getNavigationPropertyBindings(); - if (navigationPropertyBindings != null) { - boolean found = false; - for (final Iterator itor = navigationPropertyBindings.iterator(); - itor.hasNext() && !found;) { + boolean found = false; + for (final Iterator 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; } } } 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 a89bf16c7..905a310cd 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); } } 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 2f9ac88f9..9cde1b11f 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); } } 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 14e1eb49b..669e431c9 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; 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 000000000..518eb6ed1 --- /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 candidateAssociationSets = new ArrayList(); + 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); + } + +} 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 dfcc38b3e..e077e3abb 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(); - 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(); - 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(); - 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())); 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 a859d8809..bc28cc6ab 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 getNavigationPropertyBindings() { - throw new UnsupportedInV3Exception(); - } - } 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 9de531859..c8fed6562 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; 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 9aef820c7..0d74c1238 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 @@ -32,6 +32,12 @@ public class XMLMetadataImpl extends AbstractXMLMetadata { super(edmx); } + @Override + @SuppressWarnings("unchecked") + public List getSchemas() { + return (List) super.getSchemas(); + } + @Override public Schema getSchema(final int index) { return (Schema) super.getSchema(index); 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 5efb1d3c7..337eadcde 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()); + } }