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 }