Java6

Java 6 からいつの間にか javax.script パッケージというのが追加されてますね。
何気に Java 6 には Rhino が取り込まれていて Java から JavaScript が使用できるようになっているそうな。
なにげに文字列を eval できるのでクライアントから送られて来た JavaScript をサーバで実行して返すとかできる。
すごくセキュリティホールにつながりそうだけどなんか面白い使いかたないのかなー?

取り合え得ずバージョンを見てみるとか。

import java.util.List;
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngineFactory;

public class ScriptEngineList
{
    public static void main(String[] args) {
        ScriptEngineManager manager = new ScriptEngineManager();
        List<ScriptEngineFactory> factories = manager.getEngineFactories();
        for (ScriptEngineFactory factory: factories) {
            System.out.printf("%s : %s\n", factory.getEngineName(), factory.getEngineVersion());
        }
    }
}

こいつを javac でコンパイルして実行してみると

$ java ScriptEngineList
Mozilla Rhino : 1.6 release 2

なんつー感じに表示されます。って Rhino 1.6 r2 か…結構古いかも?

ちなみに同じような動作をする JavaScript

importPackage(java.lang);
importPackage(java.util);
importPackage(javax.script);

var manager = new ScriptEngineManager();
var factories = manager.getEngineFactories();
var it = factories.iterator();
while (it.hasNext()) {
    var factory = it.next();
    print(factory.getEngineName() + " : " + factory.getEngineVersion() + "\n");
}

こんな感じでかけるようです。
JDK付属の jrunscript を使用して

$ jrunscript ScriptEngineList.js
Mozilla Rhino : 1.6 release 2

とかやってもいいけど下記のようなプログラムを書いて

import java.io.FileReader;
import java.io.FileNotFoundException;
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;

public class ScriptDriver
{
    public static void main(String[] args) {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
        try {
            engine.eval(new FileReader(args[0]));
        } catch (ScriptException e) {
            System.out.println(e);
        } catch (FileNotFoundException e) {
            System.out.println(e);
        }
    }
}
$ javac ScriptDriver.java
$ java ScriptDriver ScriptEngineList.js
Mozilla Rhino : 1.6 release 2

なんてこともできるみたい。