From 4733c3c7b505bc0788f15c364caa06ab9bbbbd3f Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Thu, 24 Feb 2022 09:24:29 +0000 Subject: [PATCH] Add custom renderer example for component --- .../samples/standard/ComponentCommands.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) 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 77ac36a4..83244953 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 @@ -16,10 +16,15 @@ package org.springframework.shell.samples.standard; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Optional; +import java.util.function.Function; import java.util.stream.Collectors; +import org.jline.utils.AttributedString; +import org.jline.utils.AttributedStringBuilder; + import org.springframework.shell.component.ConfirmationInput; import org.springframework.shell.component.ConfirmationInput.ConfirmationInputContext; import org.springframework.shell.component.MultiItemSelector; @@ -34,6 +39,7 @@ 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.util.StringUtils; @ShellComponent public class ComponentCommands extends AbstractShellComponent { @@ -100,4 +106,42 @@ public class ComponentCommands extends AbstractShellComponent { .collect(Collectors.joining(",")); return "Got value " + result; } + + @ShellMethod(key = "component stringcustom", value = "String input", group = "Components") + public String stringInputCustom(boolean mask) { + StringInput component = new StringInput(getTerminal(), "Enter value", "myvalue", + new StringInputCustomRenderer()); + component.setResourceLoader(getResourceLoader()); + component.setTemplateExecutor(getTemplateExecutor()); + if (mask) { + component.setMaskCharater('*'); + } + StringInputContext context = component.run(StringInputContext.empty()); + return "Got value " + context.getResultValue(); + } + + private static class StringInputCustomRenderer implements Function> { + + @Override + public List apply(StringInputContext context) { + AttributedStringBuilder builder = new AttributedStringBuilder(); + builder.append(context.getName()); + builder.append(" "); + + if (context.getResultValue() != null) { + builder.append(context.getResultValue()); + } + else { + String input = context.getInput(); + if (StringUtils.hasText(input)) { + builder.append(input); + } + else { + builder.append("[Default " + context.getDefaultValue() + "]"); + } + } + + return Arrays.asList(builder.toAttributedString()); + } + } }