/** * Copyright (c) 2014, the Railo Company Ltd. * Copyright (c) 2015, Lucee Assosication Switzerland * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see <http://www.gnu.org/licenses/>. * */ package lucee.transformer.cfml.evaluator.impl; import java.util.Iterator; import java.util.List; import lucee.transformer.bytecode.Body; import lucee.transformer.bytecode.Statement; import lucee.transformer.bytecode.statement.PrintOut; import lucee.transformer.bytecode.statement.tag.Attribute; import lucee.transformer.bytecode.statement.tag.Tag; import lucee.transformer.bytecode.statement.tag.TagFunction; import lucee.transformer.bytecode.statement.tag.TagImport; import lucee.transformer.cfml.evaluator.EvaluatorException; import lucee.transformer.expression.ExprString; import lucee.transformer.expression.literal.LitString; import lucee.transformer.library.tag.TagLibTag; public class Interface extends Component { @Override public void evaluate(Tag tag,TagLibTag libTag) throws EvaluatorException { super.evaluate(tag,libTag); Body body = tag.getBody(); List<Statement> statments = body.getStatements(); Statement stat; Iterator<Statement> it = statments.iterator(); Tag t; while(it.hasNext()) { stat=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 = t.getFactory().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",stat.getFactory().createLitString("public"),"string")); } else throw new EvaluatorException("tag "+libTag.getFullName()+" can only contain function definitions."); } } } }