入門記10:動かしてみる。(「震えるか宇宙 めぐりあえよ生命」編)

前回はXOR-Split、XOR-Joinを使ったので、今度はAnd-Split、And-Joinを使ってみます。

フローは前回同様こんな感じに。

若干、箱の形が変わっていますが、基本的には同じ構成です。ただし、箱の設定はだいぶ異なりますので、以下に全部の設定を書いておきます。(とは言え、「登録」のアクティビティは同じ)

  • 「公開中」の設定

- Start modeは空欄
- Finish modeはManual
- タブ[Transition restriction]のSplit typeに[And]を選択。

  • 「公開中」から「公開終了」へ伸びる線の設定

- Typeは空欄。
- Extended attribute, 0 element(s)は設定なし。

  • 「公開中」から「印刷待ち」へ伸びる線の設定

- Typeは空欄。
- Extended attribute, 0 element(s)は設定なし。

  • 「印刷確認」の設定

- Start modeは空欄
- Finish modeはManual

  • 「印刷待ち」の設定

- Start modeは空欄
- Finish modeはManual

  • 「公開終了」の設定

- Start modeは空欄
- Finish modeはManual
- タブ[Transition restriction]のJoin typeは[And]を選択。


以上の設定で、「公開中」の次にステートを進めた場合、「印刷確認」、「印刷待ち」の両方でステータスが進められるまで「公開終了」にはなりません。また、以下のJUnitのコードでもお分かりの通り、「公開中」の次のステートである「印刷確認」、「印刷待ち」がそれぞれ1件ずつカウントされています。getDataListFromPathメソッドで単純に指定したアクティビティを持つDtoの件数を取得しているだけなのですが、実はこれが意外に凄い事だったりします。

従来の開発では、こういった状態遷移を例えば「0:公開中」「1:印刷待ち」「2:印刷確認」「3:公開終了」とシーケンシャルなコードを割り当てているケースが圧倒的に多かったと思います。こうなると、1つのエンティティで2つ以上のステータスを管理できないという事になります。そこでどうするか、というと「印刷依頼」等のステータスを追加して、印刷から印刷が完了するまでの短いプロセスを管理する為のステータスを別の列(例えばPrintStatus)で管理したり、別のエンティティ(例えば、PrintCueのようなテーブルを作ったり)に切りだしたりしていました。

が、Buriを使うと、Documentのテーブルは相変わらずIDとTitleとContentしか無いにも関わらず、2つの状態を一度に管理してくれました。

Buri・・・恐ろしい子><


という訳で、オマケ的に上記フローのJUnitコード。

public class DocumentProcessorTest4 extends S2TestCase {

	private static final String DICON_PATH = "app.dicon";
	static final String FLOW_PACKAGE = "文書管理パッケージ1.";
	static final String FLOW_PROCESS = "文書管理プロセス5.";

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		super.include(DICON_PATH);
	}
	@SuppressWarnings("unchecked")
	public void testTx() {
		BuriAutoSelectProcessor processor = (BuriAutoSelectProcessor) super.getComponent(BuriAutoSelectProcessor.class);

		DocumentDto doc1 = new DocumentDto("文書A", "文書Aです。");
		// 「登録」
		processor.toNextStatus(FLOW_PACKAGE + FLOW_PROCESS + "登録", doc1, null);
		assertEquals(1, processor.getDataListFromPath(FLOW_PACKAGE + FLOW_PROCESS + "公開中", doc1, DocumentDto.class).size());
		assertEquals(0, processor.getDataListFromPath(FLOW_PACKAGE + FLOW_PROCESS + "公開終了", doc1, DocumentDto.class).size());
		assertEquals(0, processor.getDataListFromPath(FLOW_PACKAGE + FLOW_PROCESS + "印刷確認", doc1, DocumentDto.class).size());
		assertEquals(0, processor.getDataListFromPath(FLOW_PACKAGE + FLOW_PROCESS + "印刷待ち", doc1, DocumentDto.class).size());
		// 「公開中」の次に(ココが凄いと思った!)
		processor.toNextStatus(FLOW_PACKAGE + FLOW_PROCESS + "公開中", doc1, null);
		assertEquals(0, processor.getDataListFromPath(FLOW_PACKAGE + FLOW_PROCESS + "公開中", doc1, DocumentDto.class).size());
		assertEquals(0, processor.getDataListFromPath(FLOW_PACKAGE + FLOW_PROCESS + "公開終了", doc1, DocumentDto.class).size());
		assertEquals(1, processor.getDataListFromPath(FLOW_PACKAGE + FLOW_PROCESS + "印刷確認", doc1, DocumentDto.class).size());
		assertEquals(1, processor.getDataListFromPath(FLOW_PACKAGE + FLOW_PROCESS + "印刷待ち", doc1, DocumentDto.class).size());
		// 「印刷待ち」を次に
		processor.toNextStatus(FLOW_PACKAGE + FLOW_PROCESS + "印刷待ち", doc1, null);
		assertEquals(0, processor.getDataListFromPath(FLOW_PACKAGE + FLOW_PROCESS + "公開中", doc1, DocumentDto.class).size());
		assertEquals(0, processor.getDataListFromPath(FLOW_PACKAGE + FLOW_PROCESS + "公開終了", doc1, DocumentDto.class).size());
		assertEquals(1, processor.getDataListFromPath(FLOW_PACKAGE + FLOW_PROCESS + "印刷確認", doc1, DocumentDto.class).size());
		assertEquals(0, processor.getDataListFromPath(FLOW_PACKAGE + FLOW_PROCESS + "印刷待ち", doc1, DocumentDto.class).size());
		// 「印刷確認ち」を次に
		processor.toNextStatus(FLOW_PACKAGE + FLOW_PROCESS + "印刷確認", doc1, null);
		assertEquals(0, processor.getDataListFromPath(FLOW_PACKAGE + FLOW_PROCESS + "公開中", doc1, DocumentDto.class).size());
		assertEquals(1, processor.getDataListFromPath(FLOW_PACKAGE + FLOW_PROCESS + "公開終了", doc1, DocumentDto.class).size());
		assertEquals(0, processor.getDataListFromPath(FLOW_PACKAGE + FLOW_PROCESS + "印刷確認", doc1, DocumentDto.class).size());
		assertEquals(0, processor.getDataListFromPath(FLOW_PACKAGE + FLOW_PROCESS + "印刷待ち", doc1, DocumentDto.class).size());
	}

}

はい、ちゃんとめぐりあえました。

Buri・・・恐ろしい子><


大事なことなので二回書きました。


この凄さを体感する為に、同じ機能をBuriを使わずに作ってみると良いのかも知れませんね。。。ちょっと頑張ってみようかな。


(追記)スイマセン、画像を貼り間違えておりました><