Repository: olingo-odata4
Updated Branches:
  refs/heads/master 58b3896f7 -> 0b862cd68


[OLINGO-486] Abstract EdmEntities without keys do not hand down their empty key 
set

Signed-off-by: Michael Bolz <[email protected]>


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

Branch: refs/heads/master
Commit: 0b862cd68e15dae7a0d1ac3a473790444f31893a
Parents: 58b3896
Author: Christian Holzer <[email protected]>
Authored: Tue Dec 16 13:23:46 2014 +0100
Committer: Michael Bolz <[email protected]>
Committed: Tue Dec 16 19:03:36 2014 +0100

----------------------------------------------------------------------
 .../core/edm/provider/EdmEntityTypeImpl.java    |   3 +-
 .../edm/provider/EdmEntityTypeImplTest.java     | 105 +++++++++++++++++++
 2 files changed, 107 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/0b862cd6/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 bfc31e6..5ad7e99 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
@@ -72,7 +72,8 @@ public class EdmEntityTypeImpl extends AbstractEdmEntityType {
       if (baseTypeName != null) {
         baseType = buildBaseType(baseTypeName);
       }
-      if (baseType == null) {
+      if (baseType == null
+          || (baseType.isAbstract() && ((AbstractEdmEntityType) 
baseType).getKeyPropertyRefs().size() == 0)) {
         entityBaseType = null;
 
         final List<PropertyRef> key = entityType.getKey();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/0b862cd6/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 ddc9c28..7ba846e 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
@@ -116,7 +116,112 @@ public class EdmEntityTypeImplTest {
 
     typeWithComplexKey = EdmEntityTypeImpl.getInstance(edm, 
typeWithComplexKeyName, typeWithComplexKeyProvider);
   }
+  
+  @Test
+  public void testAbstractBaseTypeWithoutKey() throws Exception {
+    EdmProvider provider = mock(EdmProvider.class);
+    EdmProviderImpl edm = new EdmProviderImpl(provider);
+
+    FullQualifiedName baseName = new FullQualifiedName("namespace", 
"BaseTypeName");
+    EntityType baseType = new EntityType();
+    baseType.setName(baseName.getName());
+    List<Property> properties = new ArrayList<Property>();
+    properties.add(new 
Property().setName("Id").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    properties.add(new 
Property().setName("Name").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    baseType.setProperties(properties);
+    List<NavigationProperty> navigationProperties = new 
ArrayList<NavigationProperty>();
+    navigationProperties.add(new NavigationProperty().setName("nav1"));
+    baseType.setNavigationProperties(navigationProperties);
+    when(provider.getEntityType(baseName)).thenReturn(baseType);
+    baseType.setAbstract(true);
+    EdmEntityType edmAbstarctBaseType = EdmEntityTypeImpl.getInstance(edm, 
baseName, baseType);
+    
+    FullQualifiedName typeName = new FullQualifiedName("namespace", 
"typeName");
+    EntityType type = new EntityType();
+    type.setName(typeName.getName());
+    type.setBaseType(baseName);
+    List<Property> typeProperties = new ArrayList<Property>();
+    typeProperties.add(new 
Property().setName("address").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    typeProperties.add(new 
Property().setName("email").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    type.setProperties(typeProperties);
+    List<PropertyRef> key = new ArrayList<PropertyRef>();
+    key.add(new PropertyRef().setPropertyName("email"));
+    type.setKey(key);
+    List<NavigationProperty> typeNavigationProperties = new 
ArrayList<NavigationProperty>();
+    typeNavigationProperties.add(new NavigationProperty().setName("nav2"));
+    type.setNavigationProperties(typeNavigationProperties);
+    when(provider.getEntityType(typeName)).thenReturn(type);
+
+    EdmEntityType edmType = EdmEntityTypeImpl.getInstance(edm, typeName, type);
+    
+    assertEquals(2, edmAbstarctBaseType.getPropertyNames().size());
+    
+    assertEquals(1, edmType.getKeyPropertyRefs().size());
+    assertEquals("email", edmType.getKeyPredicateNames().get(0));
+    
+    assertEquals(4, edmType.getPropertyNames().size());
+    assertEquals("Id", edmType.getPropertyNames().get(0));
+    assertEquals("Name", edmType.getPropertyNames().get(1));
+    assertEquals("address", edmType.getPropertyNames().get(2));
+    assertEquals("email", edmType.getPropertyNames().get(3));
+    
+    assertEquals(2, edmType.getNavigationPropertyNames().size());
+    assertEquals("nav1", edmType.getNavigationPropertyNames().get(0));
+    assertEquals("nav2", edmType.getNavigationPropertyNames().get(1));
+  }
+  
+  @Test
+  public void testAbstractBaseTypeWithtKey() throws Exception {
+    EdmProvider provider = mock(EdmProvider.class);
+    EdmProviderImpl edm = new EdmProviderImpl(provider);
 
+    FullQualifiedName baseName = new FullQualifiedName("namespace", 
"BaseTypeName");
+    EntityType baseType = new EntityType();
+    baseType.setName(baseName.getName());
+    List<Property> properties = new ArrayList<Property>();
+    properties.add(new 
Property().setName("Id").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    properties.add(new 
Property().setName("Name").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    baseType.setProperties(properties);
+    List<PropertyRef> key = new ArrayList<PropertyRef>();
+    key.add(new PropertyRef().setPropertyName("Id"));
+    baseType.setKey(key);
+    List<NavigationProperty> navigationProperties = new 
ArrayList<NavigationProperty>();
+    navigationProperties.add(new NavigationProperty().setName("nav1"));
+    baseType.setNavigationProperties(navigationProperties);
+    when(provider.getEntityType(baseName)).thenReturn(baseType);
+    baseType.setAbstract(true);
+    EdmEntityType edmAbstarctBaseType = EdmEntityTypeImpl.getInstance(edm, 
baseName, baseType);
+    
+    FullQualifiedName typeName = new FullQualifiedName("namespace", 
"typeName");
+    EntityType type = new EntityType();
+    type.setName(typeName.getName());
+    type.setBaseType(baseName);
+    List<Property> typeProperties = new ArrayList<Property>();
+    typeProperties.add(new 
Property().setName("address").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    typeProperties.add(new 
Property().setName("email").setType(EdmPrimitiveTypeKind.String.getFullQualifiedName()));
+    type.setProperties(typeProperties);
+    List<NavigationProperty> typeNavigationProperties = new 
ArrayList<NavigationProperty>();
+    typeNavigationProperties.add(new NavigationProperty().setName("nav2"));
+    type.setNavigationProperties(typeNavigationProperties);
+    when(provider.getEntityType(typeName)).thenReturn(type);
+    EdmEntityType edmType = EdmEntityTypeImpl.getInstance(edm, typeName, type);
+    
+    assertEquals(2, edmAbstarctBaseType.getPropertyNames().size());
+    
+    assertEquals(1, edmType.getKeyPropertyRefs().size());
+    assertEquals("Id", edmType.getKeyPredicateNames().get(0));
+    
+    assertEquals(4, edmType.getPropertyNames().size());
+    assertEquals("Id", edmType.getPropertyNames().get(0));
+    assertEquals("Name", edmType.getPropertyNames().get(1));
+    assertEquals("address", edmType.getPropertyNames().get(2));
+    assertEquals("email", edmType.getPropertyNames().get(3));
+    
+    assertEquals(2, edmType.getNavigationPropertyNames().size());
+    assertEquals("nav1", edmType.getNavigationPropertyNames().get(0));
+    assertEquals("nav2", edmType.getNavigationPropertyNames().get(1));
+  }
+  
   @Test
   public void hasStream() {
     assertFalse(typeWithBaseType.hasStream());

Reply via email to