JOHNZON-96 new JsonObjectBuilder features from JSON-P-1.1

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

Branch: refs/heads/JSONP-1.1
Commit: 4b20eaf9ba1bfe033101ddf12fa37f26c904f1ac
Parents: c62932b
Author: Mark Struberg <[email protected]>
Authored: Thu Feb 23 16:40:32 2017 +0100
Committer: Mark Struberg <[email protected]>
Committed: Thu Feb 23 16:40:32 2017 +0100

----------------------------------------------------------------------
 .../johnzon/core/JsonBuilderFactoryImpl.java    |  4 ++
 .../johnzon/core/JsonObjectBuilderImpl.java     | 62 +++++++++++-----
 .../apache/johnzon/core/JsonProviderImpl.java   | 12 +++-
 .../org/apache/johnzon/core/SimpleStack.java    |  4 +-
 .../johnzon/core/JsonObjectBuilderImplTest.java | 76 +++++++++++++++++++-
 .../apache/johnzon/core/JsonReaderImplTest.java |  4 +-
 6 files changed, 139 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/4b20eaf9/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java
----------------------------------------------------------------------
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java
 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java
index c91014d..6f1f9ba 100644
--- 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java
+++ 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java
@@ -77,4 +77,8 @@ class JsonBuilderFactoryImpl implements JsonBuilderFactory {
     public Map<String, ?> getConfigInUse() {
         return Collections.unmodifiableMap(internalConfig);
     }
+
+    public JsonObjectBuilder createObjectBuilder(Map<String, Object> 
initialValues) {
+        return new JsonObjectBuilderImpl(initialValues);
+    }
 }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/4b20eaf9/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
----------------------------------------------------------------------
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
index 17cfe17..d6e8a48 100644
--- 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
+++ 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
@@ -19,6 +19,7 @@
 package org.apache.johnzon.core;
 
 import javax.json.JsonArrayBuilder;
+import javax.json.JsonException;
 import javax.json.JsonObject;
 import javax.json.JsonObjectBuilder;
 import javax.json.JsonValue;
@@ -30,16 +31,50 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 
 class JsonObjectBuilderImpl implements JsonObjectBuilder, Serializable {
-    private Map<String, JsonValue> tmpMap;
+    private Map<String, JsonValue> attributeMap = new LinkedHashMap<>();
 
     public JsonObjectBuilderImpl() {
     }
 
     public JsonObjectBuilderImpl(JsonObject initialData) {
-        tmpMap = new LinkedHashMap<>(initialData);
+        attributeMap = new LinkedHashMap<>(initialData);
+    }
+
+    public JsonObjectBuilderImpl(Map<String, Object> initialValues) {
+        this();
+        for (Map.Entry<String, Object> entry : initialValues.entrySet()) {
+            add(entry.getKey(), entry.getValue());
+        }
     }
 
 
+    /**
+     * Internal method to add a value where we do not yet know the type at 
compile time.
+     */
+    public void add(final String name, final Object value) {
+        if (value instanceof JsonValue) {
+            add(name, (JsonValue) value);
+        } else if (value instanceof BigDecimal) {
+            add(name, (BigDecimal) value);
+        } else if (value instanceof BigInteger) {
+            add(name, (BigInteger) value);
+        } else if (value instanceof Boolean) {
+            add(name, (boolean) value);
+        } else if (value instanceof Double) {
+            add(name, (double) value);
+        } else if (value instanceof Integer) {
+            add(name, (int) value);
+        } else if (value instanceof Long) {
+            add(name, (long) value);
+        } else if (value instanceof String) {
+            add(name, (String) value);
+        } else if (value == null) {
+            addNull(name);
+        } else {
+            throw new JsonException("Illegal JSON type! name=" + name + " 
type=" + value.getClass());
+        }
+    }
+
     @Override
     public JsonObjectBuilder add(final String name, final JsonValue value) {
         putValue(name, value);
@@ -108,40 +143,35 @@ class JsonObjectBuilderImpl implements JsonObjectBuilder, 
Serializable {
 
     @Override
     public JsonObjectBuilder addAll(JsonObjectBuilder builder) {
-        tmpMap.putAll(builder.build());
+        if (builder instanceof JsonObjectBuilderImpl) {
+            attributeMap.putAll(builder.build());
+        }
         return this;
     }
 
     @Override
     public JsonObjectBuilder remove(String name) {
-        tmpMap.remove(name);
+        attributeMap.remove(name);
         return this;
     }
 
     private void putValue(String name, JsonValue value){
         if(name == null || value == null) {
-            throw npe();
+            throw new NullPointerException("name or value/builder must not be 
null");
         }
         
-        if(tmpMap==null){
-            tmpMap = new LinkedHashMap<>();
-        }
-        
-        tmpMap.put(name, value);
+        attributeMap.put(name, value);
     }
     
-    private static NullPointerException npe() {
-        return new NullPointerException("name or value/builder must not be 
null");
-    }
 
     @Override
     public JsonObject build() {
         
-        if(tmpMap==null) {
+        if(attributeMap ==null) {
             return new JsonObjectImpl(Collections.EMPTY_MAP);
         } else {
-            Map<String, JsonValue> dump = 
(Collections.unmodifiableMap(tmpMap));
-            tmpMap=null;
+            Map<String, JsonValue> dump = 
(Collections.unmodifiableMap(attributeMap));
+            attributeMap =null;
             return new JsonObjectImpl(dump);
         }
         

http://git-wip-us.apache.org/repos/asf/johnzon/blob/4b20eaf9/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java
----------------------------------------------------------------------
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java
index 0eeef2c..de18839 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java
@@ -219,7 +219,7 @@ public class JsonProviderImpl extends JsonProvider 
implements Serializable {
         private final JsonParserFactory parserFactory = new 
JsonParserFactoryImpl(null);
         private final JsonGeneratorFactory generatorFactory = new 
JsonGeneratorFactoryImpl(null);
         private final JsonWriterFactory writerFactory = new 
JsonWriterFactoryImpl(null);
-        private final JsonBuilderFactory builderFactory = new 
JsonBuilderFactoryImpl(null);
+        private final JsonBuilderFactoryImpl builderFactory = new 
JsonBuilderFactoryImpl(null);
 
         @Override
         public JsonParser createParser(final InputStream in) {
@@ -287,6 +287,16 @@ public class JsonProviderImpl extends JsonProvider 
implements Serializable {
         }
 
         @Override
+        public JsonObjectBuilder createObjectBuilder(JsonObject jsonObject) {
+            return builderFactory.createObjectBuilder(jsonObject);
+        }
+
+        @Override
+        public JsonObjectBuilder createObjectBuilder(Map<String, Object> 
initialValues) {
+            return builderFactory.createObjectBuilder(initialValues);
+        }
+
+        @Override
         public JsonArrayBuilder createArrayBuilder() {
             return builderFactory.createArrayBuilder();
         }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/4b20eaf9/johnzon-core/src/main/java/org/apache/johnzon/core/SimpleStack.java
----------------------------------------------------------------------
diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/SimpleStack.java 
b/johnzon-core/src/main/java/org/apache/johnzon/core/SimpleStack.java
index e72540c..74bd14f 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/SimpleStack.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/SimpleStack.java
@@ -53,8 +53,8 @@ class SimpleStack<T> {
 
         }
 
-        Element<T> previous;
-        T payload;
+        private Element<T> previous;
+        private T payload;
 
     }
 

http://git-wip-us.apache.org/repos/asf/johnzon/blob/4b20eaf9/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectBuilderImplTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectBuilderImplTest.java
 
b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectBuilderImplTest.java
index 098967e..1ba9348 100644
--- 
a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectBuilderImplTest.java
+++ 
b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectBuilderImplTest.java
@@ -18,18 +18,90 @@
  */
 package org.apache.johnzon.core;
 
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.HashMap;
+import java.util.Map;
+
 import static org.junit.Assert.assertEquals;
 
 import javax.json.Json;
+import javax.json.JsonObject;
 import javax.json.JsonObjectBuilder;
+import javax.json.JsonValue;
 
+import org.junit.Assert;
 import org.junit.Test;
 
 public class JsonObjectBuilderImplTest {
     @Test
-    public void build() {
+    public void testBuild() {
         final JsonObjectBuilder builder = Json.createObjectBuilder();
         builder.add("a", "b");
-        assertEquals("{\"a\":\"b\"}", builder.build().toString());
+        JsonObject jsonObject = builder.build();
+        assertEquals("{\"a\":\"b\"}", jsonObject.toString());
+
+        JsonObjectBuilder anotherBuilder = 
Json.createObjectBuilder(jsonObject);
+        anotherBuilder.add("c", "d");
+        assertEquals("{\"a\":\"b\",\"c\":\"d\"}", 
anotherBuilder.build().toString());
+    }
+
+    @Test
+    public void testCreateObjectBuilderWithMapFlatItems() {
+        Map<String, Object> jsonItems = new HashMap<>();
+
+        {
+            // build up the items
+            jsonItems.put("bigDecimalVal", new BigDecimal(1234567.89));
+            jsonItems.put("bigIntegerVal", BigInteger.valueOf(54321L));
+            jsonItems.put("booleanVal", true);
+            jsonItems.put("doubleVal", 1234567.89d);
+            jsonItems.put("intVal", 4711);
+            jsonItems.put("jsonValueVal", JsonValue.FALSE);
+            jsonItems.put("longVal", 123_456_789L);
+            jsonItems.put("stringVal", "b");
+            jsonItems.put("nullVal", null);
+
+            // there are 9 addXxxx methods with types in JsonObjectBuilder
+            // ensure we have all of them covered
+            // we do not have items with JsonObjectBuilder and 
JsonArrayBuilder itself
+            Assert.assertEquals(9, jsonItems.size());
+        }
+
+        JsonObjectBuilder builder = Json.createObjectBuilder(jsonItems);
+        JsonObject jsonObject = builder.build();
+
+        Assert.assertEquals(new BigDecimal(1234567.89), 
jsonObject.getJsonNumber("bigDecimalVal").bigDecimalValue());
+        Assert.assertEquals(BigInteger.valueOf(54321L), 
jsonObject.getJsonNumber("bigIntegerVal").bigIntegerValue());
+        Assert.assertEquals(true, jsonObject.getBoolean("booleanVal"));
+        Assert.assertEquals(1234567.89d, 
jsonObject.getJsonNumber("doubleVal").doubleValue(), 0.01d);
+        Assert.assertEquals(4711, jsonObject.getInt("intVal"));
+        Assert.assertEquals(JsonValue.FALSE, jsonObject.get("jsonValueVal"));
+        Assert.assertEquals(123_456_789L, 
jsonObject.getJsonNumber("longVal").longValue());
+        Assert.assertEquals("b", jsonObject.getString("stringVal"));
+        Assert.assertEquals(true, jsonObject.isNull("nullVal"));
+    }
+
+    @Test
+    public void testAddAll() {
+        final JsonObjectBuilder builder = Json.createObjectBuilder();
+        builder.add("a", "b");
+        builder.add("c", "d");
+
+        final JsonObjectBuilder anotherBuilder = Json.createObjectBuilder();
+        anotherBuilder.addAll(builder);
+
+        assertEquals("{\"a\":\"b\",\"c\":\"d\"}", 
anotherBuilder.build().toString());
+    }
+
+    @Test
+    public void testRemove() {
+        final JsonObjectBuilder builder = Json.createObjectBuilder();
+        builder.add("a", "b");
+        builder.add("c", "d");
+
+        builder.remove("a");
+
+        assertEquals("{\"c\":\"d\"}", builder.build().toString());
     }
 }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/4b20eaf9/johnzon-core/src/test/java/org/apache/johnzon/core/JsonReaderImplTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonReaderImplTest.java 
b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonReaderImplTest.java
index e9d3d74..21bb463 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonReaderImplTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonReaderImplTest.java
@@ -474,7 +474,7 @@ public class JsonReaderImplTest {
     public void testGrowingString() throws Throwable {
         JsonReaderFactory factory = Json.createReaderFactory(null);
         StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < 40000; i++) {
+        for (int i = 0; i < 10000; i++) {
             sb.append('x');
             String growingString = sb.toString();
             String str = "[4, \"\", \"" + growingString + "\", \"\", \"" + 
growingString + "\", \"\", 400]";
@@ -507,7 +507,7 @@ public class JsonReaderImplTest {
             JsonReaderFactory factory = Json.createReaderFactory(config);
 
             StringBuilder sb = new StringBuilder();
-            for (int i = 0; i < 1000; i++) {
+            for (int i = 0; i < 100; i++) {
                 sb.append('x');
                 String name = sb.toString();
                 String str = "[4, \"\", \"" + name + "\", \"\", \"" + name + 
"\", \"\", 400]";

Reply via email to