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