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

Susumu ISHIGAMI [E-MAIL ADDRESS DELETED]
2010年 1月 26日 (火) 14:25:32 JST


石上です。

下記の件ありがとうございます。
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 メーリングリストの案内