Package railo.runtime.functions.dynamicEvaluation

Source Code of railo.runtime.functions.dynamicEvaluation.EvaluateComponent

package railo.runtime.functions.dynamicEvaluation;

import java.util.Iterator;
import java.util.Map.Entry;

import railo.commons.lang.SystemOut;
import railo.runtime.Component;
import railo.runtime.ComponentScope;
import railo.runtime.ComponentWrap;
import railo.runtime.PageContext;
import railo.runtime.exp.PageException;
import railo.runtime.op.Caster;
import railo.runtime.type.Collection;
import railo.runtime.type.Collection.Key;
import railo.runtime.type.Struct;
import railo.runtime.type.UDF;
import railo.runtime.type.util.CollectionUtil;
import railo.runtime.type.util.ComponentUtil;
import railo.runtime.type.util.KeyConstants;

public final class EvaluateComponent {
  public static Object call(PageContext pc, String name, String md5, Struct sctThis) throws PageException {
    return invoke(pc, name, md5, sctThis, null);
    }
  public static Object call(PageContext pc, String name, String md5, Struct sctThis, Struct sctVariables) throws PageException {
    return invoke(pc, name, md5, sctThis, sctVariables);
  }
  public static Component invoke(PageContext pc, String name, String md5, Struct sctThis, Struct sctVariables) throws PageException {
    // Load comp
    Component comp=null;
    try {
      comp = pc.loadComponent(name);
      if(!ComponentUtil.md5(comp).equals(md5)){ 
        SystemOut.printDate(pc.getConfig().getErrWriter(),"component ["+name+"] in this enviroment has not the same interface as the component to load, it is possible that one off the components has Functions added dynamicly.");
        //throw new ExpressionException("component ["+name+"] in this enviroment has not the same interface as the component to load");
      }
    }
    catch (Exception e) {
      throw Caster.toPageException(e);
    }
    setInternalState(comp,sctThis,sctVariables);
    return comp;
  }
  public static void setInternalState(Component comp, Struct sctThis, Struct sctVariables) throws PageException {
   
    // this 
    // delete this scope data members
    ComponentWrap cw = ComponentWrap.toComponentWrap(Component.ACCESS_PRIVATE,comp);
    Collection.Key[] cwKeys = CollectionUtil.keys(cw);
    Object member;
    for(int i=0;i<cwKeys.length;i++) {
      member = cw.get(cwKeys[i]);
      if(member instanceof UDF) continue;
            cw.removeEL(cwKeys[i]);
    }
   
    // set this scope data members
    Iterator<Entry<Key, Object>> it = sctThis.entryIterator();
    Entry<Key, Object> e;
    //keys = sctThis.keys();
    while(it.hasNext()) {
      e=it.next();
            comp.set(e.getKey(),e.getValue());
    }
   
  // Variables
       
          ComponentScope scope = comp.getComponentScope();
         
          // delete variables scope data members
          Key[] sKeys = CollectionUtil.keys(scope);
        for(int i=0;i<sKeys.length;i++) {
          if(KeyConstants._this.equals(sKeys[i])) continue;
          if(scope.get(sKeys[i]) instanceof UDF) continue;
                scope.removeEL(sKeys[i]);
        }
         
         
          // set variables scope data members
        it=sctVariables.entryIterator();
          //keys = sctVariables.keys();
      while(it.hasNext()) {
        e=it.next();
        scope.set(e.getKey(),e.getValue());
      }
       
  }
}
TOP

Related Classes of railo.runtime.functions.dynamicEvaluation.EvaluateComponent

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.