in velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTIntegerRange.java [213:282]
public Object value(InternalContextAdapter context)
throws MethodInvocationException
{
/*
* get the two range ends
*/
Object left = jjtGetChild(0).value( context );
Object right = jjtGetChild(1).value( context );
/*
* if either is null, lets log and bail
*/
if (left == null || right == null)
{
log.error((left == null ? "Left" : "Right")
+ " side of range operator [n..m] has null value."
+ " Operation not possible. "
+ StringUtils.formatFileString(this));
return null;
}
/*
* if not a Number, try to convert
*/
try
{
left = DuckType.asNumber(left);
}
catch (NumberFormatException nfe) {}
try
{
right = DuckType.asNumber(right);
}
catch (NumberFormatException nfe) {}
/*
* if still not a Number, nothing we can do
*/
if ( !( left instanceof Number ) || !( right instanceof Number ))
{
log.error((!(left instanceof Number) ? "Left" : "Right")
+ " side of range operator is not convertible to a Number. "
+ StringUtils.formatFileString(this));
return null;
}
/*
* get the two integer values of the ends of the range
*/
int l = ((Number) left).intValue() ;
int r = ((Number) right).intValue();
/*
* Determine whether the increment is positive or negative.
*/
int delta = ( l >= r ) ? -1 : 1;
/*
* Return the corresponding integer range
*/
return new IntegerRange(l, r, delta);
}