if (this.usedVariables != null) {
return this.usedVariables;
}
this.usedVariables = new TreeSet<String>();
final Engine engine = new Engine();
final ScopedMap scopedMap = new ScopedMap(Collections.EMPTY_MAP);
ProcessListener processListener = new ProcessListener() {
@Override
public void log(TemplateContext context, Token token, Action action) {
if (token instanceof ExpressionToken) {
String variable = ((ExpressionToken) token).getExpression();
if (!isLocal(variable)) {
usedVariables.add(variable);
}
}
}
// a variable is local if any enclosing foreach has it as a step
// variable
private boolean isLocal(String variable) {
for (Token token : context.scopes) {
if (token instanceof ForEachToken) {
String foreachVarName = ((ForEachToken) token)
.getVarName();
if (foreachVarName.equals(variable)) {
return true;
}
}
}
return false;
}
};
final Locale locale = Locale.getDefault();
context = new TemplateContext(template, locale, sourceName, scopedMap,
new DefaultModelAdaptor(), engine, engine.getErrorHandler(), processListener);
transformPure(context);
return usedVariables;
}