[OLINGO-1481]Handle odata v4.01 annotations in edm assisted serailizer
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/OData.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/OData.java
index 01a8b0f..2092620 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/OData.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/OData.java
@@ -219,6 +219,16 @@
/**
* Creates a new serializer object capable of working without EDM information
+ * for rendering content in the specified format.
+ * @param contentType a content type supported by Olingo
+ * @param versions Odata Version v4 or v4.01
+ */
+ public abstract EdmAssistedSerializer createEdmAssistedSerializer(final ContentType contentType,
+ final List<String> versions) throws SerializerException;
+
+
+ /**
+ * Creates a new serializer object capable of working without EDM information
* for rendering delta content in the specified format.
* @param contentType a content type supported by Olingo
* @param version versions supported by Olingo
diff --git a/lib/server-core/src/main/java/org/apache/olingo/netty/server/core/ODataNettyImpl.java b/lib/server-core/src/main/java/org/apache/olingo/netty/server/core/ODataNettyImpl.java
index 7250e33..4ad07e8 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/netty/server/core/ODataNettyImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/netty/server/core/ODataNettyImpl.java
@@ -154,6 +154,12 @@
public EdmAssistedSerializer createEdmAssistedSerializer(ContentType contentType) throws SerializerException {
return odata.createEdmAssistedSerializer(contentType);
}
+
+ @Override
+ public EdmAssistedSerializer createEdmAssistedSerializer(ContentType contentType,
+ List<String> versions) throws SerializerException {
+ return odata.createEdmAssistedSerializer(contentType, versions);
+ }
@Override
public EdmDeltaSerializer createEdmDeltaSerializer(ContentType contentType, List<String> versions)
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataImpl.java
index 8011dec..507d87c 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataImpl.java
@@ -138,6 +138,22 @@
((contentType != null) ? contentType.toContentTypeString() : null));
}
+ @Override
+ public EdmAssistedSerializer createEdmAssistedSerializer(final ContentType contentType,
+ List<String> versions) throws SerializerException {
+ IConstants constants = new Constantsv00();
+ if(versions!=null && !versions.isEmpty() && getMaxVersion(versions) > 4){
+ constants = new Constantsv01() ;
+ }
+ if (contentType != null && contentType.isCompatible(ContentType.APPLICATION_JSON)) {
+ return new EdmAssistedJsonSerializer(contentType, constants);
+ }
+ throw new SerializerException("Unsupported format: " +
+ ((contentType != null) ? contentType.toContentTypeString() : null),
+ SerializerException.MessageKeys.UNSUPPORTED_FORMAT,
+ ((contentType != null) ? contentType.toContentTypeString() : null));
+ }
+
@Override
public EdmDeltaSerializer createEdmDeltaSerializer(final ContentType contentType, final List<String> versions)
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 dda5c12..c011fdd 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
@@ -25,6 +25,8 @@
import java.util.List;
import org.apache.olingo.commons.api.Constants;
+import org.apache.olingo.commons.api.IConstants;
+import org.apache.olingo.commons.api.constants.Constantsv00;
import org.apache.olingo.commons.api.data.AbstractEntityCollection;
import org.apache.olingo.commons.api.data.AbstractODataObject;
import org.apache.olingo.commons.api.data.Annotatable;
@@ -68,11 +70,20 @@
protected final boolean isIEEE754Compatible;
protected final boolean isODataMetadataNone;
protected final boolean isODataMetadataFull;
+ private IConstants constants;
public EdmAssistedJsonSerializer(final ContentType contentType) {
this.isIEEE754Compatible = ContentTypeHelper.isODataIEEE754Compatible(contentType);
this.isODataMetadataNone = ContentTypeHelper.isODataMetadataNone(contentType);
this.isODataMetadataFull = ContentTypeHelper.isODataMetadataFull(contentType);
+ this.constants = new Constantsv00();
+ }
+
+ public EdmAssistedJsonSerializer(final ContentType contentType, final IConstants constants) {
+ this.isIEEE754Compatible = ContentTypeHelper.isODataIEEE754Compatible(contentType);
+ this.isODataMetadataNone = ContentTypeHelper.isODataMetadataNone(contentType);
+ this.isODataMetadataFull = ContentTypeHelper.isODataMetadataFull(contentType);
+ this.constants = constants;
}
@Override
@@ -135,13 +146,13 @@
if (entityCollection.getCount() != null) {
if (isIEEE754Compatible) {
- json.writeStringField(Constants.JSON_COUNT, Integer.toString(entityCollection.getCount()));
+ json.writeStringField(constants.getCount(), Integer.toString(entityCollection.getCount()));
} else {
- json.writeNumberField(Constants.JSON_COUNT, entityCollection.getCount());
+ json.writeNumberField(constants.getCount(), entityCollection.getCount());
}
}
if (entityCollection.getDeltaLink() != null) {
- json.writeStringField(Constants.JSON_DELTA_LINK, entityCollection.getDeltaLink().toASCIIString());
+ json.writeStringField(constants.getDeltaLink(), entityCollection.getDeltaLink().toASCIIString());
}
for (final Annotation annotation : entityCollection.getAnnotations()) {
@@ -155,7 +166,7 @@
json.writeEndArray();
if (entityCollection.getNext() != null) {
- json.writeStringField(Constants.JSON_NEXT_LINK, entityCollection.getNext().toASCIIString());
+ json.writeStringField(constants.getNextLink(), entityCollection.getNext().toASCIIString());
}
json.writeEndObject();
@@ -184,10 +195,10 @@
if (!isODataMetadataNone &&
entity.getEditLink() != null && entity.getEditLink().getHref() != null) {
- json.writeStringField(Constants.JSON_EDIT_LINK, entity.getEditLink().getHref());
+ json.writeStringField(constants.getEditLink(), entity.getEditLink().getHref());
if (entity.isMediaEntity()) {
- json.writeStringField(Constants.JSON_MEDIA_READ_LINK, entity.getEditLink().getHref() + "/$value");
+ json.writeStringField(constants.getMediaReadLink(), entity.getEditLink().getHref() + "/$value");
}
}
@@ -201,24 +212,24 @@
throws IOException, SerializerException {
if (!isODataMetadataNone) {
if (contextURLString != null) {
- json.writeStringField(Constants.JSON_CONTEXT, contextURLString);
+ json.writeStringField(constants.getContext(), contextURLString);
}
if (metadataETag != null) {
- json.writeStringField(Constants.JSON_METADATA_ETAG, metadataETag);
+ json.writeStringField(constants.getMetadataEtag(), metadataETag);
}
if (eTag != null) {
- json.writeStringField(Constants.JSON_ETAG, eTag);
+ json.writeStringField(constants.getEtag(), eTag);
}
if(isODataMetadataFull){
if (type != null) {
- json.writeStringField(Constants.JSON_TYPE, type);
+ json.writeStringField(constants.getType(), type);
}
if (id == null) {
if (writeNullId) {
- json.writeNullField(Constants.JSON_ID);
+ json.writeNullField(constants.getId());
}
} else {
- json.writeStringField(Constants.JSON_ID, id.toASCIIString());
+ json.writeStringField(constants.getId(), id.toASCIIString());
}
}
}
@@ -337,7 +348,7 @@
json.writeStartObject();
if (typeName != null && isODataMetadataFull) {
- json.writeStringField(Constants.JSON_TYPE, typeName);
+ json.writeStringField(constants.getType(), typeName);
}
for (final Property property : value.getValue()) {
@@ -393,7 +404,7 @@
}
if (typeName != null) {
- json.writeStringField(name + Constants.JSON_TYPE, constructTypeExpression(typeName));
+ json.writeStringField(name + constants.getType(), constructTypeExpression(typeName));
}
}
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/ODataImplTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/ODataImplTest.java
index 9bef198..5c56970 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/ODataImplTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/ODataImplTest.java
@@ -108,4 +108,14 @@
public void serializer() throws SerializerException {
odata.createSerializer(null);
}
+
+ @Test
+ public void edmAssistedSerializerWithVersion() throws SerializerException {
+ List<String> versions = new ArrayList<String>();
+ versions.add("4.01");
+ assertNotNull(odata.createEdmAssistedSerializer(ContentType.APPLICATION_JSON, versions));
+
+ versions.add("5");
+ assertNotNull(odata.createEdmAssistedSerializer(ContentType.APPLICATION_JSON, versions));
+ }
}
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/EdmAssistedJsonSerializerV401Test.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/EdmAssistedJsonSerializerV401Test.java
new file mode 100644
index 0000000..31f76f9
--- /dev/null
+++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/EdmAssistedJsonSerializerV401Test.java
@@ -0,0 +1,701 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * 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
+ *
+ * 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
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.serializer.json;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.math.RoundingMode;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.List;
+import java.util.TimeZone;
+import java.util.UUID;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.olingo.commons.api.data.AbstractEntityCollection;
+import org.apache.olingo.commons.api.data.ComplexValue;
+import org.apache.olingo.commons.api.data.ContextURL;
+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;
+import org.apache.olingo.commons.api.edm.EdmEntityContainer;
+import org.apache.olingo.commons.api.edm.EdmEntitySet;
+import org.apache.olingo.commons.api.edmx.EdmxReference;
+import org.apache.olingo.commons.api.format.ContentType;
+import org.apache.olingo.server.api.OData;
+import org.apache.olingo.server.api.ServiceMetadata;
+import org.apache.olingo.server.api.serializer.EdmAssistedSerializer;
+import org.apache.olingo.server.api.serializer.EdmAssistedSerializerOptions;
+import org.apache.olingo.server.api.serializer.SerializerException;
+import org.apache.olingo.server.tecsvc.MetadataETagSupport;
+import org.apache.olingo.server.tecsvc.provider.EdmTechProvider;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class EdmAssistedJsonSerializerV401Test {
+ private static final OData oData = OData.newInstance();
+ private static final ServiceMetadata metadata = oData.createServiceMetadata(
+ new EdmTechProvider(), Collections.<EdmxReference> emptyList(), null);
+ private static final EdmEntityContainer entityContainer = metadata.getEdm().getEntityContainer();
+ private final EdmAssistedSerializer serializer;
+ private final EdmAssistedSerializer serializerMin;
+ private final EdmAssistedSerializer serializerNone;
+
+ public EdmAssistedJsonSerializerV401Test() throws SerializerException {
+ List<String> versions = new ArrayList<>();
+ versions.add("4.01");
+ versions.add("4");
+ serializer = oData.createEdmAssistedSerializer(ContentType.JSON_FULL_METADATA, versions);
+ serializerMin = oData.createEdmAssistedSerializer(ContentType.JSON, versions);
+ serializerNone = oData.createEdmAssistedSerializer(ContentType.JSON_NO_METADATA, versions);
+ }
+
+ @Test
+ public void entityCollectionSimple() 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("{\"@context\":\"$metadata#EntitySet(Property1)\","
+ + "\"value\":[{\"@id\":null,\"Property1@type\":\"#Single\",\"Property1\":1.25}]}",
+ serialize(serializer, metadata, null, entityCollection, null));
+ }
+
+ @Test
+ public void entityCollectionWithEdm() throws Exception {
+ final EdmEntitySet entitySet = entityContainer.getEntitySet("ESTwoPrim");
+ Entity entity = new Entity();
+ entity.setId(null);
+ entity.addProperty(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, (short) 1))
+ .addProperty(new Property(null, "PropertyString", ValueType.PRIMITIVE, "test"))
+ .addProperty(new Property(null, "AdditionalProperty", ValueType.PRIMITIVE, (byte) 42));
+ EntityCollection entityCollection = new EntityCollection();
+ entityCollection.getEntities().add(entity);
+ Assert.assertEquals("{\"@context\":\"$metadata#ESTwoPrim\",\"value\":[{\"@id\":null,"
+ + "\"PropertyInt16\":1,\"PropertyString\":\"test\","
+ + "\"AdditionalProperty@type\":\"#SByte\",\"AdditionalProperty\":42}]}",
+ serialize(serializer, metadata, entitySet, entityCollection, null));
+ }
+
+ @Test
+ public void entityCollection() 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(
+ "{\"@context\":\"$metadata#EntitySet(Property0,Property1,Property2,Property3,Property4)\","
+ + "\"@count\":2,"
+ + "\"value\":[{\"@id\":null,"
+ + "\"Property0\":null,"
+ + "\"Property1@type\":\"#Int32\",\"Property1\":1,"
+ + "\"Property2@type\":\"#Date\",\"Property2\":\"2000-02-29\","
+ + "\"Property3@type\":\"#DateTimeOffset\",\"Property3\":\"2000-02-29T00:00:00Z\","
+ + "\"Property4@type\":\"#Collection(Boolean)\",\"Property4\":[true,false,null]}],"
+ + "\"@nextLink\":\"nextLink\"}",
+ serialize(serializer, metadata, null, entityCollection, null));
+ }
+
+ @Test
+ public void entityCollectionIEEE754Compatible() throws Exception {
+ EntityCollection entityCollection = new EntityCollection();
+ entityCollection.getEntities().add(new Entity()
+ .addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, Long.MIN_VALUE))
+ .addProperty(new Property(null, "Property2", ValueType.PRIMITIVE, BigDecimal.valueOf(Long.MAX_VALUE, 10)))
+ .addProperty(new Property("Edm.Byte", "Property3", ValueType.PRIMITIVE, 20)));
+ entityCollection.setCount(3);
+ Assert.assertEquals(
+ "{\"@odata.context\":\"$metadata#EntitySet(Property1,Property2,Property3)\","
+ + "\"@odata.count\":\"3\","
+ + "\"value\":[{\"@odata.id\":null,"
+ + "\"Property1@odata.type\":\"#Int64\",\"Property1\":\"-9223372036854775808\","
+ + "\"Property2@odata.type\":\"#Decimal\",\"Property2\":\"922337203.6854775807\","
+ + "\"Property3@odata.type\":\"#Byte\",\"Property3\":20}]}",
+ serialize(
+ oData.createEdmAssistedSerializer(
+ ContentType.create(ContentType.JSON_FULL_METADATA, ContentType.PARAMETER_IEEE754_COMPATIBLE, "true")),
+ metadata, null, entityCollection, null));
+
+ List<String> versions = new ArrayList<>();
+ versions.add("4.01");
+ Assert.assertEquals(
+ "{\"@context\":\"$metadata#EntitySet(Property1,Property2,Property3)\","
+ + "\"@count\":\"3\","
+ + "\"value\":[{\"@id\":null,"
+ + "\"Property1@type\":\"#Int64\",\"Property1\":\"-9223372036854775808\","
+ + "\"Property2@type\":\"#Decimal\",\"Property2\":\"922337203.6854775807\","
+ + "\"Property3@type\":\"#Byte\",\"Property3\":20}]}",
+ serialize(
+ oData.createEdmAssistedSerializer(
+ ContentType.create(ContentType.JSON_FULL_METADATA,
+ ContentType.PARAMETER_IEEE754_COMPATIBLE, "true"), versions),
+ metadata, null, entityCollection, null));
+ }
+
+ @Test
+ public void entityCollectionWithComplexProperty() 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("{\"@context\":\"$metadata#EntitySet(Property1,Property2)\","
+ + "\"value\":[{\"@id\":null,"
+ + "\"Property1@type\":\"#Int64\",\"Property1\":1,"
+ + "\"Property2\":{\"@type\":\"#Namespace.ComplexType\","
+ + "\"Inner1@type\":\"#Decimal\",\"Inner1\":0.00010,"
+ + "\"Inner2@type\":\"#TimeOfDay\",\"Inner2\":\"13:00:59.999\"}}]}",
+ serialize(serializer, metadata, null, entityCollection, null));
+ }
+
+ @Test
+ public void entityCollectionWithComplexCollection() 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("{\"@context\":\"$metadata#ESMixPrimCollComp(CollPropertyComp)\","
+ + "\"value\":[{\"@id\":null,"
+ + "\"CollPropertyComp\":["
+ + "{\"PropertyInt16\":1,\"PropertyString\":\"one\"},"
+ + "{\"PropertyInt16\":2,\"PropertyString\":\"two\"},"
+ + "{\"PropertyInt16\":3,\"PropertyString\":\"three\"}]}]}",
+ serialize(serializer, metadata, entitySet, entityCollection, "CollPropertyComp"));
+ }
+
+ @Test
+ public void entityCollectionWithEmptyCollection() 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(
+ "{\"@context\":\"$metadata#ESMixPrimCollComp(CollPropertyString)\","
+ + "\"value\":[{\"@id\":null,\"CollPropertyString\":[]}]}",
+ serialize(serializer, metadata, entitySet, entityCollection, "CollPropertyString"));
+ }
+
+ @Test
+ public void expand() 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("{\"@context\":\"$metadata#EntitySet(Property1,NavigationProperty(Related1))\","
+ + "\"value\":[{\"@id\":null,"
+ + "\"Property1@type\":\"#Int16\",\"Property1\":1,"
+ + "\"NavigationProperty\":["
+ + "{\"@id\":null,\"Related1@type\":\"#Double\",\"Related1\":1.5},"
+ + "{\"@id\":null,\"Related1@type\":\"#Double\",\"Related1\":2.75}]}]}",
+ serialize(serializer, metadata, null, entityCollection, "Property1,NavigationProperty(Related1)"));
+ }
+
+ @Test
+ public void expandWithEdm() throws Exception {
+ final EdmEntitySet entitySet = entityContainer.getEntitySet("ESTwoPrim");
+ Entity entity = new Entity()
+ .addProperty(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, (short) 42))
+ .addProperty(new Property(null, "PropertyString", ValueType.PRIMITIVE, "test"));
+ final Entity target = new Entity()
+ .addProperty(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, (short) 2))
+ .addProperty(new Property(null, "PropertyByte", ValueType.PRIMITIVE, 3L));
+ Link link = new Link();
+ link.setTitle("NavPropertyETAllPrimOne");
+ link.setInlineEntity(target);
+ entity.getNavigationLinks().add(link);
+ EntityCollection entityCollection = new EntityCollection();
+ entityCollection.getEntities().add(entity);
+ Assert.assertEquals("{\"@context\":\"$metadata#ESTwoPrim\",\"value\":[{\"@id\":null,"
+ + "\"PropertyInt16\":42,\"PropertyString\":\"test\","
+ + "\"NavPropertyETAllPrimOne\":{\"@id\":null,\"PropertyInt16\":2,\"PropertyByte\":3}}]}",
+ serialize(serializer, metadata, entitySet, entityCollection, null));
+ }
+
+ @Test
+ public void metadata() throws Exception {
+ final ServiceMetadata metadata = oData.createServiceMetadata(null, Collections.<EdmxReference> 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("{\"@context\":\"$metadata#EntitySet(Property1)\","
+ + "\"@metadataEtag\":\"W/\\\"42\\\"\",\"value\":[{"
+ + "\"@etag\":\"W/\\\"1000\\\"\","
+ + "\"@type\":\"#Namespace.EntityType\","
+ + "\"@id\":\"ID\","
+ + "\"Property1@type\":\"#Guid\",\"Property1\":\"12345678-abcd-1234-cdef-123456789012\","
+ + "\"@editLink\":\"editLink\","
+ + "\"@mediaReadLink\":\"editLink/$value\"}]}",
+ serialize(serializer, metadata, null, entityCollection, null));
+
+ Assert.assertEquals("{\"value\":[{\"Property1\":\"12345678-abcd-1234-cdef-123456789012\"}]}",
+ serialize(oData.createEdmAssistedSerializer(ContentType.JSON_NO_METADATA), metadata,
+ null, entityCollection, null));
+ }
+
+ @Test(expected = SerializerException.class)
+ public void enumType() throws Exception {
+ EntityCollection entityCollection = new EntityCollection();
+ entityCollection.getEntities().add(
+ new Entity().addProperty(new Property(null, "Property1", ValueType.ENUM, 42)));
+ serializer.entityCollection(metadata, null, entityCollection, null);
+ }
+
+ @Test(expected = SerializerException.class)
+ public void collectionEnumType() throws Exception {
+ EntityCollection entityCollection = new EntityCollection();
+ entityCollection.getEntities().add(
+ new Entity().addProperty(new Property(null, "Property1", ValueType.COLLECTION_ENUM, Arrays.asList(42))));
+ serializer.entityCollection(metadata, null, entityCollection, null);
+ }
+
+ @Test(expected = SerializerException.class)
+ public void geoType() throws Exception {
+ EntityCollection entityCollection = new EntityCollection();
+ entityCollection.getEntities().add(
+ new Entity().addProperty(new Property(null, "Property1", ValueType.GEOSPATIAL, 1)));
+ serializer.entityCollection(metadata, null, entityCollection, null);
+ }
+
+ @Test(expected = SerializerException.class)
+ public void unsupportedType() throws Exception {
+ EntityCollection entityCollection = new EntityCollection();
+ entityCollection.getEntities().add(
+ new Entity().addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, TimeZone.getDefault())));
+ serializer.entityCollection(metadata, null, entityCollection, null);
+ }
+
+ @Test(expected = SerializerException.class)
+ public void wrongValueForType() throws Exception {
+ EntityCollection entityCollection = new EntityCollection();
+ entityCollection.getEntities().add(
+ new Entity().addProperty(new Property("Edm.SByte", "Property1", ValueType.PRIMITIVE, "-1")));
+ serializer.entityCollection(metadata, null, entityCollection, null);
+ }
+
+ @Test(expected = SerializerException.class)
+ public void wrongValueForPropertyFacet() throws Exception {
+ EntityCollection entityCollection = new EntityCollection();
+ entityCollection.getEntities().add(
+ new Entity().addProperty(
+ new Property(null, "PropertyDecimal", ValueType.PRIMITIVE, BigDecimal.ONE.scaleByPowerOfTen(-11))));
+ serializer.entityCollection(metadata, entityContainer.getEntitySet("ESAllPrim").getEntityType(), entityCollection,
+ null);
+ }
+
+ @Test(expected = SerializerException.class)
+ public void wrongValueForPropertyFacetInComplexProperty() throws Exception {
+ ComplexValue innerComplexValue = new ComplexValue();
+ innerComplexValue.getValue().add(new Property(null, "PropertyDecimal", ValueType.PRIMITIVE,
+ BigDecimal.ONE.scaleByPowerOfTen(-6)));
+ ComplexValue complexValue = new ComplexValue();
+ complexValue.getValue().add(new Property(null, "PropertyComp", ValueType.COMPLEX,
+ innerComplexValue));
+ EntityCollection entityCollection = new EntityCollection();
+ entityCollection.getEntities().add(
+ new Entity().addProperty(
+ new Property(null, "CollPropertyComp", ValueType.COLLECTION_COMPLEX,
+ Collections.singletonList(complexValue))));
+ serializer.entityCollection(metadata, entityContainer.getEntitySet("ESKeyNav").getEntityType(), entityCollection,
+ null);
+ }
+
+ private String serialize(final EdmAssistedSerializer serializer, final ServiceMetadata metadata,
+ final EdmEntitySet edmEntitySet, final AbstractEntityCollection entityCollection, final String selectList)
+ throws SerializerException, IOException {
+ ContextURL.Builder contextURLBuilder = ContextURL.with();
+ contextURLBuilder = edmEntitySet == null ?
+ contextURLBuilder.entitySetOrSingletonOrType("EntitySet") :
+ contextURLBuilder.entitySet(edmEntitySet);
+ if (selectList == null && entityCollection instanceof AbstractEntityCollection) {
+ if (edmEntitySet == null) {
+ StringBuilder names = new StringBuilder();
+ for (final Property property :
+ ((AbstractEntityCollection)entityCollection).iterator().next().getProperties()) {
+ names.append(names.length() > 0 ? ',' : "").append(property.getName());
+ }
+ contextURLBuilder = contextURLBuilder.selectList(names.toString());
+ }
+ } else {
+ contextURLBuilder = contextURLBuilder.selectList(selectList);
+ }
+ return IOUtils.toString(
+ serializer.entityCollection(metadata,
+ edmEntitySet == null ? null : edmEntitySet.getEntityType(),
+ entityCollection,
+ 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("{\"@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(
+ "{\"@context\":\"$metadata#EntitySet(Property0,Property1,Property2,Property3,Property4)\","
+ + "\"@count\":2,"
+ + "\"value\":[{"
+ + "\"Property0\":null,"
+ + "\"Property1\":1,"
+ + "\"Property2\":\"2000-02-29\","
+ + "\"Property3\":\"2000-02-29T00:00:00Z\","
+ + "\"Property4\":[true,false,null]}],"
+ + "\"@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(
+ "{"
+ + "\"@count\":2,"
+ + "\"value\":[{"
+ + "\"Property0\":null,"
+ + "\"Property1\":1,"
+ + "\"Property2\":\"2000-02-29\","
+ + "\"Property3\":\"2000-02-29T00:00:00Z\","
+ + "\"Property4\":[true,false,null]}],"
+ + "\"@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("{\"@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("{\"@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(
+ "{\"@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("{\"@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.<EdmxReference> 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("{\"@context\":\"$metadata#EntitySet(Property1)\","
+ + "\"@metadataEtag\":\"W/\\\"42\\\"\",\"value\":[{"
+ + "\"@etag\":\"W/\\\"1000\\\"\","
+ + "\"Property1\":\"12345678-abcd-1234-cdef-123456789012\","
+ + "\"@editLink\":\"editLink\","
+ + "\"@mediaReadLink\":\"editLink/$value\"}]}",
+ serialize(serializerMin, metadata, null, entityCollection, null));
+ }
+
+ @Test
+ public void entityCollectionWithBigDecimalProperty() throws Exception {
+ EntityCollection entityCollection = new EntityCollection();
+ BigDecimal b = new BigDecimal(1.666666666666666666666666666666667);
+ b.abs(new MathContext(0, RoundingMode.UNNECESSARY));
+ entityCollection.getEntities().add(new Entity()
+ .addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, b)));
+ Assert.assertTrue(
+ serialize(serializerMin, metadata, null, entityCollection, null)
+ .contains("1.6666666666666667406815349750104360282421112060546875"));
+ }
+}