001 package railo.transformer.cfml.evaluator.impl; 002 003 import railo.transformer.bytecode.cast.CastBoolean; 004 import railo.transformer.bytecode.expression.Expression; 005 import railo.transformer.bytecode.statement.tag.Attribute; 006 import railo.transformer.bytecode.statement.tag.Tag; 007 import railo.transformer.bytecode.statement.tag.TagLoop; 008 import railo.transformer.bytecode.util.ASMUtil; 009 import railo.transformer.cfml.ExprTransformer; 010 import railo.transformer.cfml.evaluator.EvaluatorException; 011 import railo.transformer.cfml.evaluator.EvaluatorSupport; 012 import railo.transformer.library.function.FunctionLib; 013 import railo.transformer.library.tag.TagLib; 014 import railo.transformer.library.tag.TagLibTag; 015 import railo.transformer.util.CFMLString; 016 017 018 019 /** 020 * Pr�ft den Kontext des Tag loop. 021 * Die Anforderungen an das Tag unterscheiden sich je nach Definition der Attribute. 022 * Falls das Attribute list vorhanden ist, muss auch das Attribute index vorhanden sein. 023 * Falls das Attribute list nicht vorhanden ist, aber das Attribute index, m�ssen auch die Attribute from und to vorhanden sein. 024 * Wenn das Attribute condition vorhanden ist, muss dieses mithilfe des ExprTransformer noch transformiert werden. 025 * Falls das Attribute collection verwendet wird, muss auch das Attribute item verwendet werden. 026 **/ 027 public final class Loop extends EvaluatorSupport { 028 //� 029 /** 030 * 031 * @see railo.transformer.cfml.evaluator.EvaluatorSupport#evaluate(railo.transformer.bytecode.statement.tag.Tag, railo.transformer.library.tag.TagLibTag, railo.transformer.library.function.FunctionLib[]) 032 */ 033 public void evaluate(Tag tag,TagLibTag tagLibTag,FunctionLib[] flibs) throws EvaluatorException { 034 TagLoop loop=(TagLoop) tag; 035 036 // file loop 037 if(tag.containsAttribute("file")) { 038 if(!tag.containsAttribute("index")) 039 throw new EvaluatorException("Wrong Context, when you use attribute file you must also use attribute index"); 040 loop.setType(TagLoop.TYPE_FILE); 041 } 042 // list loop 043 else if(tag.containsAttribute("list")){ 044 if(!tag.containsAttribute("index")) 045 throw new EvaluatorException("Wrong Context, when you use attribute list you must also use attribute index"); 046 loop.setType(TagLoop.TYPE_LIST); 047 } 048 // array loop 049 else if(tag.containsAttribute("array")){ 050 if(!tag.containsAttribute("index")) 051 throw new EvaluatorException("Wrong Context, when you use attribute array you must also use attribute index"); 052 loop.setType(TagLoop.TYPE_ARRAY); 053 } 054 // index loop 055 else if(tag.containsAttribute("index")) { 056 if(!tag.containsAttribute("from") || !tag.containsAttribute("to")) 057 throw new EvaluatorException("Wrong Context, when you use attribute index you must also use attribute from and to or list or file"); 058 loop.setType(TagLoop.TYPE_INDEX); 059 } 060 // condition loop 061 else if(tag.containsAttribute("condition")){ 062 TagLib tagLib=tagLibTag.getTagLib(); 063 ExprTransformer transformer; 064 String text=ASMUtil.getAttributeString(tag, "condition"); 065 066 try { 067 transformer = tagLib.getExprTransfomer(); 068 Expression expr=transformer.transform(null,flibs,new CFMLString(text,"UTF-8")); 069 tag.addAttribute(new Attribute(false,"condition",CastBoolean.toExprBoolean(expr),"boolean")); 070 } 071 catch (Exception e) { 072 throw new EvaluatorException(e.getMessage()); 073 } 074 loop.setType(TagLoop.TYPE_CONDITION); 075 } 076 // query loop 077 else if(tag.containsAttribute("query")){ 078 loop.setType(TagLoop.TYPE_QUERY); 079 } 080 // collection loop 081 else if(tag.containsAttribute("collection")) { 082 if(!tag.containsAttribute("item")) 083 throw new EvaluatorException("Wrong Context, when you use attribute collection you must also use attribute item"); 084 loop.setType(TagLoop.TYPE_COLLECTION); 085 } 086 else { 087 throw new EvaluatorException("Wrong Context, invalid attributes in tag cfloop"); 088 } 089 } 090 }