S2JSFをSUNのRI1.1で動かす
単にweb.xmlからMyFacesに関する部分をコメントアウトしてjarを入れ替えるだけだと、TagProcessorImpl#processBodyTagのdo〜whileのところで無限ループに陥ってしまうみたい。〜までの描画が無限に繰り返されてOutOfMemory。
protected void processBodyTag(JsfContext pagesContext, BodyTag tag) throws JspException { if (Tag.SKIP_BODY != tag.doStartTag()) { do { PageContext pageContext = pagesContext.getPageContext(); BodyContent bodyContent = pageContext.pushBody(); tag.setBodyContent(bodyContent); processChildren(pagesContext, tag); pageContext.popBody(); } while (BodyTag.SKIP_BODY != tag.doAfterBody()); tag.doEndTag(); } }
最初はweb.xmlか何かの設定ミスかと思ってたけど、SUN RIのソースを落としてきて確認したところスッキリ。MyFacesのBodyTag#doAfterBodyの実装は常にTag.SKIP_BODYを返すけど、SUN RIの実装は常にTag.EVAL_PAGEを返ようになっている。つまり、SUN RIを使うとdo〜whileがずっと真になりつづけてしまうのでループしていた。
じゃあ実際は何が正しいのかということになるが、今の僕にはよくわからない。。。いやたぶん今後も。
Javadocを見る限り、BodyTag#doAfterBodyがBodyTag.EVAL_BODY_AGAINを返すとボディの再評価となっているから、
} while (BodyTag.EVAL_BODY_AGAIN == tag.doAfterBody());
が正しいのかなぁ。Tag.EVAL_PAGEを返すSUN RIの実装が違う気もしなくはないけど。