[mayaa-user:894] Re: Mayaaファイルの多段化
suga
[E-MAIL ADDRESS DELETED]
2010年 1月 27日 (水) 23:29:36 JST
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 メーリングリストの案内