[Seasar-user:10310] Re: [Teeda]Teeda1.0.11-RC1の@PageScope、@SubapplicationScopeの挙動について

Shinpei Ohtani [E-MAIL ADDRESS DELETED]
2007年 9月 5日 (水) 00:49:30 JST


大谷です.

> ※グレーな回答ですみません。技術的にあまり自信がないです。(^-^;;
> 要望を聞いていただいてありがとうございます。

いえ、こちらこそ確認ありがとうございます.

> 余談ですが、私が気がついた点を2つ。
> 1.
> TEEDA-351対応の為のコードが現在残っています。
> HtmlViewHandler#renderViewのコード
> boolean changed = false;
> if (postback) {
> changed = pageScopeHandler.toPage(pageDesc, context);
> }
> と、
> PageScopeHandler#toPageメソッド
>
> 今回の対応で値の復旧はExternalバインディングに任せたため一見不必要かと思
> われます。
> ※実際SessionScopeHandlerにはtoPageメソッドはありません

いえ、これはPageScopeの問題なので、SubApplicationScopeでは
ありません.PageScopeは同一画面内をポストバックしている間は
値を引き継がなくてはいけないのですが、それが上手くいってなかったので修正しました.

> しかし、残す場合にはPageScopeHandlerImpl#toPageでpropertyDesc.setValueを
> 呼び出す前に書き込み可能なプロパティであるかを検出した方が良いかと思われ
> ます。

おっと、失礼.

> 間違った使い方の時にしか問題は発生しませんので必須対応ではないと思います
> が、気がついたためご報告。
> ※getterしかないプロパティに@PageScopeを付けた場合に例外が発生します。

この件もあわせて修正しました.

> 2.
> SessionPagePersistence#restore(今回の修正箇所です)にてExternalContext
> から取得した RequestMapにSubapplicationScope、RedirectScope、PageScopeの
> 値を挿入しているのですが、 Teedaとして動作上必須な下記の項目と同じ名前の
> 項目があった場合は上書きされてしまいます。

ん?RequestMapにある何が何で上書きされると言っていますか?
facesContextとかpreviousViewId、postbackのことを指しているのでしょうか?

> 少なくとも3種のスコープの値を格納する前には下記の値がすでに格納されてい
> ます。
> ・org.seasar.framework.container.hotdeploy.HotdeployFilter
> ・facesContext
> ・previousViewId
> ・postback
>
> これらと同じ名前のプロパティにスコープアノテーションを間違って(ありえる
> のか?あったから気がついたわけですが・・・)付けてしまった場合は正しく動
> 作しなくなります。
> 勿論「そんな事をしてはいけません」の一言で終わるわけですが、今後このよう
> な値が増えるのか?また、これですべてであるのかが私には判断できません。
> もし、フレームワークとして予約語のようなものをある程度定義できるのでした
> ら、これらと同じ名前のものにスコープアノテーションが付けられている
> 場合はそれを無効とするというコードが記述されていれば、余計なトラブルの種
> が減ると同時に、フレームワークのコードを読んだりするような方へのメッセー
> ジ性が増すと思われます。

基本的にこれ以上どうしてもというニーズが聞こえてこない限り
これ以上予約語が増えることはありません.
しかし橋本さんのおっしゃるようにフレームワーク側である程度予防動作を
する方がよいと思います.何か対策を打つ方向で検討してみます.


> 2点、重箱の隅をつつくような内容ですので流していただくことも可かと思いま
> すが、間違った使い方をそもそもできないようにするという視点ではアリかとも
> 思い、ご報告させていただきました。

いえ、とても有意義な観点だと思います.
ご指摘ありがとうございます.


07/09/05 に 橋本 昇<[E-MAIL ADDRESS DELETED]> さんは書きました:
> TO:大谷さん
>
> 橋本です。
> SNAPSHOTありがとうございます。
>
> TestPageでの動作を確認をいたしました。
>
> また、PageScopeの値もSessionPagePersistenceにてSubapplicationScope同様
> Externalバインディングの対象になっている事も確認しました。
> これでおそらく値の復旧タイミングは私の希望通りになったのではないかと思っ
> ています。
> ※グレーな回答ですみません。技術的にあまり自信がないです。(^-^;;
> 要望を聞いていただいてありがとうございます。
>
>
> 余談ですが、私が気がついた点を2つ。
> 1.
> TEEDA-351対応の為のコードが現在残っています。
> HtmlViewHandler#renderViewのコード
> boolean changed = false;
> if (postback) {
> changed = pageScopeHandler.toPage(pageDesc, context);
> }
> と、
> PageScopeHandler#toPageメソッド
>
> 今回の対応で値の復旧はExternalバインディングに任せたため一見不必要かと思
> われます。
> ※実際SessionScopeHandlerにはtoPageメソッドはありません
> ただし、changedによって変更を検出しているという点、SubapplicationScopeと
> の非対象性の意図により、私には判断つきかねます。(^-^;;
> しかし、残す場合にはPageScopeHandlerImpl#toPageでpropertyDesc.setValueを
> 呼び出す前に書き込み可能なプロパティであるかを検出した方が良いかと思われ
> ます。
> 間違った使い方の時にしか問題は発生しませんので必須対応ではないと思います
> が、気がついたためご報告。
> ※getterしかないプロパティに@PageScopeを付けた場合に例外が発生します。
>
> 2.
> SessionPagePersistence#restore(今回の修正箇所です)にてExternalContext
> から取得した RequestMapにSubapplicationScope、RedirectScope、PageScopeの
> 値を挿入しているのですが、 Teedaとして動作上必須な下記の項目と同じ名前の
> 項目があった場合は上書きされてしまいます。
>
> 少なくとも3種のスコープの値を格納する前には下記の値がすでに格納されてい
> ます。
> ・org.seasar.framework.container.hotdeploy.HotdeployFilter
> ・facesContext
> ・previousViewId
> ・postback
>
> これらと同じ名前のプロパティにスコープアノテーションを間違って(ありえる
> のか?あったから気がついたわけですが・・・)付けてしまった場合は正しく動
> 作しなくなります。
> 勿論「そんな事をしてはいけません」の一言で終わるわけですが、今後このよう
> な値が増えるのか?また、これですべてであるのかが私には判断できません。
> もし、フレームワークとして予約語のようなものをある程度定義できるのでした
> ら、これらと同じ名前のものにスコープアノテーションが付けられている
> 場合はそれを無効とするというコードが記述されていれば、余計なトラブルの種
> が減ると同時に、フレームワークのコードを読んだりするような方へのメッセー
> ジ性が増すと思われます。
>
> フレームワークとして対応するべきか微妙ですが一応ご報告。
>
>
> 2点、重箱の隅をつつくような内容ですので流していただくことも可かと思いま
> すが、間違った使い方をそもそもできないようにするという視点ではアリかとも
> 思い、ご報告させていただきました。
>
>
> 以上です。
> スコープアノテーションの対応ありがとうございました。
>
>
> Shinpei Ohtani wrote:
> > 大谷です.
> >
> > SNAPSHOTをデプロイしました.
> > 下記を試してもらえるでしょうか.
> >
> > http://maven.seasar.org/maven2-snapshot/org/seasar/teeda/teeda-ajax/1.0.11-SNAPSHOT/teeda-ajax-1.0.11-20070904.044943-3.jar
> >
> > http://maven.seasar.org/maven2-snapshot/org/seasar/teeda/teeda-core/1.0.11-SNAPSHOT/teeda-core-1.0.11-20070904.044943-3.jar
> >
> > http://maven.seasar.org/maven2-snapshot/org/seasar/teeda/teeda-extension/1.0.11-SNAPSHOT/teeda-extension-1.0.11-20070904.044943-3.jar
> >
> >
> > 宜しくお願いします.
> >
> > 07/09/04 に Shinpei Ohtani<[E-MAIL ADDRESS DELETED]> さんは書きました:
> >
> >> 大谷です.
> >>
> >> https://www.seasar.org/issues/browse/TEEDA-358
> >>
> >> として、修正しました.
> >> SNAPSHOTを作成しようと思うので、確認してもらっても
> >> よいでしょうか?
> >> 宜しくお願いします.
> >>
> >> 07/09/02 に Shinpei Ohtani<[E-MAIL ADDRESS DELETED]> さんは書きました:
> >>
> >>> 大谷です。
> >>>
> >>> お返事遅くなりすいません.
> >>> 下記、ちょっと調べてみるのでもう少しお時間下さい.
> >>> よろしくお願いします.
> >>>
> >>> 07/08/31 に 橋本 昇<[E-MAIL ADDRESS DELETED]> さんは書きました:
> >>>
> >>>> こんにちは、橋本と申します。
> >>>>
> >>>> 大谷さん、@PageScopeの不具合に対応していただきましてありがとうございます。
> >>>> 結果を楽しみにTeeda 1.0.11-RC1で動作を確認してみました。
> >>>> ※Seasar2 2.4.17との併用です
> >>>>
> >>>> そこでいくつか気がついた点があります。
> >>>> 質問の前提コードは下記の通りです。
> >>>>
> >>>> public class TestPage {
> >>>> @PageScope
> >>>> public String pageField;
> >>>>
> >>>> @SubapplicationScope
> >>>> public String subAppField;
> >>>>
> >>>> public Class initialize() {
> >>>> pageField = "pageField";
> >>>> subAppField = "subAppField";
> >>>> return null;
> >>>> }
> >>>>
> >>>> public Class prerender() {
> >>>> System.out.println("prerender pageFiled=" + pageField);
> >>>> System.out.println("prerender subAppField=" + subAppField);
> >>>> return null;
> >>>> }
> >>>>
> >>>> public void doUpdate() {
> >>>> System.out.println("doUpdate pageFiled=" + pageField);
> >>>> System.out.println("doUpdate subAppField=" + subAppField);
> >>>> }
> >>>> }
> >>>>
> >>>> <form id="Form">
> >>>> <input type="submit" id="doUpdate"/>
> >>>> </form>
> >>>>
> >>>> 上記のコードで
> >>>> 1.
> >>>> とりあえず画面を表示する。
> >>>> ログとして下記の表示が出力
> >>>> prerender pageFiled=pageField
> >>>> prerender subAppField=subAppField
> >>>>
> >>>> 2.
> >>>> ボタンでsubmitする
> >>>> ログとして下記の表示が出力
> >>>> doUpdate pageFiled=null
> >>>> doUpdate subAppField=null
> >>>> prerender pageFiled=pageField
> >>>> prerender subAppField=null
> >>>>
> >>>> ここで2つの疑問がわきます。
> >>>> 疑問1
> >>>> @SubapplicationScopeの値の引継ぎが失敗しているのでは?
> >>>>
> >>>> 疑問2
> >>>> @PageScopeの値の復旧はprerender時には行われていますが、doXXXのイベント発
> >>>> 生に間に合うタイミングで行われないのでしょうか?
> >>>>
> >>>> 要望としてはdoXXX実行時に間に合うタイミングで復旧する事を希望いたします。
> >>>> 実際はJSFコンポーネントがPageクラスのgetter/setterを利用し始める前でしょ
> >>>> うか・・・
> >>>> JSFに明るくないため中途半端な技術要望ですみません。
> >>>> ※1.0.10の@SubapplicationScopeはそのようなタイミングで動作しているように
> >>>> 思えます。
> >>>>
> >>>> 以上、ご検討よろしくお願いします。
> >>>> _______________________________________________
> >>>> Seasar-user mailing list
> >>>> [E-MAIL ADDRESS DELETED]
> >>>> https://ml.seasar.org/mailman/listinfo/seasar-user
> >>>>
> >>>>
> >>> --
> >>> =============================
> >>> Shinpei Ohtani
> >>> [E-MAIL ADDRESS DELETED]
> >>> =============================
> >>>
> >>>
> >> --
> >> =============================
> >> Shinpei Ohtani
> >> [E-MAIL ADDRESS DELETED]
> >> =============================
> >>
> >>
> >
> >
> >
>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>


-- 
=============================
Shinpei Ohtani
[E-MAIL ADDRESS DELETED]
=============================



Seasar-user メーリングリストの案内