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/master 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]";
