色々なスクリプトをヒアドキュメントで書いて、そのまま実行するJRuby

via http://d.hatena.ne.jp/t_yano/20070403/1175612738
http://headius.blogspot.com/2007/03/can-your-ruby-do-this.html

試しに、素のJavaで簡単に書けないか考えてみました。こんなのはどうでしょ?しかし、見た目的にいまいちですね・・・。

public class ScriptTester {
	public String x = "Hello";
	public String y = "World!";

	public void call() {
		String script = "z = 'multilanguage';" +
				"println(outer.x + ',' + z + ' ' + outer.y);";

		Scriptable s = new Scriptable("outer");
		s.js(script, this);
	}

	public static void main(String[] args) {
		new ScriptTester().call();
	}
}

ちなみに、Scriptableクラスは以下のようになってます。ちょっと頑張れば、privateなフィールドやメソッドをバインドするのも可能です。また、javascriptしか対応していないのは、JavaSE6が標準で対応しているのが、javascriptだけなのです^^; この辺りは、AOPを使ったりして減gの毎のインターフェイスを自動生成できたら嬉しいかも?

import javax.script.*;

public class Scriptable {
	private final String namespace_;
	public Scriptable(String namespace) {
		namespace_ = namespace;
	}

	public void js(String script, Object invoker) {
		ScriptEngineManager manager = new ScriptEngineManager();
		ScriptEngine engine = manager.getEngineByName("js");
		if (engine == null) {
			System.out.println("js script is not found!");
			return;
		}

		Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
		bindings.put(namespace_, invoker);

		try {
			engine.eval(script);
		} catch (ScriptException ex) {
			ex.printStackTrace();
		}
	}
}