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 2019/08/18 17:37:06 UTC
[johnzon] branch master updated: JOHNZON-265 some protection to
cast a Bignumber as a long
This is an automated email from the ASF dual-hosted git repository.
rmannibucau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/johnzon.git
The following commit(s) were added to refs/heads/master by this push:
new 2a74fc2 JOHNZON-265 some protection to cast a Bignumber as a long
2a74fc2 is described below
commit 2a74fc22fdc4518bdf16fa02d69cdf0e1fc3afe8
Author: Romain Manni-Bucau <rm...@apache.org>
AuthorDate: Sun Aug 18 19:37:01 2019 +0200
JOHNZON-265 some protection to cast a Bignumber as a long
---
.../org/apache/johnzon/core/JohnzonJsonParser.java | 7 ++++++
.../org/apache/johnzon/core/JsonArrayImpl.java | 2 +-
.../apache/johnzon/core/JsonInMemoryParser.java | 5 ++++
.../org/apache/johnzon/core/JsonReaderImpl.java | 2 +-
.../apache/johnzon/core/JsonStreamParserImpl.java | 27 +++++++++-------------
.../johnzon/core/BufferStrategyFactoryTest.java | 2 +-
6 files changed, 26 insertions(+), 19 deletions(-)
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
index febff3d..cb0a40f 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParser.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JohnzonJsonParser.java
@@ -30,6 +30,7 @@ import javax.json.stream.JsonParser;
* JsonParser with extended functionality
*/
public interface JohnzonJsonParser extends JsonParser {
+ boolean isFitLong();
boolean isNotTooLong();
@@ -50,6 +51,12 @@ public interface JohnzonJsonParser extends JsonParser {
}
@Override
+ public boolean isFitLong() {
+ return JohnzonJsonParser.class.isInstance(jsonParser) ?
+ JohnzonJsonParser.class.cast(jsonParser).isFitLong() : false;
+ }
+
+ @Override
public boolean isNotTooLong() {
return true;
}
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java
index e247d33..73206c0 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java
@@ -211,7 +211,7 @@ class JsonArrayImpl extends AbstractList<JsonValue> implements JsonArray, Serial
* get() on an ArrayList works even faster than ArrayList#iterator!
*/
private class JsonArrayIterator implements Iterator<JsonValue> {
- int cursor = 0;
+ private int cursor = 0;
@Override
public boolean hasNext() {
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 014d276..fcea38a 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
@@ -281,6 +281,11 @@ class JsonInMemoryParser extends JohnzonJsonParserImpl {
}
@Override
+ public boolean isFitLong() {
+ return JsonLongImpl.class.isInstance(currentValue);
+ }
+
+ @Override
public BigDecimal getBigDecimal() {
if (currentEvent != Event.VALUE_NUMBER) {
throw new IllegalStateException("getBigDecimal is for numbers");
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 531e371..1e3bec4 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
@@ -248,7 +248,7 @@ public class JsonReaderImpl implements JsonReader {
break;
case VALUE_NUMBER:
- if (parser.isIntegralNumber()) {
+ if (parser.isFitLong()) {
builder.add(new JsonLongImpl(parser.getLong()));
} else {
builder.add(new JsonNumberImpl(parser.getBigDecimal()));
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 79f72ae..9561cd7 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
@@ -947,6 +947,14 @@ public class JsonStreamParserImpl extends JohnzonJsonParserImpl implements JsonC
}
@Override
+ public boolean isFitLong() { // not exact but good enough for most cases
+ // no buffer overflow - assumes a buffer can hold a long
+ // + length <= since max long is 9223372036854775807 and min is -9223372036854775808
+ final int len = endOfValueInBuffer - startOfValueInBuffer;
+ return fallBackCopyBufferLength <= 0 && len > 0 && len <= 18;
+ }
+
+ @Override
public BigDecimal getBigDecimal() {
if (previousEvent != VALUE_NUMBER) {
throw new IllegalStateException(EVT_MAP[previousEvent] + " doesn't support getBigDecimal()");
@@ -954,23 +962,10 @@ public class JsonStreamParserImpl extends JohnzonJsonParserImpl implements JsonC
// return currentBigDecimalNumber;
} else if (isCurrentNumberIntegral && currentIntegralNumber != Integer.MIN_VALUE) {
return new BigDecimal(currentIntegralNumber);
- } else if (isCurrentNumberIntegral) {
- //if there a content in the value buffer read from them, if not use main buffer
- final Long retVal = fallBackCopyBufferLength > 0 ? parseLongFromChars(fallBackCopyBuffer, 0, fallBackCopyBufferLength)
- : parseLongFromChars(buffer, startOfValueInBuffer, endOfValueInBuffer);
- if (retVal == null) {
- return (/*currentBigDecimalNumber = */fallBackCopyBufferLength > 0 ? new BigDecimal(fallBackCopyBuffer, 0,
- fallBackCopyBufferLength) : new BigDecimal(buffer, startOfValueInBuffer,
- (endOfValueInBuffer - startOfValueInBuffer)));
- } else {
- return (/*currentBigDecimalNumber = */new BigDecimal(retVal.longValue()));
- }
- } else {
- //if there a content in the value buffer read from them, if not use main buffer
- return (/*currentBigDecimalNumber = */fallBackCopyBufferLength > 0 ? new BigDecimal(fallBackCopyBuffer, 0,
- fallBackCopyBufferLength) : new BigDecimal(buffer, startOfValueInBuffer, (endOfValueInBuffer - startOfValueInBuffer)));
}
-
+ //if there a content in the value buffer read from them, if not use main buffer
+ return (/*currentBigDecimalNumber = */fallBackCopyBufferLength > 0 ? new BigDecimal(fallBackCopyBuffer, 0,
+ fallBackCopyBufferLength) : new BigDecimal(buffer, startOfValueInBuffer, (endOfValueInBuffer - startOfValueInBuffer)));
}
@Override
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/BufferStrategyFactoryTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/BufferStrategyFactoryTest.java
index 895eb83..f122697 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/BufferStrategyFactoryTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/BufferStrategyFactoryTest.java
@@ -77,7 +77,7 @@ public class BufferStrategyFactoryTest {
}
public static final class DummyBufferStrategy implements BufferStrategy {
- static AtomicInteger counter = new AtomicInteger(0);
+ private static AtomicInteger counter = new AtomicInteger(0);
private BufferStrategy delegate = BufferStrategyFactory.valueOf("BY_INSTANCE");
@Override