このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring Shell 3.4.1 を使用してください!

フロー

フローコンポーネントを使用して複数のコンポーネントを使用するものを構築すると、実装が少し雑然とすることがあります。これらのユースケースを容易にするために、複数のコンポーネントの実行を「フロー」としてまとめてフックできる ComponentFlow を追加しました。

次のリストは、シェルでのフローとその出力の例を示しています。

static class FlowSampleComplex {

	@Autowired
	private ComponentFlow.Builder componentFlowBuilder;

	public void runFlow() {
		List<SelectItem> single1SelectItems = Arrays.asList(SelectItem.of("key1", "value1"),
				SelectItem.of("key2", "value2"));
		List<SelectItem> multi1SelectItems = Arrays.asList(SelectItem.of("key1", "value1"),
				SelectItem.of("key2", "value2"), SelectItem.of("key3", "value3"));
		ComponentFlow flow = componentFlowBuilder.clone()
			.reset()
			.withStringInput("field1")
			.name("Field1")
			.defaultValue("defaultField1Value")
			.and()
			.withStringInput("field2")
			.name("Field2")
			.and()
			.withNumberInput("number1")
			.name("Number1")
			.and()
			.withNumberInput("number2")
			.name("Number2")
			.defaultValue(20.5)
			.numberClass(Double.class)
			.and()
			.withConfirmationInput("confirmation1")
			.name("Confirmation1")
			.and()
			.withPathInput("path1")
			.name("Path1")
			.and()
			.withSingleItemSelector("single1")
			.name("Single1")
			.selectItems(single1SelectItems)
			.and()
			.withMultiItemSelector("multi1")
			.name("Multi1")
			.selectItems(multi1SelectItems)
			.and()
			.build();
		flow.run();
	}

}
コンポーネントの通常の実行順序は、ビルダーで定義された順序と同じです。

next 関数を使用してターゲットコンポーネント ID を返すことで、フローのどの位置でジャンプするかを条件付きで選択できます。返された ID が null または存在しない場合、フローは実質的にその時点で停止します。

static class FlowSampleConditional {

	@Autowired
	private ComponentFlow.Builder componentFlowBuilder;

	public void runFlow() {
		Map<String, String> single1SelectItems = new HashMap<>();
		single1SelectItems.put("Field1", "field1");
		single1SelectItems.put("Field2", "field2");
		ComponentFlow flow = componentFlowBuilder.clone()
			.reset()
			.withSingleItemSelector("single1")
			.name("Single1")
			.selectItems(single1SelectItems)
			.next(ctx -> ctx.getResultItem().get().getItem())
			.and()
			.withStringInput("field1")
			.name("Field1")
			.defaultValue("defaultField1Value")
			.next(ctx -> null)
			.and()
			.withStringInput("field2")
			.name("Field2")
			.defaultValue("defaultField2Value")
			.next(ctx -> null)
			.and()
			.build();
		flow.run();
	}

}
フローを実行した結果は ComponentFlowResult を返します。これを使用して、さらにアクションを実行できます。