Repository: olingo-odata4
Updated Branches:
  refs/heads/master 0d310f01e -> 6d9ac226d


[OLINGO-522] Fix for abstract entity types in metadata document


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/8f794ac4
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/8f794ac4
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/8f794ac4

Branch: refs/heads/master
Commit: 8f794ac475adf722ca9e8186f16e3841db26fec1
Parents: 0d310f0
Author: Christian Amend <[email protected]>
Authored: Wed Dec 17 15:48:19 2014 +0100
Committer: Christian Amend <[email protected]>
Committed: Wed Dec 17 15:48:19 2014 +0100

----------------------------------------------------------------------
 .../client/core/edm/EdmEntityTypeImpl.java      | 38 +++++++++++---------
 .../core/edm/provider/EdmEntityTypeImpl.java    |  5 +--
 .../xml/MetadataDocumentXmlSerializer.java      |  7 +++-
 .../edm/provider/EdmEntityTypeImplTest.java     |  2 ++
 .../tecsvc/provider/EntityTypeProvider.java     | 15 ++++++++
 .../server/tecsvc/provider/SchemaProvider.java  |  2 ++
 .../serializer/xml/MetadataDocumentTest.java    | 14 +++++---
 7 files changed, 58 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8f794ac4/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityTypeImpl.java
----------------------------------------------------------------------
diff --git 
a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityTypeImpl.java
 
b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityTypeImpl.java
index f4fdacd..27730b3 100644
--- 
a/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityTypeImpl.java
+++ 
b/lib/client-core/src/main/java/org/apache/olingo/client/core/edm/EdmEntityTypeImpl.java
@@ -1,18 +1,18 @@
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
+ * or more contributor license agreements. See the NOTICE file
  * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
+ * regarding copyright ownership. The ASF licenses this file
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
+ * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
  */
@@ -45,21 +45,27 @@ public class EdmEntityTypeImpl extends 
AbstractEdmEntityType {
   private EdmAnnotationHelper annotationHelper;
 
   public static EdmEntityTypeImpl getInstance(final Edm edm, final 
FullQualifiedName fqn,
-          final List<? extends Schema> xmlSchemas, final EntityType 
entityType) {
+      final List<? extends Schema> xmlSchemas, final EntityType entityType) {
 
     final FullQualifiedName baseTypeName = entityType.getBaseType() == null
-            ? null
-            : new 
EdmTypeInfo.Builder().setTypeExpression(entityType.getBaseType()).build().getFullQualifiedName();
+        ? null
+        : new 
EdmTypeInfo.Builder().setTypeExpression(entityType.getBaseType()).build().getFullQualifiedName();
     final EdmEntityTypeImpl instance = new EdmEntityTypeImpl(edm, fqn, 
baseTypeName, xmlSchemas, entityType);
     instance.baseType = instance.buildBaseType(baseTypeName);
 
     if (instance.baseType == null) {
       instance.entityBaseType = null;
 
-      final List<EdmKeyPropertyRef> edmKey = new ArrayList<EdmKeyPropertyRef>(
-              entityType.getKey().getPropertyRefs().size());
-      for (PropertyRef ref : entityType.getKey().getPropertyRefs()) {
-        edmKey.add(new EdmKeyPropertyRefImpl(instance, ref));
+      final List<EdmKeyPropertyRef> edmKey;
+      //Abstract EntityTypes do not necessarily have keys
+      if (entityType.isAbstractEntityType() && entityType.getKey() == null) {
+        edmKey = new ArrayList<EdmKeyPropertyRef>();
+      } else {
+        edmKey = new ArrayList<EdmKeyPropertyRef>(
+            entityType.getKey().getPropertyRefs().size());
+        for (PropertyRef ref : entityType.getKey().getPropertyRefs()) {
+          edmKey.add(new EdmKeyPropertyRefImpl(instance, ref));
+        }
       }
       instance.setEdmKeyPropertyRef(edmKey);
     } else {
@@ -70,13 +76,13 @@ public class EdmEntityTypeImpl extends 
AbstractEdmEntityType {
   }
 
   private EdmEntityTypeImpl(final Edm edm, final FullQualifiedName fqn, final 
FullQualifiedName baseTypeName,
-          final List<? extends Schema> xmlSchemas, final EntityType 
entityType) {
+      final List<? extends Schema> xmlSchemas, final EntityType entityType) {
 
     super(edm, fqn, baseTypeName, entityType.isHasStream());
     this.typeHelper = new EdmStructuredTypeHelperImpl(edm, 
getFullQualifiedName(), xmlSchemas, entityType);
     if (entityType instanceof 
org.apache.olingo.client.api.edm.xml.v4.EntityType) {
       this.annotationHelper = new EdmAnnotationHelperImpl(edm,
-              (org.apache.olingo.client.api.edm.xml.v4.EntityType) entityType);
+          (org.apache.olingo.client.api.edm.xml.v4.EntityType) entityType);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8f794ac4/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImpl.java
----------------------------------------------------------------------
diff --git 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImpl.java
 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImpl.java
index 5ad7e99..4dff2ba 100644
--- 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImpl.java
+++ 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImpl.java
@@ -71,11 +71,10 @@ public class EdmEntityTypeImpl extends 
AbstractEdmEntityType {
     if (!baseTypeChecked) {
       if (baseTypeName != null) {
         baseType = buildBaseType(baseTypeName);
+        entityBaseType = (EdmEntityType) baseType;
       }
       if (baseType == null
           || (baseType.isAbstract() && ((AbstractEdmEntityType) 
baseType).getKeyPropertyRefs().size() == 0)) {
-        entityBaseType = null;
-
         final List<PropertyRef> key = entityType.getKey();
         if (key != null) {
           final List<EdmKeyPropertyRef> edmKey = new 
ArrayList<EdmKeyPropertyRef>();
@@ -84,8 +83,6 @@ public class EdmEntityTypeImpl extends AbstractEdmEntityType {
           }
           setEdmKeyPropertyRef(edmKey);
         }
-      } else {
-        entityBaseType = (EdmEntityType) baseType;
       }
       baseTypeChecked = true;
     }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8f794ac4/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java
----------------------------------------------------------------------
diff --git 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java
 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java
index 9f81ef3..d3ca238 100644
--- 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java
+++ 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java
@@ -105,7 +105,8 @@ public class MetadataDocumentXmlSerializer {
   private static final String URI = "Uri";
   private static final String SCHEMA = "Schema";
   private static final String DATA_SERVICES = "DataServices";
-
+  private static final String ABSTRACT = "Abstract";
+  
   private final ServiceMetadata serviceMetadata;
 
   private final static String EDMX = "Edmx";
@@ -405,6 +406,10 @@ public class MetadataDocumentXmlSerializer {
       if (entityType.getBaseType() != null) {
         writer.writeAttribute(XML_BASE_TYPE, 
getFullQualifiedName(entityType.getBaseType(), false));
       }
+      
+      if(entityType.isAbstract()){
+        writer.writeAttribute(ABSTRACT, "true");
+      }
 
       appendKey(writer, entityType);
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8f794ac4/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImplTest.java
----------------------------------------------------------------------
diff --git 
a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImplTest.java
 
b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImplTest.java
index 7ba846e..344596f 100644
--- 
a/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImplTest.java
+++ 
b/lib/server-core/src/test/java/org/apache/olingo/server/core/edm/provider/EdmEntityTypeImplTest.java
@@ -154,6 +154,7 @@ public class EdmEntityTypeImplTest {
 
     EdmEntityType edmType = EdmEntityTypeImpl.getInstance(edm, typeName, type);
     
+    assertNotNull(edmType.getBaseType());
     assertEquals(2, edmAbstarctBaseType.getPropertyNames().size());
     
     assertEquals(1, edmType.getKeyPropertyRefs().size());
@@ -206,6 +207,7 @@ public class EdmEntityTypeImplTest {
     when(provider.getEntityType(typeName)).thenReturn(type);
     EdmEntityType edmType = EdmEntityTypeImpl.getInstance(edm, typeName, type);
     
+    assertNotNull(edmType.getBaseType());
     assertEquals(2, edmAbstarctBaseType.getPropertyNames().size());
     
     assertEquals(1, edmType.getKeyPropertyRefs().size());

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8f794ac4/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/EntityTypeProvider.java
----------------------------------------------------------------------
diff --git 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/EntityTypeProvider.java
 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/EntityTypeProvider.java
index 389efd1..f6b9e0e 100644
--- 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/EntityTypeProvider.java
+++ 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/EntityTypeProvider.java
@@ -72,6 +72,9 @@ public class EntityTypeProvider {
   public static final FullQualifiedName nameETTwoKeyTwoPrim = new 
FullQualifiedName(SchemaProvider.NAMESPACE,
       "ETTwoKeyTwoPrim");
   public static final FullQualifiedName nameETTwoPrim = new 
FullQualifiedName(SchemaProvider.NAMESPACE, "ETTwoPrim");
+  public static final FullQualifiedName nameETAbstract = new 
FullQualifiedName(SchemaProvider.NAMESPACE, "ETAbstract");
+  public static final FullQualifiedName nameETAbstractBase = new 
FullQualifiedName(SchemaProvider.NAMESPACE,
+      "ETAbstractBase");
 
   public EntityType getEntityType(final FullQualifiedName entityTypeName) 
throws ODataException {
     if (entityTypeName.equals(nameETAllPrim)) {
@@ -401,6 +404,18 @@ public class EntityTypeProvider {
           .setProperties(
               Arrays.asList(PropertyProvider.propertyInt16_NotNullable,
                   
PropertyProvider.propertyMixedPrimCollComp_CTMixPrimCollComp));
+    } else if (entityTypeName.equals(nameETAbstract)) {
+      return new EntityType()
+          .setName("ETAbstract")
+          .setAbstract(true);
+
+    } else if (entityTypeName.equals(nameETAbstractBase)) {
+      return new EntityType()
+          .setName("ETAbstractBase")
+          .setBaseType(nameETAbstract)
+          .setKey(Arrays.asList(new 
PropertyRef().setPropertyName("PropertyInt16")))
+          .setProperties(Arrays.asList(
+              PropertyProvider.propertyInt16_NotNullable, 
PropertyProvider.propertyString));
     }
 
     return null;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8f794ac4/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/SchemaProvider.java
----------------------------------------------------------------------
diff --git 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/SchemaProvider.java
 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/SchemaProvider.java
index a0a282e..3e63867 100644
--- 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/SchemaProvider.java
+++ 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/SchemaProvider.java
@@ -75,6 +75,8 @@ public class SchemaProvider {
     
entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETTwoBaseTwoKeyNav));
     
entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETCompMixPrimCollComp));
     entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETKeyPrimNav));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETAbstract));
+    entityTypes.add(prov.getEntityType(EntityTypeProvider.nameETAbstractBase));
 
     // ComplexTypes
     List<ComplexType> complexType = new ArrayList<ComplexType>();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/8f794ac4/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java
----------------------------------------------------------------------
diff --git 
a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java
 
b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java
index c094e52..8df2b5b 100644
--- 
a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java
+++ 
b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentTest.java
@@ -127,15 +127,21 @@ public class MetadataDocumentTest {
             + "IncludeInServiceDocument=\"false\"/>"));
 
     assertThat(metadata, 
containsString("</EntityContainer></Schema></edmx:DataServices></edmx:Edmx>"));
+
+    // BaseTypeCheck
+    assertThat(metadata, containsString("<EntityType Name=\"ETBase\" 
BaseType=\"olingo.odata.test1.ETTwoPrim\">"));
+    assertThat(metadata, containsString("<EntityType Name=\"ETAbstract\" 
Abstract=\"true\"/>"));
+    assertThat(metadata,
+        containsString("<EntityType Name=\"ETAbstractBase\" 
BaseType=\"olingo.odata.test1.ETAbstract\">"));
   }
 
   /**
    * <code>
-   *  <edmx:Reference 
Uri="http://docs.oasis-open.org/odata/odata/v4.0/cs02/vocabularies/Org.OData.Core.V1.xml";>
-   *    <edmx:Include Namespace="Org.OData.Core.V1" Alias="Core"/>
-   *  </edmx:Reference>
+   * <edmx:Reference 
Uri="http://docs.oasis-open.org/odata/odata/v4.0/cs02/vocabularies/Org.OData.Core.V1.xml";>
+   * <edmx:Include Namespace="Org.OData.Core.V1" Alias="Core"/>
+   * </edmx:Reference>
    * </code>
-   *
+   * 
    * @return default emdx reference
    */
   private List<EdmxReference> getEdmxReferences() {

Reply via email to