-式言語のカスタマイズ仕様の考察

JSFのValueBinding、MethodBinding、VariableResolver、PropertyResolverは登場人物としてJSR245にも出てくるという前提のもと、それらがどうなるかを考察します。

  • ability to redefine the behavior of the "." operator through a Property Resolver API
  • ability to plug in Variable Resolvers on a per-application and per-page basis
  • ability to plug in Property Resolvers on a per-application and per-page basis
  • ability to express references to bean methods using the expression language and invoking those methods via a Method Binding API
  • ability to express references to bean properties using the expression language and getting/setting those attributes via a Property Binding API
  • ability to defer expression evaluation until a time of a tag handler's choosing

一番はじめの、「Property Resolver API」はおそらくOGNLのPropertyAccessorの機能だと思います。今でもPropertyResolverのメソッドは、getValue(Object, Object)で、一番目の引数がベースのBean、二番目の引数がプロパティ名です。型はObjectですが、内部でtoString()して名前に変換しているので、事実上Stringです。これをValueBinding(バックワードコンパチを考えて、JSPのExpressionEvaluator)に、addPropertyResolver(Class, PropertyResolver)とするのでしょう。デフォルトでObject.classに汎用のまともにプロパティを見に行くPropertyResolverをセットしておけば、バックワードコンパチもOKです。そうであれば、Mayaの対応ではJSP2.1のスペックがでるまで独自に軽量にやっておいてもよい機能です。ここはSeasarとの連携とかで必要になる機能なので、何らかの機能がいることはいります。
二番目および三番目のVariable ResolverとProperty Resolverのアプリケーションおよびページごとにプラグインできる機能ですが、おそらくweb.xmlでアプリケーション全体の設定、JSPファイルには@ディレクティブを用いてプラグインするのだと思います。Mayaではその機能の有用性が見えてきたらでよいかと思います。エンジンいじる機能なので、簡便にやれるようにしなくてよいと思います。ただ、VariableResolverのカスタマイズによって組み込みオブジェクトのカスタマイズができます。このへんはファクトリーで対応したいと思います。
四番目の「Method Binding API」はJSFのMethodBindingを指して言ってるのだと思いますが、この機能もExpressionEvaluatorに盛り込んでしまっていいのではないかと思います。バックワードコンパチと新実装の効率を両立すると、ExpressionEvaluator#invoke(String, Class, Object[])かなと。Maya的にはOGNLでまずやるのでこのMethodBindingについては保留できます。
五番目の「Property Binding API」は値の参照のみならず設定ができるようにあらかじめ式言語エンジンを作りこんでおくということだと思いますが、Mayaの初期実装では不必要です。JSF1.2対応で必要になってくるものでしょう。JSF1.1ではスルーで式言語をJSFに行って、JSFでハンドルするのでMayaの中でやらず、S2JSFの中でやる内容と見ています。
最後がどう見せるのかよくわからないけど、バックワードコンパチ的には、デフォルトでエンジン評価なのでしょう。初期Mayaでは${}と#{}の式言語の囲いの違いで結果的にスイッチングできます。