From 75cc7197e32773f94cfec7777c973784314d7d37 Mon Sep 17 00:00:00 2001 From: Archana Rai Date: Thu, 22 Feb 2018 11:59:49 +0530 Subject: [PATCH] [OLINGO-1237]Serialization changes for odata.metadata=minimal --- .../json/EdmAssistedJsonSerializer.java | 24 +- .../json/EdmAssistedJsonSerializerTest.java | 296 +++++++++++++++++- 2 files changed, 308 insertions(+), 12 deletions(-) diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/EdmAssistedJsonSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/EdmAssistedJsonSerializer.java index fd68672bf..b9cbbd630 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/EdmAssistedJsonSerializer.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/EdmAssistedJsonSerializer.java @@ -66,10 +66,12 @@ public class EdmAssistedJsonSerializer implements EdmAssistedSerializer { protected final boolean isIEEE754Compatible; protected final boolean isODataMetadataNone; + protected final boolean isODataMetadataFull; public EdmAssistedJsonSerializer(final ContentType contentType) { this.isIEEE754Compatible = ContentTypeHelper.isODataIEEE754Compatible(contentType); this.isODataMetadataNone = ContentTypeHelper.isODataMetadataNone(contentType); + this.isODataMetadataFull = ContentTypeHelper.isODataMetadataFull(contentType); } @Override @@ -207,15 +209,17 @@ public class EdmAssistedJsonSerializer implements EdmAssistedSerializer { if (eTag != null) { json.writeStringField(Constants.JSON_ETAG, eTag); } - if (type != null) { - json.writeStringField(Constants.JSON_TYPE, type); - } - if (id == null) { - if (writeNullId) { - json.writeNullField(Constants.JSON_ID); + if(isODataMetadataFull){ + if (type != null) { + json.writeStringField(Constants.JSON_TYPE, type); + } + if (id == null) { + if (writeNullId) { + json.writeNullField(Constants.JSON_ID); + } + } else { + json.writeStringField(Constants.JSON_ID, id.toASCIIString()); } - } else { - json.writeStringField(Constants.JSON_ID, id.toASCIIString()); } } } @@ -326,7 +330,7 @@ public class EdmAssistedJsonSerializer implements EdmAssistedSerializer { final ComplexValue value) throws IOException, SerializerException { json.writeStartObject(); - if (typeName != null && !isODataMetadataNone) { + if (typeName != null && isODataMetadataFull) { json.writeStringField(Constants.JSON_TYPE, typeName); } @@ -362,7 +366,7 @@ public class EdmAssistedJsonSerializer implements EdmAssistedSerializer { protected void valuable(JsonGenerator json, final Valuable valuable, final String name, final EdmType type, final EdmProperty edmProperty) throws IOException, SerializerException { - if (!isODataMetadataNone + if (isODataMetadataFull && !(valuable instanceof Annotation) && !valuable.isComplex()) { String typeName = valuable.getType(); diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/EdmAssistedJsonSerializerTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/EdmAssistedJsonSerializerTest.java index 808e4599c..587484771 100644 --- a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/EdmAssistedJsonSerializerTest.java +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/EdmAssistedJsonSerializerTest.java @@ -56,9 +56,13 @@ public class EdmAssistedJsonSerializerTest { new EdmTechProvider(), Collections. emptyList(), null); private static final EdmEntityContainer entityContainer = metadata.getEdm().getEntityContainer(); private final EdmAssistedSerializer serializer; + private final EdmAssistedSerializer serializerMin; + private final EdmAssistedSerializer serializerNone; public EdmAssistedJsonSerializerTest() throws SerializerException { - serializer = oData.createEdmAssistedSerializer(ContentType.JSON); + serializer = oData.createEdmAssistedSerializer(ContentType.JSON_FULL_METADATA); + serializerMin = oData.createEdmAssistedSerializer(ContentType.JSON); + serializerNone = oData.createEdmAssistedSerializer(ContentType.JSON_NO_METADATA); } @Test @@ -136,7 +140,7 @@ public class EdmAssistedJsonSerializerTest { + "\"Property3@odata.type\":\"#Byte\",\"Property3\":20}]}", serialize( oData.createEdmAssistedSerializer( - ContentType.create(ContentType.JSON, ContentType.PARAMETER_IEEE754_COMPATIBLE, "true")), + ContentType.create(ContentType.JSON_FULL_METADATA, ContentType.PARAMETER_IEEE754_COMPATIBLE, "true")), metadata, null, entityCollection, null)); } @@ -373,4 +377,292 @@ public class EdmAssistedJsonSerializerTest { EdmAssistedSerializerOptions.with().contextURL(contextURLBuilder.build()).build()) .getContent()); } + + + @Test + public void entityCollectionSimpleMetadataMin() throws Exception { + Entity entity = new Entity(); + entity.setId(null); + entity.addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, 1.25F)); + EntityCollection entityCollection = new EntityCollection(); + entityCollection.getEntities().add(entity); + Assert.assertEquals("{\"@odata.context\":\"$metadata#EntitySet(Property1)\"," + + "\"value\":[{\"Property1\":1.25}]}", + serialize(serializerMin, metadata, null, entityCollection, null)); + } + + @Test + public void entityCollectionSimpleMetadataNone() throws Exception { + Entity entity = new Entity(); + entity.setId(null); + entity.addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, 1.25F)); + EntityCollection entityCollection = new EntityCollection(); + entityCollection.getEntities().add(entity); + Assert.assertEquals("{\"value\":[{\"Property1\":1.25}]}", + serialize(serializerNone, metadata, null, entityCollection, null)); + } + + @Test + public void entityCollectionMetadataMin() throws Exception { + Entity entity = new Entity(); + entity.setId(null); + entity.addProperty(new Property(null, "Property0", ValueType.PRIMITIVE, null)) + .addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, 1)); + Calendar date = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + date.clear(); + date.set(2000, 1, 29); + entity.addProperty(new Property("Edm.Date", "Property2", ValueType.PRIMITIVE, date)) + .addProperty(new Property("Edm.DateTimeOffset", "Property3", ValueType.PRIMITIVE, date)) + .addProperty(new Property(null, "Property4", ValueType.COLLECTION_PRIMITIVE, + Arrays.asList(true, false, null))); + EntityCollection entityCollection = new EntityCollection(); + entityCollection.getEntities().add(entity); + entityCollection.setCount(2); + entityCollection.setNext(URI.create("nextLink")); + Assert.assertEquals( + "{\"@odata.context\":\"$metadata#EntitySet(Property0,Property1,Property2,Property3,Property4)\"," + + "\"@odata.count\":2," + + "\"value\":[{" + + "\"Property0\":null," + + "\"Property1\":1," + + "\"Property2\":\"2000-02-29\"," + + "\"Property3\":\"2000-02-29T00:00:00Z\"," + + "\"Property4\":[true,false,null]}]," + + "\"@odata.nextLink\":\"nextLink\"}", + serialize(serializerMin, metadata, null, entityCollection, null)); + } + + @Test + public void entityCollectionMetadataNone() throws Exception { + Entity entity = new Entity(); + entity.setId(null); + entity.addProperty(new Property(null, "Property0", ValueType.PRIMITIVE, null)) + .addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, 1)); + Calendar date = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + date.clear(); + date.set(2000, 1, 29); + entity.addProperty(new Property("Edm.Date", "Property2", ValueType.PRIMITIVE, date)) + .addProperty(new Property("Edm.DateTimeOffset", "Property3", ValueType.PRIMITIVE, date)) + .addProperty(new Property(null, "Property4", ValueType.COLLECTION_PRIMITIVE, + Arrays.asList(true, false, null))); + EntityCollection entityCollection = new EntityCollection(); + entityCollection.getEntities().add(entity); + entityCollection.setCount(2); + entityCollection.setNext(URI.create("nextLink")); + Assert.assertEquals( + "{" + + "\"@odata.count\":2," + + "\"value\":[{" + + "\"Property0\":null," + + "\"Property1\":1," + + "\"Property2\":\"2000-02-29\"," + + "\"Property3\":\"2000-02-29T00:00:00Z\"," + + "\"Property4\":[true,false,null]}]," + + "\"@odata.nextLink\":\"nextLink\"}", + serialize(serializerNone, metadata, null, entityCollection, null)); + } + + @Test + public void entityCollectionWithComplexPropertyMetadataMin() throws Exception { + Entity entity = new Entity(); + entity.setId(null); + entity.addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, 1L)); + ComplexValue complexValue = new ComplexValue(); + complexValue.getValue().add(new Property(null, "Inner1", ValueType.PRIMITIVE, + BigDecimal.TEN.scaleByPowerOfTen(-5))); + Calendar time = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + time.clear(); + time.set(Calendar.HOUR_OF_DAY, 13); + time.set(Calendar.SECOND, 59); + time.set(Calendar.MILLISECOND, 999); + complexValue.getValue().add(new Property("Edm.TimeOfDay", "Inner2", ValueType.PRIMITIVE, time)); + entity.addProperty(new Property("Namespace.ComplexType", "Property2", ValueType.COMPLEX, complexValue)); + EntityCollection entityCollection = new EntityCollection(); + entityCollection.getEntities().add(entity); + Assert.assertEquals("{\"@odata.context\":\"$metadata#EntitySet(Property1,Property2)\"," + + "\"value\":[{" + + "\"Property1\":1," + + "\"Property2\":{" + + "\"Inner1\":0.00010," + + "\"Inner2\":\"13:00:59.999\"}}]}", + serialize(serializerMin, metadata, null, entityCollection, null)); + } + + @Test + public void entityCollectionWithComplexPropertyMetadataNone() throws Exception { + Entity entity = new Entity(); + entity.setId(null); + entity.addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, 1L)); + ComplexValue complexValue = new ComplexValue(); + complexValue.getValue().add(new Property(null, "Inner1", ValueType.PRIMITIVE, + BigDecimal.TEN.scaleByPowerOfTen(-5))); + Calendar time = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + time.clear(); + time.set(Calendar.HOUR_OF_DAY, 13); + time.set(Calendar.SECOND, 59); + time.set(Calendar.MILLISECOND, 999); + complexValue.getValue().add(new Property("Edm.TimeOfDay", "Inner2", ValueType.PRIMITIVE, time)); + entity.addProperty(new Property("Namespace.ComplexType", "Property2", ValueType.COMPLEX, complexValue)); + EntityCollection entityCollection = new EntityCollection(); + entityCollection.getEntities().add(entity); + Assert.assertEquals("{" + + "\"value\":[{" + + "\"Property1\":1," + + "\"Property2\":{" + + "\"Inner1\":0.00010," + + "\"Inner2\":\"13:00:59.999\"}}]}", + serialize(serializerNone, metadata, null, entityCollection, null)); + } + + @Test + public void entityCollectionWithComplexCollectionMin() throws Exception { + final EdmEntitySet entitySet = entityContainer.getEntitySet("ESMixPrimCollComp"); + ComplexValue complexValue1 = new ComplexValue(); + complexValue1.getValue().add(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, 1)); + complexValue1.getValue().add(new Property(null, "PropertyString", ValueType.PRIMITIVE, "one")); + ComplexValue complexValue2 = new ComplexValue(); + complexValue2.getValue().add(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, 2)); + complexValue2.getValue().add(new Property(null, "PropertyString", ValueType.PRIMITIVE, "two")); + ComplexValue complexValue3 = new ComplexValue(); + complexValue3.getValue().add(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, 3)); + complexValue3.getValue().add(new Property(null, "PropertyString", ValueType.PRIMITIVE, "three")); + EntityCollection entityCollection = new EntityCollection(); + entityCollection.getEntities().add(new Entity() + .addProperty(new Property(null, "CollPropertyComp", ValueType.COLLECTION_COMPLEX, + Arrays.asList(complexValue1, complexValue2, complexValue3)))); + Assert.assertEquals("{\"@odata.context\":\"$metadata#ESMixPrimCollComp(CollPropertyComp)\"," + + "\"value\":[{" + + "\"CollPropertyComp\":[" + + "{\"PropertyInt16\":1,\"PropertyString\":\"one\"}," + + "{\"PropertyInt16\":2,\"PropertyString\":\"two\"}," + + "{\"PropertyInt16\":3,\"PropertyString\":\"three\"}]}]}", + serialize(serializerMin, metadata, entitySet, entityCollection, "CollPropertyComp")); + } + + @Test + public void entityCollectionWithComplexCollectionNone() throws Exception { + final EdmEntitySet entitySet = entityContainer.getEntitySet("ESMixPrimCollComp"); + ComplexValue complexValue1 = new ComplexValue(); + complexValue1.getValue().add(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, 1)); + complexValue1.getValue().add(new Property(null, "PropertyString", ValueType.PRIMITIVE, "one")); + ComplexValue complexValue2 = new ComplexValue(); + complexValue2.getValue().add(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, 2)); + complexValue2.getValue().add(new Property(null, "PropertyString", ValueType.PRIMITIVE, "two")); + ComplexValue complexValue3 = new ComplexValue(); + complexValue3.getValue().add(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, 3)); + complexValue3.getValue().add(new Property(null, "PropertyString", ValueType.PRIMITIVE, "three")); + EntityCollection entityCollection = new EntityCollection(); + entityCollection.getEntities().add(new Entity() + .addProperty(new Property(null, "CollPropertyComp", ValueType.COLLECTION_COMPLEX, + Arrays.asList(complexValue1, complexValue2, complexValue3)))); + Assert.assertEquals("{" + + "\"value\":[{" + + "\"CollPropertyComp\":[" + + "{\"PropertyInt16\":1,\"PropertyString\":\"one\"}," + + "{\"PropertyInt16\":2,\"PropertyString\":\"two\"}," + + "{\"PropertyInt16\":3,\"PropertyString\":\"three\"}]}]}", + serialize(serializerNone, metadata, entitySet, entityCollection, "CollPropertyComp")); + } + + @Test + public void entityCollectionWithEmptyCollectionMin() throws Exception { + final EdmEntitySet entitySet = entityContainer.getEntitySet("ESMixPrimCollComp"); + EntityCollection entityCollection = new EntityCollection(); + entityCollection.getEntities().add(new Entity() + .addProperty(new Property(null, "CollPropertyString", ValueType.COLLECTION_PRIMITIVE, + Collections.emptyList()))); + Assert.assertEquals( + "{\"@odata.context\":\"$metadata#ESMixPrimCollComp(CollPropertyString)\"," + + "\"value\":[{\"CollPropertyString\":[]}]}", + serialize(serializerMin, metadata, entitySet, entityCollection, "CollPropertyString")); + } + + @Test + public void entityCollectionWithEmptyCollectionNone() throws Exception { + final EdmEntitySet entitySet = entityContainer.getEntitySet("ESMixPrimCollComp"); + EntityCollection entityCollection = new EntityCollection(); + entityCollection.getEntities().add(new Entity() + .addProperty(new Property(null, "CollPropertyString", ValueType.COLLECTION_PRIMITIVE, + Collections.emptyList()))); + Assert.assertEquals( + "{" + + "\"value\":[{\"CollPropertyString\":[]}]}", + serialize(serializerNone, metadata, entitySet, entityCollection, "CollPropertyString")); + } + + @Test + public void expandMetadataMin() throws Exception { + final Entity relatedEntity1 = new Entity().addProperty(new Property(null, "Related1", ValueType.PRIMITIVE, 1.5)); + final Entity relatedEntity2 = new Entity().addProperty(new Property(null, "Related1", ValueType.PRIMITIVE, 2.75)); + EntityCollection target = new EntityCollection(); + target.getEntities().add(relatedEntity1); + target.getEntities().add(relatedEntity2); + Link link = new Link(); + link.setTitle("NavigationProperty"); + link.setInlineEntitySet(target); + Entity entity = new Entity(); + entity.setId(null); + entity.addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, (short) 1)); + entity.getNavigationLinks().add(link); + EntityCollection entityCollection = new EntityCollection(); + entityCollection.getEntities().add(entity); + Assert.assertEquals("{\"@odata.context\":\"$metadata#EntitySet(Property1,NavigationProperty(Related1))\"," + + "\"value\":[{" + + "\"Property1\":1," + + "\"NavigationProperty\":[" + + "{\"Related1\":1.5}," + + "{\"Related1\":2.75}]}]}", + serialize(serializerMin, metadata, null, entityCollection, "Property1,NavigationProperty(Related1)")); + } + + @Test + public void expandMetadataNone() throws Exception { + final Entity relatedEntity1 = new Entity().addProperty(new Property(null, "Related1", ValueType.PRIMITIVE, 1.5)); + final Entity relatedEntity2 = new Entity().addProperty(new Property(null, "Related1", ValueType.PRIMITIVE, 2.75)); + EntityCollection target = new EntityCollection(); + target.getEntities().add(relatedEntity1); + target.getEntities().add(relatedEntity2); + Link link = new Link(); + link.setTitle("NavigationProperty"); + link.setInlineEntitySet(target); + Entity entity = new Entity(); + entity.setId(null); + entity.addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, (short) 1)); + entity.getNavigationLinks().add(link); + EntityCollection entityCollection = new EntityCollection(); + entityCollection.getEntities().add(entity); + Assert.assertEquals("{" + + "\"value\":[{" + + "\"Property1\":1," + + "\"NavigationProperty\":[" + + "{\"Related1\":1.5}," + + "{\"Related1\":2.75}]}]}", + serialize(serializerNone, metadata, null, entityCollection, "Property1,NavigationProperty(Related1)")); + } + + @Test + public void metadataMin() throws Exception { + final ServiceMetadata metadata = oData.createServiceMetadata(null, Collections. emptyList(), + new MetadataETagSupport("W/\"42\"")); + Entity entity = new Entity(); + entity.setType("Namespace.EntityType"); + entity.setId(URI.create("ID")); + entity.setETag("W/\"1000\""); + Link link = new Link(); + link.setHref("editLink"); + entity.setEditLink(link); + entity.setMediaContentSource(URI.create("media")); + entity.addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, + UUID.fromString("12345678-ABCD-1234-CDEF-123456789012"))); + EntityCollection entityCollection = new EntityCollection(); + entityCollection.getEntities().add(entity); + Assert.assertEquals("{\"@odata.context\":\"$metadata#EntitySet(Property1)\"," + + "\"@odata.metadataEtag\":\"W/\\\"42\\\"\",\"value\":[{" + + "\"@odata.etag\":\"W/\\\"1000\\\"\"," + + "\"Property1\":\"12345678-abcd-1234-cdef-123456789012\"," + + "\"@odata.editLink\":\"editLink\"," + + "\"@odata.mediaReadLink\":\"editLink/$value\"}]}", + serialize(serializerMin, metadata, null, entityCollection, null)); + } + }