[mayaa-user:896] Re: Mayaaファイルの多段化

Susumu ISHIGAMI [E-MAIL ADDRESS DELETED]
2010年 1月 29日 (金) 13:42:23 JST


石上です。

自己レスですが、templateSuffix は、別経路で、
PageImplのgetSuffixScript()のようですね。
こちらを修正しないと反映されませんでした。

お陰様で、これでほぼ要求通りに実装することができました。
ありがとうございました。

mayaaファイルの多段化が標準に組み込まれることを期待して待ってます。

2010年1月29日13:09 Susumu ISHIGAMI <[E-MAIL ADDRESS DELETED]>:
> 石上です。
>
>>> ・TemplateImpl#findMayaaAttribute
>>
>> こちらはm:mayaa タグの属性を辿るもので、
>
> 確かに、こちらの方で、親のmayaaで指定した templateSuffix が反映されない現象を確認しました。
> 個別に対応する必要がありそうですね。
>
> ありがとうございます。
>
> 2010年1月27日23:29 suga <[E-MAIL ADDRESS DELETED]>:
>> suga です。
>>
>>> ・TemplateImpl#findMayaaAttribute
>>
>> こちらはm:mayaa タグの属性を辿るもので、
>>
>>
>>> ・XPathUtil.CascadeSelectNodesIterator#hasNext
>>
>> こちらは現時点では使用してません。
>>
>>
>> --
>> suga ( [E-MAIL ADDRESS DELETED] )
>>
>>
>>
>> 2010/1/26 Susumu ISHIGAMI <[E-MAIL ADDRESS DELETED]>:
>>> 石上です。
>>>
>>> 下記の件ありがとうございます。
>>> Mayaaの再ビルドは個人的にやりたくないので、
>>> その方法で対応させていただきたいと思います。
>>>
>>> XPathも同様の対応をする必要がありますね。
>>>
>>> ソースを見たところ、
>>> ・EngineUtil#getParentSpecification
>>> の参照元は、
>>> ・EqualsIDInjectionResolver#getNode
>>> ・XPathMatchesInjectionResolver#getNode
>>> ・TemplateImpl#findMayaaAttribute
>>> ・XPathUtil.CascadeSelectNodesIterator#hasNext
>>> の4箇所のようですが、上の2つは書き換えるとして
>>> TemplateImplと、CascadeSelectNodesIterator
>>> を書き換えないと影響があるでしょうか。
>>>
>>>> 単純に getParentSpecification 部分を差し替えられるようにするだけなら
>>>> 既存にも影響はありませんし、良いかもしれませんね。
>>>> 検討してみます。
>>> ぜひ、お願い致します。
>>>
>>> 2010年1月24日21:55 suga <[E-MAIL ADDRESS DELETED]>:
>>>> suga です。
>>>>
>>>> m:id の解決のみで良ければ、
>>>> org.seasar.mayaa.impl.builder.injection.EqualsIDInjectionResolver
>>>> の代わりとなるクラスを実装し、それを使うように設定すれば可能です。
>>>>
>>>> EqualsIDInjectionResolver#getNode(SpecificationNode, InjectionChain)
>>>> の中で
>>>> EngineUtil#getParentSpecification(Specification)
>>>> を使っていますので、これを作成されたロジックに入れ換えれば良いでしょう。
>>>>
>>>> 使うようにするには、ServiceProvider ファイルで templateBuilder の上書き設定をします。
>>>>
>>>>    <templateBuilder class="org.seasar.mayaa.impl.builder.TemplateBuilderImpl">
>>>>        <resolver
>>>> class="org.seasar.mayaa.impl.builder.injection.MetaValuesSetter"/>
>>>>        <resolver
>>>> class="org.seasar.mayaa.impl.builder.injection.ReplaceSetter"/>
>>>>        <resolver
>>>> class="org.seasar.mayaa.impl.builder.injection.RenderedSetter"/>
>>>>        <resolver class="org.seasar.mayaa.impl.builder.injection.InsertSetter"/>
>>>>        <resolver
>>>> class="org.seasar.mayaa.impl.builder.injection.InjectAttributeInjectionResolver"/>
>>>>
>>>> ここを自作クラスに置き換える
>>>>        <resolver
>>>> class="org.seasar.mayaa.impl.builder.injection.EqualsIDInjectionResolver">
>>>>            <parameter name="reportUnresolvedID" value="true"/>
>>>>            <parameter name="reportDuplicatedID" value="true"/>
>>>>            <parameter name="addAttribute"
>>>> value="{http://www.w3.org/TR/html4}id"/>
>>>>            <parameter name="addAttribute"
>>>> value="{http://www.w3.org/1999/xhtml}id"/>
>>>>        </resolver>
>>>>
>>>>
>>>>        <resolver
>>>> class="org.seasar.mayaa.impl.builder.injection.XPathMatchesInjectionResolver"/>
>>>>        <parameter name="outputTemplateWhitespace" value="true"/>
>>>>        <parameter name="outputMayaaWhitespace" value="false"/>
>>>>        <parameter name="optimize" value="true"/>
>>>>        <parameter name="defaultCharset" value="UTF-8"/><!-- since 1.1.22 -->
>>>>        <parameter name="replaceSSIInclude" value="false"/><!-- since 1.1.25 -->
>>>>    </templateBuilder>
>>>>
>>>> 上記は標準の記述ですので、既に設定されている場合は EqualsIDInjectionResolver の
>>>> 置き換えだけ設定してください。
>>>>
>>>> m:mayaa タグの属性はこれとは別のルートですので適用されません。
>>>>
>>>>
>>>> default.mayaa を階層ごとに用意できるようにすることは以前検討したのですが、
>>>> ルールが複雑になるので見送りました。
>>>> 単純に getParentSpecification 部分を差し替えられるようにするだけなら
>>>> 既存にも影響はありませんし、良いかもしれませんね。
>>>> 検討してみます。
>>>>
>>>> --
>>>> suga ( [E-MAIL ADDRESS DELETED] )
>>>>
>>>>
>>>>
>>>> 2010/1/24 Susumu ISHIGAMI <[E-MAIL ADDRESS DELETED]>:
>>>>> お世話になっております。
>>>>> 石上です。
>>>>>
>>>>> 私の方で調べてみたところ
>>>>> EngineUtil.java158行目付近のgetParentSpecification()を以下のように
>>>>> 修正し、Mayaaを再ビルドしたところ、
>>>>> 思った動作に近い動きをしました。
>>>>> (m:idの見つけ方だけ。beforeRenderについては未対応です。)
>>>>>
>>>>>    public static Specification getParentSpecification(Specification spec) {
>>>>>        if (spec instanceof Page) {
>>>>>                Page page = (Page) spec;
>>>>>                if (page.getPageName().startsWith("/client_info")) {
>>>>>                        int secoundSlashPos = page.getPageName().indexOf("/", 1);
>>>>>                        secoundSlashPos = page.getPageName().indexOf("/",
>>>>> secoundSlashPos + 1);
>>>>>                        String pageName = page.getPageName().substring(secoundSlashPos);
>>>>>                        return ProviderUtil.getEngine().getPage(pageName);
>>>>>                }
>>>>>                return ProviderUtil.getEngine();
>>>>>        } else if (spec instanceof Template) {
>>>>>            return ((Template) spec).getPage();
>>>>>        }
>>>>>        return null;
>>>>>    }
>>>>>
>>>>> 前回のメールは少し実際と違っていて、実際は
>>>>> ・/client_info/AAAA/foo.html
>>>>> ・/client_info/AAAA/foo.mayaa
>>>>> ・/client_info/BBBB/foo.html
>>>>> ・/foo.mayaa
>>>>> のように配置されています。
>>>>>
>>>>> しかし、これだと、Mayaaがリリースされる度に、修正を施さなければなりません。
>>>>> PathAdjusterのように、実装を切り替えられるようになって欲しいところです。
>>>>> 今後のMayaaバージョンでそのようになっていただけることを希望します。
>>>>>
>>>>> あるいは、もっと綺麗に対応出来る方法があれば、教えていただけると幸いです。
>>>>>
>>>>> よろしくお願い致します。
>>>>>
>>>>> 2010年1月23日15:10 Susumu ISHIGAMI <[E-MAIL ADDRESS DELETED]>:
>>>>>> 石上です。
>>>>>> お世話になっております。
>>>>>>
>>>>>> このたび、次のような要望を受けてしまいました。
>>>>>> 以前質問させていただいたこと:
>>>>>> http://ml.seasar.org/archives/mayaa-user/2009-December/000868.html
>>>>>> の、続きのようなものでして、
>>>>>>
>>>>>> 以下のようにテンプレートとmayaaファイルが配置されている状態です。
>>>>>> /hoge.mayaa
>>>>>> /1/hoge.html
>>>>>> /2/hoge.html
>>>>>>
>>>>>> 前回は、
>>>>>> /1/hoge.htmlからも、/2/hoge.htmlからも、
>>>>>> /hoge.mayaaを使用したいというものでした。
>>>>>>
>>>>>> 今回は、新たに
>>>>>> /1/hoge.mayaa
>>>>>> というファイルを配置し、ここには
>>>>>> /hoge.mayaaとの「差分のみを記述したい」という要望です。
>>>>>>
>>>>>> このとき、
>>>>>> /1/hoge.htmlからは、
>>>>>> ・/1/hoge.mayaa
>>>>>> ・/hoge.mayaa
>>>>>> ・/default.mayaa
>>>>>> に記述したm:idを使用することができ、
>>>>>>
>>>>>> beforeRenderは、
>>>>>> ・/default.mayaa
>>>>>> ・/hoge.mayaa
>>>>>> ・/1/hoge.mayaa
>>>>>> の順で実行され、
>>>>>>
>>>>>> afterRenderは
>>>>>> ・/1/hoge.mayaa
>>>>>> ・/hoge.mayaa
>>>>>> ・/default.mayaa
>>>>>> の順で実行されるようにしたいです。
>>>>>>
>>>>>> 現状ですと、/hoge.mayaaのすべての内容を/1/hoge.mayaaに記述
>>>>>> すれば結果は得られるのですが、次々にコピーが存在してしまうと、
>>>>>> 管理が仕切れないというのが主な理由です。
>>>>>>
>>>>>> 方法としては、以下のいずれかのようにできたらありがたいです。
>>>>>>
>>>>>> (1) /1/hoge.mayaaにspecExtends="/hoge.mayaa"のように記述する。
>>>>>>  >> 通常のextendsでは出来ませんでした。
>>>>>>
>>>>>> (2) default.mayaaと同じような動作ですので、
>>>>>> 現在一つだけのdefault.mayaaをチェーン状に複数配置できるようにし、
>>>>>> /default.mayaa -> /foo.mayaa のようなチェーンを形成して、
>>>>>> /*/foo.xhtmlからは今までdefault.mayaaを使っている感覚でdefaultチェーンを
>>>>>> 参照する。
>>>>>>
>>>>>> 非常に難しいことだとは思いますが、
>>>>>> どんなに大変でも対応したいところです。
>>>>>> 前回のように何らかのクラスの実装を拡張することで
>>>>>> できるならば大変幸いです。
>>>>>>
>>>>>> 何卒、よろしくお願い致します。
>>>>>>
>>>>> _______________________________________________
>>>>> mayaa-user mailing list
>>>>> [E-MAIL ADDRESS DELETED]
>>>>> https://ml.seasar.org/mailman/listinfo/mayaa-user
>>>>>
>>>> _______________________________________________
>>>> mayaa-user mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/mayaa-user
>>>>
>>> _______________________________________________
>>> mayaa-user mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/mayaa-user
>>>
>> _______________________________________________
>> mayaa-user mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/mayaa-user
>>
>


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