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

Reply via email to