Java Scripting API で CoffeeScript を実行

はじめに

Java SE 6 から実装されている Java Scripting API を使えば JavaScriptJVM 上で実行できます。そして、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