[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/Olingo-129_PocJpaDataStore Commit: 1035f9249c68fc782e520a9ae649ef77b74f659c Parents: bf7da39 Author: Michael Bolz <[email protected]> Authored: Wed Apr 2 14:44:10 2014 +0200 Committer: Michael Bolz <[email protected]> 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); + } + } }
