This is an automated email from the ASF dual-hosted git repository. ramyav pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/olingo-odata4.git
The following commit(s) were added to refs/heads/master by this push: new 21d874d [OLINGO-1155]Bug Fixes for delta support in Json format 21d874d is described below commit 21d874d255e14af6837b8530036e06207c8321ba Author: ramya vasanth <ramya.vasa...@sap.com> AuthorDate: Mon Sep 9 12:05:44 2019 +0530 [OLINGO-1155]Bug Fixes for delta support in Json format --- .../json/JsonDeltaSerializerWithNavigations.java | 29 +++++++++- .../olingo/server/tecsvc/data/DataCreator.java | 39 +++++++++++++ .../server/tecsvc/provider/ContainerProvider.java | 10 +++- .../server/tecsvc/provider/EntityTypeProvider.java | 7 +-- .../JsonDeltaSerializerWithNavigationsTest.java | 67 ++++++++++++++++++++++ 5 files changed, 143 insertions(+), 9 deletions(-) diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/JsonDeltaSerializerWithNavigations.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/JsonDeltaSerializerWithNavigations.java index bf74efd..e803f89 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/JsonDeltaSerializerWithNavigations.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/JsonDeltaSerializerWithNavigations.java @@ -38,6 +38,7 @@ import org.apache.olingo.commons.api.data.Link; import org.apache.olingo.commons.api.data.Linked; import org.apache.olingo.commons.api.data.Property; import org.apache.olingo.commons.api.edm.EdmComplexType; +import org.apache.olingo.commons.api.edm.EdmEntitySet; import org.apache.olingo.commons.api.edm.EdmEntityType; import org.apache.olingo.commons.api.edm.EdmNavigationProperty; import org.apache.olingo.commons.api.edm.EdmPrimitiveType; @@ -247,9 +248,10 @@ public class JsonDeltaSerializerWithNavigations implements EdmDeltaSerializer { } } } - json.writeStringField(Constants.AT + Constants.ATOM_ATTR_ID, getEntityId(entity, entityType, name)); + String id = getEntityId(entity, entityType, name); + json.writeStringField(Constants.AT + Constants.ATOM_ATTR_ID, id); writeProperties(metadata, entityType, entity.getProperties(), select, json); - writeNavigationProperties(metadata, entityType, entity, expand, name, json, isFullRepresentation); + writeNavigationProperties(metadata, entityType, entity, expand, id, json, isFullRepresentation); json.writeEndObject(); } @@ -521,13 +523,17 @@ public class JsonDeltaSerializerWithNavigations implements EdmDeltaSerializer { SerializerException.MessageKeys.NOT_IMPLEMENTED); } if (navigationLink != null) { + EdmNavigationProperty navProperty = type.getNavigationProperty(propertyName); + String navEntitySetName = getNavigatedEntitySetName(metadata, navProperty.getType() + .getFullQualifiedName().getFullQualifiedNameAsString()); writeExpandedNavigationProperty(metadata, property, navigationLink, innerOptions == null ? null : innerOptions.getExpandOption(), innerOptions == null ? null : innerOptions.getSelectOption(), innerOptions == null ? null : innerOptions.getCountOption(), innerOptions == null ? false : innerOptions.hasCountPath(), innerOptions == null ? false : innerOptions.isRef(), - name, json, isFullRepresentation); + navEntitySetName != null ? navEntitySetName : name + "/" + property.getName(), + json, isFullRepresentation); } else { json.writeFieldName(property.getName()); if (property.isCollection()) { @@ -542,6 +548,23 @@ public class JsonDeltaSerializerWithNavigations implements EdmDeltaSerializer { } } + /** + * Fetch the entity set name which has to be shown in @Id annotation + * @param metadata + * @param fullQualifiedName + * @return + */ + private String getNavigatedEntitySetName(ServiceMetadata metadata, String fullQualifiedName) { + List<EdmEntitySet> entitySets = metadata.getEdm().getEntityContainer().getEntitySets(); + for (EdmEntitySet entitySet : entitySets) { + if (entitySet.getEntityType().getFullQualifiedName() + .getFullQualifiedNameAsString().equals(fullQualifiedName)) { + return entitySet.getName(); + } + } + return null; + } + protected void writeEntitySet(final ServiceMetadata metadata, final EdmEntityType entityType, final AbstractEntityCollection entitySet, final ExpandOption expand, final SelectOption select, final boolean onlyReference, String name, final JsonGenerator json, diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java index 3c188a0..38964fe 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java @@ -1798,6 +1798,45 @@ public class DataCreator { setLink(entityCollection.getEntities().get(3), "NavPropertyETAllPrimOne", targetEntities.get(0)); setLinkForDelta(entityCollection.getEntities().get(1), "NavPropertyETAllPrimOne"); setLinksForDelta(entityCollection.getEntities().get(2), "NavPropertyETAllPrimMany"); + final List<Entity> targetEntities1 = data.get("ESTwoBase").getEntities(); + setLinkWithoutEntityID(entityCollection.getEntities().get(0), + "NavPropertyETBaseContTwoContOne", targetEntities1.get(0)); + setLinksWithoutEntityID(entityCollection.getEntities().get(1), "NavPropertyETBaseContTwoContMany", + targetEntities1.get(1), targetEntities1.get(2)); + } + + private void setLinksWithoutEntityID(Entity entity, String navigationPropertyName, final Entity... targets) { + Link link = entity.getNavigationLink(navigationPropertyName); + for (Entity target : targets) { + target.setId(null); + } + if (link == null) { + link = new Link(); + link.setRel(Constants.NS_NAVIGATION_LINK_REL + navigationPropertyName); + link.setType(Constants.ENTITY_SET_NAVIGATION_LINK_TYPE); + link.setTitle(navigationPropertyName); + EntityCollection target = new EntityCollection(); + target.getEntities().addAll(Arrays.asList(targets)); + link.setInlineEntitySet(target); + link.setHref(entity.getId().toASCIIString() + "/" + navigationPropertyName); + entity.getNavigationLinks().add(link); + } else { + link.getInlineEntitySet().getEntities().addAll(Arrays.asList(targets)); + } + } + + private void setLinkWithoutEntityID(Entity entity, String navigationPropertyName, Entity target) { + Link link = entity.getNavigationLink(navigationPropertyName); + target.setId(null); + if (link == null) { + link = new Link(); + link.setRel(Constants.NS_NAVIGATION_LINK_REL + navigationPropertyName); + link.setType(Constants.ENTITY_NAVIGATION_LINK_TYPE); + link.setTitle(navigationPropertyName); + link.setHref(target.getId() != null ? target.getId().toASCIIString() : null); + entity.getNavigationLinks().add(link); + } + link.setInlineEntity(target); } protected static void setLinkForDelta(final Entity entity, final String navigationPropertyName) { diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java index aed408e..6244024 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java @@ -696,14 +696,20 @@ public class ContainerProvider { } else if (name.equals("ESDelta")) { return new CsdlEntitySet() .setName("ESDelta") - .setType(EntityTypeProvider.nameETTwoPrim) + .setType(EntityTypeProvider.nameETDelta) .setNavigationPropertyBindings(Arrays.asList( new CsdlNavigationPropertyBinding() .setPath("NavPropertyETAllPrimOne") .setTarget("ESAllPrim"), new CsdlNavigationPropertyBinding() .setPath("NavPropertyETAllPrimMany") - .setTarget("ESAllPrim"))); + .setTarget("ESAllPrim"), + new CsdlNavigationPropertyBinding() + .setPath("NavPropertyETBaseContOne") + .setTarget("ESTwoBase"), + new CsdlNavigationPropertyBinding() + .setPath("NavPropertyETBaseContMany") + .setTarget("ESTwoBase"))); } else if (name.equals("ESStreamOnComplexProp")) { return new CsdlEntitySet() 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 0669956..6a76e27 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 @@ -521,11 +521,10 @@ public class EntityTypeProvider { return new CsdlEntityType() .setName("ETDelta") .setBaseType(nameETTwoPrim) - .setProperties(Arrays.asList( - PropertyProvider.propertyInt16_NotNullable, PropertyProvider.propertyString)) .setNavigationProperties( - Arrays.asList(PropertyProvider.navPropertyETAllPrimOne_ETAllPrim, - PropertyProvider.collectionNavPropertyETAllPrimMany_ETAllPrim)); + Arrays.asList( + PropertyProvider.navPropertyETBaseCont_ETTwoCont, + PropertyProvider.collectionNavPropertyETBaseContMany_ETTwoCont)); } else if (entityTypeName.equals(nameETCont)) { return new CsdlEntityType() .setName("ETCont").setBaseType(nameETBaseCont) diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/JsonDeltaSerializerWithNavigationsTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/JsonDeltaSerializerWithNavigationsTest.java index 7bfd202..5a7c26f 100644 --- a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/JsonDeltaSerializerWithNavigationsTest.java +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/JsonDeltaSerializerWithNavigationsTest.java @@ -1183,4 +1183,71 @@ public class JsonDeltaSerializerWithNavigationsTest { Assert.assertNotNull(jsonString); Assert.assertEquals(expectedResult, jsonString); } + + @Test + public void testIdAnnotationWithNavigationOneInDelta() throws Exception { + final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESDelta"); + Delta delta = new Delta(); + final Entity entity = data.readAll(edmEntitySet).getEntities().get(0); + final Entity entity2 = data.readAll(edmEntitySet).getEntities().get(1); + final ExpandOption expand = ExpandSelectMock.mockExpandOption(Collections.singletonList( + ExpandSelectMock.mockExpandItem(edmEntitySet, "NavPropertyETBaseContTwoContOne"))); + List<Entity> addedEntity = new ArrayList<Entity>(); + Entity changedEntity = new Entity(); + changedEntity.setId(entity2.getId()); + changedEntity.addProperty(entity2.getProperty("PropertyString")); + addedEntity.add(entity); + addedEntity.add(changedEntity); + delta.getEntities().addAll(addedEntity); + InputStream stream = ser.entityCollection(metadata, edmEntitySet.getEntityType(), delta , + EntityCollectionSerializerOptions.with() + .contextURL(ContextURL.with().entitySet(edmEntitySet).build()).expand(expand) + .build()).getContent(); + String jsonString = IOUtils.toString(stream); + final String expectedResult = "{\"@context\":\"$metadata#ESDelta/$delta\"," + + "\"value\":[{\"@id\":\"ESDelta(32767)\",\"PropertyInt16\":32767," + + "\"PropertyString\":\"Number:32767\"," + + "\"NavPropertyETBaseContTwoContOne@delta\":" + + "{\"@id\":\"ESDelta(32767)/NavPropertyETBaseContTwoContOne" + + "(PropertyInt16=111,PropertyString='TEST%20A')\",\"PropertyInt16\":111," + + "\"PropertyString\":\"TEST A\"}},{\"@id\":\"ESDelta(-32768)\"," + + "\"PropertyString\":\"Number:-32768\",\"NavPropertyETBaseContTwoContOne\":null}]}"; + Assert.assertNotNull(jsonString); + Assert.assertEquals(expectedResult, jsonString); + } + + @Test + public void testIdAnnotationWithNavigationManyInDelta() throws Exception { + final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESDelta"); + Delta delta = new Delta(); + final Entity entity = data.readAll(edmEntitySet).getEntities().get(1); + final Entity entity2 = data.readAll(edmEntitySet).getEntities().get(2); + final ExpandOption expand = ExpandSelectMock.mockExpandOption(Collections.singletonList( + ExpandSelectMock.mockExpandItem(edmEntitySet, "NavPropertyETBaseContTwoContMany"))); + List<Entity> addedEntity = new ArrayList<Entity>(); + Entity changedEntity = new Entity(); + changedEntity.setId(entity2.getId()); + changedEntity.addProperty(entity2.getProperty("PropertyString")); + addedEntity.add(entity); + addedEntity.add(changedEntity); + delta.getEntities().addAll(addedEntity); + InputStream stream = ser.entityCollection(metadata, edmEntitySet.getEntityType(), delta , + EntityCollectionSerializerOptions.with() + .contextURL(ContextURL.with().entitySet(edmEntitySet).build()).expand(expand) + .build()).getContent(); + String jsonString = IOUtils.toString(stream); + final String expectedResult = "{\"@context\":\"$metadata#ESDelta/$delta\"," + + "\"value\":[{\"@id\":\"ESDelta(-32768)\",\"PropertyInt16\":-32768," + + "\"PropertyString\":\"Number:-32768\"," + + "\"NavPropertyETBaseContTwoContMany@delta\":" + + "[{\"@id\":\"ESDelta(-32768)/NavPropertyETBaseContTwoContMany" + + "(PropertyInt16=222,PropertyString='TEST%20B')\"," + + "\"PropertyInt16\":222,\"PropertyString\":\"TEST B\"}," + + "{\"@id\":\"ESDelta(-32768)/NavPropertyETBaseContTwoContMany" + + "(PropertyInt16=333,PropertyString='TEST%20C')\",\"PropertyInt16\":333," + + "\"PropertyString\":\"TEST C\"}]},{\"@id\":\"ESDelta(0)\"," + + "\"PropertyString\":\"Number:0\",\"NavPropertyETBaseContTwoContMany\":[]}]}"; + Assert.assertNotNull(jsonString); + Assert.assertEquals(expectedResult, jsonString); + } }