-タグハンドラ

MayaEA1の実装をみたところ、やはりそうきたか!という感じのところ。タグハンドラはひがさんの得意な分野なんでしょうかね、たぶん最終形に近いキレイなつくりでできてます。
SAXハンドラからまずエレメントのnamespaceURI / localName / qName / attributesとDefaultHandler#startElementの引数群をすべて渡して、TagSelectors#getTagSelector()より、TagSelectorオブジェクトを取得します。このTagSelectorは具体的なハンドラのファクトリーとなっています。EA1の実装では以下のTagSelectorがあります。順番もこのとおりです。この順番はS2で作っていて、maya.diconに書かれています。

  • HtmlSelector
    • htmlタグだと適用される
    • HtmlProcessorを生成
  • MetaContentTypeSelector
    • metaタグでcontent-type属性がhttp-equivだと適用される。
    • MetaContentTypeProcessorを生成
  • InjectSelector
    • m:inject属性があれば適用される。
    • TagProcessorImplを生成
  • ElementSelector
    • デフォルトのもの。TagSelectorsでは最後に評価されて、ここまでくると常に適用される。
    • ElementProcessorを生成

プラグイン可能なタグハンドラ選択機構が完成しています。そのままつかって仕様に書いておきます。これによって、複雑なカスタム処理への余地をユーザーに残していますし、自動インジェクションができてます。同様に処理を行うTagProcessorを見ていくと、

  • ElementProcessor
  • MetaContentTypeProcessor
    • ElementProcessorを継承していて、テンプレのMETAタグを出力する
    • 親のHtmlProcessorをツリーから探し、エンコーディングとコンテントタイプを渡す
  • HtmlProcessor
    • ElementProcessorを継承していて、テンプレのHTMLタグを出力する
    • HttpServletResponseに対してエンコーディングとコンテントタイプを設定する
  • TagProcessorImpl
    • JSPカスタムタグをインジェクトして、Tag.doStartTag()、Tag.doEndTag()などを呼ぶ
    • この実装ではTagインターフェイスのみサポート。JSFにはTagのみなのでS2JSFの用途では十分です。
    • 後々、LoopTag、BodyTag、TryCatchFinallyをサポートすることになるでしょう。

たとえばBODYタグに反応するTagProcessorを作って、f:viewをオートインジェクトするとかいうことができるわけですね。私はこの層でメタXMLイベントを生成するかなと考えます。メタXMLのSAXハンドラでコードジェネレーション(もしくはストリームへのコンテンツ出力)かプラグインのDOMモデルかと分かれる。