package railo.transformer.cfml.evaluator.impl;
import railo.transformer.bytecode.Statement;
import railo.transformer.bytecode.statement.tag.Tag;
import railo.transformer.bytecode.statement.tag.TagOutput;
import railo.transformer.cfml.evaluator.EvaluatorException;
import railo.transformer.cfml.evaluator.EvaluatorSupport;
import railo.transformer.library.tag.TagLibTag;
/**
* Prueft den Kontext des Tag output.
* Das Tag output darf nicht innerhalb eines output Tag verschachtelt sein,
* ausser das aeussere Tag besitzt ein group Attribute. Das innere Tag darf jedoch kein group Attribute besitzen.
*/
public final class Output extends EvaluatorSupport {
/**
* @see railo.transformer.cfml.evaluator.EvaluatorSupport#evaluate(org.w3c.dom.Element, railo.transformer.library.tag.TagLibTag)
*/
public void evaluate(Tag tag,TagLibTag libTag) throws EvaluatorException {
TagOutput output=(TagOutput) tag;
// check if inside a query tag
TagOutput parent = output;
boolean hasParentWithGroup=false;
boolean hasParentWithQuery=false;
boolean hasQuery=tag.containsAttribute("query");
while((parent=getParentTagOutput(parent))!=null) {
if(!hasParentWithQuery)hasParentWithQuery=parent.hasQuery();
if(!hasParentWithGroup)hasParentWithGroup=parent.hasGroup();
if(hasParentWithQuery && hasParentWithGroup)break;
}
if(hasQuery && hasParentWithQuery)
throw new EvaluatorException("Nesting of tags cfoutput with attribute query is not allowed");
if(hasQuery)
output.setType(TagOutput.TYPE_QUERY);
else if(tag.containsAttribute("group") && hasParentWithQuery)
output.setType(TagOutput.TYPE_GROUP);
else if(hasParentWithQuery) {
if(hasParentWithGroup) output.setType(TagOutput.TYPE_INNER_GROUP);
else output.setType(TagOutput.TYPE_INNER_QUERY);
}
else
output.setType(TagOutput.TYPE_NORMAL);
// attribute maxrows and endrow not allowd at the same time
if(tag.containsAttribute("maxrows") && tag.containsAttribute("endrow"))
throw new EvaluatorException("Wrong Context, you cannot use attribute maxrows and endrow at the same time.");
}
public static TagOutput getParentTagOutput(TagOutput stat) {
Statement parent = stat;
while(true) {
parent=parent.getParent();
if(parent==null)return null;
if(parent instanceof TagOutput) return (TagOutput) parent;
}
}
}