-ImplicitObjectELResolver

今回の私の受け持ち実装分はEL関連なので、一番でかいのは、ImplicitObjectELResolverの実装です。これは、javax.servlet.jsp.el.ImplicitObjectELResolverとしてJSR245で提供されるはずのものですが、今、とりあえず無いので実装しないといけないものです。JSR245において、JSPの組み込みオブジェクトはJSF1.1とほとんど同じようなラインナップになります。applicationScope・requestScope・sessionScope・param・paramValues・header・headerValues・cookie・initParamです。これらはすべてjava.util.Mapとして提供されます。JSF1.1と同じということで、MyFacesはどんな実装しているかというと、きちんと理にかなった実装をしています。Mapを独自に実装して、コンストラクタにServletRequestとかServletContextを渡して生成してあげれば、値にアクセスするまでパラメータ一覧を全取得しにいったりしません。
一方で、javax.servlet.jsp.el.ImplicitObjectELResolverはドキュメントを見る限りではまったく抽象メソッドが無いのでそのまま使える実装として提供されるのかなと思います。というところで、寝ながら気になってたことの裏をとるために、SunのJSFリファレンス実装をダウンロード。。。ソースが無いので詳細は不明ですが(ということにしておきます。デコンパイルはライセンス違反だからね)、型情報を見ると、コンストラクタにServletContextなどを渡す、MyFacesと同じようなMap群がしっかり実装されていました。おそらくこれらをそのままつかって、ImplicitObjectELResolverは実装提供されてくるに違いありません。ちなみに、ELResolverへのコンテキストオブジェクトの渡しは、ELContext#getContext(Class): Object で取得させることによりできます。ドキュメントから伺い知れるところによると、ELContext#pushContext(Class, Object): void でELContextのファクトリがjavax.servlet.jsp.PageContextあたりをプッシュして行うことになると思います。Mayaのとりあえずの実装では、MyFacesのコンテキストMap群をそのまま借りてきてJSR245実装私家版を作っておいて、後にJSR245のAPI-Jarが出たらそれに差し替えしたいと思います。ということで、当座はjavax.servlet.jsp.el.ImplicitObjectELResolverとjavax.servlet.jsp.el.ScopedAttributeELResolverをMyFacesのソースを流用したりして、つなぎ&まにあわせ実装しておけばよいということで納得。J2EE5.0に含まれてJSR245はリリースされるそうなので、それ以前は流用する一部のみライセンスがASL2.0になっちゃうかな。こういうのを嫌って、ApacheServlet-APIなんかも独自に実装するんでしょうね。