-Jasper2ガイド(1)

さて、いよいよ実装着手も近づいてきましたので、Mayaの実装を行ううえで参考にするJasper2のソースのうち、見ておくと良いと思われる点を軽く流してガイドします。ガイドは、Tomcat5.5.4付属のJasper2のコードです。その中でも、まずは最重要のコードジェネレートしているところ。それは、org.apache.jasper.compiler.Generatorというソースです。こいつはJasper中で最大のステップ数を誇るコード(4007ステップ)ですが、見るべきところは少ないです。

  • 1571行: GenerateVisitor.visit(Node.CustomTag)
    • JSPファイルをパースした結果生成されたDOMノードのハンドラのひとつで、JSPカスタムタグのハンドラです。このコードからのメソッドスタックでJSPカスタムタグを生成・実行するコードをジェネレートします。もっぱらこのメソッド中ではコードに埋め込む識別子の払い出しとPageContextのスタック管理のコードおよび、カスタムタグの実装するインターフェイスに応じたロジックの分岐を行っています。generateCustomDoTag() / generateCustomStart() / generateCustomEnd()を呼び出します。
  • 2116行: GenerateVisitor.generateCustomStart(...)
    • Tag#doStartTag()を実行する周辺のコードジェネレーションをします。doStargTag()の返りのint値とBodyTagインターフェイスを実装しているかどうかによって、ボディの操作について決定します。ここで、ループ対応のため、制御をdoループに突入させるコードジェネレーションをしているところが重要。tryCatchFinallyを実装していると、「try{」を書き出します。
  • 2227行: GenerateVisitor.generateCustomEnd(...)
    • Tag#doAfterBody()および Tag#doEndTag()を実行する周辺のコードジェネレーションをします。カスタムタグがIterationTagを実装している場合、doAfterBody()を呼び出しするコードを書き出し。generateCustomStart()で突入した無限ループにおいて、Tag#doAfterBody()の返値がBodyTag.EVAL_BODY_AGAINではない値だとブレイクするコードをジェネレート。tryCatchFinallyを実装していると、doCatch()およびdoFinally()を呼ぶコードを書く。最後、カスタムタグをプールに戻すコードを書きます。
  • 2333行: GenerateVisitor.generateCustomDoTag(...)
    • JSP2.0からのSimpleTagインターフェイスを実装している場合に使われるハンドラ。doTag()を呼び出すコードを書き出す。

あとは、上記からたどれるところをざっと眺めるぐらいでOK。他には、コードジェネレートした結果をオンザフライでコンパイルしてロードして、サービスする一連の流れのところをパクるぐらいかな。ということで、自習よろ。