JOHNZON-110 improve long support impl
Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/ea3bb867 Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/ea3bb867 Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/ea3bb867 Branch: refs/heads/master Commit: ea3bb86777c007ed027e7bd07c84cfdbe36bc764 Parents: eb968ec Author: Mark Struberg <[email protected]> Authored: Tue Mar 28 22:26:30 2017 +0200 Committer: Mark Struberg <[email protected]> Committed: Tue Mar 28 22:26:30 2017 +0200 ---------------------------------------------------------------------- .../apache/johnzon/core/JohnzonJsonParser.java | 134 +++++++++++++++++++ .../johnzon/core/JsonArrayBuilderImpl.java | 38 ++++-- .../apache/johnzon/core/JsonInMemoryParser.java | 8 +- .../org/apache/johnzon/core/JsonReaderImpl.java | 11 +- .../johnzon/core/JsonStreamParserImpl.java | 8 +- 5 files changed, 179 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/johnzon/blob/ea3bb867/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParser.java ---------------------------------------------------------------------- diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParser.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParser.java new file mode 100644 index 0000000..b13852b --- /dev/null +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParser.java @@ -0,0 +1,134 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.core; + +import java.math.BigDecimal; +import java.util.Map; +import java.util.stream.Stream; + +import javax.json.JsonArray; +import javax.json.JsonObject; +import javax.json.JsonValue; +import javax.json.stream.JsonLocation; +import javax.json.stream.JsonParser; + +/** + * JsonParser with extended functionality + */ +public interface JohnzonJsonParser extends JsonParser { + + boolean isNotTooLong(); + + + public static class JohnzonJsonParserWrapper implements JohnzonJsonParser { + private final JsonParser jsonParser; + + public JohnzonJsonParserWrapper(JsonParser jsonParser) { + this.jsonParser = jsonParser; + } + + @Override + public boolean isNotTooLong() { + return true; + } + + @Override + public boolean hasNext() { + return jsonParser.hasNext(); + } + + @Override + public Event next() { + return jsonParser.next(); + } + + @Override + public String getString() { + return jsonParser.getString(); + } + + @Override + public boolean isIntegralNumber() { + return jsonParser.isIntegralNumber(); + } + + @Override + public int getInt() { + return jsonParser.getInt(); + } + + @Override + public long getLong() { + return jsonParser.getLong(); + } + + @Override + public BigDecimal getBigDecimal() { + return jsonParser.getBigDecimal(); + } + + @Override + public JsonLocation getLocation() { + return jsonParser.getLocation(); + } + + @Override + public void close() { + jsonParser.close(); + } + + @Override + public JsonObject getObject() { + return jsonParser.getObject(); + } + + @Override + public JsonValue getValue() { + return jsonParser.getValue(); + } + + @Override + public JsonArray getArray() { + return jsonParser.getArray(); + } + + @Override + public Stream<JsonValue> getArrayStream() { + return jsonParser.getArrayStream(); + } + + @Override + public Stream<Map.Entry<String, JsonValue>> getObjectStream() { + return jsonParser.getObjectStream(); + } + + @Override + public Stream<JsonValue> getValueStream() { + return jsonParser.getValueStream(); + } + + @Override + public void skipArray() { + jsonParser.skipArray(); + } + + @Override + public void skipObject() { + jsonParser.skipObject(); + } + } +} http://git-wip-us.apache.org/repos/asf/johnzon/blob/ea3bb867/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java ---------------------------------------------------------------------- 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 72caf57..57cceb7 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 @@ -218,78 +218,90 @@ class JsonArrayBuilderImpl implements JsonArrayBuilder, Serializable { @Override public JsonArrayBuilder add(final JsonValue value) { - addValue(tmpList.size(), value); + addValue(value); return this; } @Override public JsonArrayBuilder add(final String value) { - addValue(tmpList.size(), new JsonStringImpl(value)); + addValue(new JsonStringImpl(value)); return this; } @Override public JsonArrayBuilder add(final BigDecimal value) { - addValue(tmpList.size(), new JsonNumberImpl(value)); + addValue(new JsonNumberImpl(value)); return this; } @Override public JsonArrayBuilder add(final BigInteger value) { - addValue(tmpList.size(), new JsonNumberImpl(new BigDecimal(value))); + addValue(new JsonNumberImpl(new BigDecimal(value))); return this; } @Override public JsonArrayBuilder add(final int value) { - addValue(tmpList.size(), new JsonLongImpl(value)); + addValue(new JsonLongImpl(value)); return this; } @Override public JsonArrayBuilder add(final long value) { - addValue(tmpList.size(), new JsonLongImpl(value)); + addValue(new JsonLongImpl(value)); return this; } @Override public JsonArrayBuilder add(final double value) { - addValue(tmpList.size(), new JsonDoubleImpl(value)); + addValue(new JsonDoubleImpl(value)); return this; } @Override public JsonArrayBuilder add(final boolean value) { - addValue(tmpList.size(), value ? JsonValue.TRUE : JsonValue.FALSE); + addValue(value ? JsonValue.TRUE : JsonValue.FALSE); return this; } @Override public JsonArrayBuilder addNull() { - addValue(tmpList.size(), JsonValue.NULL); + addValue(JsonValue.NULL); return this; } @Override public JsonArrayBuilder add(final JsonObjectBuilder builder) { - addValue(tmpList.size(), builder.build()); + addValue(builder.build()); return this; } @Override public JsonArrayBuilder add(final JsonArrayBuilder builder) { - addValue(tmpList.size(), builder.build()); + addValue(builder.build()); return this; } - private void setValue(int idx, JsonValue value){ + private void setValue(int idx, JsonValue value) { if (value == null || tmpList == null) { throw npe(); } tmpList.set(idx, value); } - private void addValue(int idx, JsonValue value){ + private void addValue(JsonValue value) { + if (value == null) { + throw npe(); + } + + if(tmpList==null){ + tmpList=new ArrayList<>(); + } + + tmpList.add(value); + } + + private void addValue(int idx, JsonValue value) { if (value == null) { throw npe(); } http://git-wip-us.apache.org/repos/asf/johnzon/blob/ea3bb867/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java ---------------------------------------------------------------------- diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java index 9137139..481ea23 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java @@ -30,9 +30,8 @@ import javax.json.JsonString; import javax.json.JsonValue; import javax.json.JsonValue.ValueType; import javax.json.stream.JsonLocation; -import javax.json.stream.JsonParser; -class JsonInMemoryParser implements JsonParser { +class JsonInMemoryParser implements JohnzonJsonParser { private final SimpleStack<Iterator<Event>> stack = new SimpleStack<Iterator<Event>>(); @@ -233,6 +232,11 @@ class JsonInMemoryParser implements JsonParser { } @Override + public boolean isNotTooLong() { + return true; + } + + @Override public int getInt() { if (currentEvent != Event.VALUE_NUMBER) { throw new IllegalStateException("getInt is for numbers"); http://git-wip-us.apache.org/repos/asf/johnzon/blob/ea3bb867/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java ---------------------------------------------------------------------- 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 c7a3189..e3af4af 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 @@ -18,6 +18,7 @@ */ package org.apache.johnzon.core; + import javax.json.JsonArray; import javax.json.JsonArrayBuilder; import javax.json.JsonNumber; @@ -30,11 +31,15 @@ import javax.json.stream.JsonParser; import javax.json.stream.JsonParsingException; public class JsonReaderImpl implements JsonReader { - private final JsonStreamParserImpl parser; + private final JohnzonJsonParser parser; private boolean closed = false; - public JsonReaderImpl(final JsonStreamParserImpl parser) { - this.parser = parser; + public JsonReaderImpl(final JsonParser parser) { + if (parser instanceof JohnzonJsonParser) { + this.parser = (JohnzonJsonParser) parser; + } else { + this.parser = new JohnzonJsonParser.JohnzonJsonParserWrapper(parser); + } } @Override http://git-wip-us.apache.org/repos/asf/johnzon/blob/ea3bb867/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java ---------------------------------------------------------------------- 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 876ec78..44ba2fd 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 @@ -20,7 +20,6 @@ package org.apache.johnzon.core; import javax.json.JsonException; import javax.json.stream.JsonLocation; -import javax.json.stream.JsonParser; import javax.json.stream.JsonParsingException; import java.io.IOException; import java.io.InputStream; @@ -31,7 +30,7 @@ import java.nio.charset.Charset; import java.util.NoSuchElementException; //This class represents either the Json tokenizer and the Json parser. -public class JsonStreamParserImpl implements JsonChars, JsonParser{ +public class JsonStreamParserImpl implements JsonChars, JohnzonJsonParser { //the main buffer where the stream will be buffered private final char[] buffer; @@ -839,6 +838,11 @@ public class JsonStreamParserImpl implements JsonChars, JsonParser{ } @Override + public boolean isNotTooLong() { + return (endOfValueInBuffer - startOfValueInBuffer) < 19; + } + + @Override public int getInt() { if (previousEvent != VALUE_NUMBER) { throw new IllegalStateException(EVT_MAP[previousEvent] + " doesn't support getInt()");
