Package railo.transformer.cfml.evaluator.impl

Source Code of railo.transformer.cfml.evaluator.impl.Query

package railo.transformer.cfml.evaluator.impl;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import railo.runtime.functions.list.ListQualify;
import railo.runtime.functions.other.PreserveSingleQuotes;
import railo.runtime.functions.other.QuotedValueList;
import railo.runtime.functions.query.ValueList;
import railo.transformer.bytecode.Body;
import railo.transformer.bytecode.Literal;
import railo.transformer.bytecode.Statement;
import railo.transformer.bytecode.cast.CastOther;
import railo.transformer.bytecode.cast.CastString;
import railo.transformer.bytecode.expression.Expression;
import railo.transformer.bytecode.expression.var.Argument;
import railo.transformer.bytecode.expression.var.BIF;
import railo.transformer.bytecode.expression.var.Member;
import railo.transformer.bytecode.expression.var.UDF;
import railo.transformer.bytecode.expression.var.Variable;
import railo.transformer.bytecode.literal.LitBoolean;
import railo.transformer.bytecode.literal.LitString;
import railo.transformer.bytecode.statement.PrintOut;
import railo.transformer.bytecode.statement.tag.Tag;
import railo.transformer.cfml.evaluator.EvaluatorException;
import railo.transformer.cfml.evaluator.EvaluatorSupport;


/**
* sign print outs for preserver
*/
public final class Query extends EvaluatorSupport {

  /**
   * @see railo.transformer.cfml.evaluator.EvaluatorSupport#evaluate(org.w3c.dom.Element)
   */
  public void evaluate(Tag tag) throws EvaluatorException {
    translateChildren(tag.getBody().getStatements().iterator());
  }
 
  private void translateChildren(Iterator it) {
    Statement stat;
    
    while(it.hasNext()) {
      stat=(Statement) it.next();
      if(stat instanceof PrintOut) {
        PrintOut printOut = ((PrintOut)stat);
        Expression e = printOut.getExpr();
        if(!(e instanceof Literal)) {
          Expression expr=removeCastString(e);
         
          if(expr instanceof Variable) {
            // do not preserve BIF PreserveSingleQuotes return value
            Member member = ((Variable)expr).getFirstMember();
            if(member instanceof BIF) {
              BIF bif=(BIF) member;

              if(bif.getClazz().getName().equals(PreserveSingleQuotes.class.getName())) {
                printOut.setExpr(bif.getArguments()[0].getValue());
                continue;
              }
              else if(bif.getClazz().getName().equals(ListQualify.class.getName())) {
                Argument[] args = bif.getArguments();
                List<Argument> arr=new ArrayList<Argument>();
               
                // first get existing arguments
                arr.add(args[0]);
                arr.add(args[1]);
                if(args.length>=3)arr.add(args[2]);
                else arr.add(new Argument(LitString.toExprString(","),"string"));
                if(args.length>=4)arr.add(args[3]);
                else arr.add(new Argument(LitString.toExprString("all"),"string"));
                if(args.length>=5)arr.add(args[4]);
                else arr.add(new Argument(LitBoolean.toExprBoolean(false),"boolean"));
               
               
                // PSQ-BIF DO NOT REMOVE THIS COMMENT
                arr.add(new Argument(LitBoolean.toExprBoolean(true),"boolean"));
                bif.setArguments(arr.toArray(new Argument[arr.size()]));
                continue;
              }
              else if(
                bif.getClazz().getName().equals(QuotedValueList.class.getName()) ||
                bif.getClazz().getName().equals(ValueList.class.getName())
                ) {
                //printOut.setPreserveSingleQuote(false);
                continue;
              }
            }
           
            // do not preserve UDF return value
            member= ((Variable)expr).getLastMember();
            if(member instanceof UDF) continue;
          }
          printOut.setCheckPSQ(true);
          if(e!=expr)printOut.setExpr(expr);
        }
      }
      else if(stat instanceof Tag){
        Body b=((Tag)stat).getBody();
        if(b!=null)
          translateChildren(b.getStatements().iterator());
      }
      else if(stat instanceof Body){
        translateChildren(((Body)stat).getStatements().iterator());
      }
    }
  }

  private Expression removeCastString(Expression expr) {
    while(true) {
      if(expr instanceof CastString){
        expr=((CastString)expr).getExpr();
       
      }
      else if(
          expr instanceof CastOther &&
          (
              ((CastOther) expr).getType().equalsIgnoreCase("String") ||
              ((CastOther) expr).getType().equalsIgnoreCase("java.lang.String")
          )
        ){
          expr=((CastOther) expr).getExpr();
      }
      else break;
    }
    return expr;
  }
}



TOP

Related Classes of railo.transformer.cfml.evaluator.impl.Query

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.