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の実装が違う気もしなくはないけど。