Java Scripting API で CoffeeScript を実行
はじめに
Java SE 6 から実装されている Java Scripting API を使えば JavaScript を JVM 上で実行できます。そして、CoffeeScript は JavaScript にコンパイルできます。
と言う事で Java Scripting API を使って CoffeeScript を実行する Groovy スクリプトを作成してみました。
ソースは http://github.com/fits/try_samples/tree/master/blog/20130618/
CoffeeScript から JavaScript への変換方法
今のところ Java Scripting API で直接 CoffeeScript を実行できませんので、まずは JavaScript へ変換する必要があります。
通常の CoffeeScript コンパイラは基本的に Node.js 用ですので、今回の用途には向いていないと思われます。
そこで、Web ブラウザ用の CoffeeScript コンパイラ(CoffeeScript ソース の下記ファイル)を使用する事にします。
- extras/coffee-script.js
CoffeeScript を実行する Groovy スクリプト作成
coffee-script.js を使って CoffeeScript を実行する Groovy スクリプトは下記のようになりました。(安全な実行にはスコープ等を考えたほうが良いかもしれません)
run_coffee.groovy
import javax.script.* // (1) def engine = new ScriptEngineManager().getEngineByExtension('js') // (2) engine.eval(new FileReader('coffee-script.js')) // (3) engine.put('coffeeSrc', new File(args[0]).getText('UTF-8')) // (4) engine.eval('eval(CoffeeScript.compile(coffeeSrc))')
処理内容は単純で、JavaScript 用の ScriptEngine を取得し (1) 、coffee-script.js をロード(評価)します (2)。次に実行時引数で指定した CoffeeScript ソースファイルの内容を JavaScript 上の coffeeSrc 変数へ設定し (3)、最後に CoffeeScript.compile(coffeeSrc) で生成された JavaScript を eval で直接実行 (4) しています。
なお、(2) と (3) はどちらを先に実行しても支障は無いはずです。
単純な CoffeeScript の実行
それでは、下記のような単純な CoffeeScript ソースファイルを実行してみます。
sample.coffee
total = 0 total += value for value in [1..5] println total
実行結果は下記の通り。一応動作しているようです。
実行結果
> groovy run_coffee.groovy sample.coffee 15
RxJava を利用した CoffeeScript の実行
次は、外部の JAR ファイルを用いた CoffeeScript ソースファイルを実行してみる事にします。 今回は fits:id:20130310 でも試した RxJava を使ってみました。
- rxjava-core-0.9.0.jar
rx_sample.coffee
importClass java.util.Arrays importPackage Packages.rx Observable.from(Arrays.asList [1..10]).filter( (a) -> a % 2 is 0 ).skip(1).take(2).subscribe (a) -> println a
処理内容は、1 ~ 10 の数値から偶数を取り出し、先頭をスキップして 2 つのデータを取得して出力しています。
ここで、外部 JAR のパッケージやクラスを参照する場合は、Packages を使用する点に注意が必要です。
- Packages.<パッケージ名>
- Packages.<パッケージ名>.<クラス名>
上記 CoffeeScript を実行するには、Groovy スクリプトが rxjava-core-0.9.0.jar をロードできるように、ユーザーホームディレクトリの .groovy/lib へ rxjava-core-0.9.0.jar を配置する等しておきます。
実行結果
> groovy run_coffee.groovy rx_sample.coffee 4 6