VisClient/org/hfbk/util/Scripter.java

Go to the documentation of this file.
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 }

Generated on Tue Apr 7 17:57:20 2009 for visclient by  doxygen 1.5.1