Author: sebb
Date: Wed Aug 5 09:03:32 2009
New Revision: 801094
URL: http://svn.apache.org/viewvc?rev=801094&view=rev
Log:
JEXL-68 Revert part of r801035 (incorrectly removed .tolong() coercions)
Modified:
commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/JexlArithmetic.java
Modified:
commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/JexlArithmetic.java
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/JexlArithmetic.java?rev=801094&r1=801093&r2=801094&view=diff
==============================================================================
---
commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/JexlArithmetic.java
(original)
+++
commons/proper/jexl/branches/2.0/src/main/java/org/apache/commons/jexl/JexlArithmetic.java
Wed Aug 5 09:03:32 2009
@@ -25,13 +25,13 @@
*/
public class JexlArithmetic {
/** Integer.MAX_VALUE as BigDecimal. */
- private static final BigDecimal BIGD_DOUBLE_MAX_VALUE =
BigDecimal.valueOf(Double.MAX_VALUE);
+ protected static final BigDecimal BIGD_DOUBLE_MAX_VALUE =
BigDecimal.valueOf(Double.MAX_VALUE);
/** Integer.MIN_VALUE as BigDecimal. */
- private static final BigDecimal BIGD_DOUBLE_MIN_VALUE =
BigDecimal.valueOf(-Double.MAX_VALUE);
+ protected static final BigDecimal BIGD_DOUBLE_MIN_VALUE =
BigDecimal.valueOf(-Double.MAX_VALUE);
/** Long.MAX_VALUE as BigInteger. */
- private static final BigInteger BIGI_LONG_MAX_VALUE =
BigInteger.valueOf(Long.MAX_VALUE);
+ protected static final BigInteger BIGI_LONG_MAX_VALUE =
BigInteger.valueOf(Long.MAX_VALUE);
/** Long.MIN_VALUE as BigInteger. */
- private static final BigInteger BIGI_LONG_MIN_VALUE =
BigInteger.valueOf(Long.MIN_VALUE);
+ protected static final BigInteger BIGI_LONG_MIN_VALUE =
BigInteger.valueOf(Long.MIN_VALUE);
/** Whether this JexlArithmetic instance behaves in strict or lenient
mode. */
protected boolean strict;
@@ -122,11 +122,7 @@
BigInteger l = toBigInteger(left);
BigInteger r = toBigInteger(right);
BigInteger result = l.add(r);
- if (result.compareTo(BIGI_LONG_MAX_VALUE) <= 0
- && result.compareTo(BIGI_LONG_MIN_VALUE) >= 0) {
- return result;
- }
- return result;
+ return narrowBigInteger(result);
} catch (java.lang.NumberFormatException nfe) {
// Well, use strings!
return toString(left).concat(toString(right));
@@ -216,11 +212,7 @@
BigInteger l = toBigInteger(left);
BigInteger r = toBigInteger(right);
BigInteger result = l.mod(r);
- if (result.compareTo(BIGI_LONG_MAX_VALUE) <= 0
- && result.compareTo(BIGI_LONG_MIN_VALUE) >= 0) {
- return result;
- }
- return result;
+ return narrowBigInteger(result);
}
/**
@@ -266,11 +258,7 @@
BigInteger l = toBigInteger(left);
BigInteger r = toBigInteger(right);
BigInteger result = l.multiply(r);
- if (result.compareTo(BIGI_LONG_MAX_VALUE) <= 0
- && result.compareTo(BIGI_LONG_MIN_VALUE) >= 0) {
- return result;
- }
- return result;
+ return narrowBigInteger(result);
}
/**
@@ -316,11 +304,7 @@
BigInteger l = toBigInteger(left);
BigInteger r = toBigInteger(right);
BigInteger result = l.subtract(r);
- if (result.compareTo(BIGI_LONG_MAX_VALUE) <= 0
- && result.compareTo(BIGI_LONG_MIN_VALUE) >= 0) {
- return result;
- }
- return result;
+ return narrowBigInteger(result);
}
/**
@@ -707,7 +691,8 @@
if (original instanceof BigInteger) {
BigInteger bigi = (BigInteger) original;
// if it's bigger than a Long it can't be narrowed
- if (bigi.compareTo(BIGI_LONG_MAX_VALUE) > 0) {
+ if (bigi.compareTo(BIGI_LONG_MAX_VALUE) > 0
+ || bigi.compareTo(BIGI_LONG_MIN_VALUE) < 0) {
return original;
}
}
@@ -725,4 +710,24 @@
return result;
}
+ /**
+ * Given a BigInteger, narrow it to a Long if it fits.
+ * @param bigi the BigInteger to narrow
+ * @return a Long if narrowing is possible, the original BigInteger
otherwise
+ */
+ protected Number narrowBigInteger(BigInteger bigi) {
+ //coerce to long if possible
+ if (bigi.compareTo(BIGI_LONG_MAX_VALUE) <= 0
+ && bigi.compareTo(BIGI_LONG_MIN_VALUE) >= 0) {
+ // coerce to int if possible
+ long l = bigi.longValue();
+// TODO: think about coercing to int when possible to avoid method calls to
fail
+// once and force a narrow call in the general 'int' case
+// if (l <= ((long) Integer.MAX_VALUE) && l >= ((long)
Integer.MIN_VALUE)) {
+// return new Integer((int) l);
+// }
+ return new Long(l);
+ }
+ return bigi;
+ }
}
\ No newline at end of file