Package railo.transformer.cfml.evaluator.impl

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

package railo.transformer.cfml.evaluator.impl;

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

import railo.transformer.bytecode.Page;
import railo.transformer.bytecode.Statement;
import railo.transformer.bytecode.cast.CastBoolean;
import railo.transformer.bytecode.cast.CastString;
import railo.transformer.bytecode.expression.Expression;
import railo.transformer.bytecode.literal.LitBoolean;
import railo.transformer.bytecode.literal.LitString;
import railo.transformer.bytecode.statement.tag.Attribute;
import railo.transformer.bytecode.statement.tag.Tag;
import railo.transformer.bytecode.util.ASMUtil;
import railo.transformer.cfml.evaluator.EvaluatorException;
import railo.transformer.cfml.evaluator.EvaluatorSupport;
import railo.transformer.library.tag.TagLibTag;



/**
* Prueft den Kontext des Tag break.
* Das Tag <code>break</code> darf nur innerhalb des Tag <code>loop, while, foreach</code> liegen.
*/
public class Component extends EvaluatorSupport {


  /**
   * @see railo.transformer.cfml.evaluator.EvaluatorSupport#evaluate(org.w3c.dom.Element, railo.transformer.library.tag.TagLibTag)
   */

  public void evaluate(Tag tag,TagLibTag tlt) throws EvaluatorException {

    Statement pPage = tag.getParent();
    String className=tag.getTagLibTag().getTagClassName();
   
    // is direct in document
    if(!(pPage instanceof Page)){
     
      // is script Component
      Tag p = ASMUtil.getParentTag(tag);
      if(p.getTagLibTag().getName().equals("script") && (pPage = p.getParent()) instanceof Page){
       
        // move imports from script to component body
        List children = p.getBody().getStatements();
        Iterator it = children.iterator();
        Statement stat;
        Tag t;
        while(it.hasNext()){
          stat=(Statement) it.next();
          if(!(stat instanceof Tag)) continue;
          t=(Tag) stat;
          if(t.getTagLibTag().getName().equals("import")){
            tag.getBody().addStatement(t);
          }
        }
       
        // replace script with component 
        ASMUtil.replace(p, tag, false);
      }
      else
        throw new EvaluatorException("Wrong Context, tag "+tlt.getFullName()+" can't be inside other tags, tag is inside tag "+p.getFullname());
    }

    Page page=(Page) pPage;
   
    // is inside a file named cfc
    String src=page.getSource();
    int pos=src.lastIndexOf(".");
    if(!(pos!=-1 && pos<src.length() && src.substring(pos+1).equals("cfc")))
      throw new EvaluatorException("Wrong Context, "+tlt.getFullName()+" tag must be inside a file with extension cfc");
   
    // check if more than one component in document and remove any other data
    List stats = page.getStatements();
    Iterator it = stats.iterator();
    Statement stat;
    int count=0;
    while(it.hasNext()) {
      stat=(Statement) it.next();
      if(stat instanceof Tag) {
        tag=(Tag) stat;
        if(tag.getTagLibTag().getTagClassName().equals(className)) count++;
      }
    }
    if(count>1)
      throw new EvaluatorException("inside one cfc file only one tag "+tlt.getFullName()+" is allowed, now we have "+count);

    boolean isComponent="railo.runtime.tag.Component".equals(tlt.getTagClassName());
    boolean isInterface="railo.runtime.tag.Interface".equals(tlt.getTagClassName());
    if(isComponent)page.setIsComponent(true);
    if(isInterface)page.setIsInterface(true);
   
// Attributes
   
    // output
    // "output=true" wird in "railo.transformer.cfml.attributes.impl.Function" geh�ndelt
    Attribute attr = tag.getAttribute("output");
    if(attr!=null) {
      Expression expr = CastBoolean.toExprBoolean(attr.getValue());
      if(!(expr instanceof LitBoolean))
        throw new EvaluatorException("Attribute output of the Tag "+tlt.getFullName()+", must contain a static boolean value (true or false, yes or no)");
      //boolean output = ((LitBoolean)expr).getBooleanValue();
      //if(!output) ASMUtil.removeLiterlChildren(tag, true);
    }
   
    // extends
    attr = tag.getAttribute("extends");
    if(attr!=null) {
      Expression expr = CastString.toExprString(attr.getValue());
      if(!(expr instanceof LitString)) throw new EvaluatorException("Attribute extends of the Tag "+tlt.getFullName()+", must contain a literal string value");
    }
   
    // implements
    if(isComponent){
      attr = tag.getAttribute("implements");
      if(attr!=null) {
        Expression expr = CastString.toExprString(attr.getValue());
        if(!(expr instanceof LitString)) throw new EvaluatorException("Attribute implements of the Tag "+tlt.getFullName()+", must contain a literal string value");
      }
    }
  }
}



TOP

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

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.