From ca76a63c30ddc523e81f04355db2e41e1e1fae72 Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Sat, 28 Jan 2023 17:50:45 +0000 Subject: [PATCH] CommandRegistration should return same options - Cache created CommandOption(s) to return same instance. - Backport #648 - Fixes #649 --- .../shell/command/CommandRegistration.java | 7 ++++++- .../shell/command/CommandRegistrationTests.java | 17 +++++++++++++++++ 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 519108e4..bebccfb3 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 @@ -812,6 +812,7 @@ public interface CommandRegistration { private String description; private Supplier availability; private List optionSpecs; + private List options; private DefaultTargetSpec targetSpec; private List aliasSpecs; private DefaultExitCodeSpec exitCodeSpec; @@ -857,11 +858,15 @@ public interface CommandRegistration { @Override public List getOptions() { - return optionSpecs.stream() + if (options != null) { + return options; + } + options = optionSpecs.stream() .map(o -> CommandOption.of(o.getLongNames(), o.getShortNames(), o.getDescription(), o.getType(), o.isRequired(), o.getDefaultValue(), o.getPosition(), o.getArityMin(), o.getArityMax(), o.getLabel(), o.getCompletion())) .collect(Collectors.toList()); + return options; } @Override 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 e025b67f..7aae6e4e 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; @@ -455,4 +456,20 @@ public class CommandRegistrationTests extends AbstractCommandTests { assertThat(registration.getOptions()).hasSize(1); assertThat(registration.getOptions().get(0).getCompletion()).isNotNull(); } + + @Test + void optionShouldBeSameInstance() { + CommandRegistration registration = CommandRegistration.builder() + .command("command1") + .withOption() + .longNames("arg1") + .and() + .withTarget() + .consumer(ctx -> {}) + .and() + .build(); + List options1 = registration.getOptions(); + List options2 = registration.getOptions(); + assertThat(options1).isEqualTo(options2); + } }