MktableServiceClass

id:goldenport:20060919でRelaxer5フレームワークのデモ用テスト・ケースMktableTestについて説明した。そのMktableTestからRelaxer5フレームワークに登録されていたサービスMktableServiceClassは以下のものである。
内容はおまじないと思っていただければよい。将来的にはDSLからRelaxer5で自動生成する部分である。

public class MktableServiceClass extends AbstractRServiceClass {
    public MktableServiceClass() {
        super("mktable");
    }

    public MktableServiceClass(String name) {
        super(name);
    }

    @Override
    protected void _buildSpecification(ServiceSpecification spec) {
        SArgument arg = spec.addArgument();
        arg.setType(_getType(URL.class));
        arg = spec.addArgument();
        arg.setType(_getType(File.class));
    }

    @Override
    public IRService accept(IRServiceCall call, IRServiceContext context, RUnitofwork unitofwork) throws RServiceException {
        return newService(call, context, unitofwork);
    }

    @Override
    protected IRService _newService(IRServiceCall call,
            IRServiceContext context, RUnitofwork unitofwork)
            throws RServiceException {
        return new MktableService(call, this, context, unitofwork);
    }
}

_buildSpecification

_buildSpecificationは、サービスの仕様を構築するメソッドである。サービス仕様は外部から与えることもできるようになる予定であるが、テスト用のサービスなどは内部で構築できた方が便利なので、それを可能にしている。

ここでは、第1引数にjava.net.URL、第2引数にjava.io.Fileの型を持つサービスであることを定義している。

MktableTestでは、String[]型のargsを引数にしてRelaxer5フレームワークのexecuteShellCommandメソッドを呼び出している。つまりフレームワークに対してはString型の値が引数として渡されるのだけれど、これを実際のサービス呼び出し時にはjava.net.URLとjava.io.Fileにフレームワークが自動的に変換してくれる。

container.executeShellCommand(args);

_newService

このクラスの重要な処理は_newServiceメソッドで行っているMktableServiceの生成である。
MktableServiceのようなサービスは、RequestやUnit of workといった実行コンテキストごとにインスタンスを割当るので、このような処理が必要となる。

このMktableServiceがサービス実装の本体である。その詳細は次回。