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:49:43 UTC

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

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


JOHNZON-81 better support of Object as mapping type - write side


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

Branch: refs/heads/master
Commit: 0020886be089320b7802090d4dd03c9b39c4c5de
Parents: 95f0c46
Author: Romain manni-Bucau <rm...@gmail.com>
Authored: Fri Jun 3 11:49:01 2016 +0200
Committer: Romain manni-Bucau <rm...@gmail.com>
Committed: Fri Jun 3 11:49:01 2016 +0200

----------------------------------------------------------------------
 .../apache/johnzon/jsonb/JsonbAccessMode.java   | 10 +++++
 .../java/org/apache/johnzon/mapper/Mapper.java  |  7 +++-
 .../org/apache/johnzon/mapper/Mappings.java     | 10 +++--
 .../johnzon/mapper/access/AccessMode.java       |  2 +
 .../johnzon/mapper/access/BaseAccessMode.java   | 11 ++++++
 .../org/apache/johnzon/mapper/MapperTest.java   | 41 ++++++++++++++------
 6 files changed, 65 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/0020886b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
index fa2e536..f660a5e 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
@@ -560,6 +560,16 @@ public class JsonbAccessMode implements AccessMode, Closeable {
         return result;
     }
 
+    @Override
+    public Reader findReader(final Class<?> clazz) {
+        throw new UnsupportedOperationException("TODO");
+    }
+
+    @Override
+    public Writer findWriter(final Class<?> clazz) {
+        throw new UnsupportedOperationException("TODO");
+    }
+
     private boolean isOptional(final DecoratedType value) {
         return ParameterizedType.class.isInstance(value.getType()) && Optional.class == ParameterizedType.class.cast(value.getType()).getRawType();
     }

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/0020886b/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 5935c36..3826c4a 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
@@ -102,9 +102,12 @@ public class Mapper implements Closeable {
     }
 
     public void writeObject(final Object object, final Writer stream) {
-        if (JsonValue.class.isInstance(object) || String.class.isInstance(object) || Number.class.isInstance(object) || object == null) {
+        if (JsonValue.class.isInstance(object)
+                || Boolean.class.isInstance(object) || String.class.isInstance(object) || Number.class.isInstance(object)
+                || object == null) {
             try {
-                stream.write(String.valueOf(object));
+                final String valueOf = String.valueOf(object);
+                stream.write(String.class.isInstance(object) ? '"' + valueOf + '"' : valueOf);
             } catch (final IOException e) {
                 throw new MapperException(e);
             } finally {

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/0020886b/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 db0ce1c..dcdb5bf 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
@@ -57,14 +57,18 @@ public class Mappings {
         final AccessMode.Factory factory;
         final Map<String, Getter> getters;
         final Map<String, Setter> setters;
-
+        final ObjectConverter.Reader<?> reader;
+        final ObjectConverter.Writer<?> writer;
 
         protected ClassMapping(final Class<?> clazz, final AccessMode.Factory factory,
-                               final Map<String, Getter> getters, final Map<String, Setter> setters) {
+                               final Map<String, Getter> getters, final Map<String, Setter> setters,
+                               final ObjectConverter.Reader<?> reader, final ObjectConverter.Writer<?> writer) {
             this.clazz = clazz;
             this.factory = factory;
             this.getters = getters;
             this.setters = setters;
+            this.writer = writer;
+            this.reader = reader;
         }
     }
 
@@ -365,7 +369,7 @@ public class Mappings {
             }
             addSetterIfNeeded(setters, key, writer.getValue(), copyDate);
         }
-        return new ClassMapping(clazz, accessMode.findFactory(clazz), getters, setters);
+        return new ClassMapping(clazz, accessMode.findFactory(clazz), getters, setters, accessMode.findReader(clazz), accessMode.findWriter(clazz));
     }
 
     protected Class<?> findModelClass(final Class<?> inClazz) {

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/0020886b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/AccessMode.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/AccessMode.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/AccessMode.java
index f47e0d0..e34facf 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/AccessMode.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/AccessMode.java
@@ -57,4 +57,6 @@ public interface AccessMode {
     Comparator<String> fieldComparator(Class<?> clazz);
     Map<String, Reader> findReaders(Class<?> clazz);
     Map<String, Writer> findWriters(Class<?> clazz);
+    ObjectConverter.Reader<?> findReader(Class<?> clazz);
+    ObjectConverter.Writer<?> findWriter(Class<?> clazz);
 }

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/0020886b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java
index cca3a8c..2eb7b11 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/BaseAccessMode.java
@@ -22,6 +22,7 @@ import org.apache.johnzon.mapper.Adapter;
 import org.apache.johnzon.mapper.Converter;
 import org.apache.johnzon.mapper.JohnzonConverter;
 import org.apache.johnzon.mapper.MapperConverter;
+import org.apache.johnzon.mapper.ObjectConverter;
 import org.apache.johnzon.mapper.internal.ConverterAdapter;
 import org.apache.johnzon.mapper.reflection.JohnzonParameterizedType;
 
@@ -82,6 +83,16 @@ public abstract class BaseAccessMode implements AccessMode {
     }
 
     @Override
+    public ObjectConverter.Reader<?> findReader(final Class<?> clazz) {
+        return null; // TODO: converter?
+    }
+
+    @Override
+    public ObjectConverter.Writer<?> findWriter(final Class<?> clazz) {
+        return null; // TODO: converter?
+    }
+
+    @Override
     public Factory findFactory(final Class<?> clazz) {
         Constructor<?> constructor = null;
         for (final Constructor<?> c : clazz.getDeclaredConstructors()) {

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/0020886b/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 8da2388..db2a212 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
@@ -38,6 +38,7 @@ import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.TreeMap;
 
 import static java.util.Arrays.asList;
 import static org.junit.Assert.assertArrayEquals;
@@ -159,31 +160,49 @@ public class MapperTest {
     }
 
     @Test
-    public void readMapWithJustObject() {
+    public void justObjectAsModel() {
+        final Mapper encodingAwareMapper = new MapperBuilder().setEncoding("UTF-8" /*otherwise guess algo fails for too small string*/).build();
+        final Mapper simpleMapper = new MapperBuilder().build();
         { // 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 String object = "{\"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\"]}}";
+            final Mapper mapper = simpleMapper;
+            final Object raw = mapper.readObject(new ByteArrayInputStream(object.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);
+
+            final Map<String, Object> sorted = new TreeMap<String, Object>(data);
+            assertEquals(object.replace(",\"c\":null", ""), mapper.writeObjectAsString(sorted));
         }
         { // 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()
+            // read
+            assertEquals(Boolean.TRUE, simpleMapper.readObject(new ByteArrayInputStream("true".getBytes()), Object.class));
+            assertEquals(Boolean.FALSE, simpleMapper.readObject(new ByteArrayInputStream("false".getBytes()), Object.class));
+            assertEquals(1., encodingAwareMapper
                     .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("val", simpleMapper.readObject(new ByteArrayInputStream("\"val\"".getBytes()), Object.class));
+            assertEquals(asList("val1", "val2"), simpleMapper.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));
+            }}, simpleMapper.readObject(new ByteArrayInputStream("{\"a\":\"val\", \"b\": true, \"c\": 1}".getBytes()), Object.class));
+
+            // write
+            assertEquals("true", simpleMapper.writeObjectAsString(true));
+            assertEquals("false", simpleMapper.writeObjectAsString(false));
+            assertEquals("1", simpleMapper.writeObjectAsString(1));
+            assertEquals("\"val\"", simpleMapper.writeObjectAsString("val"));
+            assertEquals("[\"val1\",\"val2\"]", simpleMapper.writeObjectAsString(asList("val1", "val2")));
+            assertEquals("{\"a\":\"val\",\"b\":true,\"c\":1}", simpleMapper.writeObjectAsString(new TreeMap<String, Object>() {{
+                put("a", "val");
+                put("b", true);
+                put("c", 1);
+            }}));
         }
     }