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 <[email protected]> Authored: Fri Jun 3 11:49:01 2016 +0200 Committer: Romain manni-Bucau <[email protected]> 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); + }})); } }
