package org.aitools.programd.interpreter; import org.apache.log4j.Logger; import org.mozilla.javascript.Context; import org.mozilla.javascript.Scriptable; /** * An implementation of {@link org.aitools.programd.interpreter.Interpreter} that handles server-side JavaScript using * the Rhino package. * * @author Jon Baer * @author <a href="mailto:noel@aitools.org">Noel Bush</a> */ public class RhinoInterpreter implements Interpreter { /** The logger. */ private static final Logger logger = Logger.getLogger("programd"); /** * @see org.aitools.programd.interpreter.Interpreter#evaluate(java.lang.String) */ @Override public String evaluate(String expression) { logger.debug("evaluate: \"" + expression + "\""); Context context; try { context = Context.enter(); } // If the Rhino js library is somehow missing.... catch (NoClassDefFoundError e) { logger.error("Rhino JavaScript library is missing!", e); return ""; } Scriptable scope = context.initStandardObjects(null); Object result = null; try { result = context.evaluateString(scope, expression, "<cmd>", 1, null); } catch (Exception e) { logger.warn(String.format( "JavaScript exception (see interpreter log).%nGot exception:%n%s%nwhen processing:%n%s", e, expression)); } Context.exit(); if (result != null) { return result.toString(); } // (otherwise...) logger.info("JavaScript returned null!"); return ""; } }