package com.javadude.annotation.processors.template;
import java.io.Writer;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import com.javadude.annotation.processors.Symbols;
public class ForEach extends CompositeProcessor {
private String expression;
public ForEach(int line, String expression) {
super(line);
this.expression = expression;
}
@SuppressWarnings("unchecked")
@Override
public void process(Symbols symbols, Writer writer, int ignoredLine, String padding) {
Object value = symbols.get(expression, getLine());
if (value == Symbols.NULL_VALUE)
throw new ExpressionException("Expression '" + expression + "' has null value in FOREACH on line " + getLine());
if (!(value instanceof Collection<?>)) {
throw new ExpressionException("Expression '" + expression + "' has a non-collection value in FOREACH on line " + getLine());
}
Collection<Map<String, Object>> values = (Collection<Map<String, Object>>) value;
boolean first = true;
for (Iterator<Map<String, Object>> i = values.iterator(); i.hasNext();) {
try {
Map<String, Object> item = i.next();
symbols.pushScope(item);
symbols.put("LAST", !i.hasNext());
symbols.put("FIRST", first);
first = false;
processChildren(symbols, writer, padding);
} finally {
symbols.popScope();
}
}
}
}