{"id":253,"date":"2010-06-09T17:42:56","date_gmt":"2010-06-09T17:42:56","guid":{"rendered":"https:\/\/kari.world.ikari.fi\/2010\/06\/09\/interactive-javascript-shell\/"},"modified":"2010-06-09T17:42:56","modified_gmt":"2010-06-09T17:42:56","slug":"interactive-javascript-shell","status":"publish","type":"post","link":"https:\/\/kari.world.ikari.fi\/?p=253","title":{"rendered":"Interactive javascript shell"},"content":{"rendered":"<p>Naive, but functional interactive javascript shell with Java 6.<\/p>\n<p>[code lang=&#8221;java&#8221;]<br \/>\npackage org.kari.test.script;<\/p>\n<p>import java.io.BufferedReader;<br \/>\nimport java.io.InputStream;<br \/>\nimport java.io.InputStreamReader;<br \/>\nimport java.io.PrintStream;<\/p>\n<p>import javax.script.ScriptEngine;<br \/>\nimport javax.script.ScriptEngineManager;<br \/>\nimport javax.script.ScriptException;<\/p>\n<p>import org.apache.log4j.Logger;<br \/>\nimport org.kari.log.LogUtil;<\/p>\n<p>\/**<br \/>\n * Test interactive javascript shell<br \/>\n *<br \/>\n * @author kari<br \/>\n *\/<br \/>\npublic class ScriptShell {<br \/>\n    public static final Logger LOG = LogUtil.getLogger(&#8221;script.shell&#8221;);<\/p>\n<p>    private final ScriptEngine mEngine;<br \/>\n    private InputStream mIn = System.in;<br \/>\n    private PrintStream mOut = System.out;<br \/>\n    private PrintStream mErr = System.err;<\/p>\n<p>    private ScriptShell() {<br \/>\n        ScriptEngineManager manager = new ScriptEngineManager();<br \/>\n        mEngine = manager.getEngineByName(&#8221;js&#8221;);<br \/>\n    }<\/p>\n<p>    public void run()<br \/>\n        throws Exception<br \/>\n    {<br \/>\n        BufferedReader in = new BufferedReader(new InputStreamReader(mIn));<br \/>\n        StringBuilder sb = new StringBuilder();<br \/>\n        while (true) {<br \/>\n            if (sb.length() == 0) {<br \/>\n                mOut.print(&#8221;\\njs> &#8221;);<br \/>\n                mOut.flush();<br \/>\n            }<\/p>\n<p>            String line = in.readLine();<br \/>\n            if (line == null) {<br \/>\n                break;<br \/>\n            }<br \/>\n            sb.append(line);<br \/>\n            sb.append(&#8217;\\n&#8217;);<\/p>\n<p>            String expr = sb.toString();<\/p>\n<p>            try {<br \/>\n                mEngine.put(&#8221;javax.script.filename&#8221;, &#8221;&#8221;);<br \/>\n                Object result = mEngine.eval(expr);<br \/>\n                if (result != null) {<br \/>\n                    printOut(result);<br \/>\n                }<br \/>\n                sb.setLength(0);<br \/>\n            } catch (Exception e) {<br \/>\n                String msg = e.getMessage();<br \/>\n                boolean missing = false;<br \/>\n                if (e instanceof ScriptException) {<br \/>\n                    missing = msg.indexOf(&#8221;missing&#8221;) != -1<br \/>\n                        || msg.indexOf(&#8221;Unexpected end of file&#8221;) != -1;<br \/>\n                    if (expr.endsWith(&#8221;;;\\n&#8221;)) {<br \/>\n                        missing = false;<br \/>\n                    }<br \/>\n                }<\/p>\n<p>                if (!missing) {<br \/>\n                    sb.setLength(0);<br \/>\n                    LOG.error(&#8221;Failed&#8221;, e);<br \/>\n                    printErr(msg);<br \/>\n                }<br \/>\n            } finally {<br \/>\n                flushOutErr();<br \/>\n            }<br \/>\n        }<br \/>\n    }<\/p>\n<p>    private void printErr(String msg) {<br \/>\n        flushOutErr();<br \/>\n        mErr.println(&#8221;FAIL: &#8221; + msg);<br \/>\n        flushOutErr();<br \/>\n    }<\/p>\n<p>    private void printOut(Object result) {<br \/>\n        flushOutErr();<br \/>\n        mOut.println(result);<br \/>\n        flushOutErr();<br \/>\n    }<\/p>\n<p>    private void flushOutErr() {<br \/>\n        mOut.flush();<br \/>\n        mErr.flush();<br \/>\n    }<\/p>\n<p>    public static void main(String[] args) {<br \/>\n        try {<br \/>\n            ScriptShell shell = new ScriptShell();<br \/>\n            shell.run();<br \/>\n        } catch (Exception e) {<br \/>\n            LOG.error(&#8221;failed&#8221;, e);<br \/>\n        }<br \/>\n    }<br \/>\n}<br \/>\n[\/code]<\/p>\n<p>Sample session from the shell:<\/p>\n<p>[code]<br \/>\njs> function bar(arg) {<br \/>\n   return arg * arg<br \/>\n}<\/p>\n<p>js> for (i = 0; i < 10; i++) {\nprintln(bar(i))\n}\n0\n1\n4\n9\n16\n25\n36\n49\n64\n81\n\njs><br \/>\n[\/code]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Naive, but functional interactive javascript shell with Java 6. [code lang=&#8221;java&#8221;] package org.kari.test.script; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import org.apache.log4j.Logger; import org.kari.log.LogUtil; \/** * Test interactive javascript shell * * @author kari *\/ public class ScriptShell { public static final Logger LOG = LogUtil.getLogger(&#8221;script.shell&#8221;); private final&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-253","post","type-post","status-publish","format-standard","hentry","category-java"],"_links":{"self":[{"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=\/wp\/v2\/posts\/253","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=253"}],"version-history":[{"count":0,"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=\/wp\/v2\/posts\/253\/revisions"}],"wp:attachment":[{"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=253"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=253"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kari.world.ikari.fi\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=253"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}