This is an automated email from the ASF dual-hosted git repository.
rmannibucau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/johnzon.git
The following commit(s) were added to refs/heads/master by this push:
new 5892a84 JOHNZON-211 ensure the serialization context uses the passed
key if the related method is called
5892a84 is described below
commit 5892a84e61ee6c4c0dab3773ebfb8317d23a3cea
Author: Romain Manni-Bucau <[email protected]>
AuthorDate: Mon May 20 16:07:57 2019 +0200
JOHNZON-211 ensure the serialization context uses the passed key if the
related method is called
---
.../serializer/JohnzonSerializationContext.java | 2 +-
.../org/apache/johnzon/jsonb/SerializerTest.java | 31 +++++++++++++
.../johnzon/mapper/DynamicMappingGenerator.java | 15 ++++---
.../apache/johnzon/mapper/MappingGenerator.java | 4 ++
.../johnzon/mapper/MappingGeneratorImpl.java | 51 ++++++++++++++++++++--
5 files changed, 93 insertions(+), 10 deletions(-)
diff --git
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/serializer/JohnzonSerializationContext.java
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/serializer/JohnzonSerializationContext.java
index bf19344..9d69dd1 100644
---
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/serializer/JohnzonSerializationContext.java
+++
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/serializer/JohnzonSerializationContext.java
@@ -33,7 +33,7 @@ public class JohnzonSerializationContext implements
SerializationContext {
@Override
public <T> void serialize(final String key, final T object, final
JsonGenerator generator) {
- runtime.writeObject(object, generator);
+ runtime.writeObject(key, object, generator);
}
@Override
diff --git
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/SerializerTest.java
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/SerializerTest.java
index 5838130..2bd6f38 100644
--- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/SerializerTest.java
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/SerializerTest.java
@@ -18,6 +18,7 @@
*/
package org.apache.johnzon.jsonb;
+import static java.util.Collections.singletonMap;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
@@ -25,10 +26,12 @@ import static org.junit.Assert.assertTrue;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import java.util.UUID;
import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;
+import javax.json.bind.annotation.JsonbTransient;
import javax.json.bind.annotation.JsonbTypeDeserializer;
import javax.json.bind.annotation.JsonbTypeSerializer;
import javax.json.bind.serializer.DeserializationContext;
@@ -118,6 +121,16 @@ public class SerializerTest {
jsonb.close();
}
+ @Test
+ public void serializeWithKey() throws Exception {
+ final Jsonb jsonb = JsonbBuilder.create();
+ final MyWrapper wrapper = new MyWrapper();
+ wrapper.myWrapper = new MyWrapper();
+ wrapper.myWrapper.map = singletonMap("a", "b");
+ assertEquals("{\"myWrapper\":{\"a\":\"b\"}}", jsonb.toJson(wrapper));
+ jsonb.close();
+ }
+
public static class Foo {
public String name;
@@ -125,6 +138,24 @@ public class SerializerTest {
public boolean flag;
}
+ public static class MyWrapper {
+ @JsonbTransient
+ public Map<String, String> map;
+
+ @JsonbTypeSerializer(MyMapSerializer.class)
+ public MyWrapper myWrapper;
+ }
+
+ public static class MyMapSerializer implements JsonbSerializer<MyWrapper> {
+ @Override
+ public void serialize(final MyWrapper obj, final JsonGenerator
generator, final SerializationContext ctx) {
+ ctx.serialize(obj, generator);
+ if (obj.map != null) {
+ obj.map.forEach((k, v) -> ctx.serialize(k, v, generator));
+ }
+ }
+ }
+
public static class UUIDSerializer implements JsonbSerializer<UUID> {
@Override
public void serialize(final UUID obj, final JsonGenerator generator,
final SerializationContext ctx) {
diff --git
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/DynamicMappingGenerator.java
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/DynamicMappingGenerator.java
index f8598de..86a80b6 100644
---
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/DynamicMappingGenerator.java
+++
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/DynamicMappingGenerator.java
@@ -49,15 +49,20 @@ public class DynamicMappingGenerator implements
MappingGenerator {
}
@Override
+ public MappingGenerator writeObject(final String key, final Object o,
final JsonGenerator generator) {
+ return delegate.writeObject(key, o, ensureGenerator(generator));
+ }
+
+ @Override
public MappingGenerator writeObject(final Object o, final JsonGenerator
generator) {
+ return delegate.writeObject(o, ensureGenerator(generator));
+ }
+
+ private JsonGenerator ensureGenerator(final JsonGenerator generator) {
if (this.generator != null && this.generator != generator &&
this.generator.delegate != generator) {
this.generator = null;
}
- getJsonGenerator(); // ensure we wrap it
-
- final MappingGenerator mappingGenerator = delegate.writeObject(o,
this.generator);
- flushIfNeeded();
- return mappingGenerator;
+ return getJsonGenerator(); // ensure we wrap it
}
public void flushIfNeeded() {
diff --git
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGenerator.java
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGenerator.java
index 8dd1e1a..3e52812 100644
---
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGenerator.java
+++
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGenerator.java
@@ -57,4 +57,8 @@ public interface MappingGenerator {
* @return itself, for easier chaining of commands
*/
MappingGenerator writeObject(Object o, JsonGenerator generator);
+
+ default MappingGenerator writeObject(final String key, final Object o,
final JsonGenerator generator) {
+ return writeObject(o, generator);
+ }
}
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 b7d1629..f022562 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
@@ -18,6 +18,8 @@
*/
package org.apache.johnzon.mapper;
+import static java.util.Collections.emptyList;
+
import org.apache.johnzon.mapper.internal.JsonPointerTracker;
import javax.json.JsonValue;
@@ -57,7 +59,50 @@ public class MappingGeneratorImpl implements
MappingGenerator {
}
@Override
- public MappingGenerator writeObject(Object object, JsonGenerator
generator) {
+ public MappingGenerator writeObject(final String key, final Object object,
final JsonGenerator generator) {
+ if (object == null) {
+ return this;
+ } else if (object instanceof JsonValue) {
+ generator.write(key, JsonValue.class.cast(object));
+ } else {
+ final Class<?> objectClass = object.getClass();
+ try {
+ if (Map.class.isInstance(object)) {
+ writeValue(Map.class, false, false, false, false, true,
null, key, object,
+ null, emptyList(), isDeduplicateObjects ? new
JsonPointerTracker(null, "/") : null, generator);
+ } else if(writePrimitives(key, objectClass, object,
generator)) {
+ // no-op
+ } else if (objectClass.isEnum()) {
+ final Adapter adapter = config.findAdapter(objectClass);
+ final String adaptedValue =
adapter.from(object).toString(); // we know it ends as String for enums
+ generator.write(key, adaptedValue);
+ } else if (objectClass.isArray()) {
+ writeValue(Map.class, false, false, true, false, false,
null, key, object,
+ null, emptyList(), isDeduplicateObjects ? new
JsonPointerTracker(null, "/") : null, generator);
+ } else if (Iterable.class.isInstance(object)) {
+ writeValue(Map.class, false, false, false, true, false,
null, key, object,
+ null, emptyList(), isDeduplicateObjects ? new
JsonPointerTracker(null, "/") : null, generator);
+ } else {
+ final ObjectConverter.Writer objectConverter =
config.findObjectConverterWriter(objectClass);
+ if (objectConverter != null) {
+ final DynamicMappingGenerator dynamicMappingGenerator
= new DynamicMappingGenerator(this,
+ generator::writeStartObject,
generator::writeEnd, null);
+ objectConverter.writeJson(object,
dynamicMappingGenerator);
+ dynamicMappingGenerator.flushIfNeeded();
+ } else {
+ writeValue(objectClass, false, false, false, false,
false, null, key, object,
+ null, emptyList(), isDeduplicateObjects ? new
JsonPointerTracker(null, "/") : null, generator);
+ }
+ }
+ } catch (final InvocationTargetException | IllegalAccessException
e) {
+ throw new MapperException(e);
+ }
+ }
+ return this;
+ }
+
+ @Override
+ public MappingGenerator writeObject(final Object object, final
JsonGenerator generator) {
if (object == null) {
return this;
} else if (object instanceof JsonValue) {
@@ -124,9 +169,7 @@ public class MappingGeneratorImpl implements
MappingGenerator {
generator.writeEnd();
}
}
- } catch (final InvocationTargetException e) {
- throw new MapperException(e);
- } catch (final IllegalAccessException e) {
+ } catch (final InvocationTargetException | IllegalAccessException e) {
throw new MapperException(e);
}
}