package org.apache.commons.jexl2;
import org.apache.commons.collections.CollectionUtils;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Collection;
public class JadeJexlArithmetic extends JexlArithmetic {
public JadeJexlArithmetic(boolean lenient) {
super(lenient);
}
protected int compare(Object left, Object right, String operator) {
if (left != null && right != null) {
if (left instanceof String || right instanceof String) {
return toString(left).compareTo(toString(right));
} else if (left instanceof BigDecimal || right instanceof BigDecimal) {
BigDecimal l = toBigDecimal(left);
BigDecimal r = toBigDecimal(right);
return l.compareTo(r);
} else if (left instanceof BigInteger || right instanceof BigInteger) {
BigInteger l = toBigInteger(left);
BigInteger r = toBigInteger(right);
return l.compareTo(r);
} else if (isFloatingPoint(left) || isFloatingPoint(right)) {
double lhs = toDouble(left);
double rhs = toDouble(right);
if (Double.isNaN(lhs)) {
if (Double.isNaN(rhs)) {
return 0;
} else {
return -1;
}
} else if (Double.isNaN(rhs)) {
// lhs is not NaN
return +1;
} else if (lhs < rhs) {
return -1;
} else if (lhs > rhs) {
return +1;
} else {
return 0;
}
} else if (isNumberable(left) || isNumberable(right)) {
long lhs = toLong(left);
long rhs = toLong(right);
if (lhs < rhs) {
return -1;
} else if (lhs > rhs) {
return +1;
} else {
return 0;
}
} else if ("==".equals(operator)) {
return left.equals(right) ? 0 : -1;
} else if (left instanceof Comparable<?>) {
@SuppressWarnings("unchecked") // OK because of instanceof check above
final Comparable<Object> comparable = (Comparable<Object>) left;
return comparable.compareTo(right);
} else if (right instanceof Comparable<?>) {
@SuppressWarnings("unchecked") // OK because of instanceof check above
final Comparable<Object> comparable = (Comparable<Object>) right;
return comparable.compareTo(left);
}
}
throw new ArithmeticException("Object comparison:(" + left + " " + operator + " " + right + ")");
}
/**
* using the original implementation
* added check for empty lists
* defaulting to "true"
*/
@Override
public boolean toBoolean(Object val) {
if (val == null) {
controlNullOperand();
return false;
} else if (val instanceof Boolean) {
return (Boolean) val;
} else if (val instanceof Number) {
double number = toDouble(val);
return !Double.isNaN(number) && number != 0.d;
} else if (val instanceof String) {
String strval = val.toString();
return strval.length() > 0 && !"false".equals(strval);
} else if (val instanceof Collection) {
return CollectionUtils.isNotEmpty((Collection) val);
}
return true;
}
@Override
public Object add(Object left, Object right) {
if (left instanceof String && right instanceof String) {
return (String)left + right;
}
else {
return super.add(left, right);
}
}
}