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 2016/06/03 09:31:32 UTC

incubator-johnzon git commit: JOHNZON-81 better support of Object as mapping type

Repository: incubator-johnzon
Updated Branches:
  refs/heads/master f65387945 -> 95f0c4662


JOHNZON-81 better support of Object as mapping type


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

Branch: refs/heads/master
Commit: 95f0c466252b3f94d9e33b263a95e797734150d3
Parents: f653879
Author: Romain manni-Bucau <rm...@gmail.com>
Authored: Fri Jun 3 11:31:18 2016 +0200
Committer: Romain manni-Bucau <rm...@gmail.com>
Committed: Fri Jun 3 11:31:18 2016 +0200

----------------------------------------------------------------------
 .../java/org/apache/johnzon/mapper/Mapper.java  | 13 +++++----
 .../johnzon/mapper/MappingParserImpl.java       | 14 +++++----
 .../org/apache/johnzon/mapper/MapperTest.java   | 30 ++++++++++++++++++++
 3 files changed, 47 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/95f0c466/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 c8a163e..5935c36 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
@@ -39,6 +39,7 @@ import java.io.Writer;
 import java.lang.reflect.Array;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
+import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.concurrent.ConcurrentHashMap;
@@ -56,6 +57,7 @@ public class Mapper implements Closeable {
     protected final ConcurrentMap<Adapter<?, ?>, AdapterKey> reverseAdaptersRegistry = new ConcurrentHashMap<Adapter<?, ?>, AdapterKey>();
     protected final ReaderHandler readerHandler;
     protected final Collection<Closeable> closeables;
+    protected final Charset charset;
 
     Mapper(final JsonReaderFactory readerFactory, final JsonGeneratorFactory generatorFactory, MapperConfig config,
                   final Collection<Closeable> closeables) {
@@ -65,6 +67,7 @@ public class Mapper implements Closeable {
         this.mappings = new Mappings(config);
         this.readerHandler = ReaderHandler.create(readerFactory);
         this.closeables = closeables;
+        this.charset = config.getEncoding() == null ? null : config.getEncoding();
     }
 
 
@@ -131,7 +134,7 @@ public class Mapper implements Closeable {
         writeObject(object, generator);
     }
 
-    private void writeObject(Object object, JsonGenerator generator) {
+    private void writeObject(final Object object, final JsonGenerator generator) {
         MappingGeneratorImpl mappingGenerator = new MappingGeneratorImpl(config, generator, mappings);
 
         RuntimeException originalException = null;
@@ -183,11 +186,11 @@ public class Mapper implements Closeable {
     }
 
     public <T> T readObject(final InputStream stream, final Type clazz) {
-        return mapObject(clazz, readerFactory.createReader(stream(stream)));
+        return mapObject(clazz, charset == null ? readerFactory.createReader(stream(stream)): readerFactory.createReader(stream(stream), charset));
     }
 
     public <T> Collection<T> readCollection(final InputStream stream, final ParameterizedType genericType) {
-        return mapObject(genericType, readerFactory.createReader(stream(stream)));
+        return mapObject(genericType, charset == null ? readerFactory.createReader(stream(stream)): readerFactory.createReader(stream(stream), charset));
     }
 
     public <T> T readJohnzonCollection(final InputStream stream, final JohnzonCollectionType<T> genericType) {
@@ -208,7 +211,7 @@ public class Mapper implements Closeable {
     }
 
     public <T> T readTypedArray(final InputStream stream, final Class<?> elementType, final Class<T> arrayType) {
-        final JsonReader reader = readerFactory.createReader(stream(stream));
+        final JsonReader reader = charset == null ? readerFactory.createReader(stream(stream)): readerFactory.createReader(stream(stream), charset);
         return arrayType.cast(mapArray(elementType, reader));
     }
 
@@ -218,7 +221,7 @@ public class Mapper implements Closeable {
     }
 
     public <T> T[] readArray(final InputStream stream, final Class<T> clazz) {
-        final JsonReader reader = readerFactory.createReader(stream(stream));
+        final JsonReader reader = charset == null ? readerFactory.createReader(stream(stream)): readerFactory.createReader(stream(stream), charset);
         return (T[]) mapArray(clazz, reader);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/95f0c466/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 ae1eea6..8640863 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
@@ -64,6 +64,8 @@ import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
+import static java.util.Arrays.asList;
+
 /**
  * This class is not concurrently usable as it contains state.
  */
@@ -121,7 +123,7 @@ public class MappingParserImpl implements MappingParser {
         if (JsonObject.class.isInstance(jsonValue)) {
             return (T) buildObject(targetType, JsonObject.class.cast(jsonValue), applyObjectConverter);
         }
-        if (JsonString.class.isInstance(jsonValue) && targetType == String.class) {
+        if (JsonString.class.isInstance(jsonValue) && (targetType == String.class || targetType == Object.class)) {
             return (T) JsonString.class.cast(jsonValue).getString();
         }
         if (JsonNumber.class.isInstance(jsonValue)) {
@@ -132,7 +134,7 @@ public class MappingParserImpl implements MappingParser {
             if (targetType == long.class || targetType == Long.class) {
                 return (T) Long.valueOf(number.longValue());
             }
-            if (targetType == double.class || targetType == Double.class) {
+            if (targetType == double.class || targetType == Double.class || targetType == Object.class) {
                 return (T) Double.valueOf(number.doubleValue());
             }
             if (targetType == BigDecimal.class) {
@@ -157,16 +159,18 @@ public class MappingParserImpl implements MappingParser {
                 }
 
                 return (T) mapCollection(mapping, jsonArray, null);
-
+            }
+            if (Object.class == targetType) {
+                return (T) new ArrayList(asList(Object[].class.cast(buildArrayWithComponentType(jsonArray, Object.class, null))));
             }
         }
         if (JsonValue.NULL == jsonValue) {
             return null;
         }
-        if (JsonValue.TRUE == jsonValue && (Boolean.class == targetType || boolean.class == targetType)) {
+        if (JsonValue.TRUE == jsonValue && (Boolean.class == targetType || boolean.class == targetType || Object.class == targetType)) {
             return (T) Boolean.TRUE;
         }
-        if (JsonValue.FALSE == jsonValue && (Boolean.class == targetType || boolean.class == targetType)) {
+        if (JsonValue.FALSE == jsonValue && (Boolean.class == targetType || boolean.class == targetType || Object.class == targetType)) {
             return (T) Boolean.FALSE;
         }
         throw new IllegalArgumentException("Unsupported " + jsonValue + " for type " + targetType);

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/95f0c466/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 8b3d25d..8da2388 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
@@ -33,6 +33,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
@@ -157,6 +158,35 @@ public class MapperTest {
         assertOneDimension(k, 5);
     }
 
+    @Test
+    public void readMapWithJustObject() {
+        { // object
+            final Object raw = new MapperBuilder().build()
+                    .readObject(new ByteArrayInputStream(("{\"a\":1,\"b\":true,\"c\":null,\"d\":[1, 2], " +
+                                    "\"e\":[\"i\", \"j\"],\"k\":{\"a\":1,\"b\":true,\"c\":null,\"d\":[1, 2], \"e\":[\"i\", \"j\"]}}").getBytes()),
+                            Object.class);
+            final Map<String, Object> data = Map.class.cast(raw);
+            assertOneDimension(data, 6);
+
+            final Map<String, Object> k = (Map<String, Object>) data.get("k");
+            assertNotNull(k);
+            assertOneDimension(k, 5);
+        }
+        { // primitives
+            assertEquals(Boolean.TRUE, new MapperBuilder().build().readObject(new ByteArrayInputStream("true".getBytes()), Object.class));
+            assertEquals(Boolean.FALSE, new MapperBuilder().build().readObject(new ByteArrayInputStream("false".getBytes()), Object.class));
+            assertEquals(1., new MapperBuilder().setEncoding("UTF-8" /*otherwise guess algo fails, too small string*/).build()
+                    .readObject(new ByteArrayInputStream("1".getBytes()), Object.class));
+            assertEquals("val", new MapperBuilder().build().readObject(new ByteArrayInputStream("\"val\"".getBytes()), Object.class));
+            assertEquals(asList("val1", "val2"), new MapperBuilder().build().readObject(new ByteArrayInputStream("[\"val1\", \"val2\"]".getBytes()), Object.class));
+            assertEquals(new HashMap<String, Object>() {{
+                put("a", "val");
+                put("b", true);
+                put("c", 1);
+            }}, new MapperBuilder().build().readObject(new ByteArrayInputStream("{\"a\":\"val\", \"b\": true, \"c\": 1}".getBytes()), Object.class));
+        }
+    }
+
     private void assertOneDimension(final Map<String, Object> data, final int size) {
         assertEquals(size, data.size());
         assertEquals(1, data.get("a"));