2007年11月12日月曜日

ZK + Seasar + Ruby: JFreeChart

JFreeChartアプリをRubyで書き直してみました。
rainStatsServiceコンポーネントはSingletonS2Container.getComponent(Object componentKey)を用い取得することにしました。Seasarの機能リファレンスによるとcomponentKeyにはコンポーネントのクラスまたはコンポーネント名を指定できるそうです。
コンポーネント名を自動登録するようにapp.diconへ追加設定します。

...
<component
class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
<property name="autoNaming">
<component class="org.seasar.framework.container.autoregister.DefaultAutoNaming">
<initMethod name="setCustomizedName">
<arg>"zkseasar.service.EmpService"</arg>
<arg>"empService"</arg>
</initMethod>
</component>
</property>
<initMethod name="addClassPattern">
<arg>"zkseasar.service"</arg>
<arg>".*Service"</arg>
</initMethod>
</component>
...

上記の設定でzkseaser/service/EmpServiceがempServiceというコンポーネント名で登録されるように、zkseaser/service/下の正規表現.*Serviceで表されるファイル名の先頭が大文字から小文字に変換された形で自動的にコンポーネント登録されます。
コンポーネントが自動登録されたか確認してみます。web.xmlでs2servletのdebugパラメータをtrueにしてTomcatを再起動します。

...
<servlet>
<servlet-name>s2servlet</servlet-name>
<servlet-class>org.seasar.framework.container.servlet.S2ContainerServlet</servlet-class>
<init-param>
<param-name>configPath</param-name>
<param-value>app.dicon</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
...


WEBブラウザで下記のアドレスにアクセスし確認します。

http://localhost:8080/zkseasar/s2servlet?command=list


empServiceとrainStatsServiceがコンポーネント登録されていました。

スクリプトをRubyで書き直します。

...
<window title="東京 年間降雨量デモ (Ruby)" width="500px" border="normal">
年度:
<listbox id="yr" rows="1" mold="select" onSelect="ruby:process_year">
<listitem label="2005" selected="true"/>
<listitem label="2004"/>
<listitem label="2003"/>
</listbox>
<vbox>
<chart id="myChart" title="月別降雨量 (mm)" width="500" height="250" type="pie" threeD="false" fgAlpha="128"/>
<checkbox label="3D チャート" checked="false" onCheck="myChart.setThreeD(self.isChecked())"/>
</vbox>
<zscript language="ruby">
import 'zkseasar.service.RainStatsService'
import 'org.zkoss.zul.SimplePieModel'
import 'org.seasar.framework.container.SingletonS2Container'

$model = SimplePieModel.new

#自動登録されたコンポーネント名でコンポーネントを取り出す。
$rainStatsService = SingletonS2Container.getComponent('rainStatsService')

def process_year
year = $yr.selectedItem.label
$model.clear
rain_stats = $rainStatsService.selectAll(year)
rain_stats.each{|data| $model.setValue(data.month, data.rainfall)}

$myChart.model = $model
end
process_year
</zscript>
</window>
...

RubyでS2ContainerのコンポーネントにもJFreeChartにもアクセスすることができました。

0 件のコメント: