Java tutorial
/* * 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.net.URI; import java.util.Arrays; import java.util.Calendar; import java.util.Collections; 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 EdmAssistedJsonSerializerTest { 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 EdmAssistedJsonSerializerTest() throws SerializerException { serializer = oData.createEdmAssistedSerializer(ContentType.JSON_FULL_METADATA); serializerMin = oData.createEdmAssistedSerializer(ContentType.JSON); serializerNone = oData.createEdmAssistedSerializer(ContentType.JSON_NO_METADATA); } @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("{\"@odata.context\":\"$metadata#EntitySet(Property1)\"," + "\"value\":[{\"@odata.id\":null,\"Property1@odata.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( "{\"@odata.context\":\"$metadata#ESTwoPrim\",\"value\":[{\"@odata.id\":null," + "\"PropertyInt16\":1,\"PropertyString\":\"test\"," + "\"AdditionalProperty@odata.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( "{\"@odata.context\":\"$metadata#EntitySet(Property0,Property1,Property2,Property3,Property4)\"," + "\"@odata.count\":2," + "\"value\":[{\"@odata.id\":null," + "\"Property0\":null," + "\"Property1@odata.type\":\"#Int32\",\"Property1\":1," + "\"Property2@odata.type\":\"#Date\",\"Property2\":\"2000-02-29\"," + "\"Property3@odata.type\":\"#DateTimeOffset\",\"Property3\":\"2000-02-29T00:00:00Z\"," + "\"Property4@odata.type\":\"#Collection(Boolean)\",\"Property4\":[true,false,null]}]," + "\"@odata.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)); } @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( "{\"@odata.context\":\"$metadata#EntitySet(Property1,Property2)\"," + "\"value\":[{\"@odata.id\":null," + "\"Property1@odata.type\":\"#Int64\",\"Property1\":1," + "\"Property2\":{\"@odata.type\":\"#Namespace.ComplexType\"," + "\"Inner1@odata.type\":\"#Decimal\",\"Inner1\":0.00010," + "\"Inner2@odata.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( "{\"@odata.context\":\"$metadata#ESMixPrimCollComp(CollPropertyComp)\"," + "\"value\":[{\"@odata.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( "{\"@odata.context\":\"$metadata#ESMixPrimCollComp(CollPropertyString)\"," + "\"value\":[{\"@odata.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( "{\"@odata.context\":\"$metadata#EntitySet(Property1,NavigationProperty(Related1))\"," + "\"value\":[{\"@odata.id\":null," + "\"Property1@odata.type\":\"#Int16\",\"Property1\":1," + "\"NavigationProperty\":[" + "{\"@odata.id\":null,\"Related1@odata.type\":\"#Double\",\"Related1\":1.5}," + "{\"@odata.id\":null,\"Related1@odata.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("{\"@odata.context\":\"$metadata#ESTwoPrim\",\"value\":[{\"@odata.id\":null," + "\"PropertyInt16\":42,\"PropertyString\":\"test\"," + "\"NavPropertyETAllPrimOne\":{\"@odata.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("{\"@odata.context\":\"$metadata#EntitySet(Property1)\"," + "\"@odata.metadataEtag\":\"W/\\\"42\\\"\",\"value\":[{" + "\"@odata.etag\":\"W/\\\"1000\\\"\"," + "\"@odata.type\":\"#Namespace.EntityType\"," + "\"@odata.id\":\"ID\"," + "\"Property1@odata.type\":\"#Guid\",\"Property1\":\"12345678-abcd-1234-cdef-123456789012\"," + "\"@odata.editLink\":\"editLink\"," + "\"@odata.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) { if (edmEntitySet == null) { StringBuilder names = new StringBuilder(); for (final Property property : 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( "{\"@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.<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("{\"@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)); } }