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 {

Reply via email to