S2Ruby(仮)

なんとなく、動き出した。

たとえば、

class Hoge
	attr_accessor :msg, :num, :num2

	def initialize(str="init", num=100, num2=200)
		@msg = str
		@num = num
		@num2 = num2
	end

	def setParams(str="setParams", num=100, num2=200)
		@msg = str
		@num = num
		@num2 = num2
	end

	def do
		puts "I am Hoge!!"
		p @msg
		p @num
		p @num2
	end
end

という、コンポーネントがあったとして、
以下のようなdiconファイルを書くと

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components>
	<include path="src/services/sample.dicon"/>
</components>
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components>
	<component name="hoge" class="Hoge">
		<arg>"Hello World!"</arg>
		<arg>99</arg>
		<arg>0.99</arg>
	</component>

	<component name="hoge2" class="Hoge">
		<property name="msg">"Hello World!(hoge2)"</property>
		<property name="num">999</property>
		<property name="num2">0.999</property>
	</component>

	<component name="hoge3" class="Hoge">
		<initMethod name="setParams">
			<arg>"Hello World!(hoge3)"</arg>
			<arg>9999</arg>
			<arg>0.9999</arg>
		</initMethod>
	</component>
</components>

以下のようなクライエントが動く。

$KCODE = "SJIS"

#--------------------------------------------------------
require 'log4r'
require 'log4r/configurator'
include Log4r

Configurator.load_xml_file('log4r.xml')
$logger = Logger["test"]

#--------------------------------------------------------
require 's2ruby'
include S2Ruby
$LOAD_PATH.push("./src/services")

#--------------------------------------------------------
container = S2ContainerFactory::create("app.dicon");

service = container["hoge"]
service.do
service = container["hoge2"]
service.do
service = container["hoge3"]
service.do

実行結果は以下

 INFO test: include タグを見つけました。
 INFO test: component タグを見つけました。
 INFO test: コンポーネント参照名 = "hoge"
 INFO test: クラス名 ="Hoge"
 INFO test: コンストラクタで初期化します。
 WARN test: クラス「Hoge」が見つかりません、同名ライブラリファイルのロードを試みます。
 INFO test: component タグを見つけました。
 INFO test: コンポーネント参照名 = "hoge2"
 INFO test: クラス名 ="Hoge"
 INFO test: セッターで初期化します。
 INFO test: component タグを見つけました。
 INFO test: コンポーネント参照名 = "hoge3"
 INFO test: クラス名 ="Hoge"
 INFO test: メソッドで初期化します。
I am Hoge!!
"Hello World!"
99
0.99
I am Hoge!!
"Hello World!(hoge2)"
999
0.999
I am Hoge!!
"Hello World!(hoge3)"
9999
0.9999

今後はこんな予定。

  • $LOAD_PATH の自動設定
  • テストケース作成(^^;)
  • クラス構成を考える
  • SAX2パーサ化
  • 名前を決める(募集中!)