From 3ce7afac6b19785f1f5294967f058ab7f4d21ccb Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Sat, 28 Jan 2023 17:13:29 +0000 Subject: [PATCH] CommandRegistration should return same options - Cache created CommandOption(s) to return same instance. - Fixes #648 --- .../shell/command/CommandRegistration.java | 6 +++++- .../command/CommandRegistrationTests.java | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/spring-shell-core/src/main/java/org/springframework/shell/command/CommandRegistration.java b/spring-shell-core/src/main/java/org/springframework/shell/command/CommandRegistration.java index 903c743c..217fb777 100644 --- a/spring-shell-core/src/main/java/org/springframework/shell/command/CommandRegistration.java +++ b/spring-shell-core/src/main/java/org/springframework/shell/command/CommandRegistration.java @@ -1161,6 +1161,7 @@ public interface CommandRegistration { private boolean hidden; private String description; private Supplier availability; + private List options; private List optionSpecs; private DefaultTargetSpec targetSpec; private List aliasSpecs; @@ -1218,7 +1219,10 @@ public interface CommandRegistration { @Override public List getOptions() { - List options = optionSpecs.stream() + if (options != null) { + return options; + } + options = optionSpecs.stream() .map(o -> { String[] longNames = o.getLongNames(); Function modifier = o.getOptionNameModifier(); diff --git a/spring-shell-core/src/test/java/org/springframework/shell/command/CommandRegistrationTests.java b/spring-shell-core/src/test/java/org/springframework/shell/command/CommandRegistrationTests.java index 0c425e86..e8a69ee9 100644 --- a/spring-shell-core/src/test/java/org/springframework/shell/command/CommandRegistrationTests.java +++ b/spring-shell-core/src/test/java/org/springframework/shell/command/CommandRegistrationTests.java @@ -16,6 +16,7 @@ package org.springframework.shell.command; import java.util.ArrayList; +import java.util.List; import org.junit.jupiter.api.Test; @@ -600,4 +601,21 @@ public class CommandRegistrationTests extends AbstractCommandTests { assertThat(option.getLongNames()).isEqualTo(new String[] { "xarg1" }); }); } + + @Test + void optionShouldBeSameInstance() { + CommandRegistration registration = CommandRegistration.builder() + .defaultOptionNameModifier(name -> "x" + name) + .command("command1") + .withOption() + .longNames("arg1") + .and() + .withTarget() + .consumer(ctx -> {}) + .and() + .build(); + List options1 = registration.getOptions(); + List options2 = registration.getOptions(); + assertThat(options1).isEqualTo(options2); + } }