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 10ab78e  JOHNZON-242 ensure serializer stack is not corrupted
10ab78e is described below

commit 10ab78ea9f5e42bcc99b69f7962355fda6c42ee9
Author: Romain Manni-Bucau <[email protected]>
AuthorDate: Sun Aug 18 18:44:41 2019 +0200

    JOHNZON-242 ensure serializer stack is not corrupted
---
 .../org/apache/johnzon/jsonb/SerializerTest.java   | 50 +++++++++++++++++++++-
 .../org/apache/johnzon/jsonb/test/JsonbRule.java   | 12 +++++-
 .../johnzon/mapper/DynamicMappingGenerator.java    |  6 +--
 3 files changed, 62 insertions(+), 6 deletions(-)

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 e535b54..fe658d5 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
@@ -37,6 +37,7 @@ import javax.json.bind.JsonbConfig;
 import javax.json.bind.annotation.JsonbTransient;
 import javax.json.bind.annotation.JsonbTypeDeserializer;
 import javax.json.bind.annotation.JsonbTypeSerializer;
+import javax.json.bind.config.PropertyOrderStrategy;
 import javax.json.bind.serializer.DeserializationContext;
 import javax.json.bind.serializer.JsonbDeserializer;
 import javax.json.bind.serializer.JsonbSerializer;
@@ -51,7 +52,21 @@ import org.junit.Test;
 
 public class SerializerTest {
     @Rule
-    public final JsonbRule jsonb = new JsonbRule();
+    public final JsonbRule jsonb = new JsonbRule()
+            .withPropertyOrderStrategy(PropertyOrderStrategy.LEXICOGRAPHICAL);
+
+    @Test
+    public void passthroughSerializer() {
+        final NameHolder nameHolder = new NameHolder();
+        nameHolder.name = new Named();
+        nameHolder.name.name = "Test String";
+        nameHolder.name.detailName = new DetailName();
+        nameHolder.name.detailName.name = "Another Test String";
+        assertEquals(
+                "{\"detailName\":{\"name\":\"Another Test 
String\",\"detail\":true},\"name\":{\"name\":\"Test String\"}}",
+                jsonb.toJson(nameHolder));
+
+    }
 
     @Test
     public void typeSerializer() {
@@ -455,6 +470,39 @@ public class SerializerTest {
         }
     }
 
+    public static class NameHolder {
+        @JsonbTypeSerializer(FooPassthroughSerializer.class)
+        public Named name;
+    }
+
+    public static class Named {
+        public String name;
+
+        @JsonbTypeSerializer(DetailNameSerializer.class)
+        public DetailName detailName;
+    }
+
+    public static class DetailName {
+        public String name;
+    }
+
+    public static class DetailNameSerializer implements 
JsonbSerializer<DetailName> {
+        @Override
+        public void serialize(final DetailName foo, final JsonGenerator 
jsonGenerator,
+                              final SerializationContext serializationContext) 
{
+            serializationContext.serialize(foo, jsonGenerator);
+            jsonGenerator.write("detail", true);
+        }
+    }
+
+    public static class FooPassthroughSerializer implements 
JsonbSerializer<Named> {
+        @Override
+        public void serialize(final Named foo, final JsonGenerator 
jsonGenerator,
+                              final SerializationContext serializationContext) 
{
+            serializationContext.serialize(foo, jsonGenerator);
+        }
+    }
+
     public static class StringHolder implements Holder<String> {
         private String instance = "Test";
 
diff --git 
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/test/JsonbRule.java 
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/test/JsonbRule.java
index 024d3ca..bd164fa 100644
--- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/test/JsonbRule.java
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/test/JsonbRule.java
@@ -27,6 +27,7 @@ import java.lang.reflect.Type;
 import javax.json.JsonValue;
 import javax.json.bind.Jsonb;
 import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
 import javax.json.bind.JsonbException;
 
 import org.apache.johnzon.jsonb.api.experimental.JsonbExtension;
@@ -37,12 +38,19 @@ import org.junit.runners.model.Statement;
 public class JsonbRule implements TestRule, Jsonb, JsonbExtension {
     private Jsonb jsonb;
 
+    private final JsonbConfig config = new JsonbConfig();
+
+    public JsonbRule withPropertyOrderStrategy(final String 
propertyOrderStrategy) {
+        config.withPropertyOrderStrategy(propertyOrderStrategy);
+        return this;
+    }
+
     @Override
-    public Statement apply(Statement statement, Description description) {
+    public Statement apply(final Statement statement, final Description 
description) {
         return new Statement() {
             @Override
             public void evaluate() throws Throwable {
-                try (final Jsonb jsonb = JsonbBuilder.create()) {
+                try (final Jsonb jsonb = JsonbBuilder.create(config)) {
                     JsonbRule.this.jsonb = jsonb;
                     statement.evaluate();
                 } finally {
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 bbbb8f0..35c6c2e 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
@@ -113,10 +113,10 @@ public class DynamicMappingGenerator implements 
MappingGenerator {
 
         @Override
         public JsonGenerator writeStartObject(final String name) {
-            if (state != WritingState.NONE) {
-                nested++;
+            if (state == WritingState.NONE) {
+                ensureStart();
             }
-            ensureStart();
+            nested++;
             delegate.writeStartObject(name);
             return this;
         }

Reply via email to