Webエンジニア susumuis の技術ブログ

このブログの内容は個人の見解であり、所属する組織の公式見解ではありません

WicketでS2Containerを動的に切り替えたらウマーでしょうか

BirdieMartのアーキテクチャを考えています。

(以前の日記に書いたものは現状のものであって決定ではありません。)

オープンソースなのだから、独自コンテナ、独自DBライブラリとかやめようよという声も聞こえます。
それでどうしようかなぁと、同僚の中国人の方と話し合ったりしました。

検討時のマトリックス

View コンテナ DBライブラリ 知名度 Wicketとの相性 コミュニティ 自由度 実績 導入コスト 備考
Wicket 独自 独自 × × 自社実績大
独自 DBUtils ×
Spring SpringJDBC × 世界的な実績大
Spring Hibernate+JPA × Wicket-jaのソースと同じ
Seasar2 S2JDBC 日本語資料豊富
Guice DBUtils Wicket界でGuiceは標準的
Guice ActiveObjects × ActiveRecordはあわないかも
Guice 独自 × ×

やっぱりここは手堅くGuice+DBUtilsがよさそうかなとも思ったのですが、
しかし、せっかく「日本発」オープンソースを銘打ってるんだから、国産フレームワークSeasarを検討しない手はないのじゃないかと思います。

そこで、今週はSeasar2を勉強してみます。

WicketSeasar2

WicketSeasar2の連携は、Wicket標準ライブラリではサポートされていません。
Seasar2を使うためには、Wicket-jaのid;t_yanoさんが作られた、wicket-seasar2ライブラリが使用できます。
http://d.hatena.ne.jp/t_yano/20090118/1232287169

また、id;t_yanoさんの方でサンプルソースも提供してくださっているので、それをまずはいじってみます。

svn co http://www.javelindev.jp/repos/share/wicketseasar2sample

チェックアウト後、maven2

mvn jetty:run

でいきなり実行できます。


さて、次なることは、とりあえず、DBを変えてみましょう。
実案件ではPostgreSQLを使うことが多いので、PostgreSQL 8.3で動かしてみます。

最初はどこをどうしたらいいのかわからなかったのですが、app.diconを以下のようにすれば動きました

<components>
<!--
    <component name="datasource" class="org.h2.jdbcx.JdbcDataSource">
		<property name="URL">"jdbc:h2:~/test"</property>
		<property name="user">"sa"</property>
		<property name="password">"sa"</property>
    </component>
-->

	<component name="datasource" class="org.postgresql.jdbc3.Jdbc3SimpleDataSource">
		<property name="serverName">"localhost"</property>
		<property name="databaseName">"wicketseasar2sample"</property>
		<property name="portNumber">"5432"</property>
		<property name="user">"postgres"</property>
		<property name="password">"postgres"</property>
	</component>
	
	<component name="address1" class="jp.javelindev.wicket.seasar2.sample.bean.Address">
		<property name="address1">"住所1"</property>
		<property name="address2">"住所2"</property>
	</component>

	<component name="user1" class="jp.javelindev.wicket.seasar2.sample.bean.User">
		<property name="name">"テストユーザ"</property>
		<property name="address">address1</property>
	</component>

	<component name="address2" class="jp.javelindev.wicket.seasar2.sample.bean.Address">
		<property name="address1">"住所3"</property>
		<property name="address2">"住所4"</property>
	</component>

	<component name="user2" class="jp.javelindev.wicket.seasar2.sample.bean.User">
		<property name="name">"テストユーザ2"</property>
		<property name="address">address2</property>
	</component>
</components>

もちろんpom.xmlの修正も必要です。以下のようにします。

<--
		<dependency>
			<groupId>com.h2database</groupId>
			<artifactId>h2</artifactId>
			<version>1.1.104</version>
		</dependency>
-->
		<dependency>
			<groupId>postgresql</groupId>
			<artifactId>postgresql</artifactId>
			<version>8.3-603.jdbc3</version>
		</dependency>

次はコネクションプーリングしたいですね。

 <component name="xaDataSource" class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
     <property name="driverClassName">"org.postgresql.Driver"</property>
  <property name="URL">"jdbc:postgresql://192.168.1.210:5432/wicketseasar2sample"</property>
  <property name="user">"postgres"</property>
  <property name="password">"postgres"</property>
 </component>
 <component name="connectionPool"
         class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
     <property name="timeout">600</property>
     <property name="maxPoolSize">10</property>
     <property name="allowLocalTx">true</property>
     <!--<property name="validationQuery">"select * from dual"</property>-->
     <!--<property name="validationInterval">10000</property>-->
     
     <destroyMethod name="close"/>
 </component>
 <component name="dataSource"
    class="org.seasar.extension.dbcp.impl.DataSourceImpl"/>

こんな感じでやったんだけど動かなかったorz
diconとの格闘がSeasar2の本質なのでしょうか?
とはいえ、diconの修正だけで、いろいろなことができるのは、やっぱりさすがですね。

そこで、新たなる野心が!!

現状のコードだと、S2ContainerはSingletonS2ContainerFactoryを使って取得しています。
これをやめて、動的に切り替わるようにしたら、自由自在にカスタマイズができるのではないでしょうか?
そうすれば、diconに相当する情報さえ動的生成できれば、かなり柔軟に作れるような気がします。

しばらくSeasar2を勉強してみます。