From b5a194731b224d3ea2569b89e19a673aefc12721 Mon Sep 17 00:00:00 2001 From: Christian Holzer Date: Tue, 19 May 2015 16:23:07 +0200 Subject: [PATCH] [OLINGO-664] ODataJsonSerializer writes also null values of type Edm.Boolean --- .../edm/primitivetype/EdmBooleanTest.java | 4 +- .../serializer/json/ODataJsonSerializer.java | 6 +- .../server/tecsvc/data/DataCreator.java | 277 +++++++++++------- .../json/ODataJsonSerializerTest.java | 28 +- 4 files changed, 205 insertions(+), 110 deletions(-) diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/primitivetype/EdmBooleanTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/primitivetype/EdmBooleanTest.java index f470c40f0..f6b651558 100644 --- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/primitivetype/EdmBooleanTest.java +++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/primitivetype/EdmBooleanTest.java @@ -44,10 +44,10 @@ public class EdmBooleanTest extends PrimitiveTypeBaseTest { public void valueToString() throws Exception { assertEquals("true", instance.valueToString(true, null, null, null, null, null)); assertEquals("false", instance.valueToString(Boolean.FALSE, null, null, null, null, null)); - + expectTypeErrorInValueToString(instance, 0); } - + @Test public void valueOfString() throws Exception { assertEquals(true, instance.valueOfString("true", null, null, null, null, null, Boolean.class)); diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java index 65ad204b2..d0801406a 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java @@ -485,7 +485,11 @@ public class ODataJsonSerializer implements ODataSerializer { final String value = type.valueToString(primitiveValue, isNullable, maxLength, precision, scale, isUnicode); if (type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Boolean)) { - json.writeBoolean(Boolean.parseBoolean(value)); + if(value == null) { + json.writeNull(); + } else { + json.writeBoolean(Boolean.parseBoolean(value)); + } } else if (type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Byte) || type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Decimal) || type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Double) diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java index 9bc1eb89d..0564560af 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java @@ -60,7 +60,7 @@ public class DataCreator { data.put("ESTwoKeyTwoPrim", createESTwoKeyTwoPrim()); // No data available but to allow an insert operation create empty EntitySets - data.put("ESAllNullable", new EntityCollection()); + data.put("ESAllNullable", createESAllNullable()); data.put("ESMixEnumDefCollComp", new EntityCollection()); data.put("ESTwoBase", new EntityCollection()); data.put("ESBaseTwoKeyNav", new EntityCollection()); @@ -79,16 +79,73 @@ public class DataCreator { linkESTwoKeyNav(data); } + private EntityCollection createESAllNullable() { + final EntityCollection entityCollection = new EntityCollection(); + entityCollection.getEntities().add( + new Entity() + .addProperty(createPrimitive("PropertyKey", 1)) + .addProperty(createPrimitive("PropertyInt16", 0)) + .addProperty(createPrimitive("PropertyString", "")) + .addProperty(createPrimitive("PropertyBoolean", null)) + .addProperty(createPrimitive("PropertyByte", 0)) + .addProperty(createPrimitive("PropertySByte", 0)) + .addProperty(createPrimitive("PropertyInt32", 0)) + .addProperty(createPrimitive("PropertyInt64", 0)) + .addProperty(createPrimitive("PropertySingle", 0)) + .addProperty(createPrimitive("PropertyDouble", 0)) + .addProperty(createPrimitive("PropertyDecimal", 0)) + .addProperty(createPrimitive("PropertyBinary", new byte[0])) + .addProperty(createPrimitive("PropertyDate", null)) + .addProperty(createPrimitive("PropertyDateTimeOffset", null)) + .addProperty(createPrimitive("PropertyDuration", 0)) + .addProperty(createPrimitive("PropertyGuid", null)) + .addProperty(createPrimitive("PropertyTimeOfDay", getTime(0, 0, 0))) + .addProperty(createPrimitiveCollection("CollPropertyString", "spiderman@comic.com", "", "spidergirl@comic.com")) + .addProperty(createPrimitiveCollection("CollPropertyBoolean", true, null, false)) + .addProperty(createPrimitiveCollection("CollPropertyByte", 50, 0, 249)) + .addProperty(createPrimitiveCollection("CollPropertySByte", -120, 0, 126)) + .addProperty(createPrimitiveCollection("CollPropertyInt16", 1000, 0, 30112)) + .addProperty(createPrimitiveCollection("CollPropertyInt32", 23232323, 0, 10000001)) + .addProperty(createPrimitiveCollection("CollPropertyInt64", 929292929292L, 0L, 444444444444L)) + .addProperty(createPrimitiveCollection("CollPropertySingle", 1790, 0, 3210)) + .addProperty(createPrimitiveCollection("CollPropertyDouble", -17900, 0, 3210)) + .addProperty(createPrimitiveCollection("CollPropertyDecimal", 12, 0, 1234)) + .addProperty(createPrimitiveCollection("CollPropertyBinary", + new byte[] { -85, -51, -17 }, + new byte[0], + new byte[] { 84, 103, -119 } )) + .addProperty(createPrimitiveCollection("CollPropertyDate", + getDateTime(1958, 12, 3, 0, 0, 0), + null, + getDateTime(2013, 6, 25, 0, 0, 0))) + .addProperty(createPrimitiveCollection("CollPropertyDateTimeOffset", + getDateTime(2015, 8, 12, 3, 8, 34), + null, + getDateTime(1948, 2, 17, 9, 9, 9))) + .addProperty(createPrimitiveCollection("CollPropertyGuid", + UUID.fromString("ffffff67-89ab-cdef-0123-456789aaaaaa"), + null, + UUID.fromString("cccccc67-89ab-cdef-0123-456789cccccc"))) + .addProperty(createPrimitiveCollection("CollPropertyTimeOfDay", + getTime(4, 14, 13), + getTime(0, 0, 0), + getTime(0, 37, 13)) + )); + + + return entityCollection; + } + protected Map getData() { return data; } private EntityCollection createESTwoKeyTwoPrim() { - EntityCollection entitySet = new EntityCollection(); - entitySet.getEntities().add(createETTwoKeyTwoPrimEntity((short) 32767, "Test String1")); - entitySet.getEntities().add(createETTwoKeyTwoPrimEntity((short) -365, "Test String2")); - entitySet.getEntities().add(createETTwoKeyTwoPrimEntity((short) -32766, "Test String3")); - return entitySet; + EntityCollection entityCollection = new EntityCollection(); + entityCollection.getEntities().add(createETTwoKeyTwoPrimEntity((short) 32767, "Test String1")); + entityCollection.getEntities().add(createETTwoKeyTwoPrimEntity((short) -365, "Test String2")); + entityCollection.getEntities().add(createETTwoKeyTwoPrimEntity((short) -32766, "Test String3")); + return entityCollection; } private Entity createETTwoKeyTwoPrimEntity(final short propertyInt16, final String propertyString) { @@ -97,24 +154,24 @@ public class DataCreator { } private EntityCollection createESServerSidePaging() { - EntityCollection entitySet = new EntityCollection(); + EntityCollection entityCollection = new EntityCollection(); for (int i = 1; i <= 503; i++) { - entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", i)) + entityCollection.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", i)) .addProperty(createPrimitive("PropertyString", "Number:" + i))); } - return entitySet; + return entityCollection; } private EntityCollection createESKeyNav() { - final EntityCollection entitySet = new EntityCollection(); + final EntityCollection entityCollection = new EntityCollection(); - entitySet.getEntities().add(createETKeyNavEntity(1, "I am String Property 1")); - entitySet.getEntities().add(createETKeyNavEntity(2, "I am String Property 2")); - entitySet.getEntities().add(createETKeyNavEntity(3, "I am String Property 3")); + entityCollection.getEntities().add(createETKeyNavEntity(1, "I am String Property 1")); + entityCollection.getEntities().add(createETKeyNavEntity(2, "I am String Property 2")); + entityCollection.getEntities().add(createETKeyNavEntity(3, "I am String Property 3")); - return entitySet; + return entityCollection; } @SuppressWarnings("unchecked") @@ -137,14 +194,14 @@ public class DataCreator { } private EntityCollection createESTwoKeyNav() { - final EntityCollection entitySet = new EntityCollection(); + final EntityCollection entityCollection = new EntityCollection(); - entitySet.getEntities().add(createESTwoKeyNavEntity(1, "1")); - entitySet.getEntities().add(createESTwoKeyNavEntity(1, "2")); - entitySet.getEntities().add(createESTwoKeyNavEntity(2, "1")); - entitySet.getEntities().add(createESTwoKeyNavEntity(3, "1")); + entityCollection.getEntities().add(createESTwoKeyNavEntity(1, "1")); + entityCollection.getEntities().add(createESTwoKeyNavEntity(1, "2")); + entityCollection.getEntities().add(createESTwoKeyNavEntity(2, "1")); + entityCollection.getEntities().add(createESTwoKeyNavEntity(3, "1")); - return entitySet; + return entityCollection; } @SuppressWarnings("unchecked") @@ -191,9 +248,9 @@ public class DataCreator { @SuppressWarnings("unchecked") private EntityCollection createESCompCollComp() { - final EntityCollection entitySet = new EntityCollection(); + final EntityCollection entityCollection = new EntityCollection(); - entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)) + entityCollection.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)) .addProperty(createComplex("PropertyComp", createComplexCollection("CollPropertyComp", Arrays .asList(createPrimitive("PropertyInt16", 555), createPrimitive("PropertyString", "1 Test Complex in Complex Property")), Arrays @@ -202,7 +259,7 @@ public class DataCreator { .asList(createPrimitive("PropertyInt16", 777), createPrimitive("PropertyString", "3 Test Complex in Complex Property")))))); - entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", 12345)).addProperty( + entityCollection.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", 12345)).addProperty( createComplex("PropertyComp", createComplexCollection("CollPropertyComp", Arrays .asList(createPrimitive("PropertyInt16", 888), createPrimitive("PropertyString", "11 Test Complex in Complex Property")), Arrays @@ -211,31 +268,31 @@ public class DataCreator { .asList(createPrimitive("PropertyInt16", 0), createPrimitive("PropertyString", "13 Test Complex in Complex Property")))))); - return entitySet; + return entityCollection; } private EntityCollection createESTwoPrim() { - EntityCollection entitySet = new EntityCollection(); + EntityCollection entityCollection = new EntityCollection(); - entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", 32766)) + entityCollection.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", 32766)) .addProperty(createPrimitive("PropertyString", "Test String1"))); - entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", -365)) + entityCollection.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", -365)) .addProperty(createPrimitive("PropertyString", "Test String2"))); - entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", -32766)) + entityCollection.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", -32766)) .addProperty(createPrimitive("PropertyString", null))); - entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)) + entityCollection.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)) .addProperty(createPrimitive("PropertyString", "Test String4"))); - return entitySet; + return entityCollection; } private EntityCollection createESAllPrim() { - EntityCollection entitySet = new EntityCollection(); + EntityCollection entityCollection = new EntityCollection(); - entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)) + entityCollection.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)) .addProperty(createPrimitive("PropertyString", "First Resource - positive values")) .addProperty(createPrimitive("PropertyBoolean", true)).addProperty(createPrimitive("PropertyByte", 255)) .addProperty(createPrimitive("PropertySByte", Byte.MAX_VALUE)) @@ -250,7 +307,7 @@ public class DataCreator { .addProperty(createPrimitive("PropertyDuration", 6)).addProperty(createPrimitive("PropertyGuid", GUID)) .addProperty(createPrimitive("PropertyTimeOfDay", getTime(3, 26, 5)))); - entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", Short.MIN_VALUE)) + entityCollection.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", Short.MIN_VALUE)) .addProperty(createPrimitive("PropertyString", "Second Resource - negative values")) .addProperty(createPrimitive("PropertyBoolean", false)).addProperty(createPrimitive("PropertyByte", 0)) .addProperty(createPrimitive("PropertySByte", Byte.MIN_VALUE)) @@ -266,7 +323,7 @@ public class DataCreator { .addProperty(createPrimitive("PropertyGuid", UUID.fromString("76543201-23ab-cdef-0123-456789dddfff"))) .addProperty(createPrimitive("PropertyTimeOfDay", getTime(23, 49, 14)))); - entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", (short) 0)) + entityCollection.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", (short) 0)) .addProperty(createPrimitive("PropertyString", "")).addProperty(createPrimitive("PropertyBoolean", false)) .addProperty(createPrimitive("PropertyByte", 0)).addProperty(createPrimitive("PropertySByte", 0)) .addProperty(createPrimitive("PropertyInt32", 0)).addProperty(createPrimitive("PropertyInt64", 0)) @@ -279,11 +336,11 @@ public class DataCreator { .addProperty(createPrimitive("PropertyGuid", UUID.fromString("76543201-23ab-cdef-0123-456789cccddd"))) .addProperty(createPrimitive("PropertyTimeOfDay", getTime(0, 1, 1)))); - return entitySet; + return entityCollection; } private EntityCollection createESCompAllPrim() { - EntityCollection entitySet = new EntityCollection(); + EntityCollection entityCollection = new EntityCollection(); Entity entity = new Entity(); entity.addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)); @@ -299,7 +356,7 @@ public class DataCreator { createPrimitive("PropertyInt32", Integer.MAX_VALUE), createPrimitive("PropertyInt64", Long.MAX_VALUE), createPrimitive("PropertySByte", Byte.MAX_VALUE), createPrimitive("PropertyTimeOfDay", getTime(1, 0, 1)))); entity.setETag("W/\"" + Short.MAX_VALUE + '\"'); - entitySet.getEntities().add(entity); + entityCollection.getEntities().add(entity); entity = new Entity(); entity.addProperty(createPrimitive("PropertyInt16", 7)); @@ -316,7 +373,7 @@ public class DataCreator { createPrimitive("PropertySByte", Byte.MAX_VALUE), createPrimitive("PropertyTimeOfDay", getTimestamp(1, 1, 1, 7, 45, 12, 765432100)))); entity.setETag("W/\"7\""); - entitySet.getEntities().add(entity); + entityCollection.getEntities().add(entity); entity = new Entity(); entity.addProperty(createPrimitive("PropertyInt16", 0)); @@ -332,15 +389,15 @@ public class DataCreator { createPrimitive("PropertyInt32", Integer.MAX_VALUE), createPrimitive("PropertyInt64", Long.MAX_VALUE), createPrimitive("PropertySByte", Byte.MAX_VALUE), createPrimitive("PropertyTimeOfDay", getTime(13, 27, 45)))); entity.setETag("W/\"0\""); - entitySet.getEntities().add(entity); + entityCollection.getEntities().add(entity); - return entitySet; + return entityCollection; } private EntityCollection createESCollAllPrim() { - EntityCollection entitySet = new EntityCollection(); + EntityCollection entityCollection = new EntityCollection(); - entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", 1)).addProperty( + entityCollection.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", 1)).addProperty( createPrimitiveCollection("CollPropertyString", "Employee1@company.example", "Employee2@company.example", "Employee3@company.example")) .addProperty(createPrimitiveCollection("CollPropertyBoolean", true, false, true)) @@ -368,16 +425,16 @@ public class DataCreator { getTime(1, 12, 33)))); Entity entity = new Entity(); - entity.getProperties().addAll(entitySet.getEntities().get(0).getProperties()); + entity.getProperties().addAll(entityCollection.getEntities().get(0).getProperties()); entity.getProperties().set(0, createPrimitive("PropertyInt16", 2)); - entitySet.getEntities().add(entity); + entityCollection.getEntities().add(entity); entity = new Entity(); - entity.getProperties().addAll(entitySet.getEntities().get(0).getProperties()); + entity.getProperties().addAll(entityCollection.getEntities().get(0).getProperties()); entity.getProperties().set(0, createPrimitive("PropertyInt16", 3)); - entitySet.getEntities().add(entity); + entityCollection.getEntities().add(entity); - return entitySet; + return entityCollection; } private EntityCollection createESMixPrimCollComp() { @@ -387,34 +444,34 @@ public class DataCreator { Arrays.asList(createPrimitive("PropertyInt16", 456), createPrimitive("PropertyString", "TEST 2")), Arrays.asList(createPrimitive("PropertyInt16", 789), createPrimitive("PropertyString", "TEST 3"))); - EntityCollection entitySet = new EntityCollection(); + EntityCollection entityCollection = new EntityCollection(); - entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)) + entityCollection.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)) .addProperty( createPrimitiveCollection("CollPropertyString", "Employee1@company.example", "Employee2@company.example", "Employee3@company.example")).addProperty( createComplex("PropertyComp", createPrimitive("PropertyInt16", 111), createPrimitive("PropertyString", "TEST A"))).addProperty(complexCollection)); - entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", 7)).addProperty( + entityCollection.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", 7)).addProperty( createPrimitiveCollection("CollPropertyString", "Employee1@company.example", "Employee2@company.example", "Employee3@company.example")).addProperty( createComplex("PropertyComp", createPrimitive("PropertyInt16", 222), createPrimitive("PropertyString", "TEST B"))).addProperty(complexCollection)); - entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", 0)).addProperty( + entityCollection.getEntities().add(new Entity().addProperty(createPrimitive("PropertyInt16", 0)).addProperty( createPrimitiveCollection("CollPropertyString", "Employee1@company.example", "Employee2@company.example", "Employee3@company.example")).addProperty( createComplex("PropertyComp", createPrimitive("PropertyInt16", 333), createPrimitive("PropertyString", "TEST C"))).addProperty(complexCollection)); - return entitySet; + return entityCollection; } private EntityCollection createESAllKey() { - EntityCollection entitySet = new EntityCollection(); + EntityCollection entityCollection = new EntityCollection(); - entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyString", "First")) + entityCollection.getEntities().add(new Entity().addProperty(createPrimitive("PropertyString", "First")) .addProperty(createPrimitive("PropertyBoolean", true)).addProperty(createPrimitive("PropertyByte", 255)) .addProperty(createPrimitive("PropertySByte", Byte.MAX_VALUE)) .addProperty(createPrimitive("PropertyInt16", Short.MAX_VALUE)) @@ -426,7 +483,7 @@ public class DataCreator { .addProperty(createPrimitive("PropertyDuration", 6)).addProperty(createPrimitive("PropertyGuid", GUID)) .addProperty(createPrimitive("PropertyTimeOfDay", getTime(2, 48, 21)))); - entitySet.getEntities().add(new Entity().addProperty(createPrimitive("PropertyString", "Second")) + entityCollection.getEntities().add(new Entity().addProperty(createPrimitive("PropertyString", "Second")) .addProperty(createPrimitive("PropertyBoolean", true)).addProperty(createPrimitive("PropertyByte", 254)) .addProperty(createPrimitive("PropertySByte", 124)).addProperty(createPrimitive("PropertyInt16", 32764)) .addProperty(createPrimitive("PropertyInt32", 2147483644)) @@ -437,57 +494,57 @@ public class DataCreator { .addProperty(createPrimitive("PropertyDuration", 6)).addProperty(createPrimitive("PropertyGuid", GUID)) .addProperty(createPrimitive("PropertyTimeOfDay", getTime(2, 48, 21)))); - return entitySet; + return entityCollection; } private EntityCollection createESCompComp() { - EntityCollection entitySet = new EntityCollection(); + EntityCollection entityCollection = new EntityCollection(); Entity entity = new Entity(); entity.addProperty(createPrimitive("PropertyInt16", 1)); entity.addProperty(createComplex("PropertyComp", createComplex("PropertyComp", createPrimitive("PropertyInt16", 123), createPrimitive("PropertyString", "String 1")))); - entitySet.getEntities().add(entity); + entityCollection.getEntities().add(entity); entity = new Entity(); entity.addProperty(createPrimitive("PropertyInt16", 2)); entity.addProperty(createComplex("PropertyComp", createComplex("PropertyComp", createPrimitive("PropertyInt16", 987), createPrimitive("PropertyString", "String 2")))); - entitySet.getEntities().add(entity); + entityCollection.getEntities().add(entity); - return entitySet; + return entityCollection; } private EntityCollection createESMedia() { - EntityCollection entitySet = new EntityCollection(); + EntityCollection entityCollection = new EntityCollection(); Entity entity = new Entity().addProperty(createPrimitive("PropertyInt16", 1)) .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("darkturquoise"))); entity.setMediaContentType("image/svg+xml"); entity.setMediaETag("W/\"1\""); - entitySet.getEntities().add(entity); + entityCollection.getEntities().add(entity); entity = new Entity().addProperty(createPrimitive("PropertyInt16", 2)) .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("royalblue"))); entity.setMediaContentType("image/svg+xml"); entity.setMediaETag("W/\"2\""); - entitySet.getEntities().add(entity); + entityCollection.getEntities().add(entity); entity = new Entity().addProperty(createPrimitive("PropertyInt16", 3)) .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("crimson"))); entity.setMediaContentType("image/svg+xml"); entity.setMediaETag("W/\"3\""); - entitySet.getEntities().add(entity); + entityCollection.getEntities().add(entity); entity = new Entity().addProperty(createPrimitive("PropertyInt16", 4)) .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("black"))); entity.setMediaContentType("image/svg+xml"); entity.setMediaETag("W/\"4\""); - entitySet.getEntities().add(entity); + entityCollection.getEntities().add(entity); - return entitySet; + return entityCollection; } private byte[] createImage(final String color) { @@ -498,87 +555,95 @@ public class DataCreator { } private void linkESTwoPrim(final Map data) { - final EntityCollection entitySet = data.get("ESTwoPrim"); + final EntityCollection entityCollection = data.get("ESTwoPrim"); final List targetEntities = data.get("ESAllPrim").getEntities(); - setLinks(entitySet.getEntities().get(1), "NavPropertyETAllPrimMany", targetEntities.get(1), targetEntities.get(2)); - - setLink(entitySet.getEntities().get(3), "NavPropertyETAllPrimOne", targetEntities.get(0)); + setLinks(entityCollection.getEntities().get(1), "NavPropertyETAllPrimMany", targetEntities.get(1), + targetEntities.get(2)); + setLink(entityCollection.getEntities().get(3), "NavPropertyETAllPrimOne", targetEntities.get(0)); } private void linkESAllPrim(final Map data) { - final EntityCollection entitySet = data.get("ESAllPrim"); + final EntityCollection entityCollection = data.get("ESAllPrim"); final List targetEntities = data.get("ESTwoPrim").getEntities(); - setLinks(entitySet.getEntities().get(0), "NavPropertyETTwoPrimMany", targetEntities.get(1)); - setLink(entitySet.getEntities().get(0), "NavPropertyETTwoPrimOne", targetEntities.get(3)); + setLinks(entityCollection.getEntities().get(0), "NavPropertyETTwoPrimMany", targetEntities.get(1)); + setLink(entityCollection.getEntities().get(0), "NavPropertyETTwoPrimOne", targetEntities.get(3)); - setLinks(entitySet.getEntities().get(2), "NavPropertyETTwoPrimMany", targetEntities.get(0), targetEntities.get(2), - targetEntities.get(3)); + setLinks(entityCollection.getEntities().get(2), "NavPropertyETTwoPrimMany", targetEntities.get(0), + targetEntities.get(2), + targetEntities.get(3)); } private void linkESKeyNav(final Map data) { - final EntityCollection entitySet = data.get("ESKeyNav"); + final EntityCollection entityCollection = data.get("ESKeyNav"); final List esKeyNavTargets = data.get("ESKeyNav").getEntities(); final List esTwoKeyNavTargets = data.get("ESTwoKeyNav").getEntities(); final List esMediaTargets = data.get("ESMedia").getEntities(); // NavPropertyETKeyNavMany - setLinks(entitySet.getEntities().get(0), "NavPropertyETKeyNavMany", esKeyNavTargets.get(0), esKeyNavTargets.get(1)); - setLinks(entitySet.getEntities().get(1), "NavPropertyETKeyNavMany", esKeyNavTargets.get(1), esKeyNavTargets.get(2)); + setLinks(entityCollection.getEntities().get(0), "NavPropertyETKeyNavMany", esKeyNavTargets.get(0), + esKeyNavTargets.get(1)); + setLinks(entityCollection.getEntities().get(1), "NavPropertyETKeyNavMany", esKeyNavTargets.get(1), + esKeyNavTargets.get(2)); // NavPropertyETKeyNavOne - setLink(entitySet.getEntities().get(0), "NavPropertyETKeyNavOne", esKeyNavTargets.get(1)); - setLink(entitySet.getEntities().get(1), "NavPropertyETKeyNavOne", esKeyNavTargets.get(2)); + setLink(entityCollection.getEntities().get(0), "NavPropertyETKeyNavOne", esKeyNavTargets.get(1)); + setLink(entityCollection.getEntities().get(1), "NavPropertyETKeyNavOne", esKeyNavTargets.get(2)); // NavPropertyETTwoKeyNavOne - setLink(entitySet.getEntities().get(0), "NavPropertyETTwoKeyNavOne", esTwoKeyNavTargets.get(0)); - setLink(entitySet.getEntities().get(1), "NavPropertyETTwoKeyNavOne", esTwoKeyNavTargets.get(1)); - setLink(entitySet.getEntities().get(2), "NavPropertyETTwoKeyNavOne", esTwoKeyNavTargets.get(2)); + setLink(entityCollection.getEntities().get(0), "NavPropertyETTwoKeyNavOne", esTwoKeyNavTargets.get(0)); + setLink(entityCollection.getEntities().get(1), "NavPropertyETTwoKeyNavOne", esTwoKeyNavTargets.get(1)); + setLink(entityCollection.getEntities().get(2), "NavPropertyETTwoKeyNavOne", esTwoKeyNavTargets.get(2)); // NavPropertyETTwoKeyNavMany - setLinks(entitySet.getEntities().get(0), "NavPropertyETTwoKeyNavMany", esTwoKeyNavTargets.get(0), + setLinks(entityCollection.getEntities().get(0), "NavPropertyETTwoKeyNavMany", esTwoKeyNavTargets.get(0), esTwoKeyNavTargets.get(1)); - setLinks(entitySet.getEntities().get(1), "NavPropertyETTwoKeyNavMany", esTwoKeyNavTargets.get(2)); - setLinks(entitySet.getEntities().get(2), "NavPropertyETTwoKeyNavMany", esTwoKeyNavTargets.get(3)); + setLinks(entityCollection.getEntities().get(1), "NavPropertyETTwoKeyNavMany", esTwoKeyNavTargets.get(2)); + setLinks(entityCollection.getEntities().get(2), "NavPropertyETTwoKeyNavMany", esTwoKeyNavTargets.get(3)); // NavPropertyETMediaOne - setLink(entitySet.getEntities().get(0), "NavPropertyETMediaOne", esMediaTargets.get(0)); - setLink(entitySet.getEntities().get(1), "NavPropertyETMediaOne", esMediaTargets.get(1)); - setLink(entitySet.getEntities().get(2), "NavPropertyETMediaOne", esMediaTargets.get(2)); + setLink(entityCollection.getEntities().get(0), "NavPropertyETMediaOne", esMediaTargets.get(0)); + setLink(entityCollection.getEntities().get(1), "NavPropertyETMediaOne", esMediaTargets.get(1)); + setLink(entityCollection.getEntities().get(2), "NavPropertyETMediaOne", esMediaTargets.get(2)); // NavPropertyETMediaMany - setLinks(entitySet.getEntities().get(0), "NavPropertyETMediaMany", esMediaTargets.get(0), esMediaTargets.get(2)); - setLinks(entitySet.getEntities().get(1), "NavPropertyETMediaMany", esMediaTargets.get(2)); - setLinks(entitySet.getEntities().get(2), "NavPropertyETMediaMany", esMediaTargets.get(0), esMediaTargets.get(1)); + setLinks(entityCollection.getEntities().get(0), "NavPropertyETMediaMany", esMediaTargets.get(0), + esMediaTargets.get(2)); + setLinks(entityCollection.getEntities().get(1), "NavPropertyETMediaMany", esMediaTargets.get(2)); + setLinks(entityCollection.getEntities().get(2), "NavPropertyETMediaMany", esMediaTargets.get(0), + esMediaTargets.get(1)); } private void linkESTwoKeyNav(final Map data) { - final EntityCollection entitySet = data.get("ESTwoKeyNav"); + final EntityCollection entityCollection = data.get("ESTwoKeyNav"); final List esKeyNavTargets = data.get("ESKeyNav").getEntities(); final List esTwoKeyNavTargets = data.get("ESTwoKeyNav").getEntities(); // NavPropertyETKeyNavOne - setLink(entitySet.getEntities().get(0), "NavPropertyETKeyNavOne", esKeyNavTargets.get(0)); - setLink(entitySet.getEntities().get(1), "NavPropertyETKeyNavOne", esKeyNavTargets.get(0)); - setLink(entitySet.getEntities().get(2), "NavPropertyETKeyNavOne", esKeyNavTargets.get(1)); - setLink(entitySet.getEntities().get(3), "NavPropertyETKeyNavOne", esKeyNavTargets.get(2)); + setLink(entityCollection.getEntities().get(0), "NavPropertyETKeyNavOne", esKeyNavTargets.get(0)); + setLink(entityCollection.getEntities().get(1), "NavPropertyETKeyNavOne", esKeyNavTargets.get(0)); + setLink(entityCollection.getEntities().get(2), "NavPropertyETKeyNavOne", esKeyNavTargets.get(1)); + setLink(entityCollection.getEntities().get(3), "NavPropertyETKeyNavOne", esKeyNavTargets.get(2)); // NavPropertyETKeyNavMany - setLinks(entitySet.getEntities().get(0), "NavPropertyETKeyNavMany", esKeyNavTargets.get(0), esKeyNavTargets.get(1)); - setLinks(entitySet.getEntities().get(1), "NavPropertyETKeyNavMany", esKeyNavTargets.get(0), esKeyNavTargets.get(1)); - setLinks(entitySet.getEntities().get(2), "NavPropertyETKeyNavMany", esKeyNavTargets.get(1), esKeyNavTargets.get(2)); + setLinks(entityCollection.getEntities().get(0), "NavPropertyETKeyNavMany", esKeyNavTargets.get(0), + esKeyNavTargets.get(1)); + setLinks(entityCollection.getEntities().get(1), "NavPropertyETKeyNavMany", esKeyNavTargets.get(0), + esKeyNavTargets.get(1)); + setLinks(entityCollection.getEntities().get(2), "NavPropertyETKeyNavMany", esKeyNavTargets.get(1), + esKeyNavTargets.get(2)); // NavPropertyETTwoKeyNavOne - setLink(entitySet.getEntities().get(0), "NavPropertyETTwoKeyNavOne", esTwoKeyNavTargets.get(0)); - setLink(entitySet.getEntities().get(2), "NavPropertyETTwoKeyNavOne", esTwoKeyNavTargets.get(1)); - setLink(entitySet.getEntities().get(3), "NavPropertyETTwoKeyNavOne", esTwoKeyNavTargets.get(2)); + setLink(entityCollection.getEntities().get(0), "NavPropertyETTwoKeyNavOne", esTwoKeyNavTargets.get(0)); + setLink(entityCollection.getEntities().get(2), "NavPropertyETTwoKeyNavOne", esTwoKeyNavTargets.get(1)); + setLink(entityCollection.getEntities().get(3), "NavPropertyETTwoKeyNavOne", esTwoKeyNavTargets.get(2)); // NavPropertyETTwoKeyNavMany - setLinks(entitySet.getEntities().get(0), "NavPropertyETTwoKeyNavMany", esTwoKeyNavTargets.get(0), + setLinks(entityCollection.getEntities().get(0), "NavPropertyETTwoKeyNavMany", esTwoKeyNavTargets.get(0), esTwoKeyNavTargets.get(1)); - setLinks(entitySet.getEntities().get(1), "NavPropertyETTwoKeyNavMany", esTwoKeyNavTargets.get(0)); - setLinks(entitySet.getEntities().get(2), "NavPropertyETTwoKeyNavMany", esTwoKeyNavTargets.get(1)); + setLinks(entityCollection.getEntities().get(1), "NavPropertyETTwoKeyNavMany", esTwoKeyNavTargets.get(0)); + setLinks(entityCollection.getEntities().get(2), "NavPropertyETTwoKeyNavMany", esTwoKeyNavTargets.get(1)); } protected static Property createPrimitive(final String name, final Object value) { diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java index c867022b7..f4990acea 100644 --- a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java @@ -351,7 +351,33 @@ public class ODataJsonSerializerTest { + "{\"@odata.mediaEtag\":\"W/\\\"4\\\"\",\"@odata.mediaContentType\":\"image/svg+xml\",\"PropertyInt16\":4}]}"; Assert.assertEquals(expectedResult, resultString); } - + + @Test + public void primitiveBooleanCollectionWithNull() throws Exception { + final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllNullable"); + final EntityCollection entitySet = data.readAll(edmEntitySet); + final String resultString = IOUtils.toString(serializer.entityCollection(metadata, + edmEntitySet.getEntityType(), entitySet, + EntityCollectionSerializerOptions.with() + .contextURL(ContextURL.with().entitySet(edmEntitySet).build()).build()).getContent()); + + final String expected = "{\"@odata.context\":\"$metadata#ESAllNullable\",\"value\":[{\"PropertyKey\":1," + + "\"PropertyInt16\":0,\"PropertyString\":\"\",\"PropertyBoolean\":null,\"PropertyByte\":0,\"PropertySByte\":0," + + "\"PropertyInt32\":0,\"PropertyInt64\":0,\"PropertySingle\":0,\"PropertyDouble\":0,\"PropertyDecimal\":0," + + "\"PropertyBinary\":\"\",\"PropertyDate\":null,\"PropertyDateTimeOffset\":null,\"PropertyDuration\":\"PT0S\"," + + "\"PropertyGuid\":null,\"PropertyTimeOfDay\":\"00:00:00\",\"CollPropertyString\":[\"spiderman@comic.com\",\"\"," + + "\"spidergirl@comic.com\"],\"CollPropertyBoolean\":[true,null,false],\"CollPropertyByte\":[50,0,249]," + + "\"CollPropertySByte\":[-120,0,126],\"CollPropertyInt16\":[1000,0,30112],\"CollPropertyInt32\":" + + "[23232323,0,10000001],\"CollPropertyInt64\":[929292929292,0,444444444444],\"CollPropertySingle\":" + + "[1790,0,3210],\"CollPropertyDouble\":[-17900,0,3210],\"CollPropertyDecimal\":[12,0,1234]," + + "\"CollPropertyBinary\":[\"q83v\",\"\",\"VGeJ\"],\"CollPropertyDate\":[\"1958-12-03\",null,\"2013-06-25\"]," + + "\"CollPropertyDateTimeOffset\":[\"2015-08-12T03:08:34Z\",null,\"1948-02-17T09:09:09Z\"]," + + "\"CollPropertyDuration\":null,\"CollPropertyGuid\":[\"ffffff67-89ab-cdef-0123-456789aaaaaa\",null," + + "\"cccccc67-89ab-cdef-0123-456789cccccc\"],\"CollPropertyTimeOfDay\":[\"04:14:13\",\"00:00:00\",\"00:37:13\"]}]}"; + + Assert.assertEquals(expected, resultString); + } + @Test public void select() throws Exception { final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim");