From 5ff98290e977d94c68e0f94810c7d2e1be69ed4a Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Fri, 18 Feb 2022 13:07:08 +0000 Subject: [PATCH] Add more beans to AbstractShellComponent - Add more common stuff like ResourceLoader, TemplateExecutor, ThemeResolver. - Make class abstract. - Expose more with sub-classes. --- .../samples/standard/ComponentCommands.java | 44 +++++++------------ .../shell/standard/commands/Completion.java | 3 +- .../shell/standard/commands/Version.java | 8 +--- .../standard/AbstractShellComponent.java | 33 +++++++++++++- 4 files changed, 49 insertions(+), 39 deletions(-) diff --git a/spring-shell-samples/src/main/java/org/springframework/shell/samples/standard/ComponentCommands.java b/spring-shell-samples/src/main/java/org/springframework/shell/samples/standard/ComponentCommands.java index 1cb2d97f..77ac36a4 100644 --- a/spring-shell-samples/src/main/java/org/springframework/shell/samples/standard/ComponentCommands.java +++ b/spring-shell-samples/src/main/java/org/springframework/shell/samples/standard/ComponentCommands.java @@ -20,43 +20,29 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ResourceLoaderAware; -import org.springframework.core.io.ResourceLoader; import org.springframework.shell.component.ConfirmationInput; -import org.springframework.shell.component.MultiItemSelector; -import org.springframework.shell.component.PathInput; -import org.springframework.shell.component.SingleItemSelector; -import org.springframework.shell.component.StringInput; import org.springframework.shell.component.ConfirmationInput.ConfirmationInputContext; +import org.springframework.shell.component.MultiItemSelector; import org.springframework.shell.component.MultiItemSelector.MultiItemSelectorContext; +import org.springframework.shell.component.PathInput; import org.springframework.shell.component.PathInput.PathInputContext; +import org.springframework.shell.component.SingleItemSelector; import org.springframework.shell.component.SingleItemSelector.SingleItemSelectorContext; +import org.springframework.shell.component.StringInput; import org.springframework.shell.component.StringInput.StringInputContext; import org.springframework.shell.component.support.SelectorItem; import org.springframework.shell.standard.AbstractShellComponent; import org.springframework.shell.standard.ShellComponent; import org.springframework.shell.standard.ShellMethod; -import org.springframework.shell.style.TemplateExecutor; @ShellComponent -public class ComponentCommands extends AbstractShellComponent implements ResourceLoaderAware { - - private ResourceLoader resourceLoader; - - @Autowired - private TemplateExecutor templateExecutor; - - @Override - public void setResourceLoader(ResourceLoader resourceLoader) { - this.resourceLoader = resourceLoader; - } +public class ComponentCommands extends AbstractShellComponent { @ShellMethod(key = "component string", value = "String input", group = "Components") public String stringInput(boolean mask) { StringInput component = new StringInput(getTerminal(), "Enter value", "myvalue"); - component.setResourceLoader(resourceLoader); - component.setTemplateExecutor(templateExecutor); + component.setResourceLoader(getResourceLoader()); + component.setTemplateExecutor(getTemplateExecutor()); if (mask) { component.setMaskCharater('*'); } @@ -67,8 +53,8 @@ public class ComponentCommands extends AbstractShellComponent implements Resourc @ShellMethod(key = "component path", value = "Path input", group = "Components") public String pathInput() { PathInput component = new PathInput(getTerminal(), "Enter value"); - component.setResourceLoader(resourceLoader); - component.setTemplateExecutor(templateExecutor); + component.setResourceLoader(getResourceLoader()); + component.setTemplateExecutor(getTemplateExecutor()); PathInputContext context = component.run(PathInputContext.empty()); return "Got value " + context.getResultValue(); } @@ -76,8 +62,8 @@ public class ComponentCommands extends AbstractShellComponent implements Resourc @ShellMethod(key = "component confirmation", value = "Confirmation input", group = "Components") public String confirmationInput(boolean no) { ConfirmationInput component = new ConfirmationInput(getTerminal(), "Enter value", !no); - component.setResourceLoader(resourceLoader); - component.setTemplateExecutor(templateExecutor); + component.setResourceLoader(getResourceLoader()); + component.setTemplateExecutor(getTemplateExecutor()); ConfirmationInputContext context = component.run(ConfirmationInputContext.empty()); return "Got value " + context.getResultValue(); } @@ -89,8 +75,8 @@ public class ComponentCommands extends AbstractShellComponent implements Resourc items.add(SelectorItem.of("key2", "value2")); SingleItemSelector> component = new SingleItemSelector<>(getTerminal(), items, "testSimple", null); - component.setResourceLoader(resourceLoader); - component.setTemplateExecutor(templateExecutor); + component.setResourceLoader(getResourceLoader()); + component.setTemplateExecutor(getTemplateExecutor()); SingleItemSelectorContext> context = component .run(SingleItemSelectorContext.empty()); String result = context.getResultItem().flatMap(si -> Optional.ofNullable(si.getItem())).get(); @@ -105,8 +91,8 @@ public class ComponentCommands extends AbstractShellComponent implements Resourc items.add(SelectorItem.of("key3", "value3")); MultiItemSelector> component = new MultiItemSelector<>(getTerminal(), items, "testSimple", null); - component.setResourceLoader(resourceLoader); - component.setTemplateExecutor(templateExecutor); + component.setResourceLoader(getResourceLoader()); + component.setTemplateExecutor(getTemplateExecutor()); MultiItemSelectorContext> context = component .run(MultiItemSelectorContext.empty()); String result = context.getResultItems().stream() diff --git a/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/Completion.java b/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/Completion.java index 38a3beb6..5d19f39e 100644 --- a/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/Completion.java +++ b/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/Completion.java @@ -17,7 +17,6 @@ package org.springframework.shell.standard.commands; import java.util.stream.Collectors; -import org.springframework.context.ResourceLoaderAware; import org.springframework.core.io.ResourceLoader; import org.springframework.shell.standard.AbstractShellComponent; import org.springframework.shell.standard.ShellComponent; @@ -30,7 +29,7 @@ import org.springframework.shell.standard.completion.BashCompletions; * @author Janne Valkealahti */ @ShellComponent -public class Completion extends AbstractShellComponent implements ResourceLoaderAware { +public class Completion extends AbstractShellComponent { /** * Marker interface used in auto-config. diff --git a/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/Version.java b/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/Version.java index 491c36e2..544ceb9d 100644 --- a/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/Version.java +++ b/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/Version.java @@ -27,7 +27,6 @@ import org.jline.utils.AttributedString; import org.springframework.boot.info.BuildProperties; import org.springframework.boot.info.GitProperties; -import org.springframework.context.ResourceLoaderAware; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.shell.standard.AbstractShellComponent; @@ -43,7 +42,7 @@ import org.springframework.util.StringUtils; * @author Janne Valkealahti */ @ShellComponent -public class Version extends AbstractShellComponent implements ResourceLoaderAware { +public class Version extends AbstractShellComponent { /** * Marker interface used in auto-config. @@ -70,11 +69,6 @@ public class Version extends AbstractShellComponent implements ResourceLoaderAwa this.templateExecutor = templateExecutor; } - @Override - public void setResourceLoader(ResourceLoader resourceLoader) { - this.resourceLoader = resourceLoader; - } - @ShellMethod(key = "version", value = "Show version info") public AttributedString version() { String templateResource = resourceAsString(resourceLoader.getResource(template)); diff --git a/spring-shell-standard/src/main/java/org/springframework/shell/standard/AbstractShellComponent.java b/spring-shell-standard/src/main/java/org/springframework/shell/standard/AbstractShellComponent.java index 0aeadb46..460670f9 100644 --- a/spring-shell-standard/src/main/java/org/springframework/shell/standard/AbstractShellComponent.java +++ b/spring-shell-standard/src/main/java/org/springframework/shell/standard/AbstractShellComponent.java @@ -24,19 +24,25 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.ObjectProvider; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; +import org.springframework.context.ResourceLoaderAware; +import org.springframework.core.io.ResourceLoader; import org.springframework.shell.CommandRegistry; import org.springframework.shell.ParameterResolver; import org.springframework.shell.Shell; +import org.springframework.shell.style.TemplateExecutor; +import org.springframework.shell.style.ThemeResolver; /** * Base class helping to build shell components. * * @author Janne Valkealahti */ -public class AbstractShellComponent implements ApplicationContextAware, InitializingBean { +public abstract class AbstractShellComponent implements ApplicationContextAware, InitializingBean, ResourceLoaderAware { private ApplicationContext applicationContext; + private ResourceLoader resourceLoader; + private ObjectProvider shellProvider; private ObjectProvider terminalProvider; @@ -45,11 +51,20 @@ public class AbstractShellComponent implements ApplicationContextAware, Initiali private ObjectProvider parameterResolverProvider; + private ObjectProvider templateExecutorProvider; + + private ObjectProvider themeResolverProvider; + @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } + @Override + public void setResourceLoader(ResourceLoader resourceLoader) { + this.resourceLoader = resourceLoader; + } + @Override public void afterPropertiesSet() throws Exception { shellProvider = applicationContext.getBeanProvider(Shell.class); @@ -58,6 +73,14 @@ public class AbstractShellComponent implements ApplicationContextAware, Initiali parameterResolverProvider = applicationContext.getBeanProvider(ParameterResolver.class); } + protected ApplicationContext getApplicationContext() { + return applicationContext; + } + + protected ResourceLoader getResourceLoader() { + return resourceLoader; + } + protected Shell getShell() { return shellProvider.getObject(); } @@ -73,4 +96,12 @@ public class AbstractShellComponent implements ApplicationContextAware, Initiali protected Stream getParameterResolver() { return parameterResolverProvider.orderedStream(); } + + protected TemplateExecutor getTemplateExecutor() { + return templateExecutorProvider.getObject(); + } + + protected ThemeResolver getThemeResolver() { + return themeResolverProvider.getObject(); + } }