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 <[email protected]>
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);
+ }
}