Package org.apache.commons.jexl2
Class JexlArithmetic
- java.lang.Object
-
- org.apache.commons.jexl2.JexlArithmetic
-
- Direct Known Subclasses:
JexlThreadedArithmetic
public class JexlArithmetic extends java.lang.Object
Perform arithmetic.All arithmetic operators (+, - , *, /, %) follow the same rules regarding their arguments.
- If both are null, result is 0
- If either is a BigDecimal, coerce both to BigDecimal and and perform operation
- If either is a floating point number, coerce both to Double and perform operation
- If both are BigInteger, treat as BigInteger and perform operation
- Else treat as BigInteger, perform operation and attempt to narrow result:
- if both arguments can be narrowed to Integer, narrow result to Integer
- if both arguments can be narrowed to Long, narrow result to Long
- Else return result as BigInteger
- Since:
- 2.0
-
-
Field Summary
Fields Modifier and Type Field Description protected static java.math.BigDecimalBIGD_DOUBLE_MAX_VALUEDouble.MAX_VALUE as BigDecimal.protected static java.math.BigDecimalBIGD_DOUBLE_MIN_VALUEDouble.MIN_VALUE as BigDecimal.protected static intBIGD_SCALEDefault BigDecimal scale.protected static java.math.BigIntegerBIGI_LONG_MAX_VALUELong.MAX_VALUE as BigInteger.protected static java.math.BigIntegerBIGI_LONG_MIN_VALUELong.MIN_VALUE as BigInteger.protected java.math.MathContextmathContextThe big decimal math context.protected intmathScaleThe big decimal scale.
-
Constructor Summary
Constructors Constructor Description JexlArithmetic(boolean lenient)Creates a JexlArithmetic.JexlArithmetic(boolean lenient, java.math.MathContext bigdContext, int bigdScale)Creates a JexlArithmetic.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description java.lang.Objectadd(java.lang.Object left, java.lang.Object right)Add two values together.java.lang.ObjectbitwiseAnd(java.lang.Object left, java.lang.Object right)Performs a bitwise and.java.lang.ObjectbitwiseComplement(java.lang.Object val)Performs a bitwise complement.java.lang.ObjectbitwiseOr(java.lang.Object left, java.lang.Object right)Performs a bitwise or.java.lang.ObjectbitwiseXor(java.lang.Object left, java.lang.Object right)Performs a bitwise xor.protected intcompare(java.lang.Object left, java.lang.Object right, java.lang.String operator)Performs a comparison.protected java.lang.ObjectcontrolNullNullOperands()The result of +,/,-,*,% when both operands are null.protected voidcontrolNullOperand()Throw a NPE if arithmetic is strict.java.lang.Objectdivide(java.lang.Object left, java.lang.Object right)Divide the left value by the right.booleanequals(java.lang.Object left, java.lang.Object right)Test if left and right are equal.java.math.MathContextgetMathContext()The MathContext instance used for +,-,/,*,% operations on big decimals.intgetMathScale()The BigDecimal scale used for comparison and coercion operations.booleangreaterThan(java.lang.Object left, java.lang.Object right)Test if left > right.booleangreaterThanOrEqual(java.lang.Object left, java.lang.Object right)Test if left ≥ right.protected booleanisFloatingPoint(java.lang.Object o)Is Object a floating point number.protected booleanisFloatingPointNumber(java.lang.Object val)Test if the passed value is a floating point number, i.e.protected booleanisFloatingPointType(java.lang.Object left, java.lang.Object right)Test if either left or right are either a Float or Double.booleanisLenient()Checks whether this JexlArithmetic instance triggers errors during evaluation when null is used as an operand.protected booleanisNumberable(java.lang.Object o)Is Object a whole number.booleanlessThan(java.lang.Object left, java.lang.Object right)Test if left < right.booleanlessThanOrEqual(java.lang.Object left, java.lang.Object right)Test if left ≤ right.booleanmatches(java.lang.Object left, java.lang.Object right)Test if left regexp matches right.java.lang.Objectmod(java.lang.Object left, java.lang.Object right)left value mod right.java.lang.Objectmultiply(java.lang.Object left, java.lang.Object right)Multiply the left value by the right.java.lang.Numbernarrow(java.lang.Number original)Given a Number, return back the value using the smallest type the result will fit into.protected booleannarrowAccept(java.lang.Class<?> narrow, java.lang.Class<?> source)Whether we consider the narrow class as a potential candidate for narrowing the source.protected booleannarrowArguments(java.lang.Object[] args)Replace all numbers in an arguments array with the smallest type that will fit.protected java.lang.ObjectnarrowArrayType(java.lang.Object[] untyped)Given an array of objects, attempt to type it more strictly.protected java.lang.NumbernarrowBigDecimal(java.lang.Object lhs, java.lang.Object rhs, java.math.BigDecimal bigd)Given a BigDecimal, attempt to narrow it to an Integer or Long if it fits if one of the arguments is a numberable.protected java.lang.NumbernarrowBigInteger(java.lang.Object lhs, java.lang.Object rhs, java.math.BigInteger bigi)Given a BigInteger, narrow it to an Integer or Long if it fits and the arguments class allow it.protected java.lang.NumbernarrowNumber(java.lang.Number original, java.lang.Class<?> narrow)Given a Number, return back the value attempting to narrow it to a target class.java.lang.Objectnegate(java.lang.Object val)Negates a value (unary minus for numbers).java.math.BigDecimalroundBigDecimal(java.math.BigDecimal number)Ensure a big decimal is rounded by this arithmetic scale and rounding mode.java.lang.Objectsubtract(java.lang.Object left, java.lang.Object right)Subtract the right value from the left.java.math.BigDecimaltoBigDecimal(java.lang.Object val)Get a BigDecimal from the object passed.java.math.BigIntegertoBigInteger(java.lang.Object val)Get a BigInteger from the object passed.booleantoBoolean(java.lang.Object val)Coerce to a boolean (not a java.lang.Boolean).doubletoDouble(java.lang.Object val)Coerce to a double.inttoInteger(java.lang.Object val)Coerce to a int.longtoLong(java.lang.Object val)Coerce to a long (not a java.lang.Long).java.lang.StringtoString(java.lang.Object val)Coerce to a string.
-
-
-
Field Detail
-
BIGD_DOUBLE_MAX_VALUE
protected static final java.math.BigDecimal BIGD_DOUBLE_MAX_VALUE
Double.MAX_VALUE as BigDecimal.
-
BIGD_DOUBLE_MIN_VALUE
protected static final java.math.BigDecimal BIGD_DOUBLE_MIN_VALUE
Double.MIN_VALUE as BigDecimal.
-
BIGI_LONG_MAX_VALUE
protected static final java.math.BigInteger BIGI_LONG_MAX_VALUE
Long.MAX_VALUE as BigInteger.
-
BIGI_LONG_MIN_VALUE
protected static final java.math.BigInteger BIGI_LONG_MIN_VALUE
Long.MIN_VALUE as BigInteger.
-
BIGD_SCALE
protected static final int BIGD_SCALE
Default BigDecimal scale.- Since:
- 2.1
- See Also:
- Constant Field Values
-
mathContext
protected final java.math.MathContext mathContext
The big decimal math context.- Since:
- 2.1
-
mathScale
protected final int mathScale
The big decimal scale.- Since:
- 2.1
-
-
Constructor Detail
-
JexlArithmetic
public JexlArithmetic(boolean lenient)
Creates a JexlArithmetic.- Parameters:
lenient- whether this arithmetic is lenient or strict
-
JexlArithmetic
public JexlArithmetic(boolean lenient, java.math.MathContext bigdContext, int bigdScale)
Creates a JexlArithmetic.- Parameters:
lenient- whether this arithmetic is lenient or strictbigdContext- the math context instance to use for +,-,/,*,% operations on big decimals.bigdScale- the scale used for big decimals.- Since:
- 2.1
-
-
Method Detail
-
isLenient
public boolean isLenient()
Checks whether this JexlArithmetic instance triggers errors during evaluation when null is used as an operand.- Returns:
- true if lenient, false if strict
-
getMathContext
public java.math.MathContext getMathContext()
The MathContext instance used for +,-,/,*,% operations on big decimals.- Returns:
- the math context
- Since:
- 2.1
-
getMathScale
public int getMathScale()
The BigDecimal scale used for comparison and coercion operations.- Returns:
- the scale
- Since:
- 2.1
-
roundBigDecimal
public java.math.BigDecimal roundBigDecimal(java.math.BigDecimal number)
Ensure a big decimal is rounded by this arithmetic scale and rounding mode.- Parameters:
number- the big decimal to round- Returns:
- the rounded big decimal
- Since:
- 2.1
-
controlNullNullOperands
protected java.lang.Object controlNullNullOperands()
The result of +,/,-,*,% when both operands are null.- Returns:
- Integer(0) if lenient
- Throws:
java.lang.ArithmeticException- if strict
-
controlNullOperand
protected void controlNullOperand()
Throw a NPE if arithmetic is strict.- Throws:
java.lang.ArithmeticException- if strict
-
isFloatingPointType
protected boolean isFloatingPointType(java.lang.Object left, java.lang.Object right)
Test if either left or right are either a Float or Double.- Parameters:
left- one object to testright- the other- Returns:
- the result of the test.
-
isFloatingPointNumber
protected boolean isFloatingPointNumber(java.lang.Object val)
Test if the passed value is a floating point number, i.e. a float, double or string with ( "." | "E" | "e").- Parameters:
val- the object to be tested- Returns:
- true if it is, false otherwise.
-
isFloatingPoint
protected boolean isFloatingPoint(java.lang.Object o)
Is Object a floating point number.- Parameters:
o- Object to be analyzed.- Returns:
- true if it is a Float or a Double.
-
isNumberable
protected boolean isNumberable(java.lang.Object o)
Is Object a whole number.- Parameters:
o- Object to be analyzed.- Returns:
- true if Integer, Long, Byte, Short or Character.
-
narrowBigInteger
protected java.lang.Number narrowBigInteger(java.lang.Object lhs, java.lang.Object rhs, java.math.BigInteger bigi)
Given a BigInteger, narrow it to an Integer or Long if it fits and the arguments class allow it.The rules are: if either arguments is a BigInteger, no narrowing will occur if either arguments is a Long, no narrowing to Integer will occur
- Parameters:
lhs- the left hand side operand that lead to the bigi resultrhs- the right hand side operand that lead to the bigi resultbigi- the BigInteger to narrow- Returns:
- an Integer or Long if narrowing is possible, the original BigInteger otherwise
-
narrowBigDecimal
protected java.lang.Number narrowBigDecimal(java.lang.Object lhs, java.lang.Object rhs, java.math.BigDecimal bigd)
Given a BigDecimal, attempt to narrow it to an Integer or Long if it fits if one of the arguments is a numberable.- Parameters:
lhs- the left hand side operand that lead to the bigd resultrhs- the right hand side operand that lead to the bigd resultbigd- the BigDecimal to narrow- Returns:
- an Integer or Long if narrowing is possible, the original BigInteger otherwise
- Since:
- 2.1
-
narrowArrayType
protected java.lang.Object narrowArrayType(java.lang.Object[] untyped)
Given an array of objects, attempt to type it more strictly.- If all objects are of the same type, the array returned will be an array of that same type
- If all objects are Numbers, the array returned will be an array of Numbers
- If all objects are convertible to a primitive type, the array returned will be an array of the primitive type
- Parameters:
untyped- an untyped array- Returns:
- the original array if the attempt to strictly type the array fails, a typed array otherwise
-
narrowArguments
protected boolean narrowArguments(java.lang.Object[] args)
Replace all numbers in an arguments array with the smallest type that will fit.- Parameters:
args- the argument array- Returns:
- true if some arguments were narrowed and args array is modified, false if no narrowing occured and args array has not been modified
-
add
public java.lang.Object add(java.lang.Object left, java.lang.Object right)
Add two values together.If any numeric add fails on coercion to the appropriate type, treat as Strings and do concatenation.
- Parameters:
left- first valueright- second value- Returns:
- left + right.
-
divide
public java.lang.Object divide(java.lang.Object left, java.lang.Object right)
Divide the left value by the right.- Parameters:
left- first valueright- second value- Returns:
- left / right
- Throws:
java.lang.ArithmeticException- if right == 0
-
mod
public java.lang.Object mod(java.lang.Object left, java.lang.Object right)
left value mod right.- Parameters:
left- first valueright- second value- Returns:
- left mod right
- Throws:
java.lang.ArithmeticException- if right == 0.0
-
multiply
public java.lang.Object multiply(java.lang.Object left, java.lang.Object right)
Multiply the left value by the right.- Parameters:
left- first valueright- second value- Returns:
- left * right.
-
subtract
public java.lang.Object subtract(java.lang.Object left, java.lang.Object right)
Subtract the right value from the left.- Parameters:
left- first valueright- second value- Returns:
- left - right.
-
negate
public java.lang.Object negate(java.lang.Object val)
Negates a value (unary minus for numbers).- Parameters:
val- the value to negate- Returns:
- the negated value
- Since:
- 2.1
-
matches
public boolean matches(java.lang.Object left, java.lang.Object right)
Test if left regexp matches right.- Parameters:
left- first valueright- second value- Returns:
- test result.
- Since:
- 2.1
-
bitwiseAnd
public java.lang.Object bitwiseAnd(java.lang.Object left, java.lang.Object right)
Performs a bitwise and.- Parameters:
left- the left operandright- the right operator- Returns:
- left & right
- Since:
- 2.1
-
bitwiseOr
public java.lang.Object bitwiseOr(java.lang.Object left, java.lang.Object right)
Performs a bitwise or.- Parameters:
left- the left operandright- the right operator- Returns:
- left | right
- Since:
- 2.1
-
bitwiseXor
public java.lang.Object bitwiseXor(java.lang.Object left, java.lang.Object right)
Performs a bitwise xor.- Parameters:
left- the left operandright- the right operator- Returns:
- left right
- Since:
- 2.1
-
bitwiseComplement
public java.lang.Object bitwiseComplement(java.lang.Object val)
Performs a bitwise complement.- Parameters:
val- the operand- Returns:
- ~val
- Since:
- 2.1
-
compare
protected int compare(java.lang.Object left, java.lang.Object right, java.lang.String operator)
Performs a comparison.- Parameters:
left- the left operandright- the right operatoroperator- the operator- Returns:
- -1 if left < right; +1 if left > right; 0 if left == right
- Throws:
java.lang.ArithmeticException- if either left or right is null- Since:
- 2.1
-
equals
public boolean equals(java.lang.Object left, java.lang.Object right)
Test if left and right are equal.- Parameters:
left- first valueright- second value- Returns:
- test result.
-
lessThan
public boolean lessThan(java.lang.Object left, java.lang.Object right)
Test if left < right.- Parameters:
left- first valueright- second value- Returns:
- test result.
-
greaterThan
public boolean greaterThan(java.lang.Object left, java.lang.Object right)
Test if left > right.- Parameters:
left- first valueright- second value- Returns:
- test result.
-
lessThanOrEqual
public boolean lessThanOrEqual(java.lang.Object left, java.lang.Object right)
Test if left ≤ right.- Parameters:
left- first valueright- second value- Returns:
- test result.
-
greaterThanOrEqual
public boolean greaterThanOrEqual(java.lang.Object left, java.lang.Object right)
Test if left ≥ right.- Parameters:
left- first valueright- second value- Returns:
- test result.
-
toBoolean
public boolean toBoolean(java.lang.Object val)
Coerce to a boolean (not a java.lang.Boolean).- Parameters:
val- Object to be coerced.- Returns:
- The boolean coerced value, or false if none possible.
-
toInteger
public int toInteger(java.lang.Object val)
Coerce to a int.- Parameters:
val- Object to be coerced.- Returns:
- The int coerced value.
-
toLong
public long toLong(java.lang.Object val)
Coerce to a long (not a java.lang.Long).- Parameters:
val- Object to be coerced.- Returns:
- The long coerced value.
-
toBigInteger
public java.math.BigInteger toBigInteger(java.lang.Object val)
Get a BigInteger from the object passed. Null and empty string maps to zero.- Parameters:
val- the object to be coerced.- Returns:
- a BigDecimal.
- Throws:
java.lang.NullPointerException- if val is null and mode is strict.
-
toBigDecimal
public java.math.BigDecimal toBigDecimal(java.lang.Object val)
Get a BigDecimal from the object passed. Null and empty string maps to zero.- Parameters:
val- the object to be coerced.- Returns:
- a BigDecimal.
- Throws:
java.lang.NullPointerException- if val is null and mode is strict.
-
toDouble
public double toDouble(java.lang.Object val)
Coerce to a double.- Parameters:
val- Object to be coerced.- Returns:
- The double coerced value.
- Throws:
java.lang.NullPointerException- if val is null and mode is strict.
-
toString
public java.lang.String toString(java.lang.Object val)
Coerce to a string.- Parameters:
val- Object to be coerced.- Returns:
- The String coerced value.
- Throws:
java.lang.NullPointerException- if val is null and mode is strict.
-
narrow
public java.lang.Number narrow(java.lang.Number original)
Given a Number, return back the value using the smallest type the result will fit into. This works hand in hand with parameter 'widening' in java method calls, e.g. a call to substring(int,int) with an int and a long will fail, but a call to substring(int,int) with an int and a short will succeed.- Parameters:
original- the original number.- Returns:
- a value of the smallest type the original number will fit into.
-
narrowAccept
protected boolean narrowAccept(java.lang.Class<?> narrow, java.lang.Class<?> source)
Whether we consider the narrow class as a potential candidate for narrowing the source.- Parameters:
narrow- the target narrow classsource- the orginal source class- Returns:
- true if attempt to narrow source to target is accepted
- Since:
- 2.1
-
narrowNumber
protected java.lang.Number narrowNumber(java.lang.Number original, java.lang.Class<?> narrow)
Given a Number, return back the value attempting to narrow it to a target class.- Parameters:
original- the original numbernarrow- the attempted target class- Returns:
- the narrowed number or the source if no narrowing was possible
- Since:
- 2.1
-
-