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