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() {
