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());
}
}
}