S2ServiceInvoker

どうにも眠れないので書いてみた。100行未満のコードであっさりと動いた(笑)Flashから渡ってくるパラメータをコンポーネントに渡すのが面倒かな〜と思ったらOpenAMFは素晴らしかった!以下のように書いてComponentのInvokeはあっさりと終了。

if (container.hasComponentDef(serviceName)) {
  component = container.getComponent(serviceName);
} else {
  component = container.getComponent(Class.forName(serviceName));
}
BeanDesc beanDesc =
  BeanDescFactory.getBeanDesc(component.getClass());
result =
  beanDesc.invoke(
    component,
    methodName,
    request.getParameters().toArray());

ちょっとはしょってますけど、コードのコアはこんな感じ。いきなりコンポーネント取得しにいっちゃってるのはsupportsメソッドで既にコンポーネントが存在している事が保障されているから。パラメータの有無をチェックしてないとか、細かいエラー処理が抜けてるのもはしょってるからです。今はコンテナの生成を固定のパス(XML)でやってしまっているのでS2 V2.0.6で実装されるS2ContainerServletのリリースを待ちます。でも複数のプレゼンテーションフレームワークを使う場合、定義XMLがひとつだとごちゃごちゃになるかな?そこは<include path="">タグを使ってうまく定義ファイルを分割すればOKか。複数のプレゼンテーション技術を、明確にユースケースを分けられればOKなんですよね。例えばFlashTapestryを使うとしたらFlashはユーザ側の画面で、Tapestryは管理機能みたいな画面とか。

そうそう今更ながら気づいたんですが、OpenAMFであきらかに使わないサービスはweb.xmlから削除しておいた方が気分的にリモーティングのパフォーマンスが良いです(笑)