You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rm...@apache.org on 2015/08/19 17:04:59 UTC

incubator-johnzon git commit: JOHNZON-54 JOHNZON-55 avoid NPE if no json value is provided + fixing primitive/enum handling when root in collections

Repository: incubator-johnzon
Updated Branches:
  refs/heads/master 0c105624d -> 14234d20e


JOHNZON-54 JOHNZON-55 avoid NPE if no json value is provided + fixing primitive/enum handling when root in collections


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

Branch: refs/heads/master
Commit: 14234d20ec87efdce26752eb586e390eeeaa1c73
Parents: 0c10562
Author: Romain Manni-Bucau <rm...@gmail.com>
Authored: Wed Aug 19 08:04:52 2015 -0700
Committer: Romain Manni-Bucau <rm...@gmail.com>
Committed: Wed Aug 19 08:04:52 2015 -0700

----------------------------------------------------------------------
 .../java/org/apache/johnzon/mapper/Mapper.java  | 27 ++++++-
 .../org/apache/johnzon/mapper/MapperTest.java   | 81 +++++++++++++++++++-
 2 files changed, 105 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/14234d20/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
index 45899c4..8d94bf9 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
@@ -287,6 +287,18 @@ public class Mapper {
         doWriteHandlingNullObject(object, generator);
     }
 
+    public String writeArrayAsString(final Collection<?> instance) {
+        final StringWriter writer = new StringWriter();
+        writeArray(instance, writer);
+        return writer.toString();
+    }
+
+    public <T> String writeArrayAsString(final T[] instance) {
+        final StringWriter writer = new StringWriter();
+        writeArray(instance, writer);
+        return writer.toString();
+    }
+
     public String writeObjectAsString(final Object instance) {
         final StringWriter writer = new StringWriter();
         writeObject(instance, writer);
@@ -322,6 +334,16 @@ public class Mapper {
                 return gen;
             }
 
+            final JsonGenerator jsonGenerator = writePrimitives(generator, object);
+            if (jsonGenerator != null) {
+                return jsonGenerator;
+            }
+
+            final Class<?> objectClass = object.getClass();
+            if (objectClass.isEnum()) {
+                return gen.write(findConverter(objectClass).toString(object));
+            }
+
             gen = gen.writeStartObject();
             gen = doWriteObjectBody(gen, object);
             return gen.writeEnd();
@@ -605,10 +627,13 @@ public class Mapper {
                 classMapping.constructor.newInstance() : classMapping.constructor.newInstance(createParameters(classMapping, object));
         for (final Map.Entry<String, Mappings.Setter> setter : classMapping.setters.entrySet()) {
             final JsonValue jsonValue = object.get(setter.getKey());
+            if (jsonValue == null) {
+                continue;
+            }
+
             final Mappings.Setter value = setter.getValue();
             final AccessMode.Writer setterMethod = value.writer;
             final Object convertedValue = toValue(jsonValue, value.converter, value.itemConverter, value.paramType);
-
             if (convertedValue != null) {
                 setterMethod.write(t, convertedValue);
             }

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/14234d20/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java
index 97e8362..f5817bb 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java
@@ -28,6 +28,7 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.StringReader;
 import java.io.StringWriter;
+import java.lang.reflect.ParameterizedType;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -84,13 +85,66 @@ public class MapperTest {
         assertEquals(1, object.size());
         final Collection<TheObject> object2 = new MapperBuilder().build()
                 .readJohnzonCollection(new ByteArrayInputStream("[{}]".getBytes()),
-                        new JohnzonCollectionType<List<TheObject>>() {
-                        });
+                    new JohnzonCollectionType<List<TheObject>>() {
+                    });
         assertNotNull(object2);
         assertEquals(1, object2.size());
     }
 
     @Test
+    public void testShouldMapACollection() throws Exception {
+        final Mapper mapper = new MapperBuilder().setAttributeOrder(new Comparator<String>() {
+            @Override
+            public int compare(final String o1, final String o2) {
+                return o1.compareTo(o2);
+            }
+        }).build();
+        final String json = "[" +
+            "{\"name\":\"addKey\"}," +
+            "{\"action\":\"REMOVE\",\"name\":\"removeKey\"}]";
+
+        final ParameterizedType type = new JohnzonParameterizedType(List.class, Command.class);
+        final List<Command> properties = new ArrayList(mapper.readCollection(new StringReader(json), type));
+
+        assertNotNull(properties);
+        assertEquals(2, properties.size());
+        assertEquals("addKey", properties.get(0).getName());
+        assertEquals("removeKey", properties.get(1).getName());
+        assertEquals(Command.Action.REMOVE, properties.get(1).getAction());
+        assertEquals(json, mapper.writeArrayAsString(properties));
+    }
+
+    @Test
+    public void enumCollection() throws Exception {
+        final Mapper mapper = new MapperBuilder().build();
+        final String json = "[\"REMOVE\",\"ADD\"]";
+
+        final ParameterizedType type = new JohnzonParameterizedType(List.class, Command.Action.class);
+        final List<Command.Action> properties = new ArrayList(mapper.readCollection(new StringReader(json), type));
+
+        assertNotNull(properties);
+        assertEquals(2, properties.size());
+        assertEquals(Command.Action.ADD, properties.get(1));
+        assertEquals(Command.Action.REMOVE, properties.get(0));
+        assertEquals(json, mapper.writeArrayAsString(properties));
+    }
+
+    @Test
+    public void primitiveCollection() throws Exception {
+        final Mapper mapper = new MapperBuilder().build();
+        final String json = "[1,2]";
+
+        final ParameterizedType type = new JohnzonParameterizedType(List.class, Integer.class);
+        final List<Integer> properties = new ArrayList(mapper.readCollection(new StringReader(json), type));
+
+        assertNotNull(properties);
+        assertEquals(2, properties.size());
+        assertEquals(2, properties.get(1).intValue());
+        assertEquals(1, properties.get(0).intValue());
+        assertEquals(json, mapper.writeArrayAsString(properties));
+    }
+
+    @Test
     public void readMapObject() {
         final Map<String, Object> data = new MapperBuilder().build()
                 .readObject(new ByteArrayInputStream(("{\"a\":1,\"b\":true,\"c\":null,\"d\":[1, 2], " +
@@ -936,6 +990,29 @@ public class MapperTest {
         }
     }
 
+    public static class Command {
+        public enum Action { ADD, REMOVE }
+
+        private Action action;
+        private String name;
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(final String name) {
+            this.name = name;
+        }
+
+        public Action getAction() {
+            return action;
+        }
+
+        public void setAction(final Action action) {
+            this.action = action;
+        }
+    }
+
     /*public static class ByteArray {
         
         public byte[] byteArray;