JOHNZON-367 Reduce calls to flush() to the bare minimum
Call flush only before snippet.terminate() and snippet.get()
Reduce calls to snippet.terminate() to only what is needed
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/Snippet.java b/johnzon-core/src/main/java/org/apache/johnzon/core/Snippet.java
index d8ae7ec..9903331 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/Snippet.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/Snippet.java
@@ -131,7 +131,7 @@
         }
 
         private void write(final JsonValue value) {
-            if (snippet.terminate()) {
+            if (terminate()) {
                 return;
             }
 
@@ -146,98 +146,79 @@
                 }
                 default: {
                     generator.write(value);
-                    generator.flush();
                 }
             }
         }
 
         private void write(final JsonArray array) {
-            if (snippet.terminate()) {
-                return;
-            }
-
             if (array.isEmpty()) {
                 generator.write(array);
-                generator.flush();
                 return;
             }
 
             generator.writeStartArray();
-            generator.flush();
             for (final JsonValue jsonValue : array) {
-                if (snippet.terminate()) {
+                if (terminate()) {
                     break;
                 }
                 write(jsonValue);
             }
             generator.writeEnd();
-            generator.flush();
         }
 
         private void write(final JsonObject object) {
-            if (snippet.terminate()) {
-                return;
-            }
-
             if (object.isEmpty()) {
                 generator.write(object);
-                generator.flush();
                 return;
             }
 
             generator.writeStartObject();
-            generator.flush();
             for (final Map.Entry<String, JsonValue> entry : object.entrySet()) {
-                if (snippet.terminate()) {
+                if (terminate()) {
                     break;
                 }
                 write(entry.getKey(), entry.getValue());
             }
             generator.writeEnd();
-            generator.flush();
         }
 
         private void write(final String name, final JsonValue value) {
-            if (snippet.terminate()) {
-                return;
-            }
-
             switch (value.getValueType()) {
                 case ARRAY:
                     generator.writeStartArray(name);
-                    generator.flush();
                     final JsonArray array = value.asJsonArray();
                     for (final JsonValue jsonValue : array) {
-                        if (snippet.terminate()) {
+                        if (terminate()) {
                             break;
                         }
                         write(jsonValue);
                     }
                     generator.writeEnd();
-                    generator.flush();
 
                     break;
                 case OBJECT:
                     generator.writeStartObject(name);
-                    generator.flush();
                     final JsonObject object = value.asJsonObject();
                     for (final Map.Entry<String, JsonValue> keyval : object.entrySet()) {
-                        if (snippet.terminate()) {
+                        if (terminate()) {
                             break;
                         }
                         write(keyval.getKey(), keyval.getValue());
                     }
                     generator.writeEnd();
-                    generator.flush();
 
                     break;
                 default: {
                     generator.write(name, value);
-                    generator.flush();
                 }
             }
         }
 
+        private boolean terminate() {
+            generator.flush();
+            return snippet.terminate();
+        }
+
         private String get() {
             generator.flush();
             return snippet.isTruncated() ? snippet.get() + "..." : snippet.get();