-OGNL3.0 pre1
OGNL3.0に乗り換えました。いずれS2もTapestryもOGNL3.0になるだろうし。3.0で式言語の文法は変りませんが、Java APIのほうはがらっと変わってます。いままでPropertyAccessorを作ると、以下のように追加していました。
static { OgnlRuntime.setPropertyAccessor(Rtti.class, new OgnlPropertyAccessor()); }
つまりはVM上のすべてのコンテキストについて、プロパティアクセッサ設定を共有してのです。しかし、3.0ではあらたにEnvironment/ExecutionEnvironmentというのが現れています。このEnvironmentはOgnlクラスとOgnlRuntime、OgnlContextとユーザーコンテキストを登録するMapがいっしょになったようなinterfaceで、うまくスレッドごとのプロパティアクセッサ等の設定にしています。サンプルは以下のような感じ。
ExecutionEnvironment env = new DefaultExecutionEnvironment(); env.setPropertyAccessor(Rtti.class, new OgnlPropertyAccessor()); env.setVariableValue("loader", new RttiLoader(....)); String el = "loader.loadRtti(\"test.Person\").parent"; Expression exp = env.parseExpression(el); Object value = env.getValue(exp, root);
3.0の利用に踏み切ったのは、staticなメンバーアクセスが2.6ではうまくできなかったからです。2.6ではstaticメンバーをパーサーが生成した式言語の解釈Nodeによって直接Class#getField()されているために、どうにもならなかったところ、3.0ではこのアクセスほかすべてにわたって、継承によってカスタマイズOKなExtensionsというユーティリティクラスで処理を一端受けるつくりになっていたために、OgnlRttiで期待する機能の(現時点で)すべてが作れました。あとは、OGNL3.0の熟成を待っている間ぐらいはプラグインに時間かかるでしょうから、今日時点でバイナリ配布が無いような状態でもよしとします。だって2.6.5じゃできないんだもん。
ということで、最新のOgnlRttiを http://www.fiberbit.net/user/kurihara/ に公開してあります。これにはOGNL3.0のコンパイル結果のJARもはいってます。OGNL3.0のコンパイルがめんどくさい方はこちらもご利用ください。ソースのほうは、JDTとOGNL3とPDE-JUnitのそれぞれ数少ないサンプルになっていると思います。