谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

S2JSFでWebParts その11

おまたせ。


紆余曲折あったけど、「insertをforEachで繰り返す」事は単純には出来ないので、

  • insertタグに自前で属性 (m:items) を追加して、m:itemsが入力された場合は複数繰り返す
  • m:srcの値(式言語)がCollectionだった場合には複数繰り返す

の、いずれかになるかと思う。
この結論が出るまで、ちょっと遠回りしたけど、勉強になりました。


insertタグに手を入れる量が増えてきたけど、まぁ、もうちょっと突っ走ります。
現実として、実プロジェクトで使うためには、既存ソースに出来るだけ手を入れないよう
落とし所を考える必要がありそうだけどね。


と言うわけで、早速、実現方法の模索。
修正箇所の見切りとして、InsertProcessor#getSrcを呼んでいる箇所を見る。

前者はS2StateManager#getLastModifiedFromFileから、
ファイルの最終更新日をチェックするために呼ばれている模様。
後者は純粋に、Processor#processとしてタグ解析時に呼ばれているようだ。


そうすると、

  • InsertProcessor#getSrcではm:srcの文字列をそのまま返す
  • 呼び出し側(ViewProcessor#addIncludes / InsertProcessor#process)で式言語の解釈をする
  • 解釈した結果がCollectionなら、ループで処理する

こんな感じにできるかな。


、、、と思ったんだけど、ちょっと難点が。


何かっていうと、
ViewProcessor#addIncludesを辿ると、そもそもの呼び出し元は、LifecyleImpl#restoreViewになっているから、
InitActionが実行されるrenderフェーズよりも前に、ViewProcessor#addIncludesが呼ばれることになる(はず)。


例えば、insertタグにm:src="#{hogeList}"を記述したとして、

  1. InitAction実行
  2. InitAction内でhogeListに、表示したいページ一覧を設定する
  3. getSrc()が呼ばれる
  4. #{hogeList}を解釈して、ページ一覧を取得できる

という流れを期待するんだけど、
ViewProcessor#addIncludesについては、

  1. getSrc()が呼ばれる
  2. #{hogeList}を解釈しても、null。(もしくは前回設定した値など)
  3. InitAction実行
  4. InitAction内でm:srcに表示するページ一覧を設定

という順序になっちゃうわけ。期待する値が入らないのよね。


って、あれ? ビュー復元フェーズの役割って、むしろ、これで正しいんだっけ?
やばい、ちょっと調べないと (^^;


まぁ、イベントが処理できるかどうか、、、も含めて、実装しながら、調査してみよう。