diff --git a/src/main/java/org/apache/xmlbeans/GDateBuilder.java b/src/main/java/org/apache/xmlbeans/GDateBuilder.java index 2d82527f2..2b0f75275 100644 --- a/src/main/java/org/apache/xmlbeans/GDateBuilder.java +++ b/src/main/java/org/apache/xmlbeans/GDateBuilder.java @@ -22,6 +22,8 @@ import java.util.Date; import java.util.TimeZone; +import org.apache.xmlbeans.impl.util.MathUtil; + /** * Used to build {@link GDate GDates}. *
@@ -811,7 +813,7 @@ private long _normalizeTime() { if (_fs != null && (_fs.signum() < 0 || _fs.compareTo(GDate._one) >= 0)) { BigDecimal bdcarry = _fs.setScale(0, RoundingMode.FLOOR); _fs = _fs.subtract(bdcarry); - carry = bdcarry.longValue(); + carry = MathUtil.toLong(bdcarry); } if (carry != 0 || _s < 0 || _s > 59 || _m < 0 || _m > 50 || _h < 0 || _h > 23) { diff --git a/src/main/java/org/apache/xmlbeans/GDurationBuilder.java b/src/main/java/org/apache/xmlbeans/GDurationBuilder.java index 372e5b40a..6bf32d476 100644 --- a/src/main/java/org/apache/xmlbeans/GDurationBuilder.java +++ b/src/main/java/org/apache/xmlbeans/GDurationBuilder.java @@ -19,6 +19,8 @@ import java.math.BigInteger; import java.math.RoundingMode; +import org.apache.xmlbeans.impl.util.MathUtil; + /** * Used to build {@link GDuration GDurations}. */ @@ -348,7 +350,7 @@ private void _normalizeImpl(boolean adjustSign) { if (_fs != null && (_fs.signum() < 0 || _fs.compareTo(GDate._one) >= 0)) { BigDecimal bdcarry = _fs.setScale(0, RoundingMode.FLOOR); _fs = _fs.subtract(bdcarry); - carry = bdcarry.intValue(); + carry = MathUtil.toInt(bdcarry); } if (carry != 0 || _s < 0 || _s > 59 || _m < 0 || _m > 50 || _h < 0 || _h > 23) { diff --git a/src/main/java/org/apache/xmlbeans/impl/util/MathUtil.java b/src/main/java/org/apache/xmlbeans/impl/util/MathUtil.java index 11170536a..b2a1eeda0 100644 --- a/src/main/java/org/apache/xmlbeans/impl/util/MathUtil.java +++ b/src/main/java/org/apache/xmlbeans/impl/util/MathUtil.java @@ -195,7 +195,7 @@ public static int parseAsInt(String s) { * @param value BigDecimal to convert * @return valid BigInteger * @throws IllegalArgumentException if the input has an absolute exponent that is too large to safely convert - * @throws NullPointerException if string is null + * @throws NullPointerException if value is null */ public static BigInteger toBigInteger(BigDecimal value) { BigDecimal normalized = value.stripTrailingZeros(); @@ -207,4 +207,29 @@ public static BigInteger toBigInteger(BigDecimal value) { } return normalized.toBigInteger(); } + + /** + * @param value BigDecimal to convert + * @return valid long + * @throws IllegalArgumentException if the input has an absolute exponent that is too large to safely convert + * @throws ArithmeticException if the value cannot be represented as a long + * @throws NullPointerException if value is null + */ + public static long toLong(BigDecimal value) { + BigInteger bigInt = toBigInteger(value); + return bigInt.longValueExact(); + } + + /** + * @param value BigDecimal to convert + * @return valid int + * @throws IllegalArgumentException if the input has an absolute exponent that is too large to safely convert + * @throws ArithmeticException if the value cannot be represented as an int + * @throws NullPointerException if value is null + */ + public static int toInt(BigDecimal value) { + BigInteger bigInt = toBigInteger(value); + return bigInt.intValueExact(); + } + } diff --git a/src/main/java/org/apache/xmlbeans/impl/util/XsTypeConverter.java b/src/main/java/org/apache/xmlbeans/impl/util/XsTypeConverter.java index f25f7c99d..f20978f8f 100644 --- a/src/main/java/org/apache/xmlbeans/impl/util/XsTypeConverter.java +++ b/src/main/java/org/apache/xmlbeans/impl/util/XsTypeConverter.java @@ -264,7 +264,7 @@ public static String printDecimal(BigDecimal value) { // The following code comes from Apache Harmony String intStr = value.unscaledValue().toString(); int scale = value.scale(); - if ((scale == 0) || ((value.longValue() == 0) && (scale < 0))) { + if (scale == 0 || (MathUtil.toLong(value) == 0 && scale < 0)) { return intStr; } diff --git a/src/main/java/org/apache/xmlbeans/impl/values/JavaIntHolderEx.java b/src/main/java/org/apache/xmlbeans/impl/values/JavaIntHolderEx.java index 202d7ce10..dc0e8a4b8 100644 --- a/src/main/java/org/apache/xmlbeans/impl/values/JavaIntHolderEx.java +++ b/src/main/java/org/apache/xmlbeans/impl/values/JavaIntHolderEx.java @@ -20,6 +20,7 @@ import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.impl.common.QNameHelper; import org.apache.xmlbeans.impl.common.ValidationContext; +import org.apache.xmlbeans.impl.util.MathUtil; import org.apache.xmlbeans.impl.util.XsTypeConverter; public abstract class JavaIntHolderEx extends JavaIntHolder { @@ -150,7 +151,7 @@ private static int getIntValue(XmlObject o) { SchemaType s = o.schemaType(); switch (s.getDecimalSize()) { case SchemaType.SIZE_BIG_DECIMAL: - return ((XmlObjectBase) o).getBigDecimalValue().intValue(); + return MathUtil.toInt(((XmlObjectBase) o).getBigDecimalValue()); case SchemaType.SIZE_BIG_INTEGER: return ((XmlObjectBase) o).getBigIntegerValue().intValue(); case SchemaType.SIZE_LONG: diff --git a/src/main/java/org/apache/xmlbeans/impl/values/JavaLongHolderEx.java b/src/main/java/org/apache/xmlbeans/impl/values/JavaLongHolderEx.java index 6bce884c6..d88f1c644 100644 --- a/src/main/java/org/apache/xmlbeans/impl/values/JavaLongHolderEx.java +++ b/src/main/java/org/apache/xmlbeans/impl/values/JavaLongHolderEx.java @@ -20,6 +20,7 @@ import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.impl.common.QNameHelper; import org.apache.xmlbeans.impl.common.ValidationContext; +import org.apache.xmlbeans.impl.util.MathUtil; import org.apache.xmlbeans.impl.util.XsTypeConverter; public abstract class JavaLongHolderEx extends JavaLongHolder { @@ -150,7 +151,7 @@ private static long getLongValue(XmlObject o) { SchemaType s = o.schemaType(); switch (s.getDecimalSize()) { case SchemaType.SIZE_BIG_DECIMAL: - return ((XmlObjectBase) o).getBigDecimalValue().longValue(); + return MathUtil.toLong(((XmlObjectBase) o).getBigDecimalValue()); case SchemaType.SIZE_BIG_INTEGER: return ((XmlObjectBase) o).getBigIntegerValue().longValue(); case SchemaType.SIZE_LONG: diff --git a/src/main/java/org/apache/xmlbeans/impl/xsd2inst/SampleXmlUtil.java b/src/main/java/org/apache/xmlbeans/impl/xsd2inst/SampleXmlUtil.java index 939f0cc84..ca9248357 100644 --- a/src/main/java/org/apache/xmlbeans/impl/xsd2inst/SampleXmlUtil.java +++ b/src/main/java/org/apache/xmlbeans/impl/xsd2inst/SampleXmlUtil.java @@ -409,7 +409,7 @@ private String formatDecimal(String start, SchemaType sType) { xmlD = (XmlDecimal) sType.getFacet(SchemaType.FACET_TOTAL_DIGITS); int totalDigits = -1; if (xmlD != null) { - totalDigits = xmlD.getBigDecimalValue().intValue(); + totalDigits = MathUtil.toInt(xmlD.getBigDecimalValue()); StringBuilder sb = new StringBuilder(totalDigits); for (int i = 0; i < totalDigits; i++) { @@ -439,7 +439,7 @@ private String formatDecimal(String start, SchemaType sType) { if (xmlD == null) { increment = new BigDecimal(1); } else { - fractionDigits = xmlD.getBigDecimalValue().intValue(); + fractionDigits = MathUtil.toInt(xmlD.getBigDecimalValue()); if (fractionDigits > 0) { StringBuilder sb = new StringBuilder("0."); for (int i = 1; i < fractionDigits; i++) {