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    }