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

suga [E-MAIL ADDRESS DELETED]
2010年 1月 24日 (日) 21:55:19 JST


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 メーリングリストの案内