Repository: johnzon Updated Branches: refs/heads/master 3fe71ac0d -> 6a7f7b2e2
JOHNZON-190 ensure jsongenerator#close can be called N, N > 1 times Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/6a7f7b2e Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/6a7f7b2e Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/6a7f7b2e Branch: refs/heads/master Commit: 6a7f7b2e29bcfe2d7768498dcd457501766368d1 Parents: 3fe71ac Author: Romain Manni-Bucau <[email protected]> Authored: Tue Oct 2 15:46:58 2018 +0200 Committer: Romain Manni-Bucau <[email protected]> Committed: Tue Oct 2 15:46:58 2018 +0200 ---------------------------------------------------------------------- .../apache/johnzon/core/JsonGeneratorImpl.java | 5 +++ .../johnzon/core/JsonGeneratorImplTest.java | 45 ++++++++++++++++---- 2 files changed, 41 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/johnzon/blob/6a7f7b2e/johnzon-core/src/main/java/org/apache/johnzon/core/JsonGeneratorImpl.java ---------------------------------------------------------------------- diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonGeneratorImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonGeneratorImpl.java index bc17340..ec303c5 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonGeneratorImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonGeneratorImpl.java @@ -49,6 +49,7 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable { private static final String INDENT = " "; //private final ConcurrentMap<String, String> cache; private int depth = 0; + private boolean closed; private final HStack<GeneratorState> state = new HStack<GeneratorState>(); @@ -452,6 +453,9 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable { @Override public void close() { + if (closed) { + return; + } try { if (currentState() != GeneratorState.END) { throw new JsonGenerationException("Invalid json"); @@ -463,6 +467,7 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable { } catch (final IOException e) { throw new JsonException(e.getMessage(), e); } finally { + closed = true; bufferProvider.release(buffer); } } http://git-wip-us.apache.org/repos/asf/johnzon/blob/6a7f7b2e/johnzon-core/src/test/java/org/apache/johnzon/core/JsonGeneratorImplTest.java ---------------------------------------------------------------------- diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonGeneratorImplTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonGeneratorImplTest.java index 83561c6..e373f41 100644 --- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonGeneratorImplTest.java +++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonGeneratorImplTest.java @@ -18,8 +18,16 @@ */ package org.apache.johnzon.core; -import org.junit.Assert; -import org.junit.Test; +import static org.junit.Assert.assertEquals; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.StringWriter; +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.HashMap; +import java.util.Queue; import javax.json.Json; import javax.json.JsonReader; @@ -28,17 +36,36 @@ import javax.json.JsonWriter; import javax.json.JsonWriterFactory; import javax.json.stream.JsonGenerationException; import javax.json.stream.JsonGenerator; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.StringWriter; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.HashMap; -import static org.junit.Assert.assertEquals; +import org.junit.Assert; +import org.junit.Test; public class JsonGeneratorImplTest { @Test + public void closeOnce() throws Throwable { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final JsonGenerator generator = Json.createGenerator(baos).writeStartObject().writeEnd(); + for (int i = 0; i < 10; i++) { + generator.close(); + assertEquals(1, getBufferSize(generator)); + } + } + + private int getBufferSize(final JsonGenerator generator) throws Throwable { + final Field bufferProvider = generator.getClass() + .getDeclaredField("bufferProvider"); + if (!bufferProvider.isAccessible()) { + bufferProvider.setAccessible(true); + } + final Object provider = bufferProvider.get(generator); + final Field queue = provider.getClass().getSuperclass().getDeclaredField("queue"); + if (!queue.isAccessible()) { + queue.setAccessible(true); + } + return Queue.class.cast(queue.get(provider)).size(); + } + + @Test public void notFluentGeneratorUsage() { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final JsonGenerator generator = Json.createGenerator(baos);
