Repository: johnzon
Updated Branches:
  refs/heads/master dc2cd8f7a -> a25adfaee


JOHNZON-154 ensure we support Object as being dynamically evaluated


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

Branch: refs/heads/master
Commit: a25adfaee4dfe30ceea0bdaafba6e3978e749923
Parents: dc2cd8f
Author: Romain Manni-Bucau <rmannibu...@gmail.com>
Authored: Wed Jan 24 15:05:42 2018 +0100
Committer: Romain Manni-Bucau <rmannibu...@gmail.com>
Committed: Wed Jan 24 15:05:42 2018 +0100

----------------------------------------------------------------------
 .../johnzon/jsonb/ObjectSerializationTest.java  | 77 ++++++++++++++++++++
 .../johnzon/mapper/MappingGeneratorImpl.java    | 29 +++-----
 .../org/apache/johnzon/mapper/Mappings.java     | 10 ++-
 .../johnzon/mapper/ObjectSerializationTest.java | 74 +++++++++++++++++++
 4 files changed, 168 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/a25adfae/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/ObjectSerializationTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/ObjectSerializationTest.java
 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/ObjectSerializationTest.java
new file mode 100644
index 0000000..7ad703c
--- /dev/null
+++ 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/ObjectSerializationTest.java
@@ -0,0 +1,77 @@
+/*
+ * 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.johnzon.jsonb;
+
+import static java.util.Arrays.asList;
+import static org.junit.Assert.assertEquals;
+
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+
+import org.junit.Test;
+
+public class ObjectSerializationTest {
+    private final Jsonb mapper = JsonbBuilder.create();
+
+    @Test
+    public void primitiveBoolean() {
+        assertEquals("{\"data\":true}", toJson(new Wrapper(true)));
+    }
+
+    @Test
+    public void numberBoolean() {
+        assertEquals("{\"data\":1}", toJson(new Wrapper(1)));
+    }
+
+    @Test
+    public void stringBoolean() {
+        assertEquals("{\"data\":\"ok\"}", toJson(new Wrapper("ok")));
+    }
+
+    @Test
+    public void objectBoolean() {
+        assertEquals("{\"data\":{\"data\":\"ok\"}}", toJson(new Wrapper(new 
Wrapper("ok"))));
+    }
+
+    @Test
+    public void arrayString() {
+        assertEquals("{\"data\":[\"10\",\"2\"]}", toJson(new 
Wrapper(asList("10", "2"))));
+    }
+
+    @Test
+    public void nestedArrayString() {
+        assertEquals("{\"data\":{\"data\":[\"10\",\"2\"]}}", toJson(new 
Wrapper(new Wrapper(asList("10", "2")))));
+    }
+
+    private String toJson(final Wrapper wrapper) {
+        return mapper.toJson(wrapper);
+    }
+
+    public static class Wrapper {
+        private final Object data;
+
+        private Wrapper(final Object data) {
+            this.data = data;
+        }
+
+        public Object getData() {
+            return data;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/johnzon/blob/a25adfae/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 b952a57..773e615 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
@@ -136,13 +136,8 @@ public class MappingGeneratorImpl implements 
MappingGenerator {
             }
 
             final Class<?> valueClass = value.getClass();
-            final boolean primitive = Mappings.isPrimitive(valueClass);
-            final boolean clazz = mappings.getClassMapping(valueClass) != null;
-            final boolean array = clazz || primitive ? false : 
valueClass.isArray();
-            final boolean collection = clazz || primitive || array ? false : 
Collection.class.isAssignableFrom(valueClass);
-            final boolean map = clazz || primitive || array || collection ? 
false : Map.class.isAssignableFrom(valueClass);
-            writeValue(valueClass,
-                    primitive, array, collection, map, itemConverter,
+            writeValue(valueClass, true,
+                    false, false, false, false, itemConverter,
                     key == null ? "null" : key.toString(), value, null, null, 
null);
         }
         return generator;
@@ -289,6 +284,7 @@ public class MappingGeneratorImpl implements 
MappingGenerator {
                 generator.write(getterEntry.getKey(), valJsonPointer);
             } else {
                 writeValue(val.getClass(),
+                        getter.dynamic,
                         getter.primitive,
                         getter.array,
                         getter.collection,
@@ -312,8 +308,8 @@ public class MappingGeneratorImpl implements 
MappingGenerator {
         }
     }
 
-
-    private void writeValue(final Class<?> type,
+    //CHECKSTYLE:OFF
+    private void writeValue(final Class<?> type, final boolean dynamic,
                             final boolean primitive, final boolean array,
                             final boolean collection, final boolean map,
                             final Adapter itemConverter,
@@ -322,10 +318,11 @@ public class MappingGeneratorImpl implements 
MappingGenerator {
                             final Collection<String> ignoredProperties,
                             final JsonPointerTracker jsonPointer)
             throws InvocationTargetException, IllegalAccessException {
+        //CHECKSTYLE:ON
         if (config.getSerializeValueFilter().shouldIgnore(key, value)) {
             return;
         }
-        if (array) {
+        if (array || (dynamic && type.isArray())) {
             final int length = Array.getLength(value);
             if (length == 0 && config.isSkipEmptyArray()) {
                 return;
@@ -352,8 +349,7 @@ public class MappingGeneratorImpl implements 
MappingGenerator {
                 }
             }
             generator.writeEnd();
-            return;
-        } else if (collection) {
+        } else if (collection || (dynamic && 
Collection.class.isAssignableFrom(type))) {
             generator.writeStartArray(key);
             int i = 0;
             for (final Object o : Collection.class.cast(value)) {
@@ -379,15 +375,12 @@ public class MappingGeneratorImpl implements 
MappingGenerator {
                 i++;
             }
             generator.writeEnd();
-            return;
-        } else if (map) {
+        } else if (map || (dynamic && Map.class.isAssignableFrom(type))) {
             generator.writeStartObject(key);
             writeMapBody((Map<?, ?>) value, itemConverter);
             generator.writeEnd();
-            return;
-        } else if (primitive) {
+        } else if (primitive || (dynamic && Mappings.isPrimitive(type))) {
             writePrimitives(key, type, value);
-            return;
         } else {
             final Adapter converter = config.findAdapter(type);
             if (converter != null) {
@@ -395,7 +388,7 @@ public class MappingGeneratorImpl implements 
MappingGenerator {
                 if (writePrimitives(key, adapted.getClass(), adapted)) {
                     return;
                 }
-                writeValue(String.class, true, false, false, false, null, key, 
adapted, null, ignoredProperties, jsonPointer);
+                writeValue(String.class, true, true, false, false, false, 
null, key, adapted, null, ignoredProperties, jsonPointer);
                 return;
             } else {
                 ObjectConverter.Writer objectConverterToUse = objectConverter;

http://git-wip-us.apache.org/repos/asf/johnzon/blob/a25adfae/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
index c8d63fe..44e13f1 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
@@ -115,13 +115,14 @@ public class Mappings {
         public final Adapter converter;
         public final Adapter itemConverter;
         public final ObjectConverter.Writer objectConverter;
+        public final boolean dynamic;
         public final boolean primitive;
         public final boolean array;
         public final boolean map;
         public final boolean collection;
         public final Collection<String> ignoreNested;
 
-        public Getter(final AccessMode.Reader reader,
+        public Getter(final AccessMode.Reader reader, final boolean dynamic,
                       final boolean primitive, final boolean array,
                       final boolean collection, final boolean map,
                       final MapperConverter converter,
@@ -129,6 +130,7 @@ public class Mappings {
                       final int version, final String[] ignoreNested) {
             this.reader = reader;
             this.version = version;
+            this.dynamic = dynamic;
             this.array = array;
             this.collection = collection;
             this.primitive = primitive;
@@ -404,7 +406,7 @@ public class Mappings {
                 accessMode.findWriter(clazz),
                 anyGetter != null ? new Getter(
                         new MethodAccessMode.MethodReader(anyGetter, 
anyGetter.getReturnType()),
-                        false, false, false, true, null, null, -1, null) : 
null,
+                        false,false, false, false, true, null, null, -1, null) 
: null,
                 accessMode.findAnySetter(clazz));
 
         accessMode.afterParsed(clazz);
@@ -458,7 +460,7 @@ public class Mappings {
         if (readIgnore == null || readIgnore.minVersion() >= 0) {
             final Class<?> returnType = 
Class.class.isInstance(value.getType()) ? Class.class.cast(value.getType()) : 
null;
             final ParameterizedType pt = 
ParameterizedType.class.isInstance(value.getType()) ? 
ParameterizedType.class.cast(value.getType()) : null;
-            final Getter getter = new Getter(value, isPrimitive(returnType),
+            final Getter getter = new Getter(value, returnType == 
Object.class, isPrimitive(returnType),
                     returnType != null && returnType.isArray(),
                     (pt != null && 
Collection.class.isAssignableFrom(Class.class.cast(pt.getRawType())))
                             || (returnType != null && 
Collection.class.isAssignableFrom(returnType)),
@@ -514,7 +516,7 @@ public class Mappings {
         final Getter getter = getters.get(key);
         final MapBuilderReader newReader = new MapBuilderReader(objectGetters, 
path, config.getVersion());
         getters.put(key, new Getter(getter == null ? newReader :
-                new CompositeReader(getter.reader, newReader), false, false, 
false, true, null, null, -1, null));
+                new CompositeReader(getter.reader, newReader), false, false, 
false, false, true, null, null, -1, null));
 
         final Setter newSetter = setters.get(key);
         final MapUnwrapperWriter newWriter = new 
MapUnwrapperWriter(objectSetters, path);

http://git-wip-us.apache.org/repos/asf/johnzon/blob/a25adfae/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectSerializationTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectSerializationTest.java
 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectSerializationTest.java
new file mode 100644
index 0000000..b6bb10d
--- /dev/null
+++ 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectSerializationTest.java
@@ -0,0 +1,74 @@
+/*
+ * 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.johnzon.mapper;
+
+import static java.util.Arrays.asList;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class ObjectSerializationTest {
+    private final Mapper mapper = new MapperBuilder().build();
+
+    @Test
+    public void primitiveBoolean() {
+        assertEquals("{\"data\":true}", toJson(new Wrapper(true)));
+    }
+
+    @Test
+    public void numberBoolean() {
+        assertEquals("{\"data\":1}", toJson(new Wrapper(1)));
+    }
+
+    @Test
+    public void stringBoolean() {
+        assertEquals("{\"data\":\"ok\"}", toJson(new Wrapper("ok")));
+    }
+
+    @Test
+    public void objectBoolean() {
+        assertEquals("{\"data\":{\"data\":\"ok\"}}", toJson(new Wrapper(new 
Wrapper("ok"))));
+    }
+
+    @Test
+    public void arrayString() {
+        assertEquals("{\"data\":[\"10\",\"2\"]}", toJson(new 
Wrapper(asList("10", "2"))));
+    }
+
+    @Test
+    public void nestedArrayString() {
+        assertEquals("{\"data\":{\"data\":[\"10\",\"2\"]}}", toJson(new 
Wrapper(new Wrapper(asList("10", "2")))));
+    }
+
+    private String toJson(final Wrapper wrapper) {
+        return mapper.writeObjectAsString(wrapper);
+    }
+
+    public static class Wrapper {
+        private final Object data;
+
+        private Wrapper(final Object data) {
+            this.data = data;
+        }
+
+        public Object getData() {
+            return data;
+        }
+    }
+}

Reply via email to