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