001    package railo.transformer.cfml.evaluator.impl;
002    
003    import java.util.ArrayList;
004    import java.util.Iterator;
005    import java.util.List;
006    
007    import railo.runtime.functions.list.ListQualify;
008    import railo.runtime.functions.other.PreserveSingleQuotes;
009    import railo.runtime.functions.other.QuotedValueList;
010    import railo.runtime.functions.query.ValueList;
011    import railo.transformer.bytecode.Body;
012    import railo.transformer.bytecode.Literal;
013    import railo.transformer.bytecode.Statement;
014    import railo.transformer.bytecode.cast.CastOther;
015    import railo.transformer.bytecode.cast.CastString;
016    import railo.transformer.bytecode.expression.Expression;
017    import railo.transformer.bytecode.expression.var.Argument;
018    import railo.transformer.bytecode.expression.var.BIF;
019    import railo.transformer.bytecode.expression.var.Member;
020    import railo.transformer.bytecode.expression.var.UDF;
021    import railo.transformer.bytecode.expression.var.Variable;
022    import railo.transformer.bytecode.literal.LitBoolean;
023    import railo.transformer.bytecode.literal.LitString;
024    import railo.transformer.bytecode.statement.PrintOut;
025    import railo.transformer.bytecode.statement.tag.Tag;
026    import railo.transformer.cfml.evaluator.EvaluatorException;
027    import railo.transformer.cfml.evaluator.EvaluatorSupport;
028    
029    
030    /**
031     * sign print outs for preserver
032    */
033    public final class Query extends EvaluatorSupport {
034    
035            /**
036             * @see railo.transformer.cfml.evaluator.EvaluatorSupport#evaluate(org.w3c.dom.Element)
037             */
038            public void evaluate(Tag tag) throws EvaluatorException { 
039                    translateChildren(tag.getBody().getStatements().iterator());
040            }
041            
042            private void translateChildren(Iterator it) {
043                    Statement stat;
044                     
045                    while(it.hasNext()) {
046                            stat=(Statement) it.next();
047                            if(stat instanceof PrintOut) {
048                                    PrintOut printOut = ((PrintOut)stat);
049                                    Expression e = printOut.getExpr();
050                                    if(!(e instanceof Literal)) {
051                                            Expression expr=removeCastString(e);
052                                            
053                                            if(expr instanceof Variable) {
054                                                    // do not preserve BIF PreserveSingleQuotes return value
055                                                    Member member = ((Variable)expr).getFirstMember();
056                                                    if(member instanceof BIF) {
057                                                            BIF bif=(BIF) member;
058    
059                                                            if(bif.getClassName().equals(PreserveSingleQuotes.class.getName())) {
060                                                                    printOut.setExpr(bif.getArguments()[0].getValue());
061                                                                    continue;
062                                                            }
063                                                            else if(bif.getClassName().equals(ListQualify.class.getName())) {
064                                                                    Argument[] args = bif.getArguments();
065                                                                    List<Argument> arr=new ArrayList<Argument>();
066                                                                    
067                                                                    // first get existing arguments
068                                                                    arr.add(args[0]);
069                                                                    arr.add(args[1]);
070                                                                    if(args.length>=3)arr.add(args[2]);
071                                                                    else arr.add(new Argument(LitString.toExprString(","),"string"));
072                                                                    if(args.length>=4)arr.add(args[3]);
073                                                                    else arr.add(new Argument(LitString.toExprString("all"),"string"));
074                                                                    if(args.length>=5)arr.add(args[4]);
075                                                                    else arr.add(new Argument(LitBoolean.toExprBoolean(false),"boolean"));
076                                                                    
077                                                                    
078                                                                    // PSQ-BIF DO NOT REMOVE THIS COMMENT
079                                                                    arr.add(new Argument(LitBoolean.toExprBoolean(true),"boolean"));
080                                                                    bif.setArguments(arr.toArray(new Argument[arr.size()]));
081                                                                    continue;
082                                                            }
083                                                            else if(
084                                                                    bif.getClassName().equals(QuotedValueList.class.getName()) ||
085                                                                    bif.getClassName().equals(ValueList.class.getName())
086                                                                    ) {
087                                                                    //printOut.setPreserveSingleQuote(false);
088                                                                    continue;
089                                                            }
090                                                    }
091                                                    
092                                                    // do not preserve UDF return value
093                                                    member= ((Variable)expr).getLastMember();
094                                                    if(member instanceof UDF) continue;
095                                            }
096                                            printOut.setCheckPSQ(true);
097                                            if(e!=expr)printOut.setExpr(expr);
098                                    }
099                            }
100                            else if(stat instanceof Tag){
101                                    Body b=((Tag)stat).getBody();
102                                    if(b!=null) 
103                                            translateChildren(b.getStatements().iterator());
104                            }
105                            else if(stat instanceof Body){
106                                    translateChildren(((Body)stat).getStatements().iterator());
107                            }
108                    }
109            }
110    
111            private Expression removeCastString(Expression expr) {
112                    while(true) {
113                            if(expr instanceof CastString){
114                                    expr=((CastString)expr).getExpr();
115                                    
116                            }
117                            else if(
118                                            expr instanceof CastOther && 
119                                            (
120                                                            ((CastOther) expr).getType().equalsIgnoreCase("String") || 
121                                                            ((CastOther) expr).getType().equalsIgnoreCase("java.lang.String")
122                                            )
123                                    ){
124                                            expr=((CastOther) expr).getExpr();
125                            }
126                            else break;
127                    }
128                    return expr;
129            }
130    }
131    
132    
133    
134