fixing error handling in 'is' operator
This commit is contained in:
parent
5c0d80ece7
commit
29fe8da1ad
|
|
@ -17,19 +17,17 @@ package org.springframework.expression.spel.ast;
|
||||||
|
|
||||||
import org.antlr.runtime.Token;
|
import org.antlr.runtime.Token;
|
||||||
import org.springframework.expression.EvaluationException;
|
import org.springframework.expression.EvaluationException;
|
||||||
|
import org.springframework.expression.spel.ExpressionState;
|
||||||
import org.springframework.expression.spel.SpelException;
|
import org.springframework.expression.spel.SpelException;
|
||||||
import org.springframework.expression.spel.SpelMessages;
|
import org.springframework.expression.spel.SpelMessages;
|
||||||
import org.springframework.expression.spel.ExpressionState;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The operator 'is' checks if an object is of the class specified in the right hand operand, in the same way that
|
* The operator 'is' checks if an object is of the class specified in the right hand operand, in the same way that
|
||||||
* instanceof does in Java.
|
* instanceof does in Java.
|
||||||
*
|
*
|
||||||
* @author Andy Clement
|
* @author Andy Clement
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class OperatorIs extends Operator {
|
public class OperatorIs extends Operator {
|
||||||
// TODO should 'is' change to 'instanceof' ?
|
|
||||||
|
|
||||||
public OperatorIs(Token payload) {
|
public OperatorIs(Token payload) {
|
||||||
super(payload);
|
super(payload);
|
||||||
|
|
@ -40,16 +38,27 @@ public class OperatorIs extends Operator {
|
||||||
return "is";
|
return "is";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare the left operand to see it is an instance of the type specified as the right operand. The right operand
|
||||||
|
* must be a class.
|
||||||
|
*
|
||||||
|
* @param state the expression state
|
||||||
|
* @return true if the left operand is an instanceof of the right operand, otherwise false
|
||||||
|
* @throws EvaluationException if there is a problem evaluating the expression
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Object getValue(ExpressionState state) throws EvaluationException {
|
public Boolean getValue(ExpressionState state) throws EvaluationException {
|
||||||
Object left = getLeftOperand().getValue(state);
|
Object left = getLeftOperand().getValue(state);
|
||||||
Object right = getRightOperand().getValue(state);
|
Object right = getRightOperand().getValue(state);
|
||||||
if (!(right instanceof Class<?>)) {
|
if (left == null) {
|
||||||
throw new SpelException(getRightOperand().getCharPositionInLine(),
|
return false; // null is not an instanceof anything
|
||||||
SpelMessages.IS_OPERATOR_NEEDS_CLASS_OPERAND, right.getClass().getName());
|
|
||||||
}
|
}
|
||||||
// TODO Could this defer to type utilities? What would be the benefit?
|
if (right == null || !(right instanceof Class<?>)) {
|
||||||
return (((Class<?>) right).isAssignableFrom(left.getClass()));
|
throw new SpelException(getRightOperand().getCharPositionInLine(),
|
||||||
|
SpelMessages.IS_OPERATOR_NEEDS_CLASS_OPERAND, (right == null ? "null" : right.getClass().getName()));
|
||||||
|
}
|
||||||
|
Class<?> rightClass = (Class<?>) right;
|
||||||
|
return rightClass.isAssignableFrom(left.getClass());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -56,4 +56,11 @@ public class ParserErrorMessagesTests extends ExpressionTestCase {
|
||||||
parseAndCheckError("1;2;3", SpelMessages.PARSE_PROBLEM, 1, "mismatched input ';' expecting EOF"); // POOR
|
parseAndCheckError("1;2;3", SpelMessages.PARSE_PROBLEM, 1, "mismatched input ';' expecting EOF"); // POOR
|
||||||
evaluate("(1;2;3)", 3, Integer.class);
|
evaluate("(1;2;3)", 3, Integer.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testBrokenExpression07() {
|
||||||
|
// T() can only take an identifier (possibly qualified), not a literal
|
||||||
|
// message ought to say identifier rather than ID
|
||||||
|
parseAndCheckError("null is T('a')", SpelMessages.PARSE_PROBLEM, 10, "mismatched input ''a'' expecting ID"); // POOR
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue