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.Cast; 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 Cast && 119 ( 120 ((Cast) expr).getType().equalsIgnoreCase("String") || 121 ((Cast) expr).getType().equalsIgnoreCase("java.lang.String") 122 ) 123 ){ 124 expr=((Cast) expr).getExpr(); 125 } 126 else break; 127 } 128 return expr; 129 } 130 } 131 132 133 134