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

This commit is contained in:
Francesco Chicchiriccò 2014-03-07 10:04:24 +01:00
parent d1b341dfaa
commit 31b6c8c09a
14 changed files with 185 additions and 53 deletions

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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 {
}

View File

@ -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;
}
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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);
}
}

View File

@ -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()));

View File

@ -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();
}
}

View File

@ -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;

View File

@ -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);

View File

@ -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());
}
}