Repository: olingo-odata4 Updated Branches: refs/heads/master 570f4317c -> dbf7fd386
OLINGO-898: making sure the payload correctly deserializes the extended entity Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/dbf7fd38 Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/dbf7fd38 Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/dbf7fd38 Branch: refs/heads/master Commit: dbf7fd386c1f9294fc3ab631d8e7787bcbf5eceb Parents: 570f431 Author: Ramesh Reddy <[email protected]> Authored: Mon Mar 21 12:11:28 2016 -0500 Committer: Ramesh Reddy <[email protected]> Committed: Mon Mar 21 13:33:20 2016 -0500 ---------------------------------------------------------------------- .../json/ODataJsonDeserializer.java | 6 ++-- .../tecsvc/provider/EntityTypeProvider.java | 7 +++++ .../json/ODataJsonDeserializerEntityTest.java | 30 ++++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/dbf7fd38/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java index da57309..67f961f 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java @@ -389,17 +389,19 @@ public class ODataJsonDeserializer implements ODataDeserializer { link.setTitle(navigationPropertyName); final ExpandTreeBuilder childExpandBuilder = (expandBuilder != null) ? expandBuilder.expand(edmNavigationProperty) : null; + EdmEntityType derivedEdmEntityType = (EdmEntityType)getDerivedType( + edmNavigationProperty.getType(), jsonNode); if (jsonNode.isArray() && edmNavigationProperty.isCollection()) { link.setType(Constants.ENTITY_SET_NAVIGATION_LINK_TYPE); EntityCollection inlineEntitySet = new EntityCollection(); inlineEntitySet.getEntities().addAll( - consumeEntitySetArray(edmNavigationProperty.getType(), jsonNode, childExpandBuilder)); + consumeEntitySetArray(derivedEdmEntityType, jsonNode, childExpandBuilder)); link.setInlineEntitySet(inlineEntitySet); } else if (!jsonNode.isArray() && (!jsonNode.isValueNode() || jsonNode.isNull()) && !edmNavigationProperty.isCollection()) { link.setType(Constants.ENTITY_NAVIGATION_LINK_TYPE); if (!jsonNode.isNull()) { - Entity inlineEntity = consumeEntityNode(edmNavigationProperty.getType(), (ObjectNode) jsonNode, + Entity inlineEntity = consumeEntityNode(derivedEdmEntityType, (ObjectNode) jsonNode, childExpandBuilder); link.setInlineEntity(inlineEntity); } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/dbf7fd38/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 71c576d..c2397c4 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 @@ -55,6 +55,8 @@ public class EntityTypeProvider { public static final FullQualifiedName nameETKeyNav = new FullQualifiedName(SchemaProvider.NAMESPACE, "ETKeyNav"); public static final FullQualifiedName nameETKeyPrimNav = new FullQualifiedName(SchemaProvider.NAMESPACE, "ETKeyPrimNav"); + public static final FullQualifiedName nameETKeyPrimNavDerived = new FullQualifiedName(SchemaProvider.NAMESPACE, + "ETKeyPrimNavDerived"); public static final FullQualifiedName nameETKeyNavCont = new FullQualifiedName(SchemaProvider.NAMESPACE, "ETKeyNavCont"); public static final FullQualifiedName nameETTwoKeyNavCont = new FullQualifiedName(SchemaProvider.NAMESPACE, @@ -333,6 +335,11 @@ public class EntityTypeProvider { .setNavigationProperties( Arrays.asList( PropertyProvider.navPropertyETKeyPrimNavOne_ETKeyPrimNav)); + } else if (entityTypeName.equals(nameETKeyPrimNavDerived)) { + return new CsdlEntityType() + .setName("ETKeyPrimNavDerived") + .setBaseType(nameETKeyPrimNav) + .setProperties(Arrays.asList(PropertyProvider.propertyBoolean_NotNullable)); } else if (entityTypeName.equals(nameETKeyNavCont)) { return new CsdlEntityType() .setName("ETKeyNavCont") http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/dbf7fd38/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java ---------------------------------------------------------------------- diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java index 48dc870..8ebf598 100644 --- a/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java @@ -37,6 +37,7 @@ import java.util.List; import org.apache.olingo.commons.api.Constants; import org.apache.olingo.commons.api.data.ComplexValue; import org.apache.olingo.commons.api.data.Entity; +import org.apache.olingo.commons.api.data.EntityCollection; import org.apache.olingo.commons.api.data.Link; import org.apache.olingo.commons.api.data.Property; import org.apache.olingo.commons.api.data.ValueType; @@ -250,6 +251,35 @@ public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTe false)); } + @Test + public void extendedEntityProperty() throws Exception { + final String payload = "{\n" + + " \"@odata.context\":\"$metadata#ETKeyPrimNav/$entity\",\n" + + " \"@odata.metadataEtag\":\"W/metadataETag\",\n" + + " \"@odata.etag\":\"W/32767\",\n" + + " \"PropertyInt16\":32767,\n" + + " \"PropertyString\":\"string\",\n" + + " \"NavPropertyETKeyPrimNavOne\":\n" + + " {\n" + + " \"@odata.type\":\"#olingo.odata.test1.ETKeyPrimNavDerived\",\n" + + " \"PropertyInt16\":32767,\n" + + " \"PropertyString\":\"First Resource - first\",\n" + + " \"PropertyBoolean\":true\n" + + " }\n" + + " \n" + + "}"; + final Entity result = deserialize(payload, "ETKeyPrimNav"); + Assert.assertNotNull(result); + Link navProperty = result.getNavigationLink("NavPropertyETKeyPrimNavOne"); + Assert.assertNotNull(navProperty); + Entity e = navProperty.getInlineEntity(); + Assert.assertNotNull(e); + Assert.assertEquals("olingo.odata.test1.ETKeyPrimNavDerived", e.getType()); + Assert.assertEquals(new Short((short)32767), e.getProperty("PropertyInt16").getValue()); + Assert.assertEquals("First Resource - first", e.getProperty("PropertyString").getValue()); + Assert.assertEquals(true, e.getProperty("PropertyBoolean").getValue()); + } + private Property getCVProperty(ComplexValue cv, String name) { for (Property p : cv.getValue()) { if (p.getName().equals(name)) {
