Skip to content

Commit ca76a63

Browse files
committed
CommandRegistration should return same options
- Cache created CommandOption(s) to return same instance. - Backport #648 - Fixes #649
1 parent 61ab2de commit ca76a63

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

spring-shell-core/src/main/java/org/springframework/shell/command/CommandRegistration.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,7 @@ static class DefaultCommandRegistration implements CommandRegistration {
812812
private String description;
813813
private Supplier<Availability> availability;
814814
private List<DefaultOptionSpec> optionSpecs;
815+
private List<CommandOption> options;
815816
private DefaultTargetSpec targetSpec;
816817
private List<DefaultAliasSpec> aliasSpecs;
817818
private DefaultExitCodeSpec exitCodeSpec;
@@ -857,11 +858,15 @@ public Availability getAvailability() {
857858

858859
@Override
859860
public List<CommandOption> getOptions() {
860-
return optionSpecs.stream()
861+
if (options != null) {
862+
return options;
863+
}
864+
options = optionSpecs.stream()
861865
.map(o -> CommandOption.of(o.getLongNames(), o.getShortNames(), o.getDescription(), o.getType(),
862866
o.isRequired(), o.getDefaultValue(), o.getPosition(), o.getArityMin(), o.getArityMax(),
863867
o.getLabel(), o.getCompletion()))
864868
.collect(Collectors.toList());
869+
return options;
865870
}
866871

867872
@Override

spring-shell-core/src/test/java/org/springframework/shell/command/CommandRegistrationTests.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.springframework.shell.command;
1717

1818
import java.util.ArrayList;
19+
import java.util.List;
1920

2021
import org.junit.jupiter.api.Test;
2122

@@ -455,4 +456,20 @@ public void testOptionWithCompletion() {
455456
assertThat(registration.getOptions()).hasSize(1);
456457
assertThat(registration.getOptions().get(0).getCompletion()).isNotNull();
457458
}
459+
460+
@Test
461+
void optionShouldBeSameInstance() {
462+
CommandRegistration registration = CommandRegistration.builder()
463+
.command("command1")
464+
.withOption()
465+
.longNames("arg1")
466+
.and()
467+
.withTarget()
468+
.consumer(ctx -> {})
469+
.and()
470+
.build();
471+
List<CommandOption> options1 = registration.getOptions();
472+
List<CommandOption> options2 = registration.getOptions();
473+
assertThat(options1).isEqualTo(options2);
474+
}
458475
}

0 commit comments

Comments
 (0)