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");