You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rm...@apache.org on 2018/11/22 08:55:16 UTC

[1/2] johnzon git commit: JOHNZON-195: enhanced JsonWriterImplTest unit test to writer all kinds of values and fixed JsonGeneratorImpl accordingly.

Repository: johnzon
Updated Branches:
  refs/heads/master 78ad82adb -> 2893743f2


JOHNZON-195: enhanced JsonWriterImplTest unit test to writer all kinds of values and fixed JsonGeneratorImpl accordingly.


Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/54c0b11a
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/54c0b11a
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/54c0b11a

Branch: refs/heads/master
Commit: 54c0b11ab8d84fceff6547612d54b2849fecc3a6
Parents: 78ad82a
Author: Bernd Gutjahr <be...@hpe.com>
Authored: Thu Nov 22 08:08:17 2018 +0100
Committer: Bernd Gutjahr <be...@hpe.com>
Committed: Thu Nov 22 08:08:17 2018 +0100

----------------------------------------------------------------------
 .../apache/johnzon/core/JsonGeneratorImpl.java  | 16 ++--
 .../apache/johnzon/core/JsonWriterImplTest.java | 89 +++++++++++++++++++-
 2 files changed, 94 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/54c0b11a/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 ec303c5..49f52e1 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
@@ -376,42 +376,42 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
 
     @Override
     public JsonGenerator write(final String value) {
-        checkArray(false);
+        checkArray(true);
         writeValueAsJsonString(value);
         return this;
     }
 
     @Override
     public JsonGenerator write(final BigDecimal value) {
-        checkArray(false);
+        checkArray(true);
         writeValue(String.valueOf(value));
         return this;
     }
 
     @Override
     public JsonGenerator write(final BigInteger value) {
-        checkArray(false);
+        checkArray(true);
         writeValue(String.valueOf(value));
         return this;
     }
 
     @Override
     public JsonGenerator write(final int value) {
-        checkArray(false);
+        checkArray(true);
         writeValue(value);
         return this;
     }
 
     @Override
     public JsonGenerator write(final long value) {
-        checkArray(false);
+        checkArray(true);
         writeValue(value);
         return this;
     }
 
     @Override
     public JsonGenerator write(final double value) {
-        checkArray(false);
+        checkArray(true);
         checkDoubleRange(value);
         writeValue(String.valueOf(value));
         return this;
@@ -419,14 +419,14 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
 
     @Override
     public JsonGenerator write(final boolean value) {
-        checkArray(false);
+        checkArray(true);
         writeValue(String.valueOf(value));
         return this;
     }
 
     @Override
     public JsonGenerator writeNull() {
-        checkArray(false);
+        checkArray(true);
         writeValue(NULL);
         return this;
     }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/54c0b11a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonWriterImplTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonWriterImplTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonWriterImplTest.java
index d9b2ecd..f26b29d 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonWriterImplTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonWriterImplTest.java
@@ -21,22 +21,105 @@ package org.apache.johnzon.core;
 import static org.junit.Assert.assertEquals;
 
 import java.io.ByteArrayOutputStream;
+import java.math.BigDecimal;
 
 import javax.json.Json;
+import javax.json.JsonArrayBuilder;
 import javax.json.JsonObjectBuilder;
+import javax.json.JsonValue;
 import javax.json.JsonWriter;
 
 import org.junit.Test;
 
 public class JsonWriterImplTest {
     @Test
-    public void writer() {
+    public void objectWriter() {
         final ByteArrayOutputStream out = new ByteArrayOutputStream();
         final JsonWriter writer = Json.createWriter(out);
         final JsonObjectBuilder ob = Json.createObjectBuilder();
-        ob.add("a", new JsonStringImpl("b"));
+        ob.add("a", 123);
+        ob.add("b", new BigDecimal("234.567"));
+        ob.add("c", "string");
+        ob.add("d", JsonValue.TRUE);
+        ob.add("e", JsonValue.FALSE);
+        ob.add("f", JsonValue.NULL);
         writer.write(ob.build());
         writer.close();
-        assertEquals("{\"a\":\"b\"}", new String(out.toByteArray()));
+        assertEquals("{\"a\":123,\"b\":234.567,\"c\":\"string\",\"d\":true,\"e\":false,\"f\":null}",
+                     new String(out.toByteArray()));
+    }
+
+    @Test
+    public void arrayValueWriter() {
+        final ByteArrayOutputStream out = new ByteArrayOutputStream();
+        final JsonWriter writer = Json.createWriter(out);
+        final JsonArrayBuilder ab = Json.createArrayBuilder();
+        ab.add(123);
+        ab.add(new BigDecimal("234.567"));
+        ab.add("string");
+        ab.add(JsonValue.TRUE);
+        ab.add(JsonValue.FALSE);
+        ab.add(JsonValue.NULL);
+        writer.write(ab.build());
+        writer.close();
+        assertEquals("[123,234.567,\"string\",true,false,null]",
+                     new String(out.toByteArray()));
+    }
+
+    @Test
+    public void integralNumberValueWriter() {
+        final ByteArrayOutputStream out = new ByteArrayOutputStream();
+        final JsonWriter writer = Json.createWriter(out);
+        final JsonValue value = Json.createValue(123);
+        writer.write(value);
+        writer.close();
+        assertEquals("123", new String(out.toByteArray()));
+    }
+
+    @Test
+    public void nonIntegralNumberValueWriter() {
+        final ByteArrayOutputStream out = new ByteArrayOutputStream();
+        final JsonWriter writer = Json.createWriter(out);
+        final JsonValue value = Json.createValue(new BigDecimal("123.456"));
+        writer.write(value);
+        writer.close();
+        assertEquals("123.456", new String(out.toByteArray()));
+    }
+
+    @Test
+    public void stringValueWriter() {
+        final ByteArrayOutputStream out = new ByteArrayOutputStream();
+        final JsonWriter writer = Json.createWriter(out);
+        final JsonValue value = Json.createValue("test-value");
+        writer.write(value);
+        writer.close();
+        assertEquals("\"test-value\"", new String(out.toByteArray()));
+    }
+
+    @Test
+    public void nullValueWriter() {
+        final ByteArrayOutputStream out = new ByteArrayOutputStream();
+        final JsonWriter writer = Json.createWriter(out);
+        writer.write(JsonValue.NULL);
+        writer.close();
+        assertEquals("null", new String(out.toByteArray()));
+    }
+
+    @Test
+    public void trueValueWriter() {
+        final ByteArrayOutputStream out = new ByteArrayOutputStream();
+        final JsonWriter writer = Json.createWriter(out);
+        writer.write(JsonValue.TRUE);
+        writer.close();
+        assertEquals("true", new String(out.toByteArray()));
+    }
+
+    @Test
+    public void falseValueWriter() {
+        final ByteArrayOutputStream out = new ByteArrayOutputStream();
+        final JsonWriter writer = Json.createWriter(out);
+        writer.write(JsonValue.FALSE);
+        writer.close();
+        assertEquals("false", new String(out.toByteArray()));
     }
 }


[2/2] johnzon git commit: JOHNZON-195 ensure jsongenerator can write pritmitives directly (jsonp 1.1) and it still fails when it writes array items in an object

Posted by rm...@apache.org.
JOHNZON-195 ensure jsongenerator can write pritmitives directly (jsonp 1.1) and it still fails when it writes array items in an object


Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/2893743f
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/2893743f
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/2893743f

Branch: refs/heads/master
Commit: 2893743f2846e0e5983d4efb593492e6525ae058
Parents: 54c0b11
Author: Romain Manni-Bucau <rm...@gmail.com>
Authored: Thu Nov 22 09:55:02 2018 +0100
Committer: Romain Manni-Bucau <rm...@gmail.com>
Committed: Thu Nov 22 09:55:02 2018 +0100

----------------------------------------------------------------------
 .../johnzon/core/JsonGeneratorFactoryImpl.java  |  8 +-
 .../apache/johnzon/core/JsonGeneratorImpl.java  | 98 +++++++++-----------
 .../johnzon/core/JsonGeneratorImplTest.java     | 33 +++++++
 .../johnzon/core/TestJsonGeneratorFactory.java  |  5 +-
 4 files changed, 84 insertions(+), 60 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/2893743f/johnzon-core/src/main/java/org/apache/johnzon/core/JsonGeneratorFactoryImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonGeneratorFactoryImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonGeneratorFactoryImpl.java
index 92abbcd..8d1f6ec 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonGeneratorFactoryImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonGeneratorFactoryImpl.java
@@ -26,7 +26,6 @@ import java.nio.charset.Charset;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
-import java.util.concurrent.ConcurrentMap;
 
 import javax.json.stream.JsonGenerator;
 import javax.json.stream.JsonGeneratorFactory;
@@ -39,7 +38,6 @@ public class JsonGeneratorFactoryImpl extends AbstractJsonFactory implements Jso
         JsonGenerator.PRETTY_PRINTING, GENERATOR_BUFFER_LENGTH, BUFFER_STRATEGY
     );
     //key caching currently disabled
-    private final ConcurrentMap<String, String> cache = null;//new ConcurrentHashMap<String, String>();
     private final boolean pretty;
     private final BufferStrategy.BufferProvider<char[]> bufferProvider;
 
@@ -59,17 +57,17 @@ public class JsonGeneratorFactoryImpl extends AbstractJsonFactory implements Jso
 
     @Override
     public JsonGenerator createGenerator(final Writer writer) {
-        return new JsonGeneratorImpl(writer, bufferProvider, cache, pretty);
+        return new JsonGeneratorImpl(writer, bufferProvider, pretty);
     }
 
     @Override
     public JsonGenerator createGenerator(final OutputStream out) {
-        return new JsonGeneratorImpl(out, bufferProvider, cache, pretty);
+        return new JsonGeneratorImpl(out, bufferProvider, pretty);
     }
 
     @Override
     public JsonGenerator createGenerator(final OutputStream out, final Charset charset) {
-        return new JsonGeneratorImpl(out,charset, bufferProvider, cache, pretty);
+        return new JsonGeneratorImpl(out,charset, bufferProvider, pretty);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/johnzon/blob/2893743f/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 49f52e1..ce5e8b7 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
@@ -36,7 +36,6 @@ import java.math.BigInteger;
 import java.nio.charset.Charset;
 import java.util.Iterator;
 import java.util.Map;
-import java.util.concurrent.ConcurrentMap;
 
 class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
     private static final Charset UTF8_CHARSET = Charset.forName("UTF-8");
@@ -47,27 +46,31 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
     private int bufferPos = 0;
     private final boolean prettyPrint;
     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>();
 
     private enum GeneratorState {
-        INITIAL(false, true), START_OBJECT(true, false), IN_OBJECT(true, false), AFTER_KEY(false, true), START_ARRAY(false, true), IN_ARRAY(
-                false, true), END(false, false);
+        INITIAL(false, true, false), // nothing created yet
+        START_OBJECT(true, false, true), IN_OBJECT(true, false, true), AFTER_KEY(false, true, false), // object
+        START_ARRAY(false, true, true), IN_ARRAY(false, true, true), // array
+        END(false, false, false), // end of context
+        ROOT_VALUE(false, false, true); // direct primitive (added in jsonp 1.1, was not supported in 1.0)
 
         private final boolean acceptsKey;
         private final boolean acceptsValue;
+        private final boolean endable;
 
-        GeneratorState(final boolean acceptsKey, final boolean acceptsValue) {
+        GeneratorState(final boolean acceptsKey, final boolean acceptsValue, final boolean endable) {
             this.acceptsKey = acceptsKey;
             this.acceptsValue = acceptsValue;
+            this.endable = endable;
         }
     }
 
     JsonGeneratorImpl(final Writer writer, final BufferStrategy.BufferProvider<char[]> bufferProvider,
-            final ConcurrentMap<String, String> cache, final boolean prettyPrint) {
+                      final boolean prettyPrint) {
         this.writer = writer;
         //this.cache = cache;
         this.buffer = bufferProvider.newBuffer();
@@ -77,13 +80,13 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
     }
 
     JsonGeneratorImpl(final OutputStream out, final BufferStrategy.BufferProvider<char[]> bufferProvider,
-            final ConcurrentMap<String, String> cache, final boolean prettyPrint) {
-        this(new OutputStreamWriter(out, UTF8_CHARSET), bufferProvider, cache, prettyPrint);
+                      final boolean prettyPrint) {
+        this(new OutputStreamWriter(out, UTF8_CHARSET), bufferProvider, prettyPrint);
     }
 
     JsonGeneratorImpl(final OutputStream out, final Charset encoding, final BufferStrategy.BufferProvider<char[]> bufferProvider,
-            final ConcurrentMap<String, String> cache, final boolean prettyPrint) {
-        this(new OutputStreamWriter(out, encoding), bufferProvider, cache, prettyPrint);
+                      final boolean prettyPrint) {
+        this(new OutputStreamWriter(out, encoding), bufferProvider, prettyPrint);
     }
 
     private void writeEol() {
@@ -144,7 +147,7 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
 
     @Override
     public JsonGenerator writeStartObject(final String name) {
-        checkObject(false);
+        checkObject();
         writeKey(name);
         justWrite(START_OBJECT_CHAR);
         writeEol();
@@ -166,7 +169,7 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
 
     @Override
     public JsonGenerator writeStartArray(final String name) {
-        checkObject(false);
+        checkObject();
         writeKey(name);
         justWrite(START_ARRAY_CHAR);
         writeEol();
@@ -176,7 +179,7 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
     }
 
     private void writeJsonValue(final String name, final JsonValue value) {
-        checkObject(false);
+        checkObject();
         //TODO check null handling
         switch (value.getValueType()) {
             case ARRAY:
@@ -227,7 +230,7 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
     }
 
     private void writeJsonValue(final JsonValue value) {
-        checkArray(true);
+        checkArray();
         //TODO check null handling
         switch (value.getValueType()) {
             case ARRAY:
@@ -279,14 +282,14 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
 
     @Override
     public JsonGenerator write(final String name, final JsonValue value) {
-        checkObject(false);
+        checkObject();
         writeJsonValue(name, value);
         return this;
     }
 
     @Override
     public JsonGenerator write(final String name, final String value) {
-        checkObject(false);
+        checkObject();
         writeKey(name);
         writeValueAsJsonString(value);
         return this;
@@ -294,7 +297,7 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
 
     @Override
     public JsonGenerator write(final String name, final BigInteger value) {
-        checkObject(false);
+        checkObject();
         writeKey(name);
         writeValue(String.valueOf(value));
         return this;
@@ -302,7 +305,7 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
 
     @Override
     public JsonGenerator write(final String name, final BigDecimal value) {
-        checkObject(false);
+        checkObject();
         writeKey(name);
         writeValue(String.valueOf(value));
         return this;
@@ -310,7 +313,7 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
 
     @Override
     public JsonGenerator write(final String name, final int value) {
-        checkObject(false);
+        checkObject();
         writeKey(name);
         writeValue(value);
         return this;
@@ -318,7 +321,7 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
 
     @Override
     public JsonGenerator write(final String name, final long value) {
-        checkObject(false);
+        checkObject();
         writeKey(name);
         writeValue(value);
         return this;
@@ -326,7 +329,7 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
 
     @Override
     public JsonGenerator write(final String name, final double value) {
-        checkObject(false);
+        checkObject();
         checkDoubleRange(value);
         writeKey(name);
         writeValue(String.valueOf(value));
@@ -335,7 +338,7 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
 
     @Override
     public JsonGenerator write(final String name, final boolean value) {
-        checkObject(false);
+        checkObject();
         writeKey(name);
         writeValue(String.valueOf(value));
         return this;
@@ -343,7 +346,7 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
 
     @Override
     public JsonGenerator writeNull(final String name) {
-        checkObject(false);
+        checkObject();
         writeKey(name);
         writeValue(NULL);
         return this;
@@ -351,8 +354,10 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
 
     @Override
     public JsonGenerator writeEnd() {
-        checkArrayOrObject(false);
         final GeneratorState last = state.pop();
+        if (last == null || !last.endable) {
+            throw new JsonGenerationException("Can't end current context: " + last);
+        }
         depth--;
         if (last != GeneratorState.START_ARRAY) {
             writeEol();
@@ -360,7 +365,7 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
         writeIndent();
         if (last == GeneratorState.IN_ARRAY || last == GeneratorState.START_ARRAY) {
             justWrite(END_ARRAY_CHAR);
-        } else {
+        } else if (last != GeneratorState.ROOT_VALUE) {
             justWrite(END_OBJECT_CHAR);
         }
         alignState();
@@ -369,49 +374,49 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
 
     @Override
     public JsonGenerator write(final JsonValue value) {
-        checkArray(true);
+        checkArray();
         writeJsonValue(value);
         return this;
     }
 
     @Override
     public JsonGenerator write(final String value) {
-        checkArray(true);
+        checkArray();
         writeValueAsJsonString(value);
         return this;
     }
 
     @Override
     public JsonGenerator write(final BigDecimal value) {
-        checkArray(true);
+        checkArray();
         writeValue(String.valueOf(value));
         return this;
     }
 
     @Override
     public JsonGenerator write(final BigInteger value) {
-        checkArray(true);
+        checkArray();
         writeValue(String.valueOf(value));
         return this;
     }
 
     @Override
     public JsonGenerator write(final int value) {
-        checkArray(true);
+        checkArray();
         writeValue(value);
         return this;
     }
 
     @Override
     public JsonGenerator write(final long value) {
-        checkArray(true);
+        checkArray();
         writeValue(value);
         return this;
     }
 
     @Override
     public JsonGenerator write(final double value) {
-        checkArray(true);
+        checkArray();
         checkDoubleRange(value);
         writeValue(String.valueOf(value));
         return this;
@@ -419,14 +424,14 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
 
     @Override
     public JsonGenerator write(final boolean value) {
-        checkArray(true);
+        checkArray();
         writeValue(String.valueOf(value));
         return this;
     }
 
     @Override
     public JsonGenerator writeNull() {
-        checkArray(true);
+        checkArray();
         writeValue(NULL);
         return this;
     }
@@ -457,7 +462,8 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
             return;
         }
         try {
-            if (currentState() != GeneratorState.END) {
+            final GeneratorState state = currentState();
+            if (state != GeneratorState.END && state != GeneratorState.ROOT_VALUE) {
                 throw new JsonGenerationException("Invalid json");
             }
         } finally {
@@ -603,34 +609,22 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
         buffer[bufferPos++] = value;
     }
 
-    private void checkObject(final boolean allowInitial) {
+    private void checkObject() {
         final GeneratorState currentState = currentState();
         if (currentState != GeneratorState.IN_OBJECT && currentState != GeneratorState.START_OBJECT) {
-            if (!allowInitial || currentState != GeneratorState.INITIAL) {
-                throw new JsonGenerationException("write(name, param) is only valid in objects");
-            }
+            throw new JsonGenerationException("write(name, param) is only valid in objects");
         }
     }
 
-    private void checkArray(final boolean allowInitial) {
+    private void checkArray() {
         final GeneratorState currentState = currentState();
         if (currentState != GeneratorState.IN_ARRAY && currentState != GeneratorState.START_ARRAY) {
-            if (!allowInitial || currentState != GeneratorState.INITIAL) {
+            if (currentState != GeneratorState.INITIAL) {
                 throw new JsonGenerationException("write(param) is only valid in arrays");
             }
         }
     }
 
-    private void checkArrayOrObject(final boolean allowInitial) {
-        final GeneratorState currentState = currentState();
-        if (currentState != GeneratorState.IN_ARRAY && currentState != GeneratorState.START_ARRAY
-                && currentState != GeneratorState.IN_OBJECT && currentState != GeneratorState.START_OBJECT) {
-            if (!allowInitial || currentState != GeneratorState.INITIAL) {
-                throw new JsonGenerationException("only valid within array or object");
-            }
-        }
-    }
-
     private static void checkDoubleRange(final double value) {
         if (Double.isInfinite(value) || Double.isNaN(value)) {
             throw new NumberFormatException("double can't be infinite or NaN");
@@ -661,7 +655,7 @@ class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
                 swapState(GeneratorState.IN_OBJECT);
                 break;
             case INITIAL:
-                swapState(GeneratorState.END);
+                state.push(GeneratorState.ROOT_VALUE);
                 break;
             default:
         }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/2893743f/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 e373f41..b359e20 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
@@ -441,4 +441,37 @@ public class JsonGeneratorImplTest {
 
         assertEquals("{\n" + "  \"firstName\":\"John\"\n" + "}", buffer.toString());
     }
+
+    @Test(expected = JsonGenerationException.class)
+    public void errorWhenWritingValueInObject() {
+        Json.createGenerator(new StringWriter()).writeStartObject().write(1);
+    }
+
+    @Test
+    public void writeNumber() {
+        {
+            final StringWriter writer = new StringWriter();
+            Json.createGenerator(writer).write(1).writeEnd().close();
+            assertEquals("1", writer.toString());
+        }
+        {
+            final StringWriter writer = new StringWriter();
+            Json.createGenerator(writer).write(1).close();
+            assertEquals("1", writer.toString());
+        }
+    }
+
+    @Test
+    public void writeBoolean() {
+        {
+            final StringWriter writer = new StringWriter();
+            Json.createGenerator(writer).write(true).writeEnd().close();
+            assertEquals("true", writer.toString());
+        }
+        {
+            final StringWriter writer = new StringWriter();
+            Json.createGenerator(writer).write(true).close();
+            assertEquals("true", writer.toString());
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/2893743f/johnzon-mapper/src/test/java/org/apache/johnzon/core/TestJsonGeneratorFactory.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/core/TestJsonGeneratorFactory.java b/johnzon-mapper/src/test/java/org/apache/johnzon/core/TestJsonGeneratorFactory.java
index 363a86d..3380b82 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/core/TestJsonGeneratorFactory.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/core/TestJsonGeneratorFactory.java
@@ -21,7 +21,6 @@ package org.apache.johnzon.core;
 import javax.json.stream.JsonGenerator;
 import java.io.Writer;
 import java.util.Collections;
-import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * This class is only used for {@link org.apache.johnzon.mapper.JsonGeneratorCloseTest}.
@@ -36,13 +35,13 @@ import java.util.concurrent.ConcurrentHashMap;
 public class TestJsonGeneratorFactory extends JsonGeneratorFactoryImpl {
 
     public TestJsonGeneratorFactory() {
-        super(Collections.<String, Object>emptyMap());
+        super(Collections.emptyMap());
     }
 
 
     @Override
     public JsonGenerator createGenerator(Writer writer) {
-        return new JsonGeneratorImpl(writer, TestBufferProvider.INSTANCE, new ConcurrentHashMap<String, String>(0), false);
+        return new JsonGeneratorImpl(writer, TestBufferProvider.INSTANCE, false);
     }
 
 }