javaagent対応

どうやら今まで自分は、TopLinkのjavaagentの動作でずっと勘違いをしていたみたいです(汗)
premainメソッドのagentArgs引数は、コマンドで

toplink-essentials-agent.jar=${agentArgs}

みたいに引数を渡さない限りnullが返ってきます。したがって、特にagentArgsを指定しなければ、TopLinkのagentはpremainメソッドの中でpersistence.xml、Entityの読み込み、ClassTransformerの作成を行っていました。しかし何故か自分はずっと、PersistenceProviderからメソッドを呼ばれたときに行ってる(initializeFromMain)ものだと勘違いしてました(汗)・・・なるほど、やっぱりjavaagent環境であろうと、エンハンス対象のEntityは、ClassTransformerを定義する前にロードしてはいけないのですね・・・普通に考えたら当然の筈なのですが、何故か勘違いしてしまっていました。
というわけで、TopLink Essentialsのb22を使って、改めてjavaagent対応をやってみました。今度は、MappingFileAutoDetectorにも対応してます。しかし、ClassAutoDetectorには対応できない(ClassAutoDetectorはclassをロードしてしまうから)ことも明らかになったので、とりあえずS2TopLinkでのAutoDetector対応は、xmlファイルのみに限りたいと思います。TopLink自体のクラス自動登録機能の方を使えば、Entityを個別に定義する必要はありません。
また、現在のTopLink Essentials最新バージョン(b24)でも相変わらずjavaagentを使うとエラーになります。調査してみたところ、ClassTransformerのtransformメソッドの中でエラーが起こっていました。更に調べると、asmライブラリの中でエラーが発生している模様。うーん・・・ここから先は自分には無理そう・・・java.netのフォーラムでもこれと似た問題が挙がっていた(http://forums.java.net/jive/thread.jspa?threadID=19638&tstart=0)ので、とりあえずはTopLink側が早く解決してくれることを期待。
・・・後は、一旦消してしまったWeb環境でのLAZYロード機能の復活ですね。PersistenceUnitInfoの作成はTopLinkのライブラリ使えばよさそうなので、後はClassTransformerからのクラス定義と、それをいつどこで行うかの再定義でしょうか。
とりあえず、初期化用のServletを作って、それをS2ContainerServletよりも前に実行する形で定義してみようかと思ってます。・・・ただし、ServletコンテナがServletのオブジェクトをいつ・どのタイミングでロードするかによって、また例の「Entityクラスのロード問題」にぶち当たるかも・・・