mktableデモ・テスト・ケース

Relaxer5は、現在フレームワークを中心に開発を進めている。
7月20日沖縄、9月11日大阪の夜学で説明したように、Relaxer5はRelaxer5フレームワークの土台の上に、Relaxer5(プログラム生成器)、SmartDoc5(文書処理系)、SmartCase5(モデル処理系)を構築する予定である。そのRelaxer5フレームワークがやや形を見せ始めてきた。

そのデモもかねて作成したテスト・ケースがMktableTestである。
大昔にSmartTableという汎用表データ変換器を作成したことがあるのだけれど、その機能をフレームワーク上で実現してみた。

テスト・ケースMktableTestは以下の通り。(パッケージ宣言は省略)

public class MktableTest extends TestCase {
    private FileStoreModel work_;

    @Override
    protected void setUp() throws RModelException {
        work_ = new FileStoreModel("work:/");
        work_.open();
        work_.commit();
    }

    @Override
    protected void tearDown() throws RModelException {
        work_.delete();
        work_.commit();
        work_.close();
    }

    public void test() throws RModelException, IOException {
        File work = work_.getRoot().getOutputDataSource().getFile();
        URL excel = getClass().getResource("/org/relaxer/Relaxer5/models/excel/test.xls");
        File target = new File(work, "test.csv");
        String[] args = new String[] {
                excel.toExternalForm(),
                target.getAbsolutePath()
        };
        mktable(args);
        assertTrue(target.exists());
    }

    public static void mktable(String[] args) throws RelaxerFrameworkException {
        IRContainer container = new RelaxerFramework(args);
        container.addServiceClass(new MktableServiceClass());
        container.open();
        container.executeShellCommand(args);
        container.close();
    }
}

FileStoreModel

Relaxer5フレームワークは、Relaxer5モデル・フレームワークとRelaxer5サービス・フレームワークから構成されている。Relaxer5モデル・フレームワーク上のモデル・オブジェクトは単体でも有用なので、単独で切り出して利用できるようになっている。
インスタンス変数work_のタイプであるFileStoreModelがそれ。FileStoreModelはファイルシステム写像したモデルである。

setUp

Relaxer5モデル・フレームワークでは、スキーム名workのURIを使用することができる。このスキームは/tmp/relaxerfw17892.d(c:\Documents and Settings\example\Local Settings\Temp\relaxerfw17892.d)というような作業ディレクトリを必要に応じて作成したものをルートディレクトリとしたファイルを指示したURIであることを意味している。
setUpメソッドでは、「work:/」を指定してFileStoreModelを作成している。これは作業ディレクトリを作成し、そのファイルシステムをRelaxer5モデル・フレームワークから操作できるようになったことを意味する。
FileStoreModelの作成後、openとcommitを行っている。この処理によって実際のディレクトリが作成される。

tearDown

tearDownは、テスト完了後の後処理として作業ファイルの削除を行っている。
FileStoerModelのdeleteとcommitによって作業ファイルの削除が実際のファイルシステム上に反映される。

test

testメソッドは、テスト本体である。
リソースに格納されているExcelファイル/org/relaxer/Relaxer5/models/excel/test.xlsのjava.net.URLを取得。これはmktableの入力となる予定である。
出力は先ほど作成した作業ディレクトリ上に"test.csv"というCSVファイルとすることにした。これをjava.io.Fileとして取得。
そして、この2つのオブジェクトを引数にしてmktableメソッドを呼び出している。

mktable呼出し後、Fileのexistsメソッドでファイルが無事作成されていることを確認。
本当は内容も確認するとよいのだけれど、プログラム上は省略。目視では無事作成されていました。

mktable

mktableはアプリケーションロジック本体である。コンテナにMktableServiceClassを追加した上で、executeShellCommandメソッドでコマンド・ラインからの利用を想定した引数を指定してサービスの実行を依頼している。
この結果、リソースに格納されているExcelファイル/org/relaxer/Relaxer5/models/excel/test.xlsのデータが作業ディレクトリ上にtest.csvというファイルとして出力される。

ということで、本当のアプリケーション・ロジック本体はMktableServiceClassとなるのだけれど、これは後日。