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 2018/01/24 14:05:50 UTC
johnzon git commit: JOHNZON-154 ensure we support Object as being
dynamically evaluated
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 <rm...@gmail.com>
Authored: Wed Jan 24 15:05:42 2018 +0100
Committer: Romain Manni-Bucau <rm...@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;
+ }
+ }
+}