[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
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 @@
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 @@
}
}
+
+ /* 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());
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 @@
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 {