001    package railo.transformer.bytecode.statement;
002    
003    import java.util.ArrayList;
004    import java.util.Iterator;
005    
006    import org.objectweb.asm.commons.GeneratorAdapter;
007    
008    import railo.transformer.bytecode.Body;
009    import railo.transformer.bytecode.BytecodeContext;
010    import railo.transformer.bytecode.BytecodeException;
011    import railo.transformer.bytecode.Statement;
012    import railo.transformer.bytecode.expression.ExprBoolean;
013    import railo.transformer.bytecode.expression.Expression;
014    import railo.transformer.bytecode.literal.LitBoolean;
015    import railo.transformer.bytecode.util.ExpressionUtil;
016    import railo.transformer.bytecode.visitor.ConditionVisitor;
017    
018    public final class Condition extends StatementBase implements HasBodies {
019        
020        private ArrayList ifs=new ArrayList();
021        private Pair _else;
022    
023        /**
024         * Constructor of the class
025         * @param condition
026         * @param body
027         * @param line
028         */
029        public Condition(int line) {
030            super(line);
031        }
032        
033        /**
034         * Constructor of the class
035         * @param condition
036         * @param body
037         * @param line
038         */
039        public Condition(ExprBoolean condition, Statement body, int line) {
040            super(line);
041            addElseIf(condition,body,line);
042            body.setParent(this);
043        }
044        
045        public Condition(boolean b, Statement body, int line) {
046                    this(LitBoolean.toExprBoolean(b, -1),body,line);
047            }
048    
049            /**
050         * adds a else statment
051         * @param condition
052         * @param body
053         */
054        public void addElseIf(ExprBoolean condition, Statement body, int line) {
055            ifs.add(new Pair(condition,body,line));
056            body.setParent(this);
057        }
058        
059        /**
060         * sets the else Block of the condition
061         * @param body
062         */
063        public void setElse(Statement body, int line) {
064            _else=new Pair(null,body,line);
065            body.setParent(this);
066        }
067        
068        public final class Pair {
069            private ExprBoolean condition;
070            private Statement body;
071            private int line;
072    
073            public Pair(ExprBoolean condition, Statement body, int line) {
074                this.condition=condition;
075                this.body=body;
076                this.line=line;
077            }
078        }
079        
080        
081    
082        public void _writeOut(BytecodeContext bc) throws BytecodeException {
083            GeneratorAdapter adapter = bc.getAdapter();
084            Iterator it = ifs.iterator();
085            Pair pair;
086            ConditionVisitor cv=new ConditionVisitor();
087            cv.visitBefore();
088                    // ifs
089                    while(it.hasNext()) {
090                            pair=(Pair) it.next();
091                            ExpressionUtil.visitLine(bc, pair.line);
092                            cv.visitWhenBeforeExpr();
093                                    pair. condition.writeOut(bc,Expression.MODE_VALUE);
094                            cv.visitWhenAfterExprBeforeBody(bc);
095                                    pair.body.writeOut(bc);
096                            cv.visitWhenAfterBody(bc);
097                    }
098                    // else
099                    if(_else!=null && _else.body!=null) {
100                            cv.visitOtherviseBeforeBody();
101                                    _else.body.writeOut(bc);
102                            cv.visitOtherviseAfterBody();
103                    }
104                    
105            cv.visitAfter(bc);
106        }
107    
108            /**
109             * @see railo.transformer.bytecode.statement.HasBodies#getBodies()
110             */
111            public Body[] getBodies() {
112                    int len=ifs.size(),count=0;
113                    if(_else!=null)len++;
114                    Body[] bodies=new Body[len];
115                    Pair p;
116                    Iterator it = ifs.iterator();
117                    while(it.hasNext()) {
118                            p=(Pair) it.next();
119                            bodies[count++]=(Body) p.body;
120                    }
121                    if(_else!=null)bodies[count++]=(Body) _else.body;
122                    
123                    return bodies;
124            }
125    }