Add auto-config for ComponentFlow

- ComponentFlowAutoConfiguration which creates a builder bean
  and configures ComponentFlowCustomizer to set needed
  defaults for terminal, resource loader and template executor.
- Fixes #387
This commit is contained in:
Janne Valkealahti
2022-03-05 09:33:22 +00:00
parent 85976cff48
commit 30e7c4d370
6 changed files with 192 additions and 18 deletions

View File

@@ -70,11 +70,10 @@ public interface ComponentFlow {
/**
* Gets a new instance of an input wizard builder.
*
* @param terminal the terminal
* @return the input wizard builder
*/
public static Builder builder(Terminal terminal) {
return new DefaultBuilder(terminal);
public static Builder builder() {
return new DefaultBuilder();
}
/**
@@ -135,6 +134,14 @@ public interface ComponentFlow {
*/
MultiItemSelectorSpec withMultiItemSelector(String id);
/**
* Sets a {@link Terminal}.
*
* @param terminal the terminal
* @return a builder
*/
Builder terminal(Terminal terminal);
/**
* Sets a {@link ResourceLoader}.
*
@@ -151,6 +158,20 @@ public interface ComponentFlow {
*/
Builder templateExecutor(TemplateExecutor templateExecutor);
/**
* Clones existing builder.
*
* @return a builder
*/
Builder clone();
/**
* Resets existing builder.
*
* @return a builder
*/
Builder reset();
/**
* Builds instance of input wizard.
*
@@ -161,7 +182,6 @@ public interface ComponentFlow {
static abstract class BaseBuilder implements Builder {
private Terminal terminal;
private final List<BaseStringInput> stringInputs = new ArrayList<>();
private final List<BasePathInput> pathInputs = new ArrayList<>();
private final List<BaseConfirmationInput> confirmationInputs = new ArrayList<>();
@@ -169,11 +189,11 @@ public interface ComponentFlow {
private final List<BaseMultiItemSelector> multiItemSelectors = new ArrayList<>();
private final AtomicInteger order = new AtomicInteger();
private final HashSet<String> uniqueIds = new HashSet<>();
private Terminal terminal;
private ResourceLoader resourceLoader;
private TemplateExecutor templateExecutor;
BaseBuilder(Terminal terminal) {
this.terminal = terminal;
BaseBuilder() {
}
@Override
@@ -207,6 +227,12 @@ public interface ComponentFlow {
return new DefaultMultiInputSpec(this, id);
}
@Override
public Builder terminal(Terminal terminal) {
this.terminal = terminal;
return this;
}
@Override
public Builder resourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
@@ -219,6 +245,23 @@ public interface ComponentFlow {
return this;
}
@Override
public Builder clone() {
return new DefaultBuilder(this);
}
@Override
public Builder reset() {
stringInputs.clear();
pathInputs.clear();
confirmationInputs.clear();
singleItemSelectors.clear();
multiItemSelectors.clear();
order.set(0);
uniqueIds.clear();
return this;
}
void addStringInput(BaseStringInput input) {
checkUniqueId(input.getId());
input.setOrder(order.getAndIncrement());
@@ -249,6 +292,10 @@ public interface ComponentFlow {
multiItemSelectors.add(input);
}
Terminal getTerminal() {
return terminal;
}
ResourceLoader getResourceLoader() {
return resourceLoader;
}
@@ -267,8 +314,14 @@ public interface ComponentFlow {
static class DefaultBuilder extends BaseBuilder {
DefaultBuilder(Terminal terminal) {
super(terminal);
DefaultBuilder() {
super();
}
DefaultBuilder(BaseBuilder other) {
terminal(other.getTerminal());
resourceLoader(other.getResourceLoader());
templateExecutor(other.getTemplateExecutor());
}
}

View File

@@ -41,7 +41,8 @@ public class ComponentFlowTests extends AbstractShellTests {
single1SelectItems.put("key2", "value2");
List<SelectItem> multi1SelectItems = Arrays.asList(SelectItem.of("key1", "value1"),
SelectItem.of("key2", "value2"), SelectItem.of("key3", "value3"));
ComponentFlow wizard = ComponentFlow.builder(getTerminal())
ComponentFlow wizard = ComponentFlow.builder()
.terminal(getTerminal())
.resourceLoader(getResourceLoader())
.templateExecutor(getTemplateExecutor())
.withStringInput("field1")
@@ -107,7 +108,8 @@ public class ComponentFlowTests extends AbstractShellTests {
@Test
public void testSkipsGivenComponents() throws InterruptedException {
ComponentFlow wizard = ComponentFlow.builder(getTerminal())
ComponentFlow wizard = ComponentFlow.builder()
.terminal(getTerminal())
.withStringInput("id1")
.name("name")
.resultValue("value1")
@@ -154,7 +156,8 @@ public class ComponentFlowTests extends AbstractShellTests {
@Test
public void testChoosesDynamically() throws InterruptedException {
ComponentFlow wizard = ComponentFlow.builder(getTerminal())
ComponentFlow wizard = ComponentFlow.builder()
.terminal(getTerminal())
.resourceLoader(getResourceLoader())
.templateExecutor(getTemplateExecutor())
.withStringInput("id1")