package railo.transformer.cfml.evaluator.impl;
import java.util.Iterator;
import java.util.List;
import railo.transformer.bytecode.Body;
import railo.transformer.bytecode.Statement;
import railo.transformer.bytecode.cast.CastString;
import railo.transformer.bytecode.expression.ExprString;
import railo.transformer.bytecode.literal.LitString;
import railo.transformer.bytecode.statement.PrintOut;
import railo.transformer.bytecode.statement.tag.Attribute;
import railo.transformer.bytecode.statement.tag.Tag;
import railo.transformer.bytecode.statement.tag.TagFunction;
import railo.transformer.bytecode.statement.tag.TagImport;
import railo.transformer.cfml.evaluator.EvaluatorException;
import railo.transformer.library.tag.TagLibTag;
public class Interface extends Component {
/**
* @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 {
super.evaluate(tag,libTag);
Body body = tag.getBody();
List statments = body.getStatements();
Statement stat;
Iterator it = statments.iterator();
Tag t;
while(it.hasNext()) {
stat=(Statement) it.next();
if(stat instanceof PrintOut) {
//body.remove(stat);
}
else if(stat instanceof Tag) {
t=(Tag) stat;
if(stat instanceof TagImport) {
// ignore
}
else if(stat instanceof TagFunction) {
Function.throwIfNotEmpty(t);
Attribute attr = t.getAttribute("access");
if(attr!=null) {
ExprString expr = CastString.toExprString(attr.getValue());
if(!(expr instanceof LitString))
throw new EvaluatorException(
"the attribute access of the Tag function inside an interface must contain a constant value");
String access = ((LitString)expr).getString().trim();
if(!"public".equalsIgnoreCase(access))
throw new EvaluatorException(
"the attribute access of the tag function inside an interface definition can only have the value [public] not ["+access+"]");
}
else t.addAttribute(new Attribute(false,"access",LitString.toExprString("public"),"string"));
}
else throw new EvaluatorException("tag "+libTag.getFullName()+" can only contain function definitions.");
}
}
}
}