You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2016/12/13 09:22:14 UTC
[2/2] olingo-odata4 git commit: Cross Service EDM
Cross Service EDM
Change-Id: I14ed9771c85e576c33d51ed3ea05e6323c20c51a
Signed-off-by: Archana Rai <ar...@sap.com>
Signed-off-by: Christian Amend <ch...@sap.com>
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/01c6aa15
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/01c6aa15
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/01c6aa15
Branch: refs/heads/master
Commit: 01c6aa1592eeb041556be23253424cc2a04e1627
Parents: 4b3c023
Author: Archana Rai <ar...@sap.com>
Authored: Wed Dec 7 15:29:04 2016 +0530
Committer: Christian Amend <ch...@sap.com>
Committed: Tue Dec 13 10:10:22 2016 +0100
----------------------------------------------------------------------
.../commons/core/edm/CrossServiceTest.java | 237 +++++++++++++++++++
1 file changed, 237 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/01c6aa15/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/CrossServiceTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/CrossServiceTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/CrossServiceTest.java
new file mode 100644
index 0000000..f2c7430
--- /dev/null
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/CrossServiceTest.java
@@ -0,0 +1,237 @@
+package org.apache.olingo.commons.core.edm;
+ /*
+ * 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.
+ */
+
+ import java.util.Arrays;
+ import java.util.Collections;
+ import java.util.List;
+
+ import org.apache.olingo.commons.api.edm.Edm;
+ import org.apache.olingo.commons.api.edm.EdmEntitySet;
+ import org.apache.olingo.commons.api.edm.EdmEntityType;
+ import org.apache.olingo.commons.api.edm.FullQualifiedName;
+ import org.apache.olingo.commons.api.edm.provider.CsdlAbstractEdmProvider;
+ import org.apache.olingo.commons.api.edm.provider.CsdlAliasInfo;
+ import org.apache.olingo.commons.api.edm.provider.CsdlEdmProvider;
+ import org.apache.olingo.commons.api.edm.provider.CsdlEntityContainer;
+ import org.apache.olingo.commons.api.edm.provider.CsdlEntityContainerInfo;
+ import org.apache.olingo.commons.api.edm.provider.CsdlEntitySet;
+ import org.apache.olingo.commons.api.edm.provider.CsdlEntityType;
+ import org.apache.olingo.commons.api.edm.provider.CsdlNavigationProperty;
+ import org.apache.olingo.commons.api.edm.provider.CsdlProperty;
+ import org.apache.olingo.commons.api.edm.provider.CsdlPropertyRef;
+ import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
+ import org.apache.olingo.commons.api.ex.ODataException;
+import org.apache.olingo.commons.core.edm.EdmProviderImpl;
+import org.junit.Assert;
+ import org.junit.Test;
+
+ public class CrossServiceTest {
+
+ private final CsdlEdmProvider provider1 = new CsdlProvider("One");
+ private final CsdlEdmProvider provider2 = new CsdlProvider("Two");
+ private final Edm edm1 = new EdmProviderImpl(provider1);
+ private final Edm edm2 = new EdmProviderImpl(provider2);
+
+ private class CsdlProvider extends CsdlAbstractEdmProvider {
+
+ private static final String NAMESPACE_PREFIX = "Namespace.";
+ private static final String ALIAS_PREFIX = "Alias";
+ private static final String CONTAINER_PREFIX = "Container";
+ private static final String ENTITY_SET_PREFIX = "EntitySet";
+ private static final String ENTITY_TYPE_PREFIX = "EntityType";
+ private final String name;
+ private final String namespace;
+ private final String other;
+ private final CsdlEntitySet entitySet;
+ private final CsdlEntityType entityType;
+
+ private CsdlProvider(final String name) {
+ this.name = name;
+ namespace = NAMESPACE_PREFIX + name;
+ other = name.equals("One") ? "Two" : "One";
+ entitySet = new CsdlEntitySet().setName(ENTITY_SET_PREFIX + name)
+ .setType(new FullQualifiedName(namespace, ENTITY_TYPE_PREFIX + name));
+ entityType = new CsdlEntityType().setName(ENTITY_TYPE_PREFIX + name)
+ .setKey(Collections.singletonList(new CsdlPropertyRef().setName("ID" + name)))
+ .setProperties(Collections.singletonList(
+ new CsdlProperty().setName("ID" + name).setNullable(false).setType("Edm.Guid")))
+ .setNavigationProperties(Collections.singletonList(
+ new CsdlNavigationProperty().setName("Navigation" + other)
+ .setType(new FullQualifiedName(ALIAS_PREFIX + other, ENTITY_TYPE_PREFIX + other))));
+ }
+
+ @Override
+ public List<CsdlAliasInfo> getAliasInfos() throws ODataException {
+ return Arrays.asList(
+ new CsdlAliasInfo().setNamespace(NAMESPACE_PREFIX + name).setAlias(ALIAS_PREFIX + name),
+ new CsdlAliasInfo().setNamespace(NAMESPACE_PREFIX + other).setAlias(ALIAS_PREFIX + other));
+ }
+
+ @Override
+ public List<CsdlSchema> getSchemas() throws ODataException {
+ return Collections.singletonList(
+ new CsdlSchema().setNamespace(namespace).setAlias(ALIAS_PREFIX + name)
+ .setEntityContainer(getEntityContainer())
+ .setEntityTypes(Collections.singletonList(entityType)));
+ }
+
+ @Override
+ public CsdlEntityContainerInfo getEntityContainerInfo(final FullQualifiedName entityContainerName)
+ throws ODataException {
+ if (entityContainerName == null) {
+ return new CsdlEntityContainerInfo().setContainerName(
+ new FullQualifiedName(namespace, CONTAINER_PREFIX + name));
+ } else if (namespace.equals(entityContainerName.getNamespace())) {
+ if ((CONTAINER_PREFIX + name).equals(entityContainerName.getName())) {
+ return new CsdlEntityContainerInfo().setContainerName(entityContainerName);
+ }
+ return null;
+ } else if ((NAMESPACE_PREFIX + other).equals(entityContainerName.getNamespace())) {
+ final CsdlEdmProvider otherProvider = this == provider1 ? provider2 : provider1;
+ return otherProvider.getEntityContainerInfo(entityContainerName);
+ }
+ return null;
+ }
+
+ @Override
+ public CsdlEntityContainer getEntityContainer() throws ODataException {
+ return new CsdlEntityContainer().setName(CONTAINER_PREFIX + name)
+ .setEntitySets(Collections.singletonList(entitySet));
+ }
+
+ @Override
+ public CsdlEntitySet getEntitySet(final FullQualifiedName entityContainer, final String entitySetName)
+ throws ODataException {
+ if (namespace.equals(entityContainer.getNamespace())) {
+ if ((CONTAINER_PREFIX + name).equals(entityContainer.getName())
+ && (ENTITY_SET_PREFIX + name).equals(entitySetName)) {
+ return entitySet;
+ }
+ return null;
+ } else if ((NAMESPACE_PREFIX + other).equals(entityContainer.getNamespace())) {
+ final CsdlEdmProvider otherProvider = this == provider1 ? provider2 : provider1;
+ return otherProvider.getEntitySet(entityContainer, entitySetName);
+ }
+ return null;
+ }
+
+ @Override
+ public CsdlEntityType getEntityType(final FullQualifiedName entityTypeName) throws ODataException {
+ if (namespace.equals(entityTypeName.getNamespace())) {
+ if ((ENTITY_TYPE_PREFIX + name).equals(entityTypeName.getName())) {
+ return entityType;
+ }
+ return null;
+ } else if ((NAMESPACE_PREFIX + other).equals(entityTypeName.getNamespace())) {
+ // Requesting a type in a foreign namespace delegates the request to another CSDL provider.
+ final CsdlEdmProvider otherProvider = this == provider1 ? provider2 : provider1;
+ return otherProvider.getEntityType(entityTypeName);
+ }
+ return null;
+ }
+ }
+
+ @Test
+ public void entityType() throws Exception {
+ final FullQualifiedName typeName = new FullQualifiedName("Namespace.One", "EntityTypeOne");
+ final EdmEntityType entityType = edm1.getEntityType(typeName);
+ Assert.assertNotNull(entityType);
+ Assert.assertNotNull(entityType.getNavigationProperty("NavigationTwo"));
+
+ // We get an entity type in a foreign namespace if it is used in our namespace.
+ final EdmEntityType targetType = entityType.getNavigationProperty("NavigationTwo").getType();
+ Assert.assertNotNull(targetType);
+ final FullQualifiedName targetName = new FullQualifiedName("Namespace.Two", "EntityTypeTwo");
+ Assert.assertEquals(targetName, targetType.getFullQualifiedName());
+
+ // Directly accessing the foreign type is also possible.
+ Assert.assertNotNull(edm1.getEntityType(targetName));
+ Assert.assertEquals(targetType, edm1.getEntityType(targetName));
+
+ // However, the schema contains only elements from the own namespace.
+ final List<EdmEntityType> entityTypes = edm1.getSchema("Namespace.One").getEntityTypes();
+ Assert.assertNotNull(entityTypes);
+ Assert.assertEquals(1, entityTypes.size());
+ Assert.assertEquals(typeName, entityTypes.get(0).getFullQualifiedName());
+
+ // The foreign service has the foreign type available, both directly and in its schema.
+ Assert.assertNotNull(edm2.getEntityType(targetName));
+ Assert.assertEquals(targetName, edm2.getEntityType(targetName).getFullQualifiedName());
+ Assert.assertEquals(targetName,
+ edm2.getSchema("AliasTwo").getEntityTypes().get(0).getFullQualifiedName());
+
+ // Alias access is also supported.
+ Assert.assertNotNull(edm1.getEntityType(new FullQualifiedName("AliasOne", "EntityTypeOne")));
+
+ // A wrong name leads to null result.
+ Assert.assertNull(edm1.getEntityType(new FullQualifiedName("AliasOne", "EntityTypeWrong")));
+ Assert.assertNull(edm1.getEntityType(new FullQualifiedName("AliasTwo", "EntityTypeWrong")));
+ Assert.assertNull(edm1.getEntityType(new FullQualifiedName("AliasWrong", "EntityTypeOne")));
+ }
+
+ @Test
+ public void entityContainer() throws Exception {
+ Assert.assertNotNull(edm1.getEntityContainer());
+ Assert.assertNotNull(edm1.getEntityContainer(new FullQualifiedName("Namespace.One", "ContainerOne")));
+ Assert.assertEquals(edm1.getEntityContainer(),
+ edm1.getEntityContainer(new FullQualifiedName("Namespace.One", "ContainerOne")));
+ Assert.assertEquals(edm1.getEntityContainer(),
+ edm1.getEntityContainer(new FullQualifiedName("AliasOne", "ContainerOne")));
+ Assert.assertNotNull(edm1.getEntityContainer(new FullQualifiedName("AliasTwo", "ContainerTwo")));
+
+ // A wrong name leads to null result.
+ Assert.assertNull(edm1.getEntityContainer(new FullQualifiedName("AliasTwo", "ContainerOne")));
+ Assert.assertNull(edm1.getEntityContainer(new FullQualifiedName("AliasWrong", "ContainerOne")));
+ }
+
+ @Test
+ public void entitySet() throws Exception {
+ final EdmEntitySet entitySet = edm1.getEntityContainer(new FullQualifiedName("AliasTwo", "ContainerTwo"))
+ .getEntitySet("EntitySetTwo");
+ Assert.assertNotNull(entitySet);
+ Assert.assertEquals("EntitySetTwo", entitySet.getName());
+ Assert.assertNotNull(entitySet.getEntityType());
+ Assert.assertEquals("EntityTypeTwo", entitySet.getEntityType().getName());
+
+ // A wrong name leads to null result.
+ Assert.assertNull(edm1.getEntityContainer().getEntitySet("EntitySetTwo"));
+ Assert.assertNull(
+ edm1.getEntityContainer(new FullQualifiedName("AliasTwo", "ContainerTwo")).getEntitySet("EntitySetOne"));
+ }
+
+ @Test
+ public void schema() throws Exception {
+ Assert.assertNotNull(edm1.getSchemas());
+ Assert.assertEquals(1, edm1.getSchemas().size());
+ Assert.assertEquals("AliasOne", edm1.getSchemas().get(0).getAlias());
+ Assert.assertNotNull(edm1.getSchemas().get(0).getEntityTypes());
+ Assert.assertEquals(1, edm1.getSchemas().get(0).getEntityTypes().size());
+ Assert.assertEquals(new FullQualifiedName("Namespace.One", "EntityTypeOne"),
+ edm1.getSchemas().get(0).getEntityTypes().get(0).getFullQualifiedName());
+ }
+
+ @Test
+ public void entitySets() throws Exception {
+ Assert.assertNotNull(edm1.getEntityContainer());
+ Assert.assertNotNull(edm1.getEntityContainer().getEntitySets());
+ Assert.assertEquals(1, edm1.getEntityContainer().getEntitySets().size());
+ Assert.assertEquals("EntitySetOne", edm1.getEntityContainer().getEntitySets().get(0).getName());
+ }
+}