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 <[email protected]> Authored: Mon Jun 5 15:01:56 2017 +0200 Committer: rmannibucau <[email protected]> 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");
