luehe 2003/06/17 13:18:11 Modified: el/src/java/org/apache/commons/el ArithmeticOperator.java Coercions.java DivideOperator.java GreaterThanOperator.java GreaterThanOrEqualsOperator.java LessThanOperator.java LessThanOrEqualsOperator.java MinusOperator.java ModulusOperator.java MultiplyOperator.java PlusOperator.java RelationalOperator.java UnaryMinusOperator.java Log: Fix for Bugtraq 4879322 ("Number coercions from String to Big(Decimal/Integer) isn't performed correctly") Patch provided by Ryan Lubke Revision Changes Path 1.2 +20 -6 jakarta-commons/el/src/java/org/apache/commons/el/ArithmeticOperator.java Index: ArithmeticOperator.java =================================================================== RCS file: /home/cvs/jakarta-commons/el/src/java/org/apache/commons/el/ArithmeticOperator.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- ArithmeticOperator.java 4 Feb 2003 00:22:24 -0000 1.1 +++ ArithmeticOperator.java 17 Jun 2003 20:18:10 -0000 1.2 @@ -56,6 +56,8 @@ package org.apache.commons.el; import javax.servlet.jsp.el.ELException; +import java.math.BigDecimal; +import java.math.BigInteger; /** * @@ -86,18 +88,30 @@ * * Applies the operator to the given double values, returning a double **/ - public abstract double apply (double pLeft, - double pRight, - Logger pLogger); + public abstract double apply (double pLeft, double pRight); //------------------------------------- /** * * Applies the operator to the given double values, returning a double **/ - public abstract long apply (long pLeft, - long pRight, - Logger pLogger); + public abstract long apply (long pLeft, long pRight); //------------------------------------- + + /** + * + * Applies the operator to the given BigDecimal values, returning a BigDecimal + **/ + public abstract BigDecimal apply(BigDecimal pLeft, BigDecimal pRight); + + //------------------------------------- + + /** + * + * Applies the operator to the given BigDecimal values, returning a BigDecimal + **/ + public abstract BigInteger apply(BigInteger pLeft, BigInteger pRight); + + //------------------------------------- } 1.3 +122 -22 jakarta-commons/el/src/java/org/apache/commons/el/Coercions.java Index: Coercions.java =================================================================== RCS file: /home/cvs/jakarta-commons/el/src/java/org/apache/commons/el/Coercions.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- Coercions.java 17 Jun 2003 17:31:27 -0000 1.2 +++ Coercions.java 17 Jun 2003 20:18:10 -0000 1.3 @@ -74,9 +74,17 @@ * Binary operator - A {+,-,*} B * if A and B are null * return 0 + * if A or B is BigDecimal, coerce both to BigDecimal and then: + * if operator is +, return <code>A.add(B)</code> + * if operator is -, return <code>A.subtract(B)</code> + * if operator is *, return <code>A.multiply(B)</code> * if A or B is Float, Double, or String containing ".", "e", or "E" - * coerce both A and B to Double - * apply operator + * if A or B is BigInteger, coerce both A and B to BigDecimal and apply operator + * coerce both A and B to Double and apply operator + * if A or B is BigInteger, coerce both to BigInteger and then: + * if operator is +, return <code>A.add(B)</code> + * if operator is -, return <code>A.subtract(B)</code> + * if operator is *, return <code>A.multiply(B)</code> * otherwise * coerce both A and B to Long * apply operator @@ -85,6 +93,8 @@ * Binary operator - A {/,div} B * if A and B are null * return 0 + * if A or B is a BigDecimal or BigInteger, coerce both to BigDecimal and + * return <code>A.divide(B, BigDecimal.ROUND_HALF_UP)</code> * otherwise * coerce both A and B to Double * apply operator @@ -93,9 +103,11 @@ * Binary operator - A {%,mod} B * if A and B are null * return 0 - * if A or B is Float, Double, or String containing ".", "e" or "E" + * if A or B is BigDecimal, Float, Double, or String containing ".", "e" or "E" * coerce both to Double * apply operator + * if A or B is BigInteger, coerce both to BigInteger and return + * <code>A.remainder(B)</code> * otherwise * coerce both A and B to Long * apply operator @@ -104,6 +116,7 @@ * Unary minus operator - -A * if A is null * return 0 + * if A is BigInteger or BigDecimal, return <code>A.negate()</code> * if A is String * if A contains ".", "e", or "E" * coerce to Double, apply operator @@ -126,6 +139,8 @@ * return true * if A is Map and ((Map) A).isEmpty() * return true + * if A is Collection an ((Collection) A).isEmpty() + * return true * otherwise * return false * @@ -146,9 +161,13 @@ * return false * if A or B is null * return false + * if A or B is BigDecimal, coerce both A and B to BigDecimal and use the + * return value of <code>A.compareTo(B)</code> * if A or B is Float or Double * coerce both A and B to Double * apply operator + * if A or B is BigInteger, coerce both A and B to BigInteger and use the + * return value of <code>A.compareTo(B)</code> * if A or B is Byte,Short,Character,Integer,Long * coerce both A and B to Long * apply operator @@ -173,9 +192,15 @@ * apply operator * if A or B is null * return false for ==, true for != + * if A or B is BigDecimal, coerce both A and B to BigDecimal and then: + * if operator is == or eq, return <code>A.equals(B)</code> + * if operator is != or ne, return <code>!A.equals(B)</code> * if A or B is Float or Double * coerce both A and B to Double * apply operator + * if A or B is BigInteger, coerce both A and B to BigInteger and then: + * if operator is == or eq, return <code>A.equals(B)</code> + * if operator is != or ne, return <code>!A.equals(B)</code> * if A or B is Byte,Short,Character,Integer,Long * coerce both A and B to Long * apply operator @@ -805,18 +830,42 @@ return PrimitiveObjects.getInteger (0); } - else if (isFloatingPointType (pLeft) || - isFloatingPointType (pRight) || - isFloatingPointString (pLeft) || - isFloatingPointString (pRight)) { - double left = - coerceToPrimitiveNumber (pLeft, Double.class, pLogger). - doubleValue (); - double right = - coerceToPrimitiveNumber (pRight, Double.class, pLogger). - doubleValue (); - return - PrimitiveObjects.getDouble (pOperator.apply (left, right, pLogger)); + else if (isBigDecimal(pLeft) || isBigDecimal(pRight)) { + BigDecimal left = (BigDecimal) + coerceToPrimitiveNumber(pLeft, BigDecimal.class, pLogger); + BigDecimal right = (BigDecimal) + coerceToPrimitiveNumber(pRight, BigDecimal.class, pLogger); + return pOperator.apply(left, right); + } + + else if (isFloatingPointType(pLeft) || + isFloatingPointType(pRight) || + isFloatingPointString(pLeft) || + isFloatingPointString(pRight)) { + if (isBigInteger(pLeft) || isBigInteger(pRight)) { + BigDecimal left = (BigDecimal) + coerceToPrimitiveNumber(pLeft, BigDecimal.class, pLogger); + BigDecimal right = (BigDecimal) + coerceToPrimitiveNumber(pRight, BigDecimal.class, pLogger); + return pOperator.apply(left, right); + } else { + double left = + coerceToPrimitiveNumber(pLeft, Double.class, pLogger). + doubleValue(); + double right = + coerceToPrimitiveNumber(pRight, Double.class, pLogger). + doubleValue(); + return + PrimitiveObjects.getDouble(pOperator.apply(left, right)); + } + } + + else if (isBigInteger(pLeft) || isBigInteger(pRight)) { + BigInteger left = (BigInteger) + coerceToPrimitiveNumber(pLeft, BigInteger.class, pLogger); + BigInteger right = (BigInteger) + coerceToPrimitiveNumber(pRight, BigInteger.class, pLogger); + return pOperator.apply(left, right); } else { @@ -827,7 +876,7 @@ coerceToPrimitiveNumber (pRight, Long.class, pLogger). longValue (); return - PrimitiveObjects.getLong (pOperator.apply (left, right, pLogger)); + PrimitiveObjects.getLong (pOperator.apply (left, right)); } } @@ -844,7 +893,15 @@ Logger pLogger) throws ELException { - if (isFloatingPointType (pLeft) || + if (isBigDecimal(pLeft) || isBigDecimal(pRight)) { + BigDecimal left = (BigDecimal) + coerceToPrimitiveNumber(pLeft, BigDecimal.class, pLogger); + BigDecimal right = (BigDecimal) + coerceToPrimitiveNumber(pRight, BigDecimal.class, pLogger); + return PrimitiveObjects.getBoolean(pOperator.apply(left, right)); + } + + else if (isFloatingPointType (pLeft) || isFloatingPointType (pRight)) { double left = coerceToPrimitiveNumber (pLeft, Double.class, pLogger). @@ -853,7 +910,15 @@ coerceToPrimitiveNumber (pRight, Double.class, pLogger). doubleValue (); return - PrimitiveObjects.getBoolean (pOperator.apply (left, right, pLogger)); + PrimitiveObjects.getBoolean (pOperator.apply (left, right)); + } + + else if (isBigInteger(pLeft) || isBigInteger(pRight)) { + BigInteger left = (BigInteger) + coerceToPrimitiveNumber(pLeft, BigInteger.class, pLogger); + BigInteger right = (BigInteger) + coerceToPrimitiveNumber(pRight, BigInteger.class, pLogger); + return PrimitiveObjects.getBoolean(pOperator.apply(left, right)); } else if (isIntegerType (pLeft) || @@ -865,7 +930,7 @@ coerceToPrimitiveNumber (pRight, Long.class, pLogger). longValue (); return - PrimitiveObjects.getBoolean (pOperator.apply (left, right, pLogger)); + PrimitiveObjects.getBoolean (pOperator.apply (left, right)); } else if (pLeft instanceof String || @@ -873,7 +938,7 @@ String left = coerceToString (pLeft, pLogger); String right = coerceToString (pRight, pLogger); return - PrimitiveObjects.getBoolean (pOperator.apply (left, right, pLogger)); + PrimitiveObjects.getBoolean (pOperator.apply (left, right)); } else if (pLeft instanceof Comparable) { @@ -881,7 +946,7 @@ int result = ((Comparable) pLeft).compareTo (pRight); return PrimitiveObjects.getBoolean - (pOperator.apply (result, -result, pLogger)); + (pOperator.apply (result, -result)); } catch (Exception exc) { if (pLogger.isLoggingError ()) { @@ -901,7 +966,7 @@ int result = ((Comparable) pRight).compareTo (pLeft); return PrimitiveObjects.getBoolean - (pOperator.apply (-result, result, pLogger)); + (pOperator.apply (-result, result)); } catch (Exception exc) { if (pLogger.isLoggingError ()) { @@ -950,6 +1015,14 @@ return PrimitiveObjects.getBoolean (pOperator.apply (false, pLogger)); } + else if (isBigDecimal(pLeft) || isBigDecimal(pRight)) { + BigDecimal left = (BigDecimal) + coerceToPrimitiveNumber(pLeft, BigDecimal.class, pLogger); + BigDecimal right = (BigDecimal) + coerceToPrimitiveNumber(pRight, BigDecimal.class, pLogger); + return PrimitiveObjects.getBoolean(pOperator.apply(left.equals(right), pLogger)); + } + else if (isFloatingPointType (pLeft) || isFloatingPointType (pRight)) { double left = @@ -963,6 +1036,14 @@ (pOperator.apply (left == right, pLogger)); } + else if (isBigInteger(pLeft) || isBigInteger(pRight)) { + BigInteger left = (BigInteger) + coerceToPrimitiveNumber(pLeft, BigInteger.class, pLogger); + BigInteger right = (BigInteger) + coerceToPrimitiveNumber(pRight, BigInteger.class, pLogger); + return PrimitiveObjects.getBoolean(pOperator.apply(left.equals(right), pLogger)); + } + else if (isIntegerType (pLeft) || isIntegerType (pRight)) { long left = @@ -1100,4 +1181,23 @@ //------------------------------------- + /** + * Returns true if the given object is BigInteger. + * @param pObject - Object to evaluate + * @return - true if the given object is BigInteger + */ + public static boolean isBigInteger(Object pObject) { + return + pObject != null && pObject instanceof BigInteger; + } + + /** + * Returns true if the given object is BigDecimal. + * @param pObject - Object to evaluate + * @return - true if the given object is BigDecimal + */ + public static boolean isBigDecimal(Object pObject) { + return + pObject != null && pObject instanceof BigDecimal; + } } 1.2 +44 -19 jakarta-commons/el/src/java/org/apache/commons/el/DivideOperator.java Index: DivideOperator.java =================================================================== RCS file: /home/cvs/jakarta-commons/el/src/java/org/apache/commons/el/DivideOperator.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- DivideOperator.java 4 Feb 2003 00:22:24 -0000 1.1 +++ DivideOperator.java 17 Jun 2003 20:18:10 -0000 1.2 @@ -56,6 +56,7 @@ package org.apache.commons.el; import javax.servlet.jsp.el.ELException; +import java.math.BigDecimal; /** * @@ -116,25 +117,49 @@ return PrimitiveObjects.getInteger (0); } - double left = - Coercions.coerceToPrimitiveNumber (pLeft, Double.class, pLogger). - doubleValue (); - double right = - Coercions.coerceToPrimitiveNumber (pRight, Double.class, pLogger). - doubleValue (); - - try { - return PrimitiveObjects.getDouble (left / right); - } - catch (Exception exc) { - if (pLogger.isLoggingError ()) { - pLogger.logError - (Constants.ARITH_ERROR, - getOperatorSymbol (), - "" + left, - "" + right); - } - return PrimitiveObjects.getInteger (0); + if (Coercions.isBigDecimal(pLeft) || + Coercions.isBigInteger(pLeft) || + Coercions.isBigDecimal(pRight) || + Coercions.isBigInteger(pRight)) { + + BigDecimal left = (BigDecimal) + Coercions.coerceToPrimitiveNumber(pLeft, BigDecimal.class, pLogger); + BigDecimal right = (BigDecimal) + Coercions.coerceToPrimitiveNumber(pRight, BigDecimal.class, pLogger); + + try { + return left.divide(right, BigDecimal.ROUND_HALF_UP); + } catch (Exception exc) { + if (pLogger.isLoggingError()) { + pLogger.logError + (Constants.ARITH_ERROR, + getOperatorSymbol(), + "" + left, + "" + right); + } + return PrimitiveObjects.getInteger(0); + } + } else { + + double left = + Coercions.coerceToPrimitiveNumber(pLeft, Double.class, pLogger). + doubleValue(); + double right = + Coercions.coerceToPrimitiveNumber(pRight, Double.class, pLogger). + doubleValue(); + + try { + return PrimitiveObjects.getDouble(left / right); + } catch (Exception exc) { + if (pLogger.isLoggingError()) { + pLogger.logError + (Constants.ARITH_ERROR, + getOperatorSymbol(), + "" + left, + "" + right); + } + return PrimitiveObjects.getInteger(0); + } } } 1.2 +25 -12 jakarta-commons/el/src/java/org/apache/commons/el/GreaterThanOperator.java Index: GreaterThanOperator.java =================================================================== RCS file: /home/cvs/jakarta-commons/el/src/java/org/apache/commons/el/GreaterThanOperator.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- GreaterThanOperator.java 4 Feb 2003 00:22:25 -0000 1.1 +++ GreaterThanOperator.java 17 Jun 2003 20:18:10 -0000 1.2 @@ -56,6 +56,8 @@ package org.apache.commons.el; import javax.servlet.jsp.el.ELException; +import java.math.BigDecimal; +import java.math.BigInteger; /** * @@ -123,10 +125,7 @@ * * Applies the operator to the given double values **/ - public boolean apply (double pLeft, - double pRight, - Logger pLogger) - { + public boolean apply (double pLeft, double pRight) { return pLeft > pRight; } @@ -135,10 +134,7 @@ * * Applies the operator to the given long values **/ - public boolean apply (long pLeft, - long pRight, - Logger pLogger) - { + public boolean apply (long pLeft, long pRight) { return pLeft > pRight; } @@ -147,12 +143,29 @@ * * Applies the operator to the given String values **/ - public boolean apply (String pLeft, - String pRight, - Logger pLogger) - { + public boolean apply (String pLeft, String pRight) { return pLeft.compareTo (pRight) > 0; } //------------------------------------- + + /** + * + * Applies the operator to the given BigDecimal values, returning a BigDecimal + **/ + public boolean apply(BigDecimal pLeft, BigDecimal pRight) { + return isGreater(pLeft.compareTo(pRight)); + } + + //------------------------------------- + + /** + * + * Applies the operator to the given BigDecimal values, returning a BigDecimal + **/ + public boolean apply(BigInteger pLeft, BigInteger pRight) { + return isGreater(pLeft.compareTo(pRight)); + } + + //------------------------------------- } 1.2 +25 -12 jakarta-commons/el/src/java/org/apache/commons/el/GreaterThanOrEqualsOperator.java Index: GreaterThanOrEqualsOperator.java =================================================================== RCS file: /home/cvs/jakarta-commons/el/src/java/org/apache/commons/el/GreaterThanOrEqualsOperator.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- GreaterThanOrEqualsOperator.java 4 Feb 2003 00:22:25 -0000 1.1 +++ GreaterThanOrEqualsOperator.java 17 Jun 2003 20:18:10 -0000 1.2 @@ -56,6 +56,8 @@ package org.apache.commons.el; import javax.servlet.jsp.el.ELException; +import java.math.BigDecimal; +import java.math.BigInteger; /** * @@ -123,10 +125,7 @@ * * Applies the operator to the given double values **/ - public boolean apply (double pLeft, - double pRight, - Logger pLogger) - { + public boolean apply (double pLeft, double pRight) { return pLeft >= pRight; } @@ -135,10 +134,7 @@ * * Applies the operator to the given long values **/ - public boolean apply (long pLeft, - long pRight, - Logger pLogger) - { + public boolean apply (long pLeft, long pRight) { return pLeft >= pRight; } @@ -147,12 +143,29 @@ * * Applies the operator to the given String values **/ - public boolean apply (String pLeft, - String pRight, - Logger pLogger) - { + public boolean apply (String pLeft, String pRight) { return pLeft.compareTo (pRight) >= 0; } //------------------------------------- + + /** + * + * Applies the operator to the given BigDecimal values, returning a BigDecimal + **/ + public boolean apply(BigDecimal pLeft, BigDecimal pRight) { + return (isGreater(pLeft.compareTo(pRight)) || isEqual(pLeft.compareTo(pRight))); + } + + //------------------------------------- + + /** + * + * Applies the operator to the given BigDecimal values, returning a BigDecimal + **/ + public boolean apply(BigInteger pLeft, BigInteger pRight) { + return (isGreater(pLeft.compareTo(pRight)) || isEqual(pLeft.compareTo(pRight))); + } + + //------------------------------------- } 1.2 +25 -12 jakarta-commons/el/src/java/org/apache/commons/el/LessThanOperator.java Index: LessThanOperator.java =================================================================== RCS file: /home/cvs/jakarta-commons/el/src/java/org/apache/commons/el/LessThanOperator.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- LessThanOperator.java 4 Feb 2003 00:22:25 -0000 1.1 +++ LessThanOperator.java 17 Jun 2003 20:18:10 -0000 1.2 @@ -56,6 +56,8 @@ package org.apache.commons.el; import javax.servlet.jsp.el.ELException; +import java.math.BigDecimal; +import java.math.BigInteger; /** * @@ -123,10 +125,7 @@ * * Applies the operator to the given double values **/ - public boolean apply (double pLeft, - double pRight, - Logger pLogger) - { + public boolean apply (double pLeft, double pRight) { return pLeft < pRight; } @@ -135,10 +134,7 @@ * * Applies the operator to the given long values **/ - public boolean apply (long pLeft, - long pRight, - Logger pLogger) - { + public boolean apply (long pLeft, long pRight) { return pLeft < pRight; } @@ -147,12 +143,29 @@ * * Applies the operator to the given String values **/ - public boolean apply (String pLeft, - String pRight, - Logger pLogger) - { + public boolean apply (String pLeft, String pRight) { return pLeft.compareTo (pRight) < 0; } //------------------------------------- + + /** + * + * Applies the operator to the given BigDecimal values, returning a BigDecimal + **/ + public boolean apply(BigDecimal pLeft, BigDecimal pRight) { + return isLess(pLeft.compareTo(pRight)); + } + + //------------------------------------- + + /** + * + * Applies the operator to the given BigDecimal values, returning a BigDecimal + **/ + public boolean apply(BigInteger pLeft, BigInteger pRight) { + return isLess(pLeft.compareTo(pRight)); + } + + //------------------------------------- } 1.2 +25 -12 jakarta-commons/el/src/java/org/apache/commons/el/LessThanOrEqualsOperator.java Index: LessThanOrEqualsOperator.java =================================================================== RCS file: /home/cvs/jakarta-commons/el/src/java/org/apache/commons/el/LessThanOrEqualsOperator.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- LessThanOrEqualsOperator.java 4 Feb 2003 00:22:25 -0000 1.1 +++ LessThanOrEqualsOperator.java 17 Jun 2003 20:18:10 -0000 1.2 @@ -56,6 +56,8 @@ package org.apache.commons.el; import javax.servlet.jsp.el.ELException; +import java.math.BigDecimal; +import java.math.BigInteger; /** * @@ -123,10 +125,7 @@ * * Applies the operator to the given double values **/ - public boolean apply (double pLeft, - double pRight, - Logger pLogger) - { + public boolean apply (double pLeft, double pRight) { return pLeft <= pRight; } @@ -135,10 +134,7 @@ * * Applies the operator to the given long values **/ - public boolean apply (long pLeft, - long pRight, - Logger pLogger) - { + public boolean apply (long pLeft, long pRight) { return pLeft <= pRight; } @@ -147,12 +143,29 @@ * * Applies the operator to the given String values **/ - public boolean apply (String pLeft, - String pRight, - Logger pLogger) - { + public boolean apply (String pLeft, String pRight) { return pLeft.compareTo (pRight) <= 0; } //------------------------------------- + + /** + * + * Applies the operator to the given BigDecimal values, returning a BigDecimal + **/ + public boolean apply(BigDecimal pLeft, BigDecimal pRight) { + return (isLess(pLeft.compareTo(pRight)) || isEqual(pLeft.compareTo(pRight))); + } + + //------------------------------------- + + /** + * + * Applies the operator to the given BigDecimal values, returning a BigDecimal + **/ + public boolean apply(BigInteger pLeft, BigInteger pRight) { + return (isLess(pLeft.compareTo(pRight)) || isEqual(pLeft.compareTo(pRight))); + } + + //------------------------------------- } 1.2 +26 -10 jakarta-commons/el/src/java/org/apache/commons/el/MinusOperator.java Index: MinusOperator.java =================================================================== RCS file: /home/cvs/jakarta-commons/el/src/java/org/apache/commons/el/MinusOperator.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- MinusOperator.java 4 Feb 2003 00:22:25 -0000 1.1 +++ MinusOperator.java 17 Jun 2003 20:18:10 -0000 1.2 @@ -55,6 +55,9 @@ package org.apache.commons.el; +import java.math.BigDecimal; +import java.math.BigInteger; + /** * * <p>The implementation of the minus operator @@ -89,8 +92,7 @@ * * Returns the symbol representing the operator **/ - public String getOperatorSymbol () - { + public String getOperatorSymbol () { return "-"; } @@ -99,10 +101,7 @@ * * Applies the operator to the given double values, returning a double **/ - public double apply (double pLeft, - double pRight, - Logger pLogger) - { + public double apply (double pLeft, double pRight) { return pLeft - pRight; } @@ -111,12 +110,29 @@ * * Applies the operator to the given double values, returning a double **/ - public long apply (long pLeft, - long pRight, - Logger pLogger) - { + public long apply (long pLeft, long pRight) { return pLeft - pRight; } //------------------------------------- + + /** + * + * Applies the operator to the given BigDecimal values, returning a BigDecimal + **/ + public BigDecimal apply(BigDecimal pLeft, BigDecimal pRight) { + return pLeft.subtract(pRight); + } + + //------------------------------------- + + /** + * + * Applies the operator to the given BigInteger values, returning a BigInteger + **/ + public BigInteger apply(BigInteger pLeft, BigInteger pRight) { + return pLeft.subtract(pRight); + } + + //------------------------------------- } 1.2 +23 -1 jakarta-commons/el/src/java/org/apache/commons/el/ModulusOperator.java Index: ModulusOperator.java =================================================================== RCS file: /home/cvs/jakarta-commons/el/src/java/org/apache/commons/el/ModulusOperator.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- ModulusOperator.java 4 Feb 2003 00:22:25 -0000 1.1 +++ ModulusOperator.java 17 Jun 2003 20:18:10 -0000 1.2 @@ -56,6 +56,7 @@ package org.apache.commons.el; import javax.servlet.jsp.el.ELException; +import java.math.BigInteger; /** * @@ -119,9 +120,11 @@ if ((pLeft != null && (Coercions.isFloatingPointType (pLeft) || Coercions.isFloatingPointString (pLeft))) || + Coercions.isBigDecimal(pLeft) || (pRight != null && (Coercions.isFloatingPointType (pRight) || - Coercions.isFloatingPointString (pRight)))) { + Coercions.isFloatingPointString (pRight) || + Coercions.isBigDecimal(pRight)))) { double left = Coercions.coerceToPrimitiveNumber (pLeft, Double.class, pLogger). doubleValue (); @@ -142,6 +145,25 @@ } return PrimitiveObjects.getInteger (0); } + } + else if (Coercions.isBigInteger(pLeft) || Coercions.isBigInteger(pRight)) { + BigInteger left = (BigInteger) + Coercions.coerceToPrimitiveNumber(pLeft, BigInteger.class, pLogger); + BigInteger right = (BigInteger) + Coercions.coerceToPrimitiveNumber(pRight, BigInteger.class, pLogger); + + try { + return left.remainder(right); + } catch (Exception exc) { + if (pLogger.isLoggingError()) { + pLogger.logError + (Constants.ARITH_ERROR, + getOperatorSymbol(), + "" + left, + "" + right); + } + return PrimitiveObjects.getInteger(0); + } } else { long left = 1.2 +31 -4 jakarta-commons/el/src/java/org/apache/commons/el/MultiplyOperator.java Index: MultiplyOperator.java =================================================================== RCS file: /home/cvs/jakarta-commons/el/src/java/org/apache/commons/el/MultiplyOperator.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- MultiplyOperator.java 4 Feb 2003 00:22:25 -0000 1.1 +++ MultiplyOperator.java 17 Jun 2003 20:18:10 -0000 1.2 @@ -55,6 +55,9 @@ package org.apache.commons.el; +import java.math.BigDecimal; +import java.math.BigInteger; + /** * * <p>The implementation of the multiply operator @@ -100,8 +103,8 @@ * Applies the operator to the given double values, returning a double **/ public double apply (double pLeft, - double pRight, - Logger pLogger) + double pRight + ) { return pLeft * pRight; } @@ -112,11 +115,35 @@ * Applies the operator to the given double values, returning a double **/ public long apply (long pLeft, - long pRight, - Logger pLogger) + long pRight + ) { return pLeft * pRight; } //------------------------------------- + + /** + * + * Applies the operator to the given BigDecimal values, returning a BigDecimal + **/ + public BigDecimal apply(BigDecimal pLeft, + BigDecimal pRight + ) { + return pLeft.multiply(pRight); + } + + //------------------------------------- + + /** + * + * Applies the operator to the given BigInteger values, returning a BigInteger + **/ + public BigInteger apply(BigInteger pLeft, + BigInteger pRight + ) { + return pLeft.multiply(pRight); + } + + //------------------------------------- } 1.2 +27 -10 jakarta-commons/el/src/java/org/apache/commons/el/PlusOperator.java Index: PlusOperator.java =================================================================== RCS file: /home/cvs/jakarta-commons/el/src/java/org/apache/commons/el/PlusOperator.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- PlusOperator.java 4 Feb 2003 00:22:25 -0000 1.1 +++ PlusOperator.java 17 Jun 2003 20:18:10 -0000 1.2 @@ -55,6 +55,10 @@ package org.apache.commons.el; +import javax.servlet.jsp.el.ELException; +import java.math.BigDecimal; +import java.math.BigInteger; + /** * * <p>The implementation of the plus operator @@ -89,8 +93,7 @@ * * Returns the symbol representing the operator **/ - public String getOperatorSymbol () - { + public String getOperatorSymbol () { return "+"; } @@ -99,10 +102,7 @@ * * Applies the operator to the given double values, returning a double **/ - public double apply (double pLeft, - double pRight, - Logger pLogger) - { + public double apply (double pLeft, double pRight) { return pLeft + pRight; } @@ -111,12 +111,29 @@ * * Applies the operator to the given double values, returning a double **/ - public long apply (long pLeft, - long pRight, - Logger pLogger) - { + public long apply (long pLeft, long pRight) { return pLeft + pRight; } //------------------------------------- + + /** + * + * Applies the operator to the given BigDecimal values, returning a BigDecimal + **/ + public BigDecimal apply(BigDecimal pLeft, BigDecimal pRight) { + return pLeft.add(pRight); + } + + //------------------------------------- + + /** + * + * Applies the operator to the given BigDecimal values, returning a BigDecimal + **/ + public BigInteger apply(BigInteger pLeft, BigInteger pRight) { + return pLeft.add(pRight); + } + + //------------------------------------- } 1.2 +61 -6 jakarta-commons/el/src/java/org/apache/commons/el/RelationalOperator.java Index: RelationalOperator.java =================================================================== RCS file: /home/cvs/jakarta-commons/el/src/java/org/apache/commons/el/RelationalOperator.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- RelationalOperator.java 4 Feb 2003 00:22:25 -0000 1.1 +++ RelationalOperator.java 17 Jun 2003 20:18:10 -0000 1.2 @@ -56,6 +56,8 @@ package org.apache.commons.el; import javax.servlet.jsp.el.ELException; +import java.math.BigDecimal; +import java.math.BigInteger; /** * @@ -69,6 +71,7 @@ public abstract class RelationalOperator extends BinaryOperator { + //------------------------------------- /** * @@ -88,8 +91,8 @@ * Applies the operator to the given double values **/ public abstract boolean apply (double pLeft, - double pRight, - Logger pLogger); + double pRight + ); //------------------------------------- /** @@ -97,8 +100,8 @@ * Applies the operator to the given long values **/ public abstract boolean apply (long pLeft, - long pRight, - Logger pLogger); + long pRight + ); //------------------------------------- /** @@ -106,8 +109,60 @@ * Applies the operator to the given String values **/ public abstract boolean apply (String pLeft, - String pRight, - Logger pLogger); + String pRight + ); //------------------------------------- + + + /** + * Applies the operator to the given BigDecimal values, returning a BigDecimal + **/ + public abstract boolean apply(BigDecimal pLeft, BigDecimal pRight); + + //------------------------------------- + + /** + * Applies the operator to the given BigDecimal values, returning a BigDecimal + **/ + public abstract boolean apply(BigInteger pLeft, BigInteger pRight); + + //------------------------------------- + + + /** + * Test return value of BigInteger/BigDecimal A.compareTo(B). + * @param val - result of BigInteger/BigDecimal compareTo() call + * @return - true if result is less than 0, otherwise false + */ + protected boolean isLess(int val) { + if (val < 0) + return true; + else + return false; + } + + /** + * Test return value of BigInteger/BigDecimal A.compareTo(B). + * @param val - result of BigInteger/BigDecimal compareTo() call + * @return - true if result is equal to 0, otherwise false + */ + protected boolean isEqual(int val) { + if (val == 0) + return true; + else + return false; + } + + /** + * Test return value of BigInteger/BigDecimal A.compareTo(B). + * @param val - result of BigInteger/BigDecimal compareTo() call + * @return - true if result is greater than 0, otherwise false + */ + protected boolean isGreater(int val) { + if (val > 0) + return true; + else + return false; + } } 1.2 +10 -0 jakarta-commons/el/src/java/org/apache/commons/el/UnaryMinusOperator.java Index: UnaryMinusOperator.java =================================================================== RCS file: /home/cvs/jakarta-commons/el/src/java/org/apache/commons/el/UnaryMinusOperator.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- UnaryMinusOperator.java 4 Feb 2003 00:22:25 -0000 1.1 +++ UnaryMinusOperator.java 17 Jun 2003 20:18:10 -0000 1.2 @@ -56,6 +56,8 @@ package org.apache.commons.el; import javax.servlet.jsp.el.ELException; +import java.math.BigInteger; +import java.math.BigDecimal; /** * @@ -114,6 +116,14 @@ } */ return PrimitiveObjects.getInteger (0); + } + + else if (pValue instanceof BigInteger) { + return ((BigInteger) pValue).negate(); + } + + else if (pValue instanceof BigDecimal) { + return ((BigDecimal) pValue).negate(); } else if (pValue instanceof String) {
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]