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