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);
         }
     }

Reply via email to