2008-05-20

JRuby for BlazeDS その2

前回のエントリで、JRubyに対して Flex(BlazeDS)向けのハックをいくらか適用した。

が、JRubyから Flexへ値を返す際にまだ下記の問題が残っている。

1)ハッシュのキーを文字列でなくシンボルにすると、Flex側でプロパティが拾えない。
2)ActiveRecordのエンティティをそのまま返すとFlex側でプロパティが拾えない。
3)インスタンス変数持ちのオブジェクトを返しても、Flex側でプロパティが拾えない。

これらはいずれも JRuby側のオブジェクトを ActionScriptの Object(動的プロパティ持ち)として返したい場合のものだ。
ちなみに ActionScript3にはハッシュ型というものの用意がなく、Object型のオブジェクトに動的プロパティを与えることで代用するようになっている。

BlazeDSでは、JavaBeansや Mapといったオブジェクトを AMFにシリアライズする際、それぞれの型にあった「プロパティプロキシ」のインスタンスを内部レジストリから取得し、それを経由して目的のオブジェクトから「キー:値」のエントリを取り出すようになっている。
上に挙げた問題を解決するために、
・JRubyのハッシュ型(org.jruby.RubyHash)に対応するプロパティプロキシ RubyHashProxy
・JRubyのオブジェクト全般(org.jruby.RubyObject)に対応するプロパティプロキシ RubyObjectProxy
を作成した。これらは Mapオブジェクトをシリアライズするためのプロキシである MapProxyがベースになっている。
前者は1の問題、後者は2及び3の問題に対応する。

これらの独自で作成したプロパティプロキシをBlazeDSの PropertyProxyRegistryに登録すれば、JRubyからの返り値が期待通りに ActionScript側へ プロパティのセットされた Objectとして届くようになる。特に ActiveRecordのオブジェクトをそのまま Flexへ返せるようになるのは威力絶大だ。

しかし、PropertyProxyRegistryの設定は残念ながら設定ファイルで行うことが出来ない。
仕方ないので Webアプリケーションの起動時に PropertyProxyRegistryへプロパティプロキシの登録を行うよう、web.xmlに登録するための簡単なリスナクラスも作成した。プロパティプロキシと合わせてソースを置いておく。

jruby_property_proxies.zip

ラベル: ,

0 件のコメント:

コメントを投稿

<< ホーム