}
EvaluationResult _result = null;
Any _any = null;
AbstractTCLNode _currentOperator = expr;
Any _currentAny = any;
StringBuffer _currentPath = new StringBuffer(rootName);
while (_currentOperator != null)
{
_currentPath.append(_currentOperator.toString());
if (logger_.isDebugEnabled())
{
logger_.debug("current path=" + _currentPath.toString());
logger_.debug("current operator=" + _currentOperator.toString());
logger_.debug("current any=" + _currentAny);
}
// lookup result in cache
_any = lookupAny(_currentPath.toString());
if (_any == null)
{
// cache MISS
switch (_currentOperator.getType()) {
case TCLParserTokenTypes.DOT:
// dots are skipped
break;
case TCLParserTokenTypes.UNION_POS:
logger_.debug("evaluate union by position");
UnionPositionOperator _upo = (UnionPositionOperator) _currentOperator;
// default union
if (_upo.isDefault())
{
_any = getETCLEvaluator().evaluateUnion(_currentAny);
}
else
{
_any = getETCLEvaluator().evaluateUnion(_currentAny,
_upo.getPosition());
}
break;
case TCLParserTokenTypes.IDENTIFIER:
String _identifer = ((IdentValue) _currentOperator).getIdentifier();
_any = getETCLEvaluator().evaluateIdentifier(_currentAny, _identifer);
break;
case TCLParserTokenTypes.NUMBER:
int _pos = ((NumberValue) _currentOperator).getNumber().intValue();
_any = getETCLEvaluator().evaluateIdentifier(_currentAny, _pos);
break;
case TCLParserTokenTypes.IMPLICIT:
ImplicitOperator _op = ((ImplicitOperatorNode) _currentOperator).getOperator();
_any = _op.evaluateImplicit(getETCLEvaluator(), _currentAny);
_result = EvaluationResult.fromAny(_any);
_result.addAny(_currentAny);
return _result;
case TCLParserTokenTypes.ARRAY:
int _arrayIndex = ((ArrayOperator) _currentOperator).getArrayIndex();
_any = getETCLEvaluator().evaluateArrayIndex(_currentAny, _arrayIndex);
break;
case TCLParserTokenTypes.ASSOC:
String _assocName = ((AssocOperator) _currentOperator).getAssocName();
_any = getETCLEvaluator().evaluateNamedValueList(_currentAny, _assocName);
break;
default:
throw new RuntimeException("unexpected operator: "
+ AbstractTCLNode.getNameForType(_currentOperator.getType()));
}
}
if (_any != null)
{
storeAny(_currentPath.toString(), _any);
_currentAny = _any;
}
_currentOperator = (AbstractTCLNode) _currentOperator.getNextSibling();
}
// Create the EvaluationResult
_result = EvaluationResult.fromAny(_any);