private synchronized ScriptEngineState getEngineByName(String name, boolean reset) throws SoarException { ScriptEngineState state = engines.get(name); if (state != null && reset) { state.dispose(); engines.remove(name); state = null; } if (state == null) { final ScriptEngine engine = getEngineManager().getEngineByName(name); if (engine == null) { throw new SoarException("Unsupported script engine '" + name + "'"); } final ScriptEngineFactory f = engine.getFactory(); logger.info( String.format( "Loaded '%s' script engine for %s: %s version %s, %s version %s", name, context, f.getEngineName(), f.getEngineVersion(), f.getLanguageName(), f.getLanguageVersion())); engines.put(name, state = new ScriptEngineState(context, name, engine)); } return state; }
private synchronized String disposeEngine(String name) throws SoarException { final ScriptEngineState state = engines.remove(name); if (state != null) { state.dispose(); return "Disposed '" + name + "'"; } else { return "No engine '" + name + "'"; } }
/* (non-Javadoc) * @see org.jsoar.util.commands.SoarCommand#execute(java.lang.String[]) */ @Override public String execute(SoarCommandContext commandContext, String[] args) throws SoarException { if (args.length == 1) { return engines.toString(); } // Strip off script and treat the engine type as the command name... // i.e. "script javascript ..." becomes "javascript ..." final List<String> engineArgs = globalOptions.process(Arrays.asList(args)); final String engineName = engineArgs.get(0); if (globalOptions.has(GlobalOptions.dispose)) { return disposeEngine(engineName); } final List<String> trailing = engineOptions.process(engineArgs); final ScriptEngineState state = getEngineByName(engineName, globalOptions.has(GlobalOptions.reset)); if (!trailing.isEmpty()) { final Object result = state.eval(Joiner.on(' ').join(trailing)); return result != null ? result.toString() : ""; } else { return state.toString(); } }