/** * Invoke a script from the command line. * * @param scriptResource the script resource of path * @param scriptArgs an array of command line arguments * @return the return value * @throws IOException an I/O related error occurred * @throws JavaScriptException the script threw an error during compilation or execution */ public Object runScript(Object scriptResource, String... scriptArgs) throws IOException, JavaScriptException { Resource resource; if (scriptResource instanceof Resource) { resource = (Resource) scriptResource; } else if (scriptResource instanceof String) { resource = findResource((String) scriptResource, null, null); } else { throw new IOException("Unsupported script resource: " + scriptResource); } if (!resource.exists()) { throw new FileNotFoundException(scriptResource.toString()); } Context cx = contextFactory.enterContext(); try { Object retval; Map<Trackable, ReloadableScript> scripts = getScriptCache(cx); commandLineArgs = Arrays.asList(scriptArgs); ReloadableScript script = new ReloadableScript(resource, this); scripts.put(resource, script); mainScope = new ModuleScope(resource.getModuleName(), resource, globalScope, mainWorker); retval = mainWorker.evaluateScript(cx, script, mainScope); mainScope.updateExports(); return retval instanceof Wrapper ? ((Wrapper) retval).unwrap() : retval; } finally { Context.exit(); } }
Singleton getSingleton(Singleton singleton) { synchronized (singletons) { Singleton st = singletons.get(singleton); if (st == null) { st = singleton; singletons.put(singleton, singleton); } return st; } }
/** * Resolves a type name to a script file within our script directory and returns a Scriptable * evaluated to the file. * * @param moduleName the name of the module to load * @param localPath the path of the resource issuing this call * @return The raw compiled script for the module * @throws JavaScriptException if an error occurred evaluating the script file * @throws IOException if an error occurred reading the script file */ public ReloadableScript getScript(String moduleName, Repository localPath) throws JavaScriptException, IOException { ReloadableScript script; Resource source = findResource(moduleName, loaders, localPath); if (!source.exists()) { source = loadPackage(moduleName, localPath); if (!source.exists()) { source = findResource(moduleName, null, localPath); } } Context cx = Context.getCurrentContext(); Map<Trackable, ReloadableScript> scripts = getScriptCache(cx); if (scripts.containsKey(source)) { script = scripts.get(source); } else { script = new ReloadableScript(source, this); if (source.exists()) { scripts.put(source, script); } } return script; }
/** * Create a RhinoEngine with the given configuration. If <code>globals</code> is not null, its * contents are added as properties on the global object. * * @param config the configuration used to initialize the engine. * @param globals an optional map of global properties * @throws Exception if the engine can't be created */ public RhinoEngine(RingoConfig config, Map<String, Object> globals) throws Exception { this.config = config; workers = new LinkedBlockingDeque<RingoWorker>(); currentWorker = new ThreadLocal<RingoWorker>(); mainWorker = new RingoWorker(this); compiledScripts = new ConcurrentHashMap<Trackable, ReloadableScript>(); interpretedScripts = new ConcurrentHashMap<Trackable, ReloadableScript>(); singletons = new HashMap<Singleton, Singleton>(); contextFactory = new RingoContextFactory(this, config); repositories = config.getRepositories(); wrapFactory = config.getWrapFactory(); loaders = new ModuleLoader[] {new JsModuleLoader(), new JsonModuleLoader(), new ClassModuleLoader()}; RingoDebugger debugger = null; if (config.getDebug()) { debugger = new RingoDebugger(config); debugger.setScopeProvider(this); debugger.attachTo(contextFactory); debugger.setBreakOnExceptions(true); } // create and initialize global scope Context cx = contextFactory.enterContext(); try { boolean sealed = config.isSealed(); globalScope = new RingoGlobal(cx, this, sealed); Class<Scriptable>[] classes = config.getHostClasses(); if (classes != null) { for (Class<Scriptable> clazz : classes) { defineHostClass(clazz); } } ScriptableList.init(globalScope); ScriptableMap.init(globalScope); ScriptableObject.defineClass(globalScope, ScriptableWrapper.class); ScriptableObject.defineClass(globalScope, ModuleObject.class); if (globals != null) { for (Map.Entry<String, Object> entry : globals.entrySet()) { ScriptableObject.defineProperty( globalScope, entry.getKey(), entry.getValue(), ScriptableObject.DONTENUM); } } mainWorker.evaluateScript(cx, getScript("globals"), globalScope); evaluateBootstrapScripts(cx); if (sealed) { globalScope.sealObject(); } if (debugger != null) { debugger.setBreak(); } try { Runtime.getRuntime() .addShutdownHook( new Thread() { public void run() { shutdown(); } }); } catch (java.security.AccessControlException e) { log.log(Level.WARNING, "Could not register shutdown hook due to security exception", e); } } finally { Context.exit(); } }