You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by st...@apache.org on 2017/10/16 19:56:29 UTC

johnzon git commit: JOHNZON-138 add Collection support for @JsonbTypeSerializer

Repository: johnzon
Updated Branches:
  refs/heads/master 2b3d6d99e -> 7bbeb16fd


JOHNZON-138 add Collection support for @JsonbTypeSerializer

and also for @JsonbTypeDeSerializer.

They will now be applied to all their children


Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/7bbeb16f
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/7bbeb16f
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/7bbeb16f

Branch: refs/heads/master
Commit: 7bbeb16fdb3a0d513049f79172378c5cc8d84466
Parents: 2b3d6d9
Author: Mark Struberg <st...@apache.org>
Authored: Mon Oct 16 21:23:25 2017 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Mon Oct 16 21:23:25 2017 +0200

----------------------------------------------------------------------
 .../apache/johnzon/jsonb/SerializerTest.java    | 24 ++++++++--
 .../johnzon/mapper/MappingGeneratorImpl.java    | 16 ++++++-
 .../johnzon/mapper/MappingParserImpl.java       | 19 +++++---
 .../apache/johnzon/mapper/ObjectTypeTest.java   | 47 +++++++++++++++++---
 4 files changed, 88 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/7bbeb16f/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/SerializerTest.java
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/SerializerTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/SerializerTest.java
index 475fbcc..a6771ef 100644
--- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/SerializerTest.java
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/SerializerTest.java
@@ -31,6 +31,8 @@ import javax.json.bind.serializer.SerializationContext;
 import javax.json.stream.JsonGenerator;
 import javax.json.stream.JsonParser;
 import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -41,19 +43,31 @@ public class SerializerTest {
     public void roundTrip() {
         final Jsonb jsonb = JsonbBuilder.create();
 
-        final String json = "{\"foo\":{\"full\":true,\"name\":\"SerializerTest\"}}";
+        final String expectedJson = "{\"foo\":{\"full\":true,\"name\":\"SerializerTest\"},\"moreFoos\":[{\"full\":true,\"name\":\"foo2\"},{\"full\":true,\"name\":\"foo3\"}]}";
 
         final Foo foo = new Foo();
         foo.name = "SerializerTest";
         final Wrapper wrapper = new Wrapper();
         wrapper.foo = foo;
 
-        assertEquals(json, jsonb.toJson(wrapper));
+        Foo foo2 = new Foo();
+        foo2.name = "foo2";
+        Foo foo3 = new Foo();
+        foo3.name = "foo3";
+        wrapper.moreFoos.add(foo2);
+        wrapper.moreFoos.add(foo3);
 
-        final Wrapper deser = jsonb.fromJson(json, Wrapper.class);
+        assertEquals(expectedJson, jsonb.toJson(wrapper));
+
+        final Wrapper deser = jsonb.fromJson(expectedJson, Wrapper.class);
         assertEquals(foo.name, deser.foo.name);
         assertEquals(foo.name.length(), deser.foo.value);
         assertTrue(deser.foo.flag);
+
+        assertEquals(2, deser.moreFoos.size());
+        assertEquals("foo2", deser.moreFoos.get(0).name);
+        assertEquals(4, deser.moreFoos.get(0).value);
+        assertEquals(4, deser.moreFoos.get(1).value);
     }
 
     public static class Foo {
@@ -66,6 +80,10 @@ public class SerializerTest {
         @JsonbTypeSerializer(FooSer.class)
         @JsonbTypeDeserializer(FooDeser.class)
         public Foo foo;
+
+        @JsonbTypeSerializer(FooSer.class)
+        @JsonbTypeDeserializer(FooDeser.class)
+        public List<Foo> moreFoos = new ArrayList<>();
     }
 
     public static class FooDeser implements JsonbDeserializer<Foo> {

http://git-wip-us.apache.org/repos/asf/johnzon/blob/7bbeb16f/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
index a76b447..7ecf2b3 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
@@ -355,9 +355,22 @@ public class MappingGeneratorImpl implements MappingGenerator {
             for (final Object o : Collection.class.cast(value)) {
                 String valJsonPointer = jsonPointers.get(o);
                 if (valJsonPointer != null) {
+                    // write JsonPointer instead of the original object
                     writePrimitives(valJsonPointer);
                 } else {
-                    writeItem(itemConverter != null ? itemConverter.from(o) : o, ignoredProperties, config.isDeduplicateObjects() ? new JsonPointerTracker(jsonPointer, i) : null);
+                    ObjectConverter.Writer objectConverterToUse = objectConverter;
+                    if (objectConverterToUse == null) {
+                        objectConverterToUse = config.findObjectConverterWriter(o.getClass());
+                    }
+
+                    if (objectConverterToUse != null) {
+                        generator.writeStartObject();
+                        objectConverterToUse.writeJson(o, this);
+                        generator.writeEnd();
+                    } else {
+                        writeItem(itemConverter != null ? itemConverter.from(o) : o, ignoredProperties,
+                                config.isDeduplicateObjects() ? new JsonPointerTracker(jsonPointer, i) : null);
+                    }
                 }
                 i++;
             }
@@ -381,7 +394,6 @@ public class MappingGeneratorImpl implements MappingGenerator {
                 writeValue(String.class, true, false, false, false, null, key, adapted, null, ignoredProperties, jsonPointer);
                 return;
             } else {
-
                 ObjectConverter.Writer objectConverterToUse = objectConverter;
                 if (objectConverterToUse == null) {
                     objectConverterToUse = config.findObjectConverterWriter(type);

http://git-wip-us.apache.org/repos/asf/johnzon/blob/7bbeb16f/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
index 5928b95..383b10c 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
@@ -180,7 +180,7 @@ public class MappingParserImpl implements MappingParser {
 
                 final Type arg = pt.getActualTypeArguments()[0];
                 return (T) mapCollection(mapping, jsonArray, Class.class.isInstance(arg) ? config.findAdapter(Class.class.cast(arg)) : null,
-                        config.isDeduplicateObjects() ? new JsonPointerTracker(null, "/") : null);
+                        null, config.isDeduplicateObjects() ? new JsonPointerTracker(null, "/") : null);
             }
             if (Object.class == targetType) {
                 return (T) new ArrayList(asList(Object[].class.cast(buildArrayWithComponentType(jsonArray, Object.class, null,
@@ -511,7 +511,7 @@ public class MappingParserImpl implements MappingParser {
             if (JsonArray.class == type || JsonStructure.class == type) {
                 return jsonValue;
             }
-            return buildArray(type, JsonArray.class.cast(jsonValue), itemConverter, jsonPointer);
+            return buildArray(type, JsonArray.class.cast(jsonValue), itemConverter, null, jsonPointer);
         } else if (JsonNumber.class.isInstance(jsonValue)) {
             if (JsonNumber.class == type) {
                 return jsonValue;
@@ -573,7 +573,8 @@ public class MappingParserImpl implements MappingParser {
         throw new MapperException("Unable to parse " + jsonValue + " to " + type);
     }
 
-    private Object buildArray(final Type type, final JsonArray jsonArray, final Adapter itemConverter, final JsonPointerTracker jsonPointer) {
+    private Object buildArray(final Type type, final JsonArray jsonArray, final Adapter itemConverter, ObjectConverter.Reader objectConverter,
+                              final JsonPointerTracker jsonPointer) {
         if (Class.class.isInstance(type)) {
             final Class clazz = Class.class.cast(type);
             if (clazz.isArray()) {
@@ -585,12 +586,12 @@ public class MappingParserImpl implements MappingParser {
         if (ParameterizedType.class.isInstance(type)) {
             final Mappings.CollectionMapping mapping = mappings.findCollectionMapping(ParameterizedType.class.cast(type));
             if (mapping != null) {
-                return mapCollection(mapping, jsonArray, itemConverter, jsonPointer);
+                return mapCollection(mapping, jsonArray, itemConverter, objectConverter, jsonPointer);
             }
         }
 
         if (Object.class == type) {
-            return buildArray(ANY_LIST, jsonArray, null, jsonPointer);
+            return buildArray(ANY_LIST, jsonArray, null, null, jsonPointer);
         }
 
         throw new UnsupportedOperationException("type " + type + " not supported");
@@ -608,7 +609,7 @@ public class MappingParserImpl implements MappingParser {
     }
 
     private <T> Collection<T> mapCollection(final Mappings.CollectionMapping mapping, final JsonArray jsonArray,
-                                            final Adapter itemConverter, JsonPointerTracker jsonPointer) {
+                                            final Adapter itemConverter, ObjectConverter.Reader objectConverter, JsonPointerTracker jsonPointer) {
         final Collection collection;
 
         if (SortedSet.class == mapping.raw || NavigableSet.class == mapping.raw || TreeSet.class == mapping.raw) {
@@ -631,7 +632,9 @@ public class MappingParserImpl implements MappingParser {
 
         int i = 0;
         for (final JsonValue value : jsonArray) {
-            collection.add(JsonValue.NULL.equals(value) ? null : toObject(null, value, mapping.arg, itemConverter,
+            collection.add(JsonValue.NULL.equals(value)
+                    ? null
+                    : toValue(null, value, null, itemConverter, mapping.arg, objectConverter,
                     config.isDeduplicateObjects() ? new JsonPointerTracker(jsonPointer, i) : null));
             i++;
         }
@@ -677,6 +680,8 @@ public class MappingParserImpl implements MappingParser {
 
             if (jsonValue instanceof JsonObject) {
                 return objectConverter.fromJson((JsonObject) jsonValue, type, this);
+            } else if (jsonValue instanceof JsonArray) {
+                return buildArray(type, jsonValue.asJsonArray(), itemConverter, objectConverter, jsonPointer);
             } else {
                 throw new UnsupportedOperationException("Array handling with ObjectConverter currently not implemented");
             }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/7bbeb16f/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
index 8ac0289..adfe0e5 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
@@ -127,11 +127,15 @@ public class ObjectTypeTest {
     }
 
     @Test
-    public void multiple() {
+    public void testGenericList() {
         assumeFalse("field".equals(accessMode) /*we need setType*/);
 
         final Multiple multiple = new Multiple();
-        multiple.dogs = asList(new Dog(), new Beagle());
+        Poodle poodle = new Poodle();
+        poodle.setHairCut(true);
+        Beagle beagle = new Beagle();
+        beagle.setColor("brown");
+        multiple.dogs = asList(poodle, beagle);
         final Mapper mapper = new MapperBuilder()
                 .setAccessModeName(accessMode)
                 .setReadAttributeBeforeWrite(true)
@@ -142,18 +146,19 @@ public class ObjectTypeTest {
                     }
                 }).build();
         final String json = "{\"dogs\":[" +
-                "{\"type\":\"org.apache.johnzon.mapper.ObjectTypeTest$Dog\",\"value\":{}}," +
-                "{\"type\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\",\"value\":{}}]}";
+                "{\"type\":\"org.apache.johnzon.mapper.ObjectTypeTest$Poodle\",\"value\":{\"hairCut\":true}}," +
+                "{\"type\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\",\"value\":{\"color\":\"brown\"}}]}";
         assertEquals(json, mapper.writeObjectAsString(multiple));
 
         final Multiple deser = mapper.readObject(json, Multiple.class);
         assertEquals(2, deser.dogs.size());
-        assertTrue(Dog.class.isInstance(deser.dogs.get(0)));
+        assertTrue(Poodle.class.isInstance(deser.dogs.get(0)));
         assertFalse(Beagle.class.isInstance(deser.dogs.get(0)));
         assertTrue(Beagle.class.isInstance(deser.dogs.get(1)));
     }
 
 
+
     private Mutt getJavaObject() {
         Poodle mum = new Poodle();
         mum.setName("Rosa");
@@ -306,7 +311,7 @@ public class ObjectTypeTest {
         }
     }
 
-    public static class Dog {
+    public static abstract class Dog {
         private String name;
         private Dog father;
         private Dog mother;
@@ -366,6 +371,15 @@ public class ObjectTypeTest {
     }
 
     public static class Beagle extends Dog {
+        private String color;
+
+        public String getColor() {
+            return color;
+        }
+
+        public void setColor(String color) {
+            this.color = color;
+        }
     }
 
     public static class Poodle extends Dog {
@@ -414,4 +428,25 @@ public class ObjectTypeTest {
             return POODLES.get(jsonObject.getString("poodleName"));
         }
     }
+
+    public static class DogOwner {
+        private String name;
+        private List<Dog> dogs;
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public List<Dog> getDogs() {
+            return dogs;
+        }
+
+        public void setDogs(List<Dog> dogs) {
+            this.dogs = dogs;
+        }
+    }
 }
\ No newline at end of file