Repository: olingo-odata2 Updated Branches: refs/heads/master 8edf569c4 -> a823475b5
[OLINGO-1047] Fix metadata consumer for multi level keys Based on the contribution made by Archana Rai in https://issues.apache.org/jira/browse/OLINGO-1047 Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/a823475b Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/a823475b Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/a823475b Branch: refs/heads/master Commit: a823475b5f13a996bd41dccd38411a73d69bf138 Parents: 8edf569 Author: Christian Amend <[email protected]> Authored: Wed Nov 16 11:07:03 2016 +0100 Committer: Christian Amend <[email protected]> Committed: Wed Nov 16 11:08:18 2016 +0100 ---------------------------------------------------------------------- .../core/ep/consumer/XmlMetadataConsumer.java | 23 +++- .../ep/consumer/XmlMetadataConsumerTest.java | 120 +++++++++++++++++++ 2 files changed, 142 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/a823475b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java index 2bcc2e6..e245cad 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java @@ -991,7 +991,7 @@ public class XmlMetadataConsumer { FullQualifiedName fqName = validateEntityTypeWithAlias(baseTypeFQName); baseEntityType = entityTypesMap.get(fqName); } else { - baseEntityType = entityTypesMap.get(baseTypeFQName); + baseEntityType = fetchLastBaseType(baseTypeFQName,entityTypesMap); } if (baseEntityType.getKey() == null) { throw new EntityProviderException(EntityProviderException.ILLEGAL_ARGUMENT @@ -1005,6 +1005,27 @@ public class XmlMetadataConsumer { } } + + /* This method gets the last base type of the EntityType + * which has key defined in order to validate it*/ + private EntityType fetchLastBaseType + (FullQualifiedName baseTypeFQName, Map<FullQualifiedName, EntityType> entityTypesMap) + throws EntityProviderException { + + EntityType baseEntityType = null ; + while(baseTypeFQName!=null){ + baseEntityType = entityTypesMap.get(baseTypeFQName); + if(baseEntityType.getKey()!=null){ + break; + }else if(baseEntityType !=null && baseEntityType.getBaseType() !=null){ + baseTypeFQName = baseEntityType.getBaseType(); + }else if(baseEntityType.getBaseType() == null){ + break; + } + } + return baseEntityType; + } + private FullQualifiedName validateComplexTypeWithAlias(final FullQualifiedName aliasName) throws EntityProviderException { String namespace = aliasNamespaceMap.get(aliasName.getNamespace()); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/a823475b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java index ec8e96c..fb95029 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java @@ -293,6 +293,126 @@ public class XmlMetadataConsumerTest extends AbstractXmlConsumerTest { assertEquals(" value1", childElements.get(0).getText()); } + + + @Test + public void ODATAJAVA_77_testMetadataDokumentWithMultiLevelEntityType() throws Exception { + final String metadata = "" + + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + " <edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + " <Schema Namespace=\"" + NAMESPACE2 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + " <EntityType Name= \"Parameter\">" + + " <Key> " + + " <PropertyRef Name=\"Id\" />" + + " </Key>" + + " <Property Name=\"Id\" Type=\"Edm.Int16\" Nullable=\"false\" />" + + " </EntityType>" + + " <EntityType Name= \"ConfigParameter\" BaseType= \"RefScenario2.Parameter\" />" + + " <EntityType Name= \"DataConfigParameter\" BaseType= \"RefScenario2.ConfigParameter\" />" + + " <EntityType Name= \"StringDataConfigParameter\" BaseType= \"RefScenario2.DataConfigParameter\" />" + + " </Schema>" + + " </edmx:DataServices>" + + "</edmx:Edmx>"; + + XmlMetadataConsumer parser = new XmlMetadataConsumer(); + XMLStreamReader reader = createStreamReader(metadata); + DataServices result = parser.readMetadata(reader, true); + + assertEquals(1, result.getSchemas().size()); + List<EntityType> entityTypes = result.getSchemas().get(0).getEntityTypes(); + assertEquals(4, entityTypes.size()); + + } + + @Test + public void ODATAJAVA_77_testBaseTypeKey() throws Exception { + final String metadata = "" + + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + " <edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + " <Schema Namespace=\"" + NAMESPACE2 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + " <EntityType Name= \"Parameter\">" + + " <Key> " + + " <PropertyRef Name=\"Id\" />" + + " </Key>" + + " <Property Name=\"Id\" Type=\"Edm.Int16\" Nullable=\"false\" />" + + " </EntityType>" + + " <EntityType Name= \"ConfigParameter\" BaseType= \"RefScenario2.Parameter\" />" + + " <EntityType Name= \"DataConfigParameter\" BaseType= \"RefScenario2.ConfigParameter\" >" + + " <Key> " + + " <PropertyRef Name=\"Name\" />" + + " </Key>" + + " <Property Name=\"Name\" Type=\"Edm.String\" Nullable=\"false\" />" + + " </EntityType>" + + " <EntityType Name= \"StringDataConfigParameter\" BaseType= \"RefScenario2.DataConfigParameter\" />" + + " </Schema>" + + " </edmx:DataServices>" + + "</edmx:Edmx>"; + + XmlMetadataConsumer parser = new XmlMetadataConsumer(); + XMLStreamReader reader = createStreamReader(metadata); + DataServices result = parser.readMetadata(reader, true); + + assertEquals(1, result.getSchemas().size()); + List<EntityType> entityTypes = result.getSchemas().get(0).getEntityTypes(); + assertEquals(4, entityTypes.size()); + + } + + @Test + public void ODATAJAVA_77_testEntityTypeKey() throws Exception { + final String metadata = "" + + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + " <edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + " <Schema Namespace=\"" + NAMESPACE2 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + " <EntityType Name= \"Parameter\">" + + " <Key> " + + " <PropertyRef Name=\"Id\" />" + + " </Key>" + + " <Property Name=\"Id\" Type=\"Edm.Int16\" Nullable=\"false\" />" + + " </EntityType>" + + " <EntityType Name= \"ConfigParameter\" BaseType= \"RefScenario2.Parameter\" />" + + " <EntityType Name= \"DataConfigParameter\" BaseType= \"RefScenario2.ConfigParameter\" />" + + " <EntityType Name= \"StringDataConfigParameter\" BaseType= \"RefScenario2.DataConfigParameter\" >" + + " <Key> " + + " <PropertyRef Name=\"Name\" />" + + " </Key>" + + " <Property Name=\"Name\" Type=\"Edm.String\" Nullable=\"false\" />" + + " </EntityType>" + + " </Schema>" + + " </edmx:DataServices>" + + "</edmx:Edmx>"; + + XmlMetadataConsumer parser = new XmlMetadataConsumer(); + XMLStreamReader reader = createStreamReader(metadata); + DataServices result = parser.readMetadata(reader, true); + + assertEquals(1, result.getSchemas().size()); + List<EntityType> entityTypes = result.getSchemas().get(0).getEntityTypes(); + assertEquals(4, entityTypes.size()); + + } + @Test(expected=EntityProviderException.class) + public void ODATAJAVA_77_ExceptionScenario() throws Exception { + final String metadata = "" + + "<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"" + Edm.NAMESPACE_EDMX_2007_06 + "\">" + + " <edmx:DataServices m:DataServiceVersion=\"2.0\" xmlns:m=\"" + Edm.NAMESPACE_M_2007_08 + "\">" + + " <Schema Namespace=\"" + NAMESPACE2 + "\" xmlns=\"" + Edm.NAMESPACE_EDM_2008_09 + "\">" + + " <EntityType Name= \"ConfigParameter\" BaseType= \"RefScenario2.Parameter\" />" + + " <EntityType Name= \"DataConfigParameter\" BaseType= \"RefScenario2.ConfigParameter\" />" + + " <EntityType Name= \"StringDataConfigParameter\" BaseType= \"RefScenario2.DataConfigParameter\" />" + + " <EntityType Name= \"Parameter\">" + + " <Property Name=\"Id\" Type=\"Edm.Int16\" Nullable=\"false\" />" + + " </EntityType>" + + " </Schema>" + + " </edmx:DataServices>" + + "</edmx:Edmx>"; + + XmlMetadataConsumer parser = new XmlMetadataConsumer(); + XMLStreamReader reader = createStreamReader(metadata); + parser.readMetadata(reader, true); + } + + @Test public void stringValueForMaxLegthFacet() throws Exception {
