00001 package org.hfbk.util; 00002 00003 import java.io.BufferedReader; 00004 import java.io.IOException; 00005 import java.io.InputStreamReader; 00006 import java.util.HashMap; 00007 import java.util.Map.Entry; 00008 00009 import org.hfbk.vis.FileUtils; 00010 import org.mozilla.javascript.Context; 00011 import org.mozilla.javascript.ContextFactory; 00012 import org.mozilla.javascript.EcmaError; 00013 import org.mozilla.javascript.EvaluatorException; 00014 import org.mozilla.javascript.Function; 00015 import org.mozilla.javascript.ImporterTopLevel; 00016 import org.mozilla.javascript.Scriptable; 00017 import org.mozilla.javascript.ScriptableObject; 00018 import org.mozilla.javascript.Undefined; 00019 00020 00037 public class Scripter { 00038 00039 Scriptable scope; 00040 Context context; 00041 00042 HashMap<String,Object> params=new HashMap<String, Object>(); 00043 00044 public Scripter() { 00045 context=ContextFactory.getGlobal().enterContext(); 00046 scope=new ImporterTopLevel(context); 00047 Context.exit(); 00048 } 00049 00055 public void put(String name, Object object){ 00056 params.put(name, object); 00057 } 00058 00067 public Object evaluate(String script) throws EvaluatorException, EcmaError{ 00068 00069 context=ContextFactory.getGlobal().enterContext(); 00070 00071 for (Entry<String, Object> p: params.entrySet()) 00072 ScriptableObject.putProperty(scope, p.getKey(), Context.javaToJS(p.getValue(), scope)); 00073 00074 Object result=context.evaluateString(scope, script, script, 0, null); 00075 if (result instanceof Undefined) return null; 00076 return Context.jsToJava(result, Object.class); 00077 } 00078 00079 00085 public ScriptFunction getFunction(String name){ 00086 context=ContextFactory.getGlobal().enterContext(); 00087 Object o=scope.get(name, scope); 00088 if (o instanceof Function) 00089 return new ScriptFunction((Function)o); 00090 else 00091 return null; 00092 } 00093 00095 public class ScriptFunction{ 00096 Function f; 00097 ScriptFunction(Function f){ 00098 this.f=f; 00099 }; 00100 00102 public Object call(Object... args){ 00103 return f.call(context, scope, scope, args); 00104 } 00105 } 00106 00107 public void source(String url){ 00108 try { 00109 BufferedReader r=new BufferedReader(new InputStreamReader(FileUtils.getStream(url))); 00110 String script="", l; 00111 while((l=r.readLine())!=null) 00112 script+=l+"\n"; 00113 evaluate(script); 00114 } catch (IOException e) { 00115 e.printStackTrace(); 00116 } 00117 00118 } 00119 }