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 2017/06/05 13:02:01 UTC

johnzon git commit: JOHNZON-120 AritmeticException if no fractional part is there in JsonNumber

Repository: johnzon
Updated Branches:
  refs/heads/master de1e780a0 -> 249301acd


JOHNZON-120 AritmeticException if no fractional part is there in JsonNumber


Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/249301ac
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/249301ac
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/249301ac

Branch: refs/heads/master
Commit: 249301acdbcb8b4d56dee1659b7e090d5c28ef2f
Parents: de1e780
Author: rmannibucau <rm...@apache.org>
Authored: Mon Jun 5 15:01:56 2017 +0200
Committer: rmannibucau <rm...@apache.org>
Committed: Mon Jun 5 15:01:56 2017 +0200

----------------------------------------------------------------------
 .../org/apache/johnzon/core/JsonDoubleImpl.java | 14 +++++++++++++-
 .../org/apache/johnzon/core/JsonNumberImpl.java | 16 ++++++++++++----
 .../org/apache/johnzon/core/JsonNumberTest.java | 20 ++++++++++++++++++++
 3 files changed, 45 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/249301ac/johnzon-core/src/main/java/org/apache/johnzon/core/JsonDoubleImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonDoubleImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonDoubleImpl.java
index 4238791..daa7b57 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonDoubleImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonDoubleImpl.java
@@ -22,6 +22,7 @@ import javax.json.JsonNumber;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.util.Objects;
 
 final class JsonDoubleImpl implements JsonNumber, Serializable {
     private final double value;
@@ -52,6 +53,7 @@ final class JsonDoubleImpl implements JsonNumber, Serializable {
 
     @Override
     public int intValueExact() {
+        checkFractionalPart();
         return intValue();
     }
 
@@ -62,6 +64,7 @@ final class JsonDoubleImpl implements JsonNumber, Serializable {
 
     @Override
     public long longValueExact() {
+        checkFractionalPart();
         return (long) value;
     }
 
@@ -102,6 +105,15 @@ final class JsonDoubleImpl implements JsonNumber, Serializable {
 
     @Override
     public boolean equals(final Object obj) {
-        return JsonNumber.class.isInstance(obj) && JsonNumber.class.cast(obj).doubleValue() == value;
+        if (JsonDoubleImpl.class.isInstance(obj)) {
+            return JsonDoubleImpl.class.cast(obj).value == value;
+        }
+        return JsonNumber.class.isInstance(obj) && Objects.equals(JsonNumber.class.cast(obj).bigDecimalValue(), bigDecimalValue());
+    }
+
+    private void checkFractionalPart() {
+        if ((value % 1) != 0) {
+            throw new ArithmeticException("Not an int/long, use other value readers");
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/249301ac/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java
index 13e518e..4a1f523 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java
@@ -28,10 +28,10 @@ final class JsonNumberImpl implements JsonNumber, Serializable {
     private transient Integer hashCode = null;
 
     JsonNumberImpl(final BigDecimal decimal) {
-        if(decimal == null) {
+        if (decimal == null) {
             throw new NullPointerException("decimal must not be null");
         }
-        
+
         this.value = decimal;
     }
 
@@ -52,6 +52,7 @@ final class JsonNumberImpl implements JsonNumber, Serializable {
 
     @Override
     public int intValueExact() {
+        checkFractionalPart();
         return value.intValueExact();
     }
 
@@ -62,6 +63,7 @@ final class JsonNumberImpl implements JsonNumber, Serializable {
 
     @Override
     public long longValueExact() {
+        checkFractionalPart();
         return value.longValueExact();
     }
 
@@ -97,10 +99,10 @@ final class JsonNumberImpl implements JsonNumber, Serializable {
 
     @Override
     public int hashCode() {
-        Integer h=hashCode;
+        Integer h = hashCode;
         if (h == null) {
             h = value.hashCode();
-            hashCode=h;
+            hashCode = h;
         }
         return h;
     }
@@ -109,4 +111,10 @@ final class JsonNumberImpl implements JsonNumber, Serializable {
     public boolean equals(final Object obj) {
         return JsonNumber.class.isInstance(obj) && JsonNumber.class.cast(obj).bigDecimalValue().equals(value);
     }
+
+    private void checkFractionalPart() {
+        if (value.remainder(BigDecimal.ONE).doubleValue() != 0) {
+            throw new ArithmeticException("Not an int/long, use other value readers");
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/249301ac/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java
index 194017c..f994444 100644
--- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java
@@ -29,10 +29,30 @@ import java.io.StringWriter;
 import java.math.BigInteger;
 
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.fail;
 
 
 public class JsonNumberTest {
     @Test
+    public void nonZeroFractional() {
+        final JsonNumber number = Json.createArrayBuilder()
+                .add(12345.6489)
+                .build()
+                .getJsonNumber(0);
+        try {
+            number.intValueExact();
+            fail();
+        } catch (final ArithmeticException ae) {
+            // ok
+        }
+        try {
+            number.longValueExact();
+            fail();
+        } catch (final ArithmeticException ae) {
+            // ok
+        }
+    }
+    @Test
     public void equals() {
         final JsonNumber a = Json.createObjectBuilder().add("a", 1).build().getJsonNumber("a");
         final JsonNumber b = Json.createObjectBuilder().add("b", 1.1).build().getJsonNumber("b");