SunのRI1.1で動かす つづき

えーっと。いくつか手を入れなければ、そのままでは動かない。以下、修正した点。

  • Sun RI1.1のcom.sun.faces.application.ViewHandlerImpl#createView

たぶんバグ?なのかな。生成するUIViewRootがnew UIViewRoot();とハードコードされているため、faces-config.xmlでS2UIViewRootが指定されていても、常にUIViewRootが生成されてしまう。そのため、org.seasar.jsf.lifecycle.LifecycleImpl#hasEventのS2UIViewRootへのキャストで落ちてしまう。
ちなみに、MyFacesのViewHandler実装であるorg.apache.myfaces.application.jsp.JspViewHandlerImpl#createViewは

uiViewRoot = (UIViewRoot)facesContext.getApplication().createComponent(UIViewRoot.COMPONENT_TYPE);

となっている。これをSun RIへコピペしてnew UIViewRoot()を削除。

org.seasar.jsf.component.S2UIViewRoot#broadcastForPhaseの以下の部分、

FacesEvent event = (FacesEvent) i.next();
int ordinal = event.getPhaseId().getOrdinal();
if (ordinal == ANY_PHASE_ORDINAL || ordinal == phaseIdOrdinal) {
    UIComponent source = event.getComponent();
 :
 :

ANY_PHASE_ORDINALがMyFaces固有ではないかと思われる。JSFJavadocにはなかったので。
ここを、

if (ordinal == PhaseId.ANY_PHASE.getOrdinal() || ordinal == phaseIdOrdinal) {

と修正した。

以上2点、修正しないとどうなるかというと、従業員管理のサンプルで 検索 > 照会 > 戻る とかやると一番上の理由でClassCastExceptionで落ちます。
かなり急いで試したので間違っていたらすみません。眠ったら忘れそうなのでメモということでお許しを。
あと、まだ1点未確認のところがあって、検索 > 照会 > 編集 > 確認 で、間違っていないはずなのに Validation Error: {0}Value is not valid というエラーが部署プルダウンの右に表示される。


結局のところ、今のそのままのSun RIでは(RI側の問題で)S2JSFは動かせなかったという結論で良いのかなー?