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

git commit: [OLINGO-232] Added according methods to EdmEntityContainer

Repository: olingo-odata2
Updated Branches:
  refs/heads/master bf7da39ce -> 1035f9249


[OLINGO-232] Added according methods to EdmEntityContainer


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/1035f924
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/1035f924
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/1035f924

Branch: refs/heads/master
Commit: 1035f9249c68fc782e520a9ae649ef77b74f659c
Parents: bf7da39
Author: Michael Bolz <mi...@apache.org>
Authored: Wed Apr 2 14:44:10 2014 +0200
Committer: Michael Bolz <mi...@apache.org>
Committed: Thu Apr 3 13:13:34 2014 +0200

----------------------------------------------------------------------
 .../odata2/api/edm/EdmEntityContainer.java      |  22 ++++
 .../provider/EdmEntityContainerImplProv.java    | 111 ++++++++++++++++---
 .../EdmEntityContainerImplProvTest.java         | 105 +++++++++++++++---
 3 files changed, 208 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/1035f924/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/edm/EdmEntityContainer.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/edm/EdmEntityContainer.java b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/edm/EdmEntityContainer.java
index 899bccb..39e70e4 100644
--- a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/edm/EdmEntityContainer.java
+++ b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/edm/EdmEntityContainer.java
@@ -18,6 +18,8 @@
  ******************************************************************************/
 package org.apache.olingo.odata2.api.edm;
 
+import java.util.List;
+
 /**
  * @org.apache.olingo.odata2.DoNotImplement
  * A CSDL EntityContainer element
@@ -42,6 +44,16 @@ public interface EdmEntityContainer extends EdmNamed, EdmAnnotatable {
   EdmEntitySet getEntitySet(String name) throws EdmException;
 
   /**
+   * <b>ATTENTION:</b> This method does not support <b>LAZY LOADING</b>.
+   * <br/>
+   * Get list of all contained EntitySets.
+   * 
+   * @return with all contained {@link EdmEntitySet}
+   * @throws EdmException
+   */
+  List<EdmEntitySet> getEntitySets() throws EdmException;
+
+  /**
    * Get contained FunctionImport by name
    * 
    * @param name
@@ -60,4 +72,14 @@ public interface EdmEntityContainer extends EdmNamed, EdmAnnotatable {
    */
   EdmAssociationSet getAssociationSet(EdmEntitySet sourceEntitySet, EdmNavigationProperty navigationProperty)
       throws EdmException;
+
+  /**
+   * <b>ATTENTION:</b> This method does not support <b>LAZY LOADING</b>.
+   * <br/>
+   * Get list of all contained AssociationSets
+   * 
+   * @return list with all contained {@link EdmAssociationSet}
+   * @throws EdmException
+   */
+  List<EdmAssociationSet> getAssociationSets() throws EdmException;
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/1035f924/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/provider/EdmEntityContainerImplProv.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/provider/EdmEntityContainerImplProv.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/provider/EdmEntityContainerImplProv.java
index be42b03..e4026e6 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/provider/EdmEntityContainerImplProv.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/provider/EdmEntityContainerImplProv.java
@@ -18,7 +18,9 @@
  ******************************************************************************/
 package org.apache.olingo.odata2.core.edm.provider;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.olingo.odata2.api.edm.EdmAnnotatable;
@@ -32,9 +34,11 @@ import org.apache.olingo.odata2.api.edm.EdmFunctionImport;
 import org.apache.olingo.odata2.api.edm.EdmNavigationProperty;
 import org.apache.olingo.odata2.api.edm.FullQualifiedName;
 import org.apache.olingo.odata2.api.edm.provider.AssociationSet;
+import org.apache.olingo.odata2.api.edm.provider.EntityContainer;
 import org.apache.olingo.odata2.api.edm.provider.EntityContainerInfo;
 import org.apache.olingo.odata2.api.edm.provider.EntitySet;
 import org.apache.olingo.odata2.api.edm.provider.FunctionImport;
+import org.apache.olingo.odata2.api.edm.provider.Schema;
 import org.apache.olingo.odata2.api.exception.ODataException;
 
 /**
@@ -43,7 +47,8 @@ import org.apache.olingo.odata2.api.exception.ODataException;
 public class EdmEntityContainerImplProv implements EdmEntityContainer, EdmAnnotatable {
 
   private EdmImplProv edm;
-  private EntityContainerInfo entityContainer;
+  private List<EntityContainer> entityContainerHierachy;
+  private EntityContainerInfo entityContainerInfo;
   private Map<String, EdmEntitySet> edmEntitySets;
   private Map<String, EdmAssociationSet> edmAssociationSets;
   private Map<String, EdmFunctionImport> edmFunctionImports;
@@ -51,17 +56,17 @@ public class EdmEntityContainerImplProv implements EdmEntityContainer, EdmAnnota
   private boolean isDefaultContainer;
   private EdmAnnotations annotations;
 
-  public EdmEntityContainerImplProv(final EdmImplProv edm, final EntityContainerInfo entityContainer)
+  public EdmEntityContainerImplProv(final EdmImplProv edm, final EntityContainerInfo entityContainerInfo)
       throws EdmException {
     this.edm = edm;
-    this.entityContainer = entityContainer;
+    this.entityContainerInfo = entityContainerInfo;
     edmEntitySets = new HashMap<String, EdmEntitySet>();
     edmAssociationSets = new HashMap<String, EdmAssociationSet>();
     edmFunctionImports = new HashMap<String, EdmFunctionImport>();
-    isDefaultContainer = entityContainer.isDefaultEntityContainer();
+    isDefaultContainer = entityContainerInfo.isDefaultEntityContainer();
 
-    if (entityContainer.getExtendz() != null) {
-      edmExtendedEntityContainer = edm.getEntityContainer(entityContainer.getExtendz());
+    if (entityContainerInfo.getExtendz() != null) {
+      edmExtendedEntityContainer = edm.getEntityContainer(entityContainerInfo.getExtendz());
       if (edmExtendedEntityContainer == null) {
         throw new EdmException(EdmException.COMMON);
       }
@@ -70,7 +75,7 @@ public class EdmEntityContainerImplProv implements EdmEntityContainer, EdmAnnota
 
   @Override
   public String getName() throws EdmException {
-    return entityContainer.getName();
+    return entityContainerInfo.getName();
   }
 
   @Override
@@ -82,14 +87,13 @@ public class EdmEntityContainerImplProv implements EdmEntityContainer, EdmAnnota
 
     EntitySet entitySet;
     try {
-      entitySet = edm.edmProvider.getEntitySet(entityContainer.getName(), name);
+      entitySet = edm.edmProvider.getEntitySet(entityContainerInfo.getName(), name);
     } catch (ODataException e) {
       throw new EdmException(EdmException.PROVIDERPROBLEM, e);
     }
 
     if (entitySet != null) {
       edmEntitySet = createEntitySet(entitySet);
-      edmEntitySets.put(name, edmEntitySet);
     } else if (edmExtendedEntityContainer != null) {
       edmEntitySet = edmExtendedEntityContainer.getEntitySet(name);
       if (edmEntitySet != null) {
@@ -109,7 +113,7 @@ public class EdmEntityContainerImplProv implements EdmEntityContainer, EdmAnnota
 
     FunctionImport functionImport;
     try {
-      functionImport = edm.edmProvider.getFunctionImport(entityContainer.getName(), name);
+      functionImport = edm.edmProvider.getFunctionImport(entityContainerInfo.getName(), name);
     } catch (ODataException e) {
       throw new EdmException(EdmException.PROVIDERPROBLEM, e);
     }
@@ -147,7 +151,7 @@ public class EdmEntityContainerImplProv implements EdmEntityContainer, EdmAnnota
         new FullQualifiedName(edmAssociation.getNamespace(), edmAssociation.getName());
     try {
       associationSet =
-          edm.edmProvider.getAssociationSet(entityContainer.getName(), associationFQName, entitySetName,
+          edm.edmProvider.getAssociationSet(entityContainerInfo.getName(), associationFQName, entitySetName,
               entitySetFromRole);
     } catch (ODataException e) {
       throw new EdmException(EdmException.PROVIDERPROBLEM, e);
@@ -166,8 +170,18 @@ public class EdmEntityContainerImplProv implements EdmEntityContainer, EdmAnnota
     }
   }
 
+  /**
+   * Create an {@link EdmEntitySet} based on given {@link EntitySet} and put it into the cache (see
+   * {@link #edmEntitySets}).
+   * 
+   * @param entitySet based on which the {@link EdmEntitySet} is created
+   * @return the created and cached {@link EdmEntitySet}
+   * @throws EdmException
+   */
   private EdmEntitySet createEntitySet(final EntitySet entitySet) throws EdmException {
-    return new EdmEntitySetImplProv(edm, entitySet, this);
+    EdmEntitySet edmEntitySet = new EdmEntitySetImplProv(edm, entitySet, this);
+    edmEntitySets.put(entitySet.getName(), edmEntitySet);
+    return edmEntitySet;
   }
 
   private EdmFunctionImport createFunctionImport(final FunctionImport functionImport) throws EdmException {
@@ -186,9 +200,78 @@ public class EdmEntityContainerImplProv implements EdmEntityContainer, EdmAnnota
   @Override
   public EdmAnnotations getAnnotations() throws EdmException {
     if (annotations == null) {
-      annotations = new EdmAnnotationsImplProv(entityContainer.getAnnotationAttributes(),
-          entityContainer.getAnnotationElements());
+      annotations = new EdmAnnotationsImplProv(entityContainerInfo.getAnnotationAttributes(),
+          entityContainerInfo.getAnnotationElements());
     }
     return annotations;
   }
+
+  @Override
+  public List<EdmEntitySet> getEntitySets() throws EdmException {
+    try {
+      List<EdmEntitySet> edmEntitySets = new ArrayList<EdmEntitySet>();
+      List<EntityContainer> entityContainerHierachy = getEntityContainerHierachy();
+      for (EntityContainer entityContainer : entityContainerHierachy) {
+        List<EntitySet> entitySets = entityContainer.getEntitySets();
+        for (EntitySet entitySet : entitySets) {
+          EdmEntitySet ees = createEntitySet(entitySet);
+          edmEntitySets.add(ees);
+        }
+      }
+      return edmEntitySets;
+    } catch (ODataException e) {
+      throw new EdmException(EdmException.PROVIDERPROBLEM, e);
+    }
+  }
+
+  @Override
+  public List<EdmAssociationSet> getAssociationSets() throws EdmException {
+    try {
+      List<EntityContainer> containers = getEntityContainerHierachy();
+      List<EdmAssociationSet> edmAssociationSets = new ArrayList<EdmAssociationSet>();
+      for (EntityContainer entityContainer : containers) {
+        List<AssociationSet> associationSets = entityContainer.getAssociationSets();
+        for (AssociationSet associationSet : associationSets) {
+          EdmAssociationSet eas = createAssociationSet(associationSet);
+          edmAssociationSets.add(eas);
+        }
+      }
+
+      return edmAssociationSets;
+    } catch (ODataException e) {
+      throw new EdmException(EdmException.PROVIDERPROBLEM, e);
+    }
+  }
+
+  private Map<String, EntityContainer> getEntityContainerMap() throws ODataException {
+    Map<String, EntityContainer> name2Container = new HashMap<String, EntityContainer>();
+    List<Schema> schemas = edm.edmProvider.getSchemas();
+    for (Schema schema : schemas) {
+      List<EntityContainer> containers = schema.getEntityContainers();
+      for (EntityContainer container : containers) {
+        name2Container.put(container.getName(), container);
+      }
+    }
+    return name2Container;
+  }
+
+  private List<EntityContainer> getEntityContainerHierachy() throws ODataException {
+    if (entityContainerHierachy != null) {
+      return entityContainerHierachy;
+    }
+
+    List<EntityContainer> entityContainerHierachy = new ArrayList<EntityContainer>();
+    Map<String, EntityContainer> name2Container = getEntityContainerMap();
+    String currentName = getName();
+    while (currentName != null) {
+      EntityContainer currentContainer = name2Container.get(currentName);
+      entityContainerHierachy.add(currentContainer);
+      currentName = currentContainer.getExtendz();
+    }
+
+    if (entityContainerHierachy.isEmpty()) {
+      throw new EdmException(EdmException.PROVIDERPROBLEM, "No container at all found.");
+    }
+    return entityContainerHierachy;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/1035f924/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmEntityContainerImplProvTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmEntityContainerImplProvTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmEntityContainerImplProvTest.java
index 98ec966..1661308 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmEntityContainerImplProvTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmEntityContainerImplProvTest.java
@@ -26,20 +26,28 @@ import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 import org.apache.olingo.odata2.api.edm.EdmAnnotatable;
 import org.apache.olingo.odata2.api.edm.EdmAnnotations;
 import org.apache.olingo.odata2.api.edm.EdmAssociation;
+import org.apache.olingo.odata2.api.edm.EdmAssociationSet;
+import org.apache.olingo.odata2.api.edm.EdmEntityContainer;
 import org.apache.olingo.odata2.api.edm.EdmEntitySet;
 import org.apache.olingo.odata2.api.edm.EdmException;
 import org.apache.olingo.odata2.api.edm.EdmNavigationProperty;
 import org.apache.olingo.odata2.api.edm.FullQualifiedName;
 import org.apache.olingo.odata2.api.edm.provider.AssociationSet;
 import org.apache.olingo.odata2.api.edm.provider.EdmProvider;
+import org.apache.olingo.odata2.api.edm.provider.EntityContainer;
 import org.apache.olingo.odata2.api.edm.provider.EntityContainerInfo;
 import org.apache.olingo.odata2.api.edm.provider.EntitySet;
 import org.apache.olingo.odata2.api.edm.provider.FunctionImport;
+import org.apache.olingo.odata2.api.edm.provider.Schema;
 import org.apache.olingo.odata2.testutil.fit.BaseTest;
-import org.junit.BeforeClass;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
@@ -47,41 +55,76 @@ import org.junit.Test;
  */
 public class EdmEntityContainerImplProvTest extends BaseTest {
 
-  private static EdmEntityContainerImplProv edmEntityContainer;
+  private EdmEntityContainer edmEntityContainer;
 
-  @BeforeClass
-  public static void getEdmEntityContainerImpl() throws Exception {
+  @Before
+  public void getEdmEntityContainerImpl() throws Exception {
     EdmProvider edmProvider = mock(EdmProvider.class);
     EdmImplProv edmImplProv = new EdmImplProv(edmProvider);
-    when(edmProvider.getEntityContainerInfo("Container")).thenReturn(new EntityContainerInfo().setName("Container"));
-
-    EntityContainerInfo entityContainer = new EntityContainerInfo().setName("Container1").setExtendz("Container");
+    String containerParentName = "ContainerParent";
+    String containerName = "Container";
+
+    List<Schema> schemas = new ArrayList<Schema>();
+    Schema mockedSchema = mock(Schema.class);
+    List<EntityContainer> entityContainers = new ArrayList<EntityContainer>();
+    List<EntitySet> entitySetsParent = new ArrayList<EntitySet>();
+    EntityContainer parentEntityContainer = new EntityContainer()
+        .setName(containerParentName)
+        .setEntitySets(entitySetsParent);
+    EntityContainer entityContainer = mock(EntityContainer.class);
+    when(entityContainer.getName()).thenReturn(containerName);
+    when(entityContainer.getExtendz()).thenReturn(containerParentName);
+    entityContainers.add(entityContainer);
+    entityContainers.add(parentEntityContainer);
+    when(mockedSchema.getEntityContainers()).thenReturn(entityContainers);
+    schemas.add(mockedSchema);
+    when(edmProvider.getSchemas()).thenReturn(schemas);
+
+    List<AssociationSet> associationSets = new ArrayList<AssociationSet>();
+    when(entityContainer.getAssociationSets()).thenReturn(associationSets);
+    List<EntitySet> entitySets = new ArrayList<EntitySet>();
+    when(entityContainer.getEntitySets()).thenReturn(entitySets);
+
+    when(edmProvider.getEntityContainerInfo(containerParentName))
+        .thenReturn(new EntityContainerInfo().setName(containerParentName));
+    EntityContainerInfo entityContainerInfo =
+        new EntityContainerInfo().setName(containerName).setExtendz(containerParentName);
 
     EntitySet entitySetFooFromParent = new EntitySet().setName("fooFromParent");
-    when(edmProvider.getEntitySet("Container", "fooFromParent")).thenReturn(entitySetFooFromParent);
+    entitySetsParent.add(entitySetFooFromParent);
+    when(edmProvider.getEntitySet(containerParentName, "fooFromParent")).thenReturn(entitySetFooFromParent);
 
     EntitySet entitySetFoo = new EntitySet().setName("foo");
-    when(edmProvider.getEntitySet("Container1", "foo")).thenReturn(entitySetFoo);
+    entitySets.add(entitySetFoo);
+    when(edmProvider.getEntitySet(containerName, "foo")).thenReturn(entitySetFoo);
 
-    EntitySet entitySetBar = new EntitySet().setName("foo");
-    when(edmProvider.getEntitySet("Container1", "foo")).thenReturn(entitySetBar);
+    EntitySet entitySetBar = new EntitySet().setName("bar");
+    entitySets.add(entitySetBar);
+    when(edmProvider.getEntitySet(containerName, "bar")).thenReturn(entitySetBar);
 
     AssociationSet associationSet = new AssociationSet().setName("4711");
     FullQualifiedName assocFQName = new FullQualifiedName("AssocNs", "AssocName");
-    when(edmProvider.getAssociationSet("Container1", assocFQName, "foo", "fromRole")).thenReturn(associationSet);
+    associationSets.add(associationSet);
+    when(edmProvider.getAssociationSet(containerName, assocFQName, "foo", "fromRole")).thenReturn(associationSet);
+
+    AssociationSet parentAssociationSet = new AssociationSet().setName("42");
+    FullQualifiedName parentAssocFQName = new FullQualifiedName("AssocNs", "AssocNameParent");
+    when(edmProvider.getAssociationSet(containerParentName,
+        parentAssocFQName, "fooFromParent", "fromParentRole")).thenReturn(parentAssociationSet);
+    parentEntityContainer.setAssociationSets(Arrays.asList(parentAssociationSet));
 
     FunctionImport functionImportFoo = new FunctionImport().setName("foo");
-    when(edmProvider.getFunctionImport("Container1", "foo")).thenReturn(functionImportFoo);
+    when(edmProvider.getFunctionImport(containerName, "foo")).thenReturn(functionImportFoo);
 
     FunctionImport functionImportBar = new FunctionImport().setName("foo");
-    when(edmProvider.getFunctionImport("Container1", "foo")).thenReturn(functionImportBar);
+    when(edmProvider.getFunctionImport(containerName, "foo")).thenReturn(functionImportBar);
 
-    edmEntityContainer = new EdmEntityContainerImplProv(edmImplProv, entityContainer);
+    edmEntityContainer = new EdmEntityContainerImplProv(edmImplProv, entityContainerInfo);
   }
 
   @Test
   public void testEntityContainerName() throws EdmException {
-    assertEquals("Container1", edmEntityContainer.getName());
+    assertEquals("Container", edmEntityContainer.getName());
   }
 
   @Test
@@ -146,4 +189,34 @@ public class EdmEntityContainerImplProvTest extends BaseTest {
     assertNull(annotations.getAnnotationAttributes());
     assertNull(annotations.getAnnotationElements());
   }
+
+  @Test
+  public void testGetEntitySets() throws EdmException {
+
+    List<EdmEntitySet> entitySets = edmEntityContainer.getEntitySets();
+    assertNotNull(entitySets);
+    assertEquals(3, entitySets.size());
+
+    for (EdmEntitySet entitySet : entitySets) {
+      String name = entitySet.getName();
+      boolean expectedName = "fooFromParent".equals(name)
+          || "foo".equals(name)
+          || "bar".equals(name);
+      assertTrue("Found not expected name: " + name, expectedName);
+    }
+  }
+
+  @Test
+  public void testGetAssociationSets() throws EdmException {
+    List<EdmAssociationSet> associationSets = edmEntityContainer.getAssociationSets();
+    assertNotNull(associationSets);
+    assertEquals(2, associationSets.size());
+
+    for (EdmAssociationSet assoSet : associationSets) {
+      String name = assoSet.getName();
+      boolean expectedName = "4711".equals(name)
+          || "42".equals(name);
+      assertTrue("Found not expected name: " + name, expectedName);
+    }
+  }
 }