<div dir="ltr">suga です。<div><br></div><div>&gt; 2. 上記の child ノードの書き換え処理を実現する、より適切な方法はありますか?</div><div><br></div><div>ServiceProvider の設定ファイルで<span class="inbox-inbox-Apple-converted-space"> </span>TemplateBuilderImpl を継承した自作のものに入れ替えて afterBuild で処理するというのが妥当に思えます。<br></div><div><br></div><div>ServiceProvider の設定ファイルの置き方</div><div><a href="http://mayaa.seasar.org/documentation/engine_settings.html">http://mayaa.seasar.org/documentation/engine_settings.html</a><br></div><div><br></div><div>元のファイルは以下のパスにあります。</div><div>mayaa/src-impl/org/seasar/mayaa/impl/provider/factory/org.seasar.mayaa.provider.ServiceProvider<br><br>この元ファイルの<br>&lt;templateBuilder class=&quot;org.seasar.mayaa.impl.builder.TemplateBuilderImpl&quot;&gt;<br></div><div>のノードを丸々コピーしてクラス名を自作のものに変えれば入れ替えは終わりです。</div><div><br></div><div>この TemplateBuilderImpl のソースは</div><div><a href="https://github.com/seasarorg/mayaa/blob/master/src-impl/org/seasar/mayaa/impl/builder/TemplateBuilderImpl.java">https://github.com/seasarorg/mayaa/blob/master/src-impl/org/seasar/mayaa/impl/builder/TemplateBuilderImpl.java</a><br></div><div><br></div><div>継承したクラスで afterBuild をoverrideしてsuper.afterBuildを呼んだ後、書き換えの処理をすれば良いと思います。</div><div><br></div><div><br><br><div class="gmail_quote"><div dir="ltr">2017年6月22日(木) 19:32 Mizuno Ken &lt;<a href="mailto:mizuno.ken@interfactory.co.jp">mizuno.ken@interfactory.co.jp</a>&gt;:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">お世話になっております。水野です。<br>
<br>
弊社ではmayaaに対していくつか拡張を行った上で利用しており、その拡張の実現方法についてご相談に乗っていただけますでしょうか。<br>
<br>
■ 現状の課題<br>
IfProcessorやForProcessorの子クラスを作成し、doStartProcess をオーバーライドして以下のような処理を行っています。<br>
- 初回の呼び出し時に限り、 child ノードの書き換えを行う<br>
- 2回目以降の呼び出し時には、何もしない。(super.doStartProcessを呼び出すだけ)<br>
<br>
その結果、上記の child ノードの書き換え処理と、org.seasar.mayaa.impl.engine.specification.serialize.SerializeThread<br>
による<br>
キャッシュの書き出しが同時に発生した場合、キャッシュの内容が破壊される(書き換え途中の状態がキャッシュされてしまう)<br>
という現象が発生しています。<br>
<br>
■ 相談内容<br>
<br>
1. TemplateProcessorSupport#writeObject を synchronizedメソッドとすることは問題ないでしょうか?<br>
<br>
synchronizedとすることで、child ノードの書き換え途中の状態がキャッシュされることがなくなりますが、この対応による副次的な<br>
問題は発生しますでしょうか?<br>
特に、デッドロック発生の可能性について危惧しているので、「SerializeThread によるシリアライズ処理の順序(=親→子の順)<br>
とは異なる順序でオブジェクトをロックしている処理がないか」を教えていただけると助かります。<br>
<br>
2. 上記の child ノードの書き換え処理を実現する、より適切な方法はありますか?<br>
<br>
doStartProcess は本来 node の書き換えを行うべき場所ではないと思いますので、より適切な場所があればお知らせいただけますでしょうか。<br>
例えば、下記のようなタイミングで呼び出されるメソッドが XXXProcessor にあるとベストです。<br>
- mayaa の標準的な処理によって node の構造が構築された後<br>
- 初めてレンダリング処理が行われる前 (できれば、SerializeThread によるキャッシュ書き出しの前)<br>
<br>
かなり特殊な目的に対する質問で恐縮ですが、ご確認いただけると幸いです。<br>
よろしくお願いいたします。<br>
<br>
--<br>
株式会社インターファクトリー   水野 謙<br>
<a href="mailto:mizuno.ken@interfactory.co.jp" target="_blank">mizuno.ken@interfactory.co.jp</a><br>
<br>
〒102-0071<br>
東京都千代田区富士見2-10-2 飯田橋グラン・ブルーム4階<br>
TEL:03-5211-0056 / FAX:03-5211-0059<br>
<a href="http://www.interfactory.co.jp" rel="noreferrer" target="_blank">http://www.interfactory.co.jp</a><br>
_______________________________________________<br>
mayaa-user mailing list<br>
<a href="mailto:mayaa-user@ml.seasar.org" target="_blank">mayaa-user@ml.seasar.org</a><br>
<a href="https://ml.seasar.org/mailman/listinfo/mayaa-user" rel="noreferrer" target="_blank">https://ml.seasar.org/mailman/listinfo/mayaa-user</a><br>
</blockquote></div></div></div>