mirror of
https://github.com/apache/olingo-odata4.git
synced 2025-03-06 16:49:09 +00:00
[OLINGO-169] Now able to use commons Edm interfaces with v3
This commit is contained in:
parent
d1b341dfaa
commit
31b6c8c09a
@ -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();
|
||||
|
||||
}
|
||||
|
@ -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<? extends NavigationPropertyBinding> getNavigationPropertyBindings();
|
||||
}
|
@ -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();
|
||||
}
|
||||
|
@ -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 {
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
@ -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()));
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -32,6 +32,12 @@ public class XMLMetadataImpl extends AbstractXMLMetadata {
|
||||
super(edmx);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<Schema> getSchemas() {
|
||||
return (List<Schema>) super.getSchemas();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Schema getSchema(final int index) {
|
||||
return (Schema) super.getSchema(index);
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user