first implementation version
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java
index 60ede7e..bfdab90 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java
@@ -111,6 +111,31 @@
tmpList.add(value);
}
+
+
+ private void addValue(int index, JsonValue value){
+ if (value == null) {
+ throw npe();
+ }
+
+ if(tmpList==null){
+ tmpList=new ArrayList<JsonValue>();
+ }
+
+ tmpList.add(index, value);
+ }
+
+ private void setValue(int index, JsonValue value){
+ if (value == null) {
+ throw npe();
+ }
+
+ if(tmpList==null){
+ tmpList=new ArrayList<JsonValue>();
+ }
+
+ tmpList.set(index, value);
+ }
@Override
public JsonArray build() {
@@ -130,146 +155,149 @@
}
@Override
- public JsonArrayBuilder addAll(JsonArrayBuilder builder) {
- tmpList.addAll(builder.build()); //TODO is it ok to call build() here and destry the builder?
+ public JsonArrayBuilder addAll(JsonArrayBuilder builder) {
+ addValue(builder.build()); //TODO is it ok to call build() here and destry the builder?
return this;
}
@Override
public JsonArrayBuilder add(int index, JsonValue value) {
- tmpList.add(index, value);
+ addValue(index, value);
return this;
}
@Override
public JsonArrayBuilder add(int index, String value) {
- tmpList.add(index, Json.createValue(value));
+ addValue(index, Json.createValue(value));
return this;
}
@Override
public JsonArrayBuilder add(int index, BigDecimal value) {
- tmpList.add(index, Json.createValue(value));
+ addValue(index, Json.createValue(value));
return this;
}
@Override
public JsonArrayBuilder add(int index, BigInteger value) {
- tmpList.add(index, Json.createValue(value));
+ addValue(index, Json.createValue(value));
return this;
}
@Override
public JsonArrayBuilder add(int index, int value) {
- tmpList.add(index, Json.createValue(value));
+ addValue(index, Json.createValue(value));
return this;
}
@Override
public JsonArrayBuilder add(int index, long value) {
- tmpList.add(index, Json.createValue(value));
+ addValue(index, Json.createValue(value));
return this;
}
@Override
public JsonArrayBuilder add(int index, double value) {
- tmpList.add(index, Json.createValue(value));
+ addValue(index, Json.createValue(value));
return this;
}
@Override
public JsonArrayBuilder add(int index, boolean value) {
- tmpList.add(index, value?JsonValue.TRUE:JsonValue.FALSE);
+ addValue(index, value?JsonValue.TRUE:JsonValue.FALSE);
return this;
}
@Override
public JsonArrayBuilder addNull(int index) {
- tmpList.add(index, JsonValue.NULL);
+ addValue(index, JsonValue.NULL);
return this;
}
@Override
public JsonArrayBuilder add(int index, JsonObjectBuilder builder) {
- tmpList.add(index, builder.build()); //TODO ok to call build()?
+ addValue(index, builder.build()); //TODO ok to call build()?
return this;
}
@Override
public JsonArrayBuilder add(int index, JsonArrayBuilder builder) {
- tmpList.add(index, builder.build()); //TODO ok to call build()?
+ addValue(index, builder.build()); //TODO ok to call build()?
return this;
}
@Override
public JsonArrayBuilder set(int index, JsonValue value) {
- tmpList.set(index, value);
+ setValue(index, value);
return this;
}
@Override
public JsonArrayBuilder set(int index, String value) {
- tmpList.set(index, Json.createValue(value));
+ setValue(index, Json.createValue(value));
return this;
}
@Override
public JsonArrayBuilder set(int index, BigDecimal value) {
- tmpList.set(index, Json.createValue(value));
+ setValue(index, Json.createValue(value));
return this;
}
@Override
public JsonArrayBuilder set(int index, BigInteger value) {
- tmpList.set(index, Json.createValue(value));
+ setValue(index, Json.createValue(value));
return this;
}
@Override
public JsonArrayBuilder set(int index, int value) {
- tmpList.set(index, Json.createValue(value));
+ setValue(index, Json.createValue(value));
return this;
}
@Override
public JsonArrayBuilder set(int index, long value) {
- tmpList.set(index, Json.createValue(value));
+ setValue(index, Json.createValue(value));
return this;
}
@Override
public JsonArrayBuilder set(int index, double value) {
- tmpList.set(index, Json.createValue(value));
+ setValue(index, Json.createValue(value));
return this;
}
@Override
public JsonArrayBuilder set(int index, boolean value) {
- tmpList.set(index, value?JsonValue.TRUE:JsonValue.FALSE);
+ setValue(index, value?JsonValue.TRUE:JsonValue.FALSE);
return this;
}
@Override
public JsonArrayBuilder setNull(int index) {
- tmpList.set(index, JsonValue.NULL);
+ setValue(index, JsonValue.NULL);
return this;
}
@Override
public JsonArrayBuilder set(int index, JsonObjectBuilder builder) {
- tmpList.set(index, builder.build()); //TODO ok here to call build?
+ setValue(index, builder.build()); //TODO ok here to call build?
return this;
}
@Override
public JsonArrayBuilder set(int index, JsonArrayBuilder builder) {
- tmpList.set(index, builder.build()); //TODO ok here to call build?
+ setValue(index, builder.build()); //TODO ok here to call build?
return this;
}
@Override
public JsonArrayBuilder remove(int index) {
+
+ if(tmpList == null) return this;
+
tmpList.remove(index);
return this;
}
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
index fa54d07..40dd0a2 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
@@ -24,6 +24,7 @@
import javax.json.JsonObjectBuilder;
import javax.json.JsonReader;
import javax.json.JsonStructure;
+import javax.json.JsonValue;
import javax.json.stream.JsonParser;
import javax.json.stream.JsonParsingException;
@@ -31,26 +32,37 @@
private final JsonParser parser;
private boolean closed = false;
private final boolean readUntiltheEnd;
+ private final JsonParser.Event startEvent;
JsonReaderImpl(final JsonParser parser) {
this.parser = parser;
this.readUntiltheEnd = true;
+ this.startEvent = null;
}
- JsonReaderImpl(final JsonParser parser, boolean readUntiltheEnd) {
+ JsonReaderImpl(final JsonParser parser, boolean readUntiltheEnd, JsonParser.Event startEvent) {
this.parser = parser;
this.readUntiltheEnd = readUntiltheEnd;
+ this.startEvent = startEvent;
}
@Override
public JsonStructure read() {
+ return (JsonStructure) read(true);
+ }
+
+
+ private JsonValue read(boolean throwExceptionIfNotStructure) {
checkClosed();
if (!parser.hasNext()) {
throw new IllegalStateException("Nothing to read");
}
- switch (parser.next()) {
+
+ JsonParser.Event evt = startEvent==null?parser.next():startEvent;
+
+ switch (evt) {
case START_OBJECT:
final JsonObjectBuilder objectBuilder = new JsonObjectBuilderImpl();
parseObject(objectBuilder);
@@ -68,8 +80,19 @@
close();
return arrayBuilder.build();
default:
- close();
- throw new JsonParsingException("Unknown structure: " + parser.next(), parser.getLocation());
+ if(throwExceptionIfNotStructure) {
+ throw new JsonParsingException("Unknown structure: " + (parser.hasNext()?parser.next():"<EOF>"), parser.getLocation());
+ } else {
+ try {
+ JsonValue value = parser.getValue();
+ if(parser.hasNext()) {
+ throw new JsonParsingException("Expected end of file", parser.getLocation());
+ }
+ return value;
+ } finally {
+ close();
+ }
+ }
}
}
@@ -212,4 +235,11 @@
}
}
+
+ @Override
+ public JsonValue readValue() {
+ return read(false);
+ }
+
+
}
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java
index b209378..1767122 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java
@@ -38,6 +38,7 @@
import javax.json.JsonException;
import javax.json.JsonObject;
import javax.json.JsonReaderFactory;
+import javax.json.JsonStructure;
import javax.json.JsonValue;
import javax.json.stream.JsonLocation;
import javax.json.stream.JsonParser;
@@ -192,7 +193,8 @@
if ((endOfValueInBuffer - startOfValueInBuffer) > maxValueLength) {
throw tmc();
}
-
+//System.out.println("copy from "+startOfValueInBuffer+" with length "+(endOfValueInBuffer - startOfValueInBuffer));
+//System.out.println("endOfValueInBuffer "+endOfValueInBuffer);
System.arraycopy(buffer, startOfValueInBuffer, fallBackCopyBuffer, fallBackCopyBufferLength,
(endOfValueInBuffer - startOfValueInBuffer));
fallBackCopyBufferLength += (endOfValueInBuffer - startOfValueInBuffer);
@@ -505,7 +507,11 @@
if (currentStructureElement == null) {
currentStructureElement = new StructureElement(null, true);
} else {
- final StructureElement localStructureElement = new StructureElement(currentStructureElement, true);
+ if(!currentStructureElement.isArray && previousEvent != KEY_SEPARATOR_EVENT) {
+ throw uexc("Expected \"");
+ }
+
+ final StructureElement localStructureElement = new StructureElement(currentStructureElement, true);
currentStructureElement = localStructureElement;
}
@@ -763,7 +769,7 @@
endOfValueInBuffer = bufferPos;
- if (y == COMMA_CHAR || y == END_ARRAY_CHAR || y == END_OBJECT_CHAR || y == EOL || y == SPACE || y == TAB || y == CR) {
+ if (y == COMMA_CHAR || y == END_ARRAY_CHAR || y == END_OBJECT_CHAR || y == EOL || y == SPACE || y == TAB || y == CR || y == EOF) {
bufferPos--;//unread one char
@@ -784,7 +790,11 @@
if (fallBackCopyBufferLength > 0) {
//we crossed a buffer boundary, use value buffer
- copyCurrentValue();
+ //copyCurrentValue();
+
+ if (fallBackCopyBufferLength >= maxValueLength) {
+ throw tmc();
+ }
} else {
if ((endOfValueInBuffer - startOfValueInBuffer) >= maxValueLength) {
@@ -929,6 +939,8 @@
}
} else {
//if there a content in the value buffer read from them, if not use main buffer
+ //System.out.println(new String(fallBackCopyBuffer, 0,
+ // fallBackCopyBufferLength));
return (/*currentBigDecimalNumber = */fallBackCopyBufferLength > 0 ? new BigDecimal(fallBackCopyBuffer, 0,
fallBackCopyBufferLength) : new BigDecimal(buffer, startOfValueInBuffer, (endOfValueInBuffer - startOfValueInBuffer)));
}
@@ -1022,12 +1034,12 @@
return new IllegalStateException("Illegal parser state exception on " + location + ". Reason is [[" + message + "]]");
}
- @Override
- public JsonObject getObject() {
- JsonReaderImpl reader = new JsonReaderImpl(this, false);
- JsonObject obj;
+
+ private JsonStructure getStructure(Event start) {
+ JsonReaderImpl reader = new JsonReaderImpl(this, false, start);
+ JsonStructure obj;
try {
- obj = reader.readObject();
+ obj = reader.read();
} catch (JsonParsingException e) {
throw is(e.getMessage());
} finally {
@@ -1036,6 +1048,22 @@
return obj;
}
+
+ @Override
+ public JsonObject getObject() {
+ if(previousEvent != START_OBJECT) {
+ throw is("Parser state must be START_OBJECT");
+ }
+ return getStructure(Event.START_OBJECT).asJsonObject();
+ }
+
+ @Override
+ public JsonArray getArray() {
+ if(previousEvent != START_ARRAY) {
+ throw is("Parser state must be START_ARRAY");
+ }
+ return getStructure(Event.START_ARRAY).asJsonArray();
+ }
@Override
public JsonValue getValue() {
@@ -1065,25 +1093,49 @@
return Json.createValue(getString());
}
- //never happen
- return null;
- }
-
- @Override
- public JsonArray getArray() {
- JsonReaderImpl reader = new JsonReaderImpl(this, false);
- JsonArray ar;
- try {
- ar = reader.readArray();
- } catch (JsonParsingException e) {
- throw is(e.getMessage());
- } finally {
- reader.close();
+ //
+ if(previousEvent == START_OBJECT) {
+ return getObject();
}
-
- return ar;
+
+ if(previousEvent == END_OBJECT) {
+ next();
+ return getValue();
+ }
+
+ if(previousEvent == START_ARRAY) {
+ return getArray();
+ }
+
+ if(previousEvent == END_ARRAY) {
+ next();
+ return getValue();
+ }
+
+ if(previousEvent == KEY_NAME) {
+ return Json.createValue(getString());
+ }
+
+ /* if(previousEvent == KEY_SEPARATOR_EVENT) {
+ next();
+ return getValue();
+ }
+
+ if(previousEvent == COMMA_EVENT) {
+ next();
+ return getValue();
+ }*/
+
+ /*if(previousEvent == -1) {
+ return getStructure();
+ }*/
+
+ throw cust("Internal parsing error: Unknown state");
+
}
+
+
@Override
public Stream<JsonValue> getArrayStream() {
//TODO check for beginning of an array
@@ -1132,7 +1184,7 @@
return false;
}
if (event != Event.KEY_NAME) {
- throw new JsonException("error generating stream, key name token expected");
+ throw new JsonException("error generating stream, key name token expected (was: "+event+")");
}
String key = getString();
if (!hasNext()) {
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
index 451e182..f378b7a 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
@@ -33,15 +33,21 @@
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.HashMap;
+import java.util.Map;
import java.util.NoSuchElementException;
+import java.util.function.Function;
+import java.util.stream.Stream;
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonArrayBuilder;
import javax.json.JsonException;
+import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.json.JsonReader;
+import javax.json.JsonString;
import javax.json.JsonValue;
+import javax.json.stream.JsonCollectors;
import javax.json.stream.JsonParser;
import javax.json.stream.JsonParser.Event;
import javax.json.stream.JsonParsingException;
@@ -1639,7 +1645,67 @@
}
@Test
+ public void simpleShortNumber() {
+ final JsonParser parser = Json.createParser(new StringReader("1"));
+ assertNotNull(parser);
+ assertTrue(parser.hasNext());
+ final JsonParser.Event event = parser.next();
+ assertNotNull(event);
+ assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+ assertEquals(Json.createValue(1), parser.getValue());
+ assertFalse(parser.hasNext());
+ }
+
+ @Test
+ public void simpleENumber() {
+ final JsonParser parser = Json.createParser(new StringReader("-4.9e-4"));
+ assertNotNull(parser);
+ assertTrue(parser.hasNext());
+ final JsonParser.Event event = parser.next();
+ assertNotNull(event);
+ assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+ assertEquals(Json.createValue(new BigDecimal("-4.9e-4")), parser.getValue());
+ assertFalse(parser.hasNext());
+ }
+
+
+ @Test
+ public void simpleENumberMinBuffer() {
+
+ for(int i=1; i<=10; i++) {
+ final int bufflen=i;
+ final JsonParser parser = Json.createParserFactory(new HashMap<String, Object>() {
+ {
+ put("org.apache.johnzon.default-char-buffer", bufflen);
+ }
+ }).createParser(new StringReader("-4.9e-4"));
+ assertNotNull(parser);
+ assertTrue(parser.hasNext());
+ final JsonParser.Event event = parser.next();
+ assertNotNull(event);
+ assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+ assertEquals(Json.createValue(new BigDecimal("-4.9e-4")), parser.getValue());
+ assertFalse(parser.hasNext());
+
+ }
+ }
+
+
+
+ @Test
public void simpleValueTrue() {
+ final JsonParser parser = Json.createParser(new StringReader("true"));
+ assertNotNull(parser);
+ assertTrue(parser.hasNext());
+ final JsonParser.Event event = parser.next();
+ assertNotNull(event);
+ assertEquals(JsonParser.Event.VALUE_TRUE, event);
+ assertEquals(JsonValue.TRUE, parser.getValue());
+ assertFalse(parser.hasNext());
+ }
+
+ @Test
+ public void simpleValueTrueWithWS() {
final JsonParser parser = Json.createParser(new StringReader(" true"));
assertNotNull(parser);
assertTrue(parser.hasNext());
@@ -1763,31 +1829,33 @@
@Test
public void getObjectFromParser() {
- final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, \"b\":{\"c\":9, \"d\":10}, \"z\":8"));
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, \"b\":{\"c\":9, \"d\":10}, \"z\":8}"));
assertNotNull(parser);
parser.next();
parser.next();
parser.next();
parser.next();
+ parser.next();
assertEquals("{\"c\":9,\"d\":10}", parser.getObject().toString());
assertTrue(parser.next() == Event.KEY_NAME);
}
@Test
public void getObjectFromParserNested() {
- final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, \"b\":{\"c\":9, \"d\":10, \"r\":{\"q\":19, \"s\":144}}, \"z\":8"));
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, \"b\":{\"c\":9, \"d\":10, \"r\":{\"q\":19, \"s\":144}}, \"z\":8}"));
assertNotNull(parser);
- parser.next();
- parser.next();
- parser.next();
- parser.next();
+ assertEquals(Event.START_OBJECT, parser.next());
+ assertEquals(Event.KEY_NAME, parser.next());
+ assertEquals(Event.VALUE_NUMBER, parser.next());
+ assertEquals(Event.KEY_NAME, parser.next());
+ assertEquals(Event.START_OBJECT, parser.next());
assertEquals("{\"c\":9,\"d\":10,\"r\":{\"q\":19,\"s\":144}}", parser.getObject().toString());
assertTrue(parser.next() == Event.KEY_NAME);
}
@Test(expected=IllegalStateException.class)
public void getObjectFromParserWrongState() {
- final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, \"b\":{\"c\":9, \"d\":10}, \"z\":8"));
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, \"b\":{\"c\":9, \"d\":10}, \"z\":8}"));
assertNotNull(parser);
parser.next();
parser.next();
@@ -1798,29 +1866,33 @@
@Test
public void getArrayFromParser() {
- final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, [1,2,3,4,5], \"z\":8"));
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, \"r\":[1,2,3,4,5], \"z\":8}"));
assertNotNull(parser);
parser.next();
parser.next();
parser.next();
+ parser.next();
+ parser.next();
assertEquals("[1,2,3,4,5]", parser.getArray().toString());
assertTrue(parser.next() == Event.KEY_NAME);
}
@Test
public void getArrayFromParserNested() {
- final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, [1,2,3,4,5,[2,2,3,4,5]], \"z\":8"));
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, \"r\":[1,2,3,4,5,[2,2,3,4,5]], \"z\":8}"));
assertNotNull(parser);
parser.next();
parser.next();
parser.next();
+ parser.next();
+ parser.next();
assertEquals("[1,2,3,4,5,[2,2,3,4,5]]", parser.getArray().toString());
assertTrue(parser.next() == Event.KEY_NAME);
}
@Test(expected=IllegalStateException.class)
public void getArrayFromParserWrogState() {
- final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, [1,2,3,4,5,[2,2,3,4,5]], \"z\":8"));
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, [1,2,3,4,5,[2,2,3,4,5]], \"z\":8}"));
assertNotNull(parser);
parser.next();
parser.next();
@@ -1830,7 +1902,7 @@
@Test
public void skipObject() {
- final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, \"b\":{\"c\":9, \"d\":10, \"r\":{\"q\":19, \"s\":144}}, \"z\":8"));
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, \"b\":{\"c\":9, \"d\":10, \"r\":{\"q\":19, \"s\":144}}, \"z\":8}"));
assertNotNull(parser);
parser.next();
parser.next();
@@ -1845,18 +1917,90 @@
@Test
public void skipArray() {
- final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, [1,2,3,4,5,[2,2,3,4,5]], \"z\":8"));
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, \"r\": [1,2,3,4,5,[2,2,3,4,5]], \"z\":8}"));
assertNotNull(parser);
parser.next();
parser.next();
parser.next();
parser.next();
+ parser.next();
parser.skipArray();
parser.next();
- assertTrue(parser.next() == Event.KEY_NAME);
+ assertEquals(Event.KEY_NAME, parser.next());
assertEquals("z",parser.getString());
}
+ @Test(expected=JsonParsingException.class)
+ public void invalidArray() {
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, [1,2,3,4,5,[2,2,3,4,5]], \"z\":8}"));
+ assertNotNull(parser);
+ assertTrue(parser.next() == Event.START_OBJECT);
+ assertTrue(parser.next() == Event.KEY_NAME);
+ assertTrue(parser.next() == Event.VALUE_NUMBER);
+ parser.next();
+ }
+
+ @Test(expected=JsonParsingException.class)
+ public void invalidArrayMissingKeyname() {
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, :[1,2,3,4,5,[2,2,3,4,5]], \"z\":8}"));
+ assertNotNull(parser);
+ assertTrue(parser.next() == Event.START_OBJECT);
+ assertTrue(parser.next() == Event.KEY_NAME);
+ assertTrue(parser.next() == Event.VALUE_NUMBER);
+ parser.next();
+ }
+
+ @Test(expected=JsonParsingException.class)
+ //TODO read key and : in once
+ public void invalidArrayMissingSeparator() {
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, \"a\"[1,2,3,4,5,[2,2,3,4,5]], \"z\":8}"));
+ assertNotNull(parser);
+ assertTrue(parser.next() == Event.START_OBJECT);
+ assertTrue(parser.next() == Event.KEY_NAME);
+ assertTrue(parser.next() == Event.VALUE_NUMBER);
+ assertTrue(parser.next() == Event.KEY_NAME);
+ parser.next();
+ }
+
+ @Test
+ public void testGetValue() {
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":false, \"d\": {\"m\":6}, \"z\":true}"));
+ assertNotNull(parser);
+ parser.next();
+ JsonObject obj = parser.getValue().asJsonObject();
+ assertEquals(3, obj.size());
+ }
+
+ @Test
+ public void testGetValue2() {
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":false, \"d\": {\"m\":6}, \"z\":true}"));
+ assertNotNull(parser);
+ assertEquals(Event.START_OBJECT, parser.next());
+ assertEquals(Event.KEY_NAME, parser.next());
+ JsonString obj = (JsonString) parser.getValue();
+ assertEquals("a", obj.getString());
+ }
+
+ @Test
+ public void objectStream() {
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":false, \"d\": {\"m\":6}, \"z\":true}"));
+ assertNotNull(parser);
+ parser.next();
+ Stream<Map.Entry<String,JsonValue>> ostream = parser.getObjectStream();
+ assertEquals(3,ostream.count());
+ //System.out.println(parser.getValue());
+
+ }
+
+ @Test(expected=JsonParsingException.class)
+ public void missingClosingObject() {
+ final JsonParser parser = Json.createParser(new StringReader("{\"a\":5, \"d\": {\"m\":6}, \"z\":true"));
+ assertNotNull(parser);
+ while(parser.hasNext()) {
+ parser.next();
+ }
+ }
+
class AttemptingInputStream extends ByteArrayInputStream {
public AttemptingInputStream(byte[] buf) {
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
new file mode 100644
index 0000000..fdb7ff8
--- /dev/null
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPatchTest.java
@@ -0,0 +1,50 @@
+package org.apache.johnzon.core;
+
+import static org.junit.Assert.*;
+
+import java.io.StringReader;
+
+import javax.json.Json;
+import javax.json.JsonArray;
+import javax.json.JsonException;
+import javax.json.JsonNumber;
+import javax.json.JsonObject;
+import javax.json.JsonPatchBuilder;
+import javax.json.JsonPointer;
+import javax.json.JsonReader;
+import javax.json.JsonString;
+import javax.json.JsonStructure;
+import javax.json.JsonValue;
+import javax.json.JsonValue.ValueType;
+import javax.json.spi.JsonProvider;
+
+import org.junit.Test;
+
+public class JsonPatchTest {
+
+ @Test
+ public void testPatch() {
+ final JsonReader loadInMemReader = Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/nested.json"));
+ assertNotNull(loadInMemReader);
+ JsonObject obj = loadInMemReader.readObject();
+ JsonPatchBuilder jpb = new JsonPatchBuilder();
+ jpb.add("/s", JsonValue.NULL);
+ jpb.add("/y", 5);
+ jpb.add("/u", "c");
+ jpb.test("/s", JsonValue.NULL);
+ //jpb.add("/m", "{\"a\":10, \"b\":11}");
+ jpb.add("/qq", Json.createReader(new StringReader("{\"a\":10, \"b\":11}")).read());
+ jpb.copy("/x", "/qq/b");
+ //jpb.test("/x", 11);
+ jpb.remove("/qq/a");
+ jpb.move("/u", "/qq/b");
+ //jpb.remove("/m/a");
+ //jpb.move("/u", "/m/a");
+ JsonObject result = jpb.apply(obj);
+ System.out.println(obj);
+ System.out.println(result);
+ //assertEquals(obj, result);
+ }
+
+
+}
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPointerTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPointerTest.java
index 21a5063..f1c4057 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPointerTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonPointerTest.java
@@ -3,6 +3,7 @@
import static org.junit.Assert.*;
import javax.json.Json;
+import javax.json.JsonArray;
import javax.json.JsonException;
import javax.json.JsonNumber;
import javax.json.JsonObject;
@@ -81,15 +82,152 @@
new JsonPointer("/a/c/g/");
}
- //@Test
- public void testaddJsonPointer1() {
+ @Test
+ public void testaddJsonPointerPairToRoot() {
final JsonReader loadInMemReader = Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/nested.json"));
assertNotNull(loadInMemReader);
JsonObject obj = loadInMemReader.readObject();
- JsonObject result = new JsonPointer("/c/new").add(obj, Json.createValue("newval"));
- System.out.println("res "+result);
- JsonValue newVal = new JsonPointer("/c/new").getValue(result);
+ JsonObject result = new JsonPointer("/new").add(obj, Json.createValue("newval"));
+ JsonValue newVal = new JsonPointer("/new").getValue(result);
assertNotNull(newVal);
assertEquals("newval", ((JsonString) newVal).getString());
+ assertEquals(3, result.size());
+ }
+
+ @Test
+ public void testaddJsonPointerArrayToRoot() {
+ final JsonReader loadInMemReader = Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/nested.json"));
+ assertNotNull(loadInMemReader);
+ JsonObject obj = loadInMemReader.readObject();
+ JsonObject result = new JsonPointer("/new").add(obj, Json.createArrayBuilder().add(true).build());
+ System.out.println(result);
+ JsonValue newVal = new JsonPointer("/new").getValue(result);
+ assertNotNull(newVal);
+ assertEquals("[true]", newVal.toString());
+ assertEquals(3, result.size());
+ }
+
+ @Test
+ public void testaddJsonPointerPairToNested() {
+ final JsonReader loadInMemReader = Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/deepnested.json"));
+ assertNotNull(loadInMemReader);
+ JsonObject obj = loadInMemReader.readObject();
+ JsonObject result = new JsonPointer("/c/d/2/e/r/2/new").add(obj, Json.createValue("newval"));
+ System.out.println(result);
+ JsonValue newVal = new JsonPointer("/c/d/2/e/r/2/new").getValue(result);
+ assertNotNull(newVal);
+ assertEquals("newval", ((JsonString) newVal).getString());
+ assertEquals(2, result.size());
+ }
+
+ @Test(expected=JsonException.class)
+ public void testaddJsonPointerDoubleNonExist() {
+ final JsonReader loadInMemReader = Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/deepnested.json"));
+ assertNotNull(loadInMemReader);
+ JsonObject obj = loadInMemReader.readObject();
+ JsonObject result = new JsonPointer("/x/y").add(obj, Json.createValue("newval"));
+ System.out.println(result);
+ }
+
+ @Test
+ public void testaddJsonPointerPairToArrayNested() {
+ final JsonReader loadInMemReader = Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/deepnested.json"));
+ assertNotNull(loadInMemReader);
+ JsonObject obj = loadInMemReader.readObject();
+ JsonObject result = new JsonPointer("/c/d/2/e/r/3").add(obj, Json.createValue("newval"));
+ JsonValue newVal = new JsonPointer("/c/d/2/e/r/3").getValue(result);
+ assertNotNull(newVal);
+ assertEquals("newval", ((JsonString) newVal).getString());
+ assertEquals(2, result.size());
+ }
+
+ @Test
+ public void testaddJsonPointerPairToObjectNestedDash() {
+ final JsonReader loadInMemReader = Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/deepnested.json"));
+ assertNotNull(loadInMemReader);
+ JsonObject obj = loadInMemReader.readObject();
+ JsonObject result = new JsonPointer("/c/d/2/e/-").add(obj, Json.createValue("newval"));
+ System.out.println(result);
+ JsonValue newVal = new JsonPointer("/c/d/2/e/-").getValue(result);
+ assertNotNull(newVal);
+ assertEquals("newval", ((JsonString) newVal).getString());
+ assertEquals(2, result.size());
+ }
+
+ @Test
+ public void testaddJsonPointerPairToArrayNestedDash() {
+ final JsonReader loadInMemReader = Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/deepnested.json"));
+ assertNotNull(loadInMemReader);
+ JsonObject obj = loadInMemReader.readObject();
+ JsonObject result = new JsonPointer("/c/d/2/e/r/-").add(obj, Json.createValue("newval"));
+ System.out.println(result);
+ JsonValue newVal = new JsonPointer("/c/d/2/e/r/3").getValue(result);
+ assertNotNull(newVal);
+ assertEquals("newval", ((JsonString) newVal).getString());
+ assertEquals(2, result.size());
+ }
+
+ @Test
+ public void testaddJsonPointerSet() {
+ final JsonReader loadInMemReader = Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/deepnested.json"));
+ assertNotNull(loadInMemReader);
+ JsonObject obj = loadInMemReader.readObject();
+ JsonObject result = new JsonPointer("/c/d/2/e").add(obj, Json.createValue("newval"));
+ JsonValue newVal = new JsonPointer("/c/d/2/e").getValue(result);
+ assertNotNull(newVal);
+ assertEquals("newval", ((JsonString) newVal).getString());
+ assertEquals(2, result.size());
+ }
+
+ @Test
+ public void testaddJsonPointerPairToArrayNestedReplace() {
+ final JsonReader loadInMemReader = Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/deepnested.json"));
+ assertNotNull(loadInMemReader);
+ JsonObject obj = loadInMemReader.readObject();
+ JsonObject result = new JsonPointer("/c/d/2/e/0").add(obj, Json.createValue("newval"));
+ JsonValue newVal = new JsonPointer("/c/d/2/e/0").getValue(result);
+ assertNotNull(newVal);
+ assertEquals("newval", ((JsonString) newVal).getString());
+ assertEquals(2, result.size());
+ }
+
+ @Test
+ public void testReplace() {
+ final JsonReader loadInMemReader = Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/deepnested.json"));
+ assertNotNull(loadInMemReader);
+ JsonObject obj = loadInMemReader.readObject();
+ JsonObject result = new JsonPointer("/c/d/2/e").replace(obj, Json.createValue("newval"));
+ JsonValue newVal = new JsonPointer("/c/d/2/e").getValue(result);
+ assertNotNull(newVal);
+ assertEquals("newval", ((JsonString) newVal).getString());
+ assertEquals(2, result.size());
+ }
+
+ @Test
+ public void testRemove() {
+ final JsonReader loadInMemReader = Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/deepnested.json"));
+ assertNotNull(loadInMemReader);
+ JsonObject obj = loadInMemReader.readObject();
+ System.out.println(obj);
+ JsonValue newVal = new JsonPointer("/c/d/2").getValue(obj);
+ assertNotNull(newVal);
+ assertEquals(2, ((JsonObject) newVal).size());
+
+ JsonObject result = new JsonPointer("/c/d/2/e").remove(obj);
+ System.out.println(result);
+ newVal = new JsonPointer("/c/d/2").getValue(result);
+ assertNotNull(newVal);
+ assertEquals(1, ((JsonObject) newVal).size());
+ assertEquals(2, result.size());
+ }
+
+ @Test
+ public void testRemoveAll() {
+ final JsonReader loadInMemReader = Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/deepnested.json"));
+ assertNotNull(loadInMemReader);
+ JsonObject obj = loadInMemReader.readObject();
+ JsonObject result = new JsonPointer("").remove(obj);
+ System.out.println(result);
+ assertEquals(JsonValue.EMPTY_JSON_OBJECT, result);
}
}
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 644a91b..4067e15 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
@@ -27,6 +27,8 @@
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import java.io.Reader;
+import java.io.StringReader;
+import java.math.BigDecimal;
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.HashMap;
@@ -37,6 +39,8 @@
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.json.JsonStructure;
+import javax.json.JsonValue;
+import javax.json.stream.JsonParsingException;
import org.junit.Test;
@@ -413,6 +417,22 @@
assertEquals(0, object.size());
reader.close();
}
+
+ @Test
+ public void bug() {
+ final JsonReader reader = Json.createReaderFactory(new HashMap<String, Object>() {
+ {
+ put("org.apache.johnzon.default-char-buffer", "1");
+ }
+ }).createReader(new StringReader("[1, \"\", \"aaaaaaa\", \"\", \"aaaaaaa\", \"\", 100]"));
+ assertNotNull(reader);
+ final JsonArray ar = reader.readArray();
+ assertNotNull(ar);
+ assertEquals(100, ar.getInt(6));
+ reader.close();
+ }
+
+
@Test
public void emptyArrayOneCharBufferSize() {
@@ -464,4 +484,49 @@
assertEquals("fdmcd", object.getJsonObject("//object").getString("sub"));
reader.close();
}
+
+ @Test
+ public void singleTrueValue() {
+ assertEquals(JsonValue.TRUE, Json.createReader(new StringReader("true")).readValue());
+ }
+
+ @Test
+ public void singleFalseValue() {
+ assertEquals(JsonValue.FALSE, Json.createReader(new StringReader("false")).readValue());
+ }
+
+ @Test
+ public void singleNullValue() {
+ assertEquals(JsonValue.NULL, Json.createReader(new StringReader("null")).readValue());
+ }
+
+ @Test(expected=JsonParsingException.class)
+ public void singleBadValue() {
+ assertEquals(JsonValue.NULL, Json.createReader(new StringReader("nullll")).readValue());
+ }
+
+ @Test
+ public void singleStringValue() {
+ assertEquals(Json.createValue("astring"), Json.createReader(new StringReader("\"astring\"")).readValue());
+ }
+
+ @Test
+ public void singleNumberValue() {
+ assertEquals(Json.createValue(1), Json.createReader(new StringReader("1")).readValue());
+ }
+
+ @Test
+ public void singleENumberValue() {
+ assertEquals(Json.createValue(new BigDecimal("-4.9e-4")), Json.createReader(new StringReader("-4.9e-4")).readValue());
+ }
+
+ @Test
+ public void singleENumberValueA() {
+ assertEquals(Json.createArrayBuilder().add(new BigDecimal("-4.9e-4")).build(), Json.createReader(new StringReader("[-4.9e-4]")).readArray());
+ }
+
+ @Test(expected=JsonParsingException.class)
+ public void singleNumberAsStructure() {
+ Json.createReader(new StringReader("112")).read();
+ }
}
\ No newline at end of file
diff --git a/johnzon-core/src/test/resources/json/deepnested.json b/johnzon-core/src/test/resources/json/deepnested.json
new file mode 100644
index 0000000..24fc570
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/deepnested.json
@@ -0,0 +1,22 @@
+{
+ "a":"b",
+ "c":{
+ "l":"m",
+ "d":[
+ 1,
+ 2,
+ {
+ "x":"y",
+ "e":{
+ "r":[
+ 7,
+ 8,
+ {
+ "z":"b"
+ }
+ ]
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file