/**
*
*/
package ognl;
import ognl.enhance.
UnsupportedCompilationException;
/**
* Base class for types that compare values.
*/
public abstract class
ComparisonExpression extends
BooleanExpression
{
public
ComparisonExpression(int
id) {
super(
id);
}
public
ComparisonExpression(
OgnlParser p, int
id) {
super(
p,
id);
}
public abstract
String getComparisonFunction();
public
String toGetSourceString(
OgnlContext context,
Object target)
{
if (
target == null)
throw new
UnsupportedCompilationException("Current target is null, can't compile.");
try {
Object value =
getValueBody(
context,
target);
if (
value != null &&
Boolean.class.
isAssignableFrom(
value.
getClass()))
_getterClass =
Boolean.
TYPE;
else if (
value != null)
_getterClass =
value.
getClass();
else
_getterClass =
Boolean.
TYPE;
// iterate over children to make numeric type detection work properly
OgnlRuntime.
getChildSource(
context,
target,
_children[0]);
OgnlRuntime.
getChildSource(
context,
target,
_children[1]);
// System.out.println("comparison expression currentType: " + context.getCurrentType() + " previousType: " + context.getPreviousType());
boolean
conversion =
OgnlRuntime.
shouldConvertNumericTypes(
context);
String result =
conversion ? "(" +
getComparisonFunction() + "( ($w) (" : "(";
result +=
OgnlRuntime.
getChildSource(
context,
target,
_children[0],
conversion)
+ " "
+ (
conversion ? "), ($w) " :
getExpressionOperator(0)) + " "
+
OgnlRuntime.
getChildSource(
context,
target,
_children[1],
conversion);
result +=
conversion ? ")" : "";
context.
setCurrentType(
Boolean.
TYPE);
result += ")";
return
result;
} catch (
NullPointerException e) {
// expected to happen in some instances
throw new
UnsupportedCompilationException("evaluation resulted in null expression.");
} catch (
Throwable t)
{
throw
OgnlOps.
castToRuntime(
t);
}
}
}