[mayaa-user:873] Re: PathAdjusterの挙動について

Susumu ISHIGAMI [E-MAIL ADDRESS DELETED]
2009年 12月 18日 (金) 12:17:05 JST


石上です。
返事が遅くなってしまって、申し訳ありません。

いただいたご回答が、どうも私が認識しているものと違うため、
コードを交えて説明させていただきます。
長くなってしまって恐縮ですが、よろしくお願いいたします。


> PathAdjuster はビルド時に呼ばれるものであり、「使い回す」のではなく
> 「テンプレートにそう記述されていたことにする」ものです。
> このためレンダリングのパフォーマンスに影響を与えることなく
> 絶対パスへの置き換えが可能です。

ということは、mayaaファイルにおいては、
<m:echo m:id="hogeimage">
 <m:attribute name="src" value="${someImagePath()}" />
</m:echo>
が、
<m:echo m:id="hogeimage">
 <m:attribute name="src"
value="${Packages.mycompany.MyPathAdjuster.something(\"${someImagePath()}\")"
/>
</m:echo>
と記述されていたということことにされるのでしょうか。
もしそうならば、PathAdjusterが"${"を見つけたらそのままリターンするか、
独自でスクリプトを解釈するなどの処理ができると思います。


ところが、たとえば、テンプレートに
<form m:id="hogeform">
</form>

mayaaファイルに
<m:echo m:id="hogeform">
 <m:attribute name="action" value="hoge.do" />
</m:echo>

PathAdjusterに
return "${adjust_path(\"" + path + "\")}";

と記述した場合も、結果の出力は
${adjust_path(&quot;hoge.do&quot;)}
となってしまいます。


したがって、PathAdjuster側では、${が入ってきたかどうかに関わらず、
その後の処理で、テンプレートとmayaaファイルの時とで挙動が
違っているようです。


スタックトレースを頼りにソースコード(Mayaa1.1.27)を参照させていただいたところ、
RenderUtil.renderTemplateProcessor:134行目
startRet = current.doStartProcess(topLevelPage);
から151行目付近が該当するのではないかと思います。
当方の勉強不足のため、深くは追えませんでした(笑)


私の方では、mayaaファイルに直接
<m:echo m:id="hogeform">
 <m:attribute name="action" value="${adjust_path('hoge.do')}" />
</m:echo>
と書いて、

PathAdjuster側では、
"http:", "https:", "file:", "/"で始まる場合は、
そのままリターンするという実装にしています。


もし、mayaaファイルからのPathAdjusterが返した${...}を展開してくれるなら、
mayaaファイルでも、テンプレートと同じように相対パスを記述できるので
大変助かるのですが。。。

現在の状況だと、チームメンバーに、"${adjust_path('path')}"って書いてください
と使えなければいけないことと、 「”」 と 「'」 のクオーテーション2つ書かなければならない
ところが不便だと感じています。


この度は、Mayaaファイルからと、テンプレート側で、PathAdjusterがリターンしてからの
挙動が異なるのではないかと思い、報告させていただきました。

実際に、このことの影響を受けているのは、私の所だけかもしれません。
もし、同じことでハマっている方がいらっしゃったら参考にしてください。
単に私の使い方がイレギュラーだったのかもしれません。
(それに至る経緯については、最初のメールに書いたとおりです)

以上、情報不足な感がありますが、報告ということでよろしくお願いいたします。

石上 晋

2009年12月13日21:40 suga <[E-MAIL ADDRESS DELETED]>:
> suga です。
>
>
> 2009/12/12 Susumu ISHIGAMI <[E-MAIL ADDRESS DELETED]>:
>> このとき、PathAdjusterによる調整は、テンプレートをパースする1回だけしか行われないようです。
>> (略)
>> としてしまうと、一回「// 何らかの処理」によって確定したresultを
>> その後の画面で使い回してしまいます。
>
> PathAdjuster はビルド時に呼ばれるものであり、「使い回す」のではなく
> 「テンプレートにそう記述されていたことにする」ものです。
> このためレンダリングのパフォーマンスに影響を与えることなく
> 絶対パスへの置き換えが可能です。
>
>
>> テンプレート側での相対パスでは期待通りなるのですが、
>> mayaaファイルに記述した動的な要素に関してもPathAdjusterが働きます。
>> <m:echo m:id="SOME_IMAGE">
>>        <m:attribute name="src" value="${getSomeImage()}" />
>> </m:echo>
>>
>> その結果、m:idに紐付けられたimgタグのsrc属性は、実行時には以下のようになってしまいます。
>> <img src="${Packages.mycompany.MyPathAdjuster.something(\"" + result + "\")}" />
>>
>> このように、${...}の部分を再展開してくれません。
>> この挙動は仕様でしょうか?
>
> はい、想定通りです。
> 上記のコードは「レンダリング時に」getSomeImage()を実行するという記述だからです。
>
>
>> 動的な要素に関してはプログラムでどうにできるので、
>> 必ずしも自動調整は必要ではありません。
>>
>> むしろ働かないようにしたいです。
>> PathAdjusterで、テンプレート側から呼ばれたのか、mayaaファイルから呼ばれたのか
>> 制御できても良いと思います。isOnTemplate()は違うようですね?
>
> mayaa にあるかどうかではなく、元の値のルールで判断できるのでは
> ないでしょうか。
> 標準の PathAdjusterImpl では、"./" で始まるかどうかを見て、対象か
> どうかを判断しています。force="true" にするとこの判断を省略して
> パス調整をします。
>
> たとえば path が "${...}" という値であれば super を通さない、などの
> 処理をすれば良いでしょう。
>
> mayaa に記述されているかどうかが必要になるケースはほぼ無いと思います。
> 実際には mayaa かどうかではなく何が記述されているかが判断基準でしょう。
>
>
> --
> suga ( [E-MAIL ADDRESS DELETED] )
> _______________________________________________
> mayaa-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/mayaa-user
>


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