maskat Plugin構造

前回のとおり、
プラグイン構造を追加した。
メーリングリスト内での議論(?)もあり、
早速提案してみたところ、受けがよさげだったので、
ざっくり作った。

今回のversionに入るかどうかは分かりませんが、
一応ざっと説明だけ。

まず、プラグインを定義できるポイントは2つ。

ひとつはPOJOの作成に関わるクラス(CreateStrategy)。
もうひとつは作成後のInjectionに関わるクラス(InjectionStrategy)。

どちらもその実装クラスを作成し、configファイルに定義しておけば、実行時にそのクラスを使い処理を行うようになる。

configファイルは
<maskat-configurations>
 <create-strategies>
  <create-strategy>
   <class>org.maskat.core.extension.DefaultCreateStrategy</class>
   <args/>
  </create-strategy>
 </create-strategies>
 <injection-strategies>
  <injection-strategy>
   <class>org.maskat.core.extension.DefaultInjectionStrategy</class>
   <args/>
  </injection-strategy>
 </injection-strategies>
</maskat-configurations>

のようになる。
見れば分かるだろう。
察しのいい方なら既にお気付きかもしれないが、
どちらのStrategyも複数定義ができる。
また、初期パラメータを渡すことも可能だ。
初期パラメータは<args/>
の部分を以下のように書けばいい
<args>
 <arg>[parameter1]</arg>
 <arg>[parameter2]</arg>
</args>

CreateStrategyとInjectionStrategyはStrategyインターフェイスを継承しており、void init(List<String> args);を持っている。
こいつの引数argsにargsタグに定義されたパラメータが渡される。
初期化もここでしてしまおう。
SeasarをCreateStrategyとして動作させたければ、
パラメータとしてdiconファイルを渡してやり、
initメソッド内でS2Containerを作ってやれば良いだろう。

さて、それでは拡張の作り方だ。

CreateStrategyは
Object create(String key)
を持っているのでこいつの中でキーに基づくオブジェクトを作ってやればいい。

例の如くSeasarなら
return container.getComponent(key);
のようなコードになるだろう。

さて、定義XMLを見て感の良い方なら既にお気付きだとは思うが、
どちらの拡張も複数定義することが可能だ。
定義は
<create-strategy>を2個、3個書いてやれば良いだけだ。
すると、(CreateStrategyは)Chain of Responsibilityの如く、
動く。
Strategy内でインスタンス化ができず、次のStrategyに処理を回す場合、NOT_CREATE定数をreturnしてやればいい。

次に、InjectionStrategyだが、基本はCreateStrategyと同じだ。
実装メソッドは
void injection(Object target, MaskatRequest request, HttpServletRequest request);
だ。targetが事前にCreateStrategyで作られたPOJOインスタンスだ。
request,reqはリクエスト情報だ。(まんまだけど)
HttpServletRequestを直で扱えるのはこのクラスのみなので、
session等の情報が欲しい場合は、拡張として、injetionするようにしてやれば良いだろう。
ただ、そのままHttpServletRequestをinjetionするのは絶対にやめてほしい。
テスト容易性が、がくっと下がってしまう。
できることなら、このような使いかたが望ましい。
HttpSession ses = req.getHttpSession();
Integer test = (Integgr) ses.getAttribute("test");
//testをInjection

POJOでは
private Integer test;
変数名を固定にして、あればそこにinjetionするっていうのが一番スマートになる。

テストサポートのためにTestCase拡張クラスも用意するので、
簡単テストを提供できるだろう。

さて、ここまでざっとかいたが、
すぐ公開されるかは正直分からない。
とりあえず、出方を待とう。

一応TestCaseはこのようにする予定だ。
入力として2つサポートする。
1リクエスXML電文そのもの。
2Mapのパラメータリスト。←こいつをキーとフィードがマッチするところにInjectionしてしまう。

返信電文のチェックを簡単に。(MaskatRequest的なものに突っ込んだ形で提供すれば、ある程度簡単に確認できるだろうと考えている。)

これさえサポートすれば、簡単にテストができるだろう。

では、公開をお楽しみに!