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 3f684d3  JOHNZON-269 ensure JsonWriter#close is not implicit
3f684d3 is described below

commit 3f684d3df85ee6b0511996d6525190290855965a
Author: Romain Manni-Bucau <[email protected]>
AuthorDate: Sun Aug 18 20:50:20 2019 +0200

    JOHNZON-269 ensure JsonWriter#close is not implicit
---
 .../org/apache/johnzon/core/JsonGeneratorImpl.java | 30 +++++++------
 .../org/apache/johnzon/core/JsonWriterImpl.java    | 50 ++++++++++------------
 .../org/apache/johnzon/core/JsonPatchTest.java     |  8 +++-
 .../java/org/apache/johnzon/core/OverflowTest.java |  1 +
 4 files changed, 47 insertions(+), 42 deletions(-)

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 ae481ac..6730ec7 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
@@ -461,21 +461,27 @@ class JsonGeneratorImpl implements JsonGenerator, 
JsonChars, Serializable {
         if (closed) {
             return;
         }
+        JsonGenerationException ex = null;
+        final GeneratorState state = currentState();
+        if (state != GeneratorState.END && state != GeneratorState.ROOT_VALUE) 
{
+            ex = new JsonGenerationException("Invalid json");
+        }
         try {
-            final GeneratorState state = currentState();
-            if (state != GeneratorState.END && state != 
GeneratorState.ROOT_VALUE) {
-                throw new JsonGenerationException("Invalid json");
+            if (ex == null) {
+                flushBuffer();
             }
-        } finally {
-            flushBuffer();
-            try {
-                writer.close();
-            } catch (final IOException e) {
-                throw new JsonException(e.getMessage(), e);
-            } finally {
-                closed = true;
-                bufferProvider.release(buffer);
+            writer.close();
+        } catch (final IOException e) {
+            if (ex != null) {
+                throw ex;
             }
+            throw new JsonException(e.getMessage(), e);
+        } finally {
+            closed = true;
+            bufferProvider.release(buffer);
+        }
+        if (ex != null) {
+            throw ex;
         }
     }
 
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonWriterImpl.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonWriterImpl.java
index 2577f1f..f17e3f8 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonWriterImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonWriterImpl.java
@@ -18,16 +18,18 @@
  */
 package org.apache.johnzon.core;
 
+import java.io.Serializable;
+
 import javax.json.JsonArray;
 import javax.json.JsonObject;
 import javax.json.JsonStructure;
 import javax.json.JsonValue;
 import javax.json.JsonWriter;
 import javax.json.stream.JsonGenerator;
-import java.io.Serializable;
 
 class JsonWriterImpl implements JsonWriter, Serializable {
     private final JsonGenerator generator;
+    private boolean called = false;
     private boolean closed = false;
 
     JsonWriterImpl(final JsonGenerator generator) {
@@ -36,55 +38,47 @@ class JsonWriterImpl implements JsonWriter, Serializable {
 
     @Override
     public void writeArray(final JsonArray array) {
-        checkClosed();
-        try {
-            generator.write(array);
-        } finally {
-            close();
-        }
+        checkState();
+        generator.write(array);
+        markCalled();
     }
 
     @Override
     public void writeObject(final JsonObject object) {
-        checkClosed();
-        try {
-            generator.write(object);
-        } finally {
-            close();
-        }
+        checkState();
+        generator.write(object);
+        markCalled();
     }
 
     @Override
     public void write(final JsonValue value) {
-        checkClosed();
-        try {
-            generator.write(value);
-        } finally {
-            close();
-        }
+        checkState();
+        generator.write(value);
+        markCalled();
     }
 
     @Override
     public void write(final JsonStructure value) {
-        checkClosed();
-        try {
-            generator.write(value);
-        } finally {
-            close();
-        }
+        checkState();
+        generator.write(value);
+        markCalled();
     }
 
     @Override
     public void close() {
-
         if (!closed) {
             closed = true;
             generator.close();
         }
     }
 
-    private void checkClosed() {
-        if (closed) {
+    private void markCalled() {
+        generator.flush();
+        called = true;
+    }
+
+    private void checkState() {
+        if (closed || called) {
             throw new IllegalStateException("writeArray(), writeObject(), 
write() or close() method was already called");
         }
 
diff --git 
a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchTest.java 
b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchTest.java
index ade393a..e579e5b 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchTest.java
@@ -29,10 +29,12 @@ import javax.json.JsonObject;
 import javax.json.JsonPatch;
 import javax.json.JsonStructure;
 import javax.json.JsonValue;
+import javax.json.JsonWriter;
 import javax.json.spi.JsonProvider;
 
 import java.io.StringReader;
 import java.io.StringWriter;
+import java.io.Writer;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -998,8 +1000,10 @@ public class JsonPatchTest {
 
 
     private static String toJsonString(JsonStructure value) {
-        StringWriter writer = new StringWriter();
-        Json.createWriter(writer).write(value);
+        final Writer writer = new StringWriter();
+        try (final JsonWriter jsonWriter = Json.createWriter(writer)) {
+            jsonWriter.write(value);
+        }
         return writer.toString();
     }
 
diff --git 
a/johnzon-core/src/test/java/org/apache/johnzon/core/OverflowTest.java 
b/johnzon-core/src/test/java/org/apache/johnzon/core/OverflowTest.java
index c097703..47652e4 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/OverflowTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/OverflowTest.java
@@ -76,6 +76,7 @@ public class OverflowTest {
             arrayBuilder.add("0123456789012345-" + i);
         }
         writer.writeArray(arrayBuilder.build());
+        writer.close();
 
         String json = sw.toString();
         System.out.println("Created a JSON of size " + json.length() + " 
bytes");

Reply via email to