Java-pluginのActiveXブリッジ
pnuts.tools.PnutsAppletを少し修正して、AppletオブジェクトをContextローカル変数から取り出せるようにして、ユーザのセキュリティポリシーをAllPermissionにしておけば、IEで動いているPnutsアプレットの中からそのページのDHTMLオブジェクトにアクセスできるようです。実際にやってみたら、AJaxでよくやるようにinnerHTMLの値をPnutsを使って置き換えることはできました。ただ、今のJava-pluginには、ページ遷移のイベントを拾う仕組みはあるけど、DOMノードに対してイベントハンドラを登録するための仕組みはなさそうです。JacobだとイベントハンドラをJavaで書けるようになっているけど、それと同じことができれば、onclickハンドラ等をJavaで書くことができるでしょう。
そういえば、Jacobのバージョンが上がっていて、win32com.jacobモジュールがコンパイルに失敗するようになっていました。後で修正します。
Client Side Java
よくできたAjaxアプリを見慣れてくると、ブラウザで動くスクリプトとしてJavaScript以外の仕組みを使うことはあまり思いつかないかもしれません。ただ、Webアプリケーションの基盤の一部として長い目で見た場合に、いくつか改善の余地があることに気がつきます。
- Javaの場合はsandboxの制限を緩めてローカルリソースにアクセスできますが、JavaScriptでは(独自拡張しないかぎり)できません。
- アプリケーションが大規模になってくると、JavaScriptのコードの量が当然多くなります。しかも、プログラムをバイトコードでなくテキストで HTTP/GET し、クライアントサイドのJavaScriptインタープリタで毎回構文解析をして実行しなければなりません。処理が小さいうちは、一瞬で起動できるインタプリタでスクリプトを実行した方が速いかもしれませんが、大きなアプリケーションでは、構文解析が済んだ状態のバイトコードをダウンロードして実行した方が効率の面で逆転するでしょう。
- prototype.jsのようなベースとなるようなライブラリを、アプリケーション用のスクリプトと同じように扱っていて、(ブラウザがキャッシュしてくれるとはいえ)論理的には毎回取りにいきます。本当は、共有される基本ライブラリは、一度だけダウンロードしておいて、あとはバージョンが新しくならないかぎりダウンロードはしなくて済むようにするべきです。
で、通常はJavaScriptで書くonclick等のイベントハンドラや DOM へのアクセスを Javaで実現するようなブラウザのプラグインは実現できないか、という妄想をしはじめました。起動時間については、Java-pluginと違ってSwing/AWTを使わず、最近のマシンだと0.2秒くらいになるので、Appletのような問題は起きないでしょう。JSR223経由のRhinoを使って、互換性を保ったままJavaScriptの実装を差し替えることができれば、ブラウザ間の非互換性に対する解になるかもしれません(逆に非互換性の元を一つ増やしてしまうかもしれませんが)。Windowsの場合はJREの配布の問題はありますが、上に挙げた問題が解決できるとすれば、それなりに価値はあると思うのです。
java.compilerモジュール
というわけでjava.compilerモジュールができあがりました。mustangで実装されたJSR-199のAPIを使ってJavaのソースコードをコンパイルできます。
JSR-199 & JSR-223
Mustangに含まれるJava Compiler API (JSR-199) を使うと、Javaコンパイラをプログラムから操作できるようになります。新たにできるようになることとしては、たとえば、クラスファイルを(ファイルシステム上に作らずに)メモリ上に作って読み込むことができます。スクリプト言語からJavaのソースコードを直接読み込むような使い方も考えられます。
Java Compiler APIは、mustangの最近のビルドでAPIの大きな変更があり、サンプルコードもない状態だったので、実は、どうやって使うものかわからずお手上げ状態でした。しかし、http://blogs.sun.com/roller/page/sundararajan?entry=jsr_223_script_engine_for
によると、http://scripting.dev.java.net/ に JSR 223の Javaエンジンの実装が追加されたそうで、JSR-199のよいサンプルコードかもしれません。