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 09e0369  JOHNZON-210 reworking JsonObject/JsonArray#toString to use 
JsonGenerator
09e0369 is described below

commit 09e03694b0460d0a65c3eb6e2600d92b2dd6b948
Author: Romain Manni-Bucau <[email protected]>
AuthorDate: Mon Apr 29 11:27:08 2019 +0200

    JOHNZON-210 reworking JsonObject/JsonArray#toString to use JsonGenerator
---
 .../java/org/apache/johnzon/core/DiffBase.java     |  3 +-
 .../apache/johnzon/core/JohnzonJsonParserImpl.java |  7 ++--
 .../apache/johnzon/core/JsonArrayBuilderImpl.java  | 25 +++++++++-----
 .../org/apache/johnzon/core/JsonArrayImpl.java     | 29 +++++++----------
 .../johnzon/core/JsonBuilderFactoryImpl.java       | 30 +++++++++++------
 .../apache/johnzon/core/JsonInMemoryParser.java    | 12 +++++--
 .../apache/johnzon/core/JsonMergePatchDiff.java    | 11 +++++--
 .../apache/johnzon/core/JsonMergePatchImpl.java    | 11 ++++---
 .../apache/johnzon/core/JsonObjectBuilderImpl.java | 23 ++++++++-----
 .../org/apache/johnzon/core/JsonObjectImpl.java    | 38 +++++++---------------
 .../apache/johnzon/core/JsonParserFactoryImpl.java |  4 +--
 .../org/apache/johnzon/core/JsonProviderImpl.java  | 13 +++++---
 .../apache/johnzon/core/JsonReaderFactoryImpl.java | 10 ++++--
 .../org/apache/johnzon/core/JsonReaderImpl.java    | 34 +++++++++++--------
 .../apache/johnzon/core/JsonStreamParserImpl.java  |  5 +++
 .../org/apache/johnzon/core/JsonStringImpl.java    |  4 ++-
 .../main/java/org/apache/johnzon/core/Strings.java | 15 ---------
 .../org/apache/johnzon/core/SerializationTest.java |  6 ++--
 .../org/apache/johnzon/jsonb/JohnzonBuilder.java   |  8 +++--
 .../org/apache/johnzon/jsonb/JsonbAccessMode.java  | 20 ++++++++----
 .../serializer/JohnzonDeserializationContext.java  |  8 +++--
 21 files changed, 179 insertions(+), 137 deletions(-)

diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/DiffBase.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/DiffBase.java
index d6abfdf..b25f5e5 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/DiffBase.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/DiffBase.java
@@ -19,11 +19,12 @@ package org.apache.johnzon.core;
 import javax.json.JsonArray;
 import javax.json.JsonObject;
 import javax.json.JsonValue;
+import java.io.Serializable;
 
 /**
  * Commonly used methods for diffs
  */
-class DiffBase {
+class DiffBase implements Serializable {
     protected boolean isJsonObject(JsonValue jsonValue) {
         return jsonValue instanceof JsonObject;
     }
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParserImpl.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParserImpl.java
index 1a0cc3d..40dbeb5 100644
--- 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParserImpl.java
+++ 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParserImpl.java
@@ -34,6 +34,7 @@ public abstract class JohnzonJsonParserImpl implements 
JohnzonJsonParser {
      * @return {@code true} if we are currently inside an array
      */
     protected abstract boolean isInArray();
+    protected abstract BufferStrategy.BufferProvider<char[]> 
getCharArrayProvider();
 
     @Override
     public JsonObject getObject() {
@@ -42,7 +43,7 @@ public abstract class JohnzonJsonParserImpl implements 
JohnzonJsonParser {
             throw new IllegalStateException(current + " doesn't support 
getObject()");
         }
 
-        JsonReaderImpl jsonReader = new JsonReaderImpl(this, true);
+        JsonReaderImpl jsonReader = new JsonReaderImpl(this, true, 
getCharArrayProvider());
         return jsonReader.readObject();
     }
 
@@ -54,7 +55,7 @@ public abstract class JohnzonJsonParserImpl implements 
JohnzonJsonParser {
             throw new IllegalStateException(current + " doesn't support 
getArray()");
         }
 
-        JsonReaderImpl jsonReader = new JsonReaderImpl(this, true);
+        JsonReaderImpl jsonReader = new JsonReaderImpl(this, true, 
getCharArrayProvider());
         return jsonReader.readArray();
     }
 
@@ -64,7 +65,7 @@ public abstract class JohnzonJsonParserImpl implements 
JohnzonJsonParser {
         switch (current) {
             case START_ARRAY:
             case START_OBJECT:
-                JsonReaderImpl jsonReader = new JsonReaderImpl(this, true);
+                JsonReaderImpl jsonReader = new JsonReaderImpl(this, true, 
getCharArrayProvider());
                 return jsonReader.readValue();
             case VALUE_TRUE:
                 return JsonValue.TRUE;
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java
index 57cceb7..1819309 100644
--- 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java
+++ 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java
@@ -33,18 +33,25 @@ import java.util.List;
 
 class JsonArrayBuilderImpl implements JsonArrayBuilder, Serializable {
     private List<JsonValue> tmpList;
+    private BufferStrategy.BufferProvider<char[]> bufferProvider;
 
-    public JsonArrayBuilderImpl() {
+    protected JsonArrayBuilderImpl() {
+        // no-op: serialization
     }
 
-    public JsonArrayBuilderImpl(JsonArray initialData) {
-        tmpList = new ArrayList<>(initialData);
+    public JsonArrayBuilderImpl(final JsonArray initialData,
+                                final BufferStrategy.BufferProvider<char[]> 
provider) {
+        this.tmpList = new ArrayList<>(initialData);
+        this.bufferProvider = provider;
     }
 
-    public JsonArrayBuilderImpl(Collection<?> initialData) {
-        tmpList = new ArrayList<>();
-        for (Object initialValue : initialData) {
-            add(initialValue);
+    public JsonArrayBuilderImpl(final Collection<?> initialData, final 
BufferStrategy.BufferProvider<char[]> provider) {
+        this.bufferProvider = provider;
+        this.tmpList = new ArrayList<>();
+        if (!initialData.isEmpty()) {
+            for (Object initialValue : initialData) {
+                add(initialValue);
+            }
         }
     }
 
@@ -316,9 +323,9 @@ class JsonArrayBuilderImpl implements JsonArrayBuilder, 
Serializable {
     @Override
     public JsonArray build() {
         if(tmpList == null) {
-            return new JsonArrayImpl(Collections.emptyList());
+            return new JsonArrayImpl(Collections.emptyList(), bufferProvider);
         }
-        return new JsonArrayImpl(Collections.unmodifiableList(tmpList));
+        return new JsonArrayImpl(Collections.unmodifiableList(tmpList), 
bufferProvider);
     }
 
     private static NullPointerException npe() {
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java
index 1d880c7..fd1b59f 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java
@@ -23,20 +23,22 @@ import javax.json.JsonNumber;
 import javax.json.JsonObject;
 import javax.json.JsonString;
 import javax.json.JsonValue;
+import javax.json.stream.JsonGenerator;
 import java.io.ObjectStreamException;
 import java.io.Serializable;
+import java.io.StringWriter;
 import java.util.AbstractList;
-import java.util.Iterator;
 import java.util.List;
 
 class JsonArrayImpl extends AbstractList<JsonValue> implements JsonArray, 
Serializable {
+    private final BufferStrategy.BufferProvider<char[]> provider;
     private Integer hashCode = null;
     private final List<JsonValue> unmodifieableBackingList;
     private int size = -1;
 
-    JsonArrayImpl(final List<JsonValue> backingList) {
-        super();
+    JsonArrayImpl(final List<JsonValue> backingList, final 
BufferStrategy.BufferProvider<char[]> provider) {
         this.unmodifieableBackingList = backingList;
+        this.provider = provider;
     }
 
     private <T> T value(final int idx, final Class<T> type) {
@@ -159,22 +161,13 @@ class JsonArrayImpl extends AbstractList<JsonValue> 
implements JsonArray, Serial
 
     @Override
     public String toString() {
-        final StringBuilder builder = new StringBuilder("[");
-        final Iterator<JsonValue> it = unmodifieableBackingList.iterator();
-        boolean hasNext = it.hasNext();
-        while (hasNext) {
-            final JsonValue jsonValue = it.next();
-            if (JsonString.class.isInstance(jsonValue)) {
-                builder.append(jsonValue.toString());
-            } else {
-                builder.append(jsonValue != JsonValue.NULL ? 
jsonValue.toString() : JsonChars.NULL);
-            }
-            hasNext = it.hasNext();
-            if (hasNext) {
-                builder.append(",");
-            }
+        final StringWriter writer = new StringWriter();
+        try (final JsonGenerator generator = new JsonGeneratorImpl(writer, 
provider, false)) {
+            generator.writeStartArray();
+            unmodifieableBackingList.forEach(generator::write);
+            generator.writeEnd();
         }
-        return builder.append(']').toString();
+        return writer.toString();
     }
 
     @Override
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java
 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java
index 81719ff..1d54c89 100644
--- 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java
+++ 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java
@@ -18,6 +18,7 @@
  */
 package org.apache.johnzon.core;
 
+import java.io.Serializable;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -32,15 +33,24 @@ import javax.json.JsonBuilderFactory;
 import javax.json.JsonObject;
 import javax.json.JsonObjectBuilder;
 
-class JsonBuilderFactoryImpl implements JsonBuilderFactory {
+import static java.util.Collections.emptyList;
+import static java.util.Collections.emptyMap;
+
+class JsonBuilderFactoryImpl implements JsonBuilderFactory, Serializable {
     private final Map<String, Object> internalConfig = new HashMap<String, 
Object>();
+    private BufferStrategy.BufferProvider<char[]> bufferProvider;
     private static final String[] SUPPORTED_CONFIG_KEYS = new String[] {
-    //nothing yet
-
+        // nothing yet
     };
+
     protected final Logger logger = 
Logger.getLogger(this.getClass().getName());
 
-    JsonBuilderFactoryImpl(final Map<String, ?> config) {
+    protected JsonBuilderFactoryImpl() {
+        // no-op: serialization
+    }
+
+    JsonBuilderFactoryImpl(final Map<String, ?> config, final 
BufferStrategy.BufferProvider<char[]> bufferProvider) {
+        this.bufferProvider = bufferProvider;
         if (config != null && config.size() > 0) {
             final List<String> supportedConfigKeys = 
Arrays.asList(SUPPORTED_CONFIG_KEYS);
             for (String configKey : config.keySet()) {
@@ -55,28 +65,28 @@ class JsonBuilderFactoryImpl implements JsonBuilderFactory {
 
     @Override
     public JsonObjectBuilder createObjectBuilder() {
-        return new JsonObjectBuilderImpl();
+        return new JsonObjectBuilderImpl(emptyMap(), bufferProvider);
     }
 
     @Override
     public JsonObjectBuilder createObjectBuilder(JsonObject initialData) {
-        return new JsonObjectBuilderImpl(initialData);
+        return new JsonObjectBuilderImpl(initialData, bufferProvider);
     }
 
     @Override
     public JsonArrayBuilder createArrayBuilder() {
-        return new JsonArrayBuilderImpl();
+        return new JsonArrayBuilderImpl(emptyList(), bufferProvider);
     }
 
 
     @Override
     public JsonArrayBuilder createArrayBuilder(JsonArray initialData) {
-        return new JsonArrayBuilderImpl(initialData);
+        return new JsonArrayBuilderImpl(initialData, bufferProvider);
     }
 
     @Override
     public JsonArrayBuilder createArrayBuilder(Collection<?> initialData) {
-        return new JsonArrayBuilderImpl(initialData);
+        return new JsonArrayBuilderImpl(initialData, bufferProvider);
     }
 
     @Override
@@ -86,7 +96,7 @@ class JsonBuilderFactoryImpl implements JsonBuilderFactory {
 
     @Override
     public JsonObjectBuilder createObjectBuilder(Map<String, Object> 
initialValues) {
-        return new JsonObjectBuilderImpl(initialValues);
+        return new JsonObjectBuilderImpl(initialValues, bufferProvider);
     }
 
 }
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java
index f94e437..014d276 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java
@@ -34,6 +34,7 @@ import javax.json.stream.JsonLocation;
 class JsonInMemoryParser extends JohnzonJsonParserImpl {
 
     private final SimpleStack<Iterator<Event>> stack = new 
SimpleStack<Iterator<Event>>();
+    private final BufferStrategy.BufferProvider<char[]> bufferProvider;
 
     private Event currentEvent;
     private JsonValue currentValue;
@@ -184,6 +185,11 @@ class JsonInMemoryParser extends JohnzonJsonParserImpl {
         return arrayDepth > 0;
     }
 
+    @Override
+    protected BufferStrategy.BufferProvider<char[]> getCharArrayProvider() {
+        return bufferProvider;
+    }
+
     private static Event getEvent(final ValueType value) {
 
         switch (value) {
@@ -204,12 +210,14 @@ class JsonInMemoryParser extends JohnzonJsonParserImpl {
 
     }
 
-    JsonInMemoryParser(final JsonObject object) {
+    JsonInMemoryParser(final JsonObject object, final 
BufferStrategy.BufferProvider<char[]> bufferProvider) {
         stack.push(new ObjectIterator(object));
+        this.bufferProvider = bufferProvider;
     }
 
-    JsonInMemoryParser(final JsonArray array) {
+    JsonInMemoryParser(final JsonArray array, final 
BufferStrategy.BufferProvider<char[]> bufferProvider) {
         stack.push(new ArrayIterator(array));
+        this.bufferProvider = bufferProvider;
     }
 
     @Override
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchDiff.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchDiff.java
index 5175e8d..1ca3bf9 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchDiff.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchDiff.java
@@ -23,24 +23,29 @@ import javax.json.JsonObject;
 import javax.json.JsonObjectBuilder;
 import javax.json.JsonValue;
 
+import static java.util.Collections.emptyMap;
+
 /**
  * Creates a JsonMergePatch as diff between two JsonValues
  */
 class JsonMergePatchDiff extends DiffBase {
+    private final BufferStrategy.BufferProvider<char[]> bufferProvider;
     private final JsonValue source;
     private final JsonValue target;
 
-    public JsonMergePatchDiff(JsonValue source, JsonValue target) {
+    public JsonMergePatchDiff(final JsonValue source, final JsonValue target,
+                              final BufferStrategy.BufferProvider<char[]> 
bufferProvider) {
+        this.bufferProvider = bufferProvider;
         this.source = source;
         this.target = target;
     }
 
     public JsonMergePatch calculateDiff() {
-        return new JsonMergePatchImpl(diff(source, target));
+        return new JsonMergePatchImpl(diff(source, target), bufferProvider);
     }
 
     private JsonValue diff(JsonValue source, JsonValue target) {
-        JsonObjectBuilder builder = new JsonObjectBuilderImpl();
+        JsonObjectBuilder builder = new JsonObjectBuilderImpl(emptyMap(), 
bufferProvider);
 
         if (isJsonObject(source) && isJsonObject(target)) {
             JsonObject srcObj = source.asJsonObject();
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchImpl.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchImpl.java
index b3f55c6..56518cd 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonMergePatchImpl.java
@@ -17,6 +17,7 @@
 package org.apache.johnzon.core;
 
 
+import java.io.Serializable;
 import java.util.Map;
 
 import javax.json.JsonMergePatch;
@@ -27,11 +28,13 @@ import javax.json.JsonValue;
 /**
  * @author <a href="mailto:[email protected]";>Mark Struberg</a>
  */
-public class JsonMergePatchImpl implements JsonMergePatch {
-    private final JsonValue patch;
+public class JsonMergePatchImpl implements JsonMergePatch, Serializable {
+    private JsonValue patch;
+    private BufferStrategy.BufferProvider<char[]> bufferProvider;
 
-    public JsonMergePatchImpl(JsonValue patch) {
+    public JsonMergePatchImpl(final JsonValue patch, final 
BufferStrategy.BufferProvider<char[]> bufferProvider) {
         this.patch = patch;
+        this.bufferProvider = bufferProvider;
     }
 
     @Override
@@ -55,7 +58,7 @@ public class JsonMergePatchImpl implements JsonMergePatch {
     }
 
     private JsonValue applyJsonObjectPatch(JsonObject jsonObject, JsonObject 
patch) {
-        JsonObjectBuilder builder = new JsonObjectBuilderImpl(jsonObject);
+        JsonObjectBuilder builder = new JsonObjectBuilderImpl(jsonObject, 
bufferProvider);
 
         for (Map.Entry<String, JsonValue> patchAttrib : patch.entrySet()) {
             String attribName = patchAttrib.getKey();
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
index b89a671..003cb77 100644
--- 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
+++ 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
@@ -31,19 +31,26 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 
 class JsonObjectBuilderImpl implements JsonObjectBuilder, Serializable {
+    private BufferStrategy.BufferProvider<char[]> bufferProvider;
     private Map<String, JsonValue> attributeMap = new LinkedHashMap<>();
 
-    public JsonObjectBuilderImpl() {
+    protected JsonObjectBuilderImpl() {
+        // no-op: serialization
     }
 
-    public JsonObjectBuilderImpl(JsonObject initialData) {
+    public JsonObjectBuilderImpl(final JsonObject initialData,
+                                 final BufferStrategy.BufferProvider<char[]> 
bufferProvider) {
+        this.bufferProvider = bufferProvider;
         attributeMap = new LinkedHashMap<>(initialData);
     }
 
-    public JsonObjectBuilderImpl(Map<String, Object> initialValues) {
-        this();
-        for (Map.Entry<String, Object> entry : initialValues.entrySet()) {
-            add(entry.getKey(), entry.getValue());
+    public JsonObjectBuilderImpl(final Map<String, Object> initialValues,
+                                 final BufferStrategy.BufferProvider<char[]> 
bufferProvider) {
+        this.bufferProvider = bufferProvider;
+        if (!initialValues.isEmpty()) {
+            for (Map.Entry<String, Object> entry : initialValues.entrySet()) {
+                add(entry.getKey(), entry.getValue());
+            }
         }
     }
 
@@ -166,10 +173,10 @@ class JsonObjectBuilderImpl implements JsonObjectBuilder, 
Serializable {
     public JsonObject build() {
         
         if(attributeMap == null || attributeMap.isEmpty()) {
-            return new JsonObjectImpl(Collections.EMPTY_MAP);
+            return new JsonObjectImpl(Collections.EMPTY_MAP, bufferProvider);
         } else {
             Map<String, JsonValue> dump = 
(Collections.unmodifiableMap(attributeMap));
-            return new JsonObjectImpl(dump);
+            return new JsonObjectImpl(dump, bufferProvider);
         }
     }
 }
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java
index a70c410..af00c6f 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java
@@ -23,16 +23,18 @@ import javax.json.JsonNumber;
 import javax.json.JsonObject;
 import javax.json.JsonString;
 import javax.json.JsonValue;
+import javax.json.stream.JsonGenerator;
 import java.io.ObjectStreamException;
 import java.io.Serializable;
+import java.io.StringWriter;
 import java.util.AbstractMap;
-import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
 
-
 final class JsonObjectImpl extends AbstractMap<String, JsonValue> implements 
JsonObject, Serializable {
+    private final BufferStrategy.BufferProvider<char[]> provider;
+
     private transient Integer hashCode = null;
     private final Map<String, JsonValue> unmodifieableBackingMap;
 
@@ -53,9 +55,9 @@ final class JsonObjectImpl extends AbstractMap<String, 
JsonValue> implements Jso
         return value;
     }
 
-    JsonObjectImpl(final Map<String, JsonValue> backingMap) {
-        super();
+    JsonObjectImpl(final Map<String, JsonValue> backingMap, final 
BufferStrategy.BufferProvider<char[]> provider) {
         this.unmodifieableBackingMap = new LinkedHashMap<>(backingMap);
+        this.provider = provider;
     }
 
     @Override
@@ -141,29 +143,13 @@ final class JsonObjectImpl extends AbstractMap<String, 
JsonValue> implements Jso
 
     @Override
     public String toString() {
-        final StringBuilder builder = new StringBuilder("{");
-        final Iterator<Map.Entry<String, JsonValue>> it = 
unmodifieableBackingMap.entrySet().iterator();
-        boolean hasNext = it.hasNext();
-        while (hasNext) {
-            final Map.Entry<String, JsonValue> entry = it.next();
-
-            builder.append('"');
-            Strings.appendEscaped(entry.getKey(), builder);
-            builder.append("\":");
-
-            final JsonValue value = entry.getValue();
-            if (JsonString.class.isInstance(value)) {
-                builder.append(value.toString());
-            } else {
-                builder.append(value != JsonValue.NULL ? value.toString() : 
JsonChars.NULL);
-            }
-
-            hasNext = it.hasNext();
-            if (hasNext) {
-                builder.append(",");
-            }
+        final StringWriter writer = new StringWriter();
+        try (final JsonGenerator generator = new JsonGeneratorImpl(writer, 
provider, false)) {
+            generator.writeStartObject();
+            unmodifieableBackingMap.forEach(generator::write);
+            generator.writeEnd();
         }
-        return builder.append('}').toString();
+        return writer.toString();
     }
 
     @Override
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonParserFactoryImpl.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonParserFactoryImpl.java
index 440b4cb..437a2ca 100644
--- 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonParserFactoryImpl.java
+++ 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonParserFactoryImpl.java
@@ -109,13 +109,13 @@ public class JsonParserFactoryImpl extends 
AbstractJsonFactory implements JsonPa
     @Override
     public JsonParser createParser(final JsonObject obj) {
         // no need of a comment version since JsonObject has no comment event
-        return new JsonInMemoryParser(obj);
+        return new JsonInMemoryParser(obj, bufferProvider);
     }
 
     @Override
     public JsonParser createParser(final JsonArray array) {
         // no need of a comment version since JsonObject has no comment event
-        return new JsonInMemoryParser(array);
+        return new JsonInMemoryParser(array, bufferProvider);
     }
 
     @Override
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java
index 37483da..4447a7d 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java
@@ -215,11 +215,15 @@ public class JsonProviderImpl extends JsonProvider 
implements Serializable {
     }
 
     static class JsonProviderDelegate extends JsonProvider {
+        private final BufferStrategy.BufferProvider<char[]> bufferProvider =
+            
BufferStrategy.valueOf(System.getProperty("johnzon.global-char-provider.strategy",
 "QUEUE"))
+                
.newCharProvider(Integer.getInteger("org.apache.johnzon.default-char-provider.length",
 1024));
+
         private final JsonReaderFactory readerFactory = new 
JsonReaderFactoryImpl(null);
         private final JsonParserFactory parserFactory = new 
JsonParserFactoryImpl(null);
         private final JsonGeneratorFactory generatorFactory = new 
JsonGeneratorFactoryImpl(null);
         private final JsonWriterFactory writerFactory = new 
JsonWriterFactoryImpl(null);
-        private final JsonBuilderFactoryImpl builderFactory = new 
JsonBuilderFactoryImpl(null);
+        private final JsonBuilderFactoryImpl builderFactory = new 
JsonBuilderFactoryImpl(null, bufferProvider);
 
         @Override
         public JsonParser createParser(final InputStream in) {
@@ -342,7 +346,8 @@ public class JsonProviderImpl extends JsonProvider 
implements Serializable {
 
         @Override
         public JsonBuilderFactory createBuilderFactory(final Map<String, ?> 
config) {
-            return (config == null || config.isEmpty()) ? builderFactory : new 
JsonBuilderFactoryImpl(config);
+            return (config == null || config.isEmpty()) ?
+                    builderFactory : new JsonBuilderFactoryImpl(config, 
bufferProvider);
         }
 
         @Override
@@ -370,12 +375,12 @@ public class JsonProviderImpl extends JsonProvider 
implements Serializable {
         }
 
         public JsonMergePatch createMergePatch(JsonValue patch) {
-            return new JsonMergePatchImpl(patch);
+            return new JsonMergePatchImpl(patch, bufferProvider);
         }
 
         @Override
         public JsonMergePatch createMergeDiff(JsonValue source, JsonValue 
target) {
-            return new JsonMergePatchDiff(source, target).calculateDiff();
+            return new JsonMergePatchDiff(source, target, 
bufferProvider).calculateDiff();
         }
     }
 }
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderFactoryImpl.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderFactoryImpl.java
index 98484b1..106de0a 100644
--- 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderFactoryImpl.java
+++ 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderFactoryImpl.java
@@ -43,21 +43,25 @@ class JsonReaderFactoryImpl extends AbstractJsonFactory 
implements JsonReaderFac
 
     @Override
     public JsonReader createReader(final Reader reader) {
-        return new JsonReaderImpl(parserFactory.createInternalParser(reader));
+        return new JsonReaderImpl(parserFactory.createInternalParser(reader), 
getCharArrayProvider());
     }
 
     @Override
     public JsonReader createReader(final InputStream in) {
-        return new JsonReaderImpl(parserFactory.createInternalParser(in));
+        return new JsonReaderImpl(parserFactory.createInternalParser(in), 
getCharArrayProvider());
     }
 
     @Override
     public JsonReader createReader(final InputStream in, final Charset 
charset) {
-        return new JsonReaderImpl(parserFactory.createInternalParser(in, 
charset));
+        return new JsonReaderImpl(parserFactory.createInternalParser(in, 
charset), getCharArrayProvider());
     }
 
     @Override
     public Map<String, ?> getConfigInUse() {
         return Collections.unmodifiableMap(internalConfig);
     }
+
+    private BufferStrategy.BufferProvider<char[]> getCharArrayProvider() {
+        return getBufferProvider().newCharProvider(1024);
+    }
 }
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
index 02d1d39..531e371 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
@@ -30,23 +30,29 @@ import javax.json.JsonValue;
 import javax.json.stream.JsonParser;
 import javax.json.stream.JsonParsingException;
 
+import static java.util.Collections.emptyList;
+import static java.util.Collections.emptyMap;
+
 public class JsonReaderImpl implements JsonReader {
     private final JohnzonJsonParser parser;
+    private final BufferStrategy.BufferProvider<char[]> bufferProvider;
     private boolean closed = false;
 
     private boolean subStreamReader;
 
-    public JsonReaderImpl(final JsonParser parser) {
-        this(parser, false);
+    public JsonReaderImpl(final JsonParser parser, final 
BufferStrategy.BufferProvider<char[]> bufferProvider) {
+        this(parser, false, bufferProvider);
     }
 
     /**
-     *
-     * @param parser
+     * @param parser json parser.
      * @param subStreamReader {@code true} if the Stream already got started 
and the first
      *           operation should not be next() but {@link 
JohnzonJsonParser#current()} instead.
+     * @param bufferProvider buffer provider for toString of created instances.
      */
-    public JsonReaderImpl(final JsonParser parser, boolean subStreamReader) {
+    public JsonReaderImpl(final JsonParser parser, boolean subStreamReader,
+                          final BufferStrategy.BufferProvider<char[]> 
bufferProvider) {
+        this.bufferProvider = bufferProvider;
         if (parser instanceof JohnzonJsonParser) {
             this.parser = (JohnzonJsonParser) parser;
         } else {
@@ -79,7 +85,7 @@ public class JsonReaderImpl implements JsonReader {
 
         switch (next) {
             case START_OBJECT:
-                final JsonObjectBuilder objectBuilder = new 
JsonObjectBuilderImpl();
+                final JsonObjectBuilder objectBuilder = new 
JsonObjectBuilderImpl(emptyMap(), bufferProvider);
                 parseObject(objectBuilder);
                 if (!subStreamReader) {
                     if (parser.hasNext()) {
@@ -89,7 +95,7 @@ public class JsonReaderImpl implements JsonReader {
                 }
                 return objectBuilder.build();
             case START_ARRAY:
-                final JsonArrayBuilder arrayBuilder = new 
JsonArrayBuilderImpl();
+                final JsonArrayBuilder arrayBuilder = new 
JsonArrayBuilderImpl(emptyList(), bufferProvider);
                 parseArray(arrayBuilder);
                 if (!subStreamReader) {
                     if (parser.hasNext()) {
@@ -190,14 +196,14 @@ public class JsonReaderImpl implements JsonReader {
                     break;
 
                 case START_OBJECT:
-                    JsonObjectBuilder subObject = null;
-                    parseObject(subObject = new JsonObjectBuilderImpl());
+                    JsonObjectBuilder subObject = new 
JsonObjectBuilderImpl(emptyMap(), bufferProvider);
+                    parseObject(subObject);
                     builder.add(key, subObject);
                     break;
 
                 case START_ARRAY:
-                    JsonArrayBuilder subArray = null;
-                    parseArray(subArray = new JsonArrayBuilderImpl());
+                    JsonArrayBuilder subArray = new 
JsonArrayBuilderImpl(emptyList(), bufferProvider);
+                    parseArray(subArray);
                     builder.add(key, subArray);
                     break;
 
@@ -250,14 +256,14 @@ public class JsonReaderImpl implements JsonReader {
                     break;
 
                 case START_OBJECT:
-                    JsonObjectBuilder subObject = null;
-                    parseObject(subObject = new JsonObjectBuilderImpl());
+                    JsonObjectBuilder subObject = new 
JsonObjectBuilderImpl(emptyMap(), bufferProvider);
+                    parseObject(subObject);
                     builder.add(subObject);
                     break;
 
                 case START_ARRAY:
                     JsonArrayBuilder subArray = null;
-                    parseArray(subArray = new JsonArrayBuilderImpl());
+                    parseArray(subArray = new 
JsonArrayBuilderImpl(emptyList(), bufferProvider));
                     builder.add(subArray);
                     break;
 
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java
index 18f0a1c..79f72ae 100644
--- 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java
+++ 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java
@@ -558,6 +558,11 @@ public class JsonStreamParserImpl extends 
JohnzonJsonParserImpl implements JsonC
         return arrayDepth > 0;
     }
 
+    @Override
+    protected BufferStrategy.BufferProvider<char[]> getCharArrayProvider() {
+        return bufferProvider;
+    }
+
     //read a string, gets called recursively
     //Handles escape/d characters
     //if string contains escape chars and/or cross buffer boundary then copy 
in the value buffer
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStringImpl.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStringImpl.java
index 5ec8a36..9cb1128 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStringImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStringImpl.java
@@ -54,7 +54,9 @@ final class JsonStringImpl implements JsonString, 
Serializable {
     public String toString() {
         String s = escape;
         if (s == null) {
-            s =  
JsonChars.QUOTE_CHAR+Strings.escape(value)+JsonChars.QUOTE_CHAR;
+            final StringBuilder builder = new StringBuilder();
+            Strings.appendEscaped(value, builder);
+            s =  JsonChars.QUOTE_CHAR + builder.toString() + 
JsonChars.QUOTE_CHAR;
             escape=s;
         }
         return s;
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/Strings.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/Strings.java
index cbcf509..5ea3305 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/Strings.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/Strings.java
@@ -60,21 +60,6 @@ class Strings implements JsonChars {
 
     }
 
-    static String escape(final String value) {
-
-        if(value == null || value.length()==0) {
-            return value;
-        }
-
-        final StringBuilder builder = BUILDER_CACHE.newBuffer();
-        try {
-            appendEscaped(value, builder);
-            return builder.toString();
-        } finally {
-            BUILDER_CACHE.release(builder);
-        }
-    }
-
     static void appendEscaped(final String value, final StringBuilder builder) 
{
         final int length = value.length();
         int nextStart = 0;
diff --git 
a/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java 
b/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java
index 383dae9..de90ff3 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java
@@ -82,7 +82,8 @@ public class SerializationTest {
         final Map<String, JsonValue> map = new LinkedHashMap<String, 
JsonValue>();
         map.put("test", new JsonStringImpl("val"));
         map.put("test2", JsonValue.TRUE);
-        final JsonObject source = new 
JsonObjectImpl(Collections.unmodifiableMap(map));
+        final JsonObject source = new 
JsonObjectImpl(Collections.unmodifiableMap(map),
+                BufferStrategy.BY_INSTANCE.newCharProvider(512));
         final JsonObject serialization = serialDeser(source);
         assertNotSame(source, serialization);
         assertTrue(serialization.containsKey("test"));
@@ -96,7 +97,8 @@ public class SerializationTest {
         final List<JsonValue> list = new ArrayList<JsonValue>();
         list.add(new JsonStringImpl("test"));
         list.add(JsonValue.TRUE); // not ser but we should be able to handle 
that
-        final JsonArray source = new 
JsonArrayImpl(Collections.unmodifiableList(list));
+        final JsonArray source = new 
JsonArrayImpl(Collections.unmodifiableList(list),
+                BufferStrategy.BY_INSTANCE.newCharProvider(512));
         final JsonArray serialization = serialDeser(source);
         assertNotSame(source, serialization);
         assertEquals(2, serialization.size());
diff --git 
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java 
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
index 70e3a45..f227a3a 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
@@ -82,6 +82,7 @@ import javax.json.stream.JsonGenerator;
 import javax.json.stream.JsonParserFactory;
 
 import org.apache.johnzon.core.AbstractJsonFactory;
+import org.apache.johnzon.core.BufferStrategy;
 import org.apache.johnzon.core.JsonGeneratorFactoryImpl;
 import org.apache.johnzon.core.JsonParserFactoryImpl;
 import org.apache.johnzon.core.Types;
@@ -189,6 +190,7 @@ public class JohnzonBuilder implements JsonbBuilder {
             throw new IllegalArgumentException("Unsupported factory: " + val);
         }).orElseGet(this::findFactory);
 
+        final BufferStrategy.BufferProvider<char[]> bufferProvider = 
BufferStrategy.QUEUE.newCharProvider(1024);
         final AccessMode accessMode = config.getProperty("johnzon.accessMode")
                 .map(this::toAccessMode)
                 .orElseGet(() -> new JsonbAccessMode(
@@ -201,7 +203,8 @@ public class JohnzonBuilder implements JsonbBuilder {
                                 .orElseGet(() -> new 
FieldAndMethodAccessMode(true, true, false)),
                         
config.getProperty("johnzon.failOnMissingCreatorValues")
                               .map(it -> String.class.isInstance(it) ? 
Boolean.parseBoolean(it.toString()) : Boolean.class.cast(it))
-                              .orElse(true) /*spec 1.0 requirement*/));
+                              .orElse(true) /*spec 1.0 requirement*/,
+                        bufferProvider));
         builder.setAccessMode(accessMode);
 
         // user adapters
@@ -300,7 +303,8 @@ public class JohnzonBuilder implements JsonbBuilder {
                 builder.addObjectConverter(
                         Class.class.cast(args[0]), (ObjectConverter.Reader)
                                 (jsonObject, targetType, parser) -> 
d.deserialize(
-                                        
JsonValueParserAdapter.createFor(jsonObject, parserFactoryProvider), new 
JohnzonDeserializationContext(parser), targetType));
+                                        
JsonValueParserAdapter.createFor(jsonObject, parserFactoryProvider),
+                                        new 
JohnzonDeserializationContext(parser, bufferProvider), targetType));
             });
         });
 
diff --git 
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java 
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
index f9d0ce2..e515818 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
@@ -81,6 +81,7 @@ import javax.json.bind.serializer.JsonbDeserializer;
 import javax.json.bind.serializer.JsonbSerializer;
 import javax.json.stream.JsonParserFactory;
 
+import org.apache.johnzon.core.BufferStrategy;
 import org.apache.johnzon.core.Types;
 import org.apache.johnzon.jsonb.converter.JohnzonJsonbAdapter;
 import org.apache.johnzon.jsonb.converter.JsonbDateConverter;
@@ -132,6 +133,7 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
             throw new UnsupportedOperationException();
         }
     };
+    private final BufferStrategy.BufferProvider<char[]> bufferProvider;
     private boolean failOnMissingCreatorValues;
     private final Types types = new Types();
 
@@ -139,7 +141,8 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
                            final PropertyVisibilityStrategy 
visibilityStrategy, final boolean caseSensitive,
                            final Map<AdapterKey, Adapter<?, ?>> 
defaultConverters, final JohnzonAdapterFactory factory,
                            final Supplier<JsonParserFactory> parserFactory, 
final AccessMode delegate,
-                           final boolean failOnMissingCreatorValues) {
+                           final boolean failOnMissingCreatorValues,
+                           final BufferStrategy.BufferProvider<char[]> 
bufferProvider) {
         this.naming = propertyNamingStrategy;
         this.order = orderValue;
         this.visibility = visibilityStrategy;
@@ -149,6 +152,7 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
         this.factory = factory;
         this.parserFactory = parserFactory;
         this.failOnMissingCreatorValues = failOnMissingCreatorValues;
+        this.bufferProvider = bufferProvider;
     }
 
     @Override
@@ -512,7 +516,7 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
                 writer = finalWriter::write;
             }
 
-            final ReaderConverters converters = new 
ReaderConverters(initialWriter);
+            final ReaderConverters converters = new 
ReaderConverters(initialWriter, bufferProvider);
             final JsonbProperty property = 
initialWriter.getAnnotation(JsonbProperty.class);
             final JsonbNillable nillable = 
initialWriter.getClassOrPackageAnnotation(JsonbNillable.class);
             final boolean isNillable = nillable != null || (property != null 
&& property.nillable());
@@ -613,7 +617,7 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
     private ParsingCacheEntry getClassEntry(final Class<?> clazz) {
         ParsingCacheEntry cache = parsingCache.get(clazz);
         if (cache == null) {
-            cache = new ParsingCacheEntry(new ClassDecoratedType(clazz), 
types);
+            cache = new ParsingCacheEntry(new ClassDecoratedType(clazz), 
types, bufferProvider);
             parsingCache.putIfAbsent(clazz, cache);
         }
         return cache;
@@ -720,7 +724,8 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
         private Adapter<?, ?> converter;
         private ObjectConverter.Reader reader;
 
-        ReaderConverters(final DecoratedType annotationHolder) {
+        ReaderConverters(final DecoratedType annotationHolder,
+                         final BufferStrategy.BufferProvider<char[]> 
bufferProvider) {
             final JsonbTypeDeserializer deserializer = 
annotationHolder.getAnnotation(JsonbTypeDeserializer.class);
             final JsonbTypeAdapter adapter = 
annotationHolder.getAnnotation(JsonbTypeAdapter.class);
             final JsonbDateFormat dateFormat = 
annotationHolder.getAnnotation(JsonbDateFormat.class);
@@ -779,7 +784,7 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
                                            final MappingParser parser, final 
JsonbDeserializer jsonbDeserializer) {
                         return jsonbDeserializer.deserialize(
                                 JsonValueParserAdapter.createFor(jsonValue, 
parserFactory),
-                                new JohnzonDeserializationContext(parser), 
targetType);
+                                new JohnzonDeserializationContext(parser, 
bufferProvider), targetType);
                     }
                 };
             } else if (johnzonConverter != null) {
@@ -871,8 +876,9 @@ public class JsonbAccessMode implements AccessMode, 
Closeable {
         private final ReaderConverters readers;
         private final WriterConverters writers;
 
-        ParsingCacheEntry(final DecoratedType type, final Types types) {
-            readers = new ReaderConverters(type);
+        ParsingCacheEntry(final DecoratedType type, final Types types,
+                          final BufferStrategy.BufferProvider<char[]> 
bufferProvider) {
+            readers = new ReaderConverters(type, bufferProvider);
             writers = new WriterConverters(type, types);
         }
     }
diff --git 
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/serializer/JohnzonDeserializationContext.java
 
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/serializer/JohnzonDeserializationContext.java
index 004b440..4c426e4 100644
--- 
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/serializer/JohnzonDeserializationContext.java
+++ 
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/serializer/JohnzonDeserializationContext.java
@@ -18,6 +18,7 @@
  */
 package org.apache.johnzon.jsonb.serializer;
 
+import org.apache.johnzon.core.BufferStrategy;
 import org.apache.johnzon.core.JsonReaderImpl;
 import org.apache.johnzon.mapper.MappingParser;
 
@@ -26,12 +27,13 @@ import javax.json.bind.serializer.DeserializationContext;
 import javax.json.stream.JsonParser;
 import java.lang.reflect.Type;
 
-// TODO: test it
 public class JohnzonDeserializationContext implements DeserializationContext {
     private final MappingParser runtime;
+    private final BufferStrategy.BufferProvider<char[]> bufferProvider;
 
-    public JohnzonDeserializationContext(final MappingParser runtime) {
+    public JohnzonDeserializationContext(final MappingParser runtime, final 
BufferStrategy.BufferProvider<char[]> bufferProvider) {
         this.runtime = runtime;
+        this.bufferProvider = bufferProvider;
     }
 
     @Override
@@ -45,6 +47,6 @@ public class JohnzonDeserializationContext implements 
DeserializationContext {
     }
 
     private JsonValue read(final JsonParser parser) { // TODO: use jsonp 1.1 
and not johnzon internals
-        return new JsonReaderImpl(parser, true).readValue();
+        return new JsonReaderImpl(parser, true, bufferProvider).readValue();
     }
 }

Reply via email to