-S01: S2を車にたとえると...

最近のJava開発コミュニティでは、軽量コンテナ(Light-weight Container)によるソリューションが花盛りです。ここで私の推すSeasar2もその盛り上がっている軽量コンテナのひとつなのですが、Seasar2のほか、JBossAOPやPicoContainer、本家(?)Spring FrameworkにHiveMindと有名多彩なコンテナ群は、実はどれも新しくしかも急速(ここ半年ぐらい)一気に開花したために、それぞれの成熟もこれからの状態なのです。この軽量コンテナというもののゴールはどちらの方向にあるのか、これもまた成熟した概念として見定められてなく、もちろん大規模の開発やヘビーな運用の禊も受けていません。そんな中、なぜ軽量コンテナが流行っているのか、はたまたコンテナ群中での比較優位論をいくら並べても空々しいのが現実だと思いました。そこで、技術自体の説明やコンテナ群の比較検討は面倒なものとして他に譲って、まずはSeasar2単体で出会ったときにステキな理由をライトでポップに説明していきます。その結果、軽量コンテナを取り巻く技術概念の説明の一部にはなりますし、コンテナ比較優位論の種ともなりえるでしょう。ではでは〜。。。


さてSeasar2 について、いろいろ卑近な例を考えてみたところひとつのたとえが思いつきました。それは、自動車です。アプリケーション開発を車の運転にたとえます。そうすると、新Seasar2カーのステキなところは、

  • 雪降って普通のタイヤじゃすべるとき、家の裏庭においてある昔の車のスタッドレスタイヤを拾ってきてつけてもきちんと走れちゃう。ラジカセを持ってきてつけると、カラオケBOXにもなる?
  • すぐエンジンがかかり、いつでも暖気運転ができているので、寒い朝でもゼロヨンロケットスタートができる。
  • 実は助手席に運転教官が座ってるので、ぶつかりそうなところや眠い時は自分で運転しているようでいて、横の教官がブレーキ踏んでたりすることもある。安心。
  • はじめからシートやカーナビなどの、やっぱり贅沢したいねってところに結構いい物が標準仕様で使われている。

ということかなと思います。それぞれPOJO、Type2/3/4、AOPSeasarコンポーネント、だったりするのですが、続きはまた今度。
注:進めるにつれて卑近例に矛盾が生じてきても、BLOGは過去にわたって直せますので、とりあえず気楽に自動車で無理押し進めます。

-僕と彼女と彼女の生きる道

しみじみと妻と二人でみました。「もっと大事なことがあるんじゃないですか」という小雪演じる家庭教師の言葉は、先週の予告で思わせぶりなカットの使い方をされていて、終わりの読めない感を演出したかと思います。ちょっと狙いすぎだったね、あの予告。
それにしてもありふれているはずのテーマをひとつ丹念に描いてくれて、なかなかに秀逸でした。月曜の「PRIDE」もぽつぽつ見ていましたし、最終回も録画でみましたが、あちらはとにかく詰め込みすぎでした。毎回いい非日常性を出し(批判めいた目でみながらも)なかなかだったのに、「PRIDE」はネタを広げすぎていて、最終回で一気にまとめるには30分の拡大枠でも無理だったな。その点この「僕と彼女と彼女の生きる道」ははじめから描くものが絞られていたので無理なく、放送は終わっても来週も登場人物の生活は続きそうな、静かにいいまとめ方をしてくれたと思います。先週心配した安易に急いだ結末作りじゃなくて本当によかった。
終わった後、なぜか私が食後の皿洗い係になって、妻にオチをつけられた感じ。ま、家族思いの父親なので風呂が沸くまで黙って洗うのです。

-Tapestry-S2連携再考(8)

ひきつづき、ひがさんうえやんさんとのBLOGを介したディスカッションです。Tapestryの変更を要求するとして、とにかく変更範囲を少なくTapestryのほうにテストも含めて手数をかけさせない方法は、

private IPage instantiatePage(...)
private IComponent instantiateComponent(...)

これらのorg.apache.tapestry.pageload.PageLoaderのメソッドをprotectedにするということでよい?上記メソッド中のClass#newInstance()コールのファクトリ化とか考えひがさんのところにコメントしましたけど、クラスをJavassistでEnhanceしているは、Poolするはで、変更範囲が大きくなっちゃいそうです。あとは説得する理由を英作文だなぁ。とりえあえず書いたんで、添削してくださいね。コメント即反映で直します(緑の字は再日本語訳です)。
subject: make PageLoader's private-method protected

Hello,
こんにちは。


I am trying to set components on the original IoC-Container called (named だったかな?もうだしちゃったから、忘れよう) 'Seasar' to Tapestry pages and JWC-component-objects. But org.apache.tapestry.pageload.PageLoader's instantiatePage(...) and instantiateComponent(...) are private method. I hope that these private methods to change into protected in the next release.
いま、「Seasar」というオリジナルのIoCコンテナ上のコンポーネントTapestryのページやJWCコンポーネントオブジェクトにセットできないかどうか、試しています。しかし、org.apache.tapestry.pageload.PageLoaderのinstantiatePage(...)と、instantiateComponent(...) はprivateメソッドなのです。次のリリースで、これらのprivateメソッドをprotectedへの変更を希望します。


Because....
Seasar has Type2 and init-method style (and Type3) component instanciate functions already, and these functions will have been apply to outer components like JWC-component-objects on Seasar's next version. See below,
なぜならば。。。
SeasarはすでにType2とinitメソッド風のコンポーネント生成機能を持ってます(それとType3も持ってます)。そして、これらの機能はSesarの次のバージョンまでにはJWCコンポーネントオブジェクトのような外部コンポーネントにも適用できるようになります。以下を見てください。

public interface S2Container {
  public injectDependency(Object outer, Class componentClass)
  public injectDependency(Object outer, String componentName)
}

'S2Container' is next version's interface which omited exceptions and many other methods from Seasar. 'injectDependency(*)' method inject components on S2Container to an 'outer' Java objects. I intended to override Tapestry's PageLoader (and PageSource) like below,
「S2Container」はSeasar中の、例外と多くのメソッドを省略した次バージョンのInterfaceです。「injectDependency(*)」メソッドはS2Container上のコンポーネントJavaオブジェクト「outer」に注入します。私はTapestryのPageLoader(とPageSource)を以下のようにオーバーライドしようとしています。

IPage page = (IPage)super.instantiatePage(...) ;
_container.injectDependency(page, pageName);
return page;

and container configuration sample is
そして、コンテナの設定サンプルは、

<components>
  <component name="home" instance="injection">
    <property name="dataSource">
      <component
        class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
        <property name="driverClassName">
          'oracle.jdbc.driver.OracleDriver'
        </property>
        <property name="URL">
          'jdbc:oracle:thin:@isid00845:1521:ark'
        </property>
      </component>
    </property>
    <initMethod name="init">
      <arg>true</arg>
    </init>
    <aspect pointcut="click">traceAdvice</aspect>
</components>

so, 'home' page-object is set 'dataSource' property and is called 'init(true)'. Additionally, home's 'click(IRequestCycle)' method is maken pointcut for 'traceAdvice' with AOP.
こうして、「home」ページオブジェクトは「dataSource」プロパティが設定され、「init(true)」が呼ばれます。さらには、homeの「click(IRequestCycle)」メソッドはAOPの「traceAdvice」のポイントカットとなります。


By the way, I have seen Tapestry's roadmap in the Wiki. I heared that Tapestry3.1 or later will be refacterd by using HiveMind. Could you think about another component containers like JBoss-AOP, Spring Framework, PicoContainer ...and Seasar?
ところで、以前Tapestryのロードマップを例のWikiで見ました。Tapestry3.1もしくはその後のバージョンはHiveMindを使って書き直すようなことを聞いています。他のコンポーネントコンテナ、たとえばJBoss-AOPとか、Spring Frameworkとか、PicoContainerとか、そしてそして、Seasarとかのことも考慮していただけませんでしょうか。<-Couldは私の英語知識が確かなら、結構丁寧な言い方のはず。本当?


if you are interested, download the latest Seasar from SourceForge.JP (sorry, there is no english version service, but this software has i18n functions).
もし、興味を持たれたなら、最新のSeasarSourceForge.JPからダウンロードしてください(すいませんが、英語版のサービスはありません。しかし、ソフトウェアは国際化機能を持ってます)。


http://prdownloads.sourceforge.jp/seasar/8807/S2-RC1.jar


Thanks for all,
Masataka.
みなさんありがとう。
まさたかでした。

えぃ!だしちゃえ[16:00]
tapestry-dev at jakarta.apache.org に出しちゃいました[16:15]