package de.neuland.jade4j.parser.node;
import java.util.LinkedList;
import java.util.List;
import de.neuland.jade4j.compiler.IndentWriter;
import de.neuland.jade4j.exceptions.ExpressionException;
import de.neuland.jade4j.exceptions.JadeCompilerException;
import de.neuland.jade4j.expression.ExpressionHandler;
import de.neuland.jade4j.model.JadeModel;
import de.neuland.jade4j.template.JadeTemplate;
public class ConditionalNode extends Node {
private List<IfConditionNode> conditions = new LinkedList<IfConditionNode>();
@Override
public void execute(IndentWriter writer, JadeModel model, JadeTemplate template) throws JadeCompilerException {
for (IfConditionNode conditionNode : this.conditions) {
try {
if (conditionNode.isDefault() || checkCondition(model, conditionNode.getValue(),template.getExpressionHandler()) ^ conditionNode.isInverse()) {
conditionNode.getBlock().execute(writer, model, template);
return;
}
} catch (ExpressionException e) {
throw new JadeCompilerException(conditionNode, template.getTemplateLoader(), e);
}
}
}
private boolean checkCondition(JadeModel model, String condition, ExpressionHandler expressionHandler) throws ExpressionException {
Boolean value = expressionHandler.evaluateBooleanExpression(condition, model);
return (value == null) ? false : value;
}
public List<IfConditionNode> getConditions() {
return conditions;
}
public void setConditions(List<IfConditionNode> conditions) {
this.conditions = conditions;
}
@Override
public ConditionalNode clone() throws CloneNotSupportedException {
ConditionalNode clone = (ConditionalNode) super.clone();
clone.conditions = new LinkedList<IfConditionNode>();
for(IfConditionNode condition : conditions) {
clone.conditions.add((IfConditionNode) condition.clone());
}
return clone;
}
}