Skip to content

Commit 3ce7afa

Browse files
committed
CommandRegistration should return same options
- Cache created CommandOption(s) to return same instance. - Fixes #648
1 parent 347b49b commit 3ce7afa

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: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1161,6 +1161,7 @@ static class DefaultCommandRegistration implements CommandRegistration {
11611161
private boolean hidden;
11621162
private String description;
11631163
private Supplier<Availability> availability;
1164+
private List<CommandOption> options;
11641165
private List<DefaultOptionSpec> optionSpecs;
11651166
private DefaultTargetSpec targetSpec;
11661167
private List<DefaultAliasSpec> aliasSpecs;
@@ -1218,7 +1219,10 @@ public Availability getAvailability() {
12181219

12191220
@Override
12201221
public List<CommandOption> getOptions() {
1221-
List<CommandOption> options = optionSpecs.stream()
1222+
if (options != null) {
1223+
return options;
1224+
}
1225+
options = optionSpecs.stream()
12221226
.map(o -> {
12231227
String[] longNames = o.getLongNames();
12241228
Function<String, String> modifier = o.getOptionNameModifier();

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

Lines changed: 18 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

@@ -600,4 +601,21 @@ void testOptionNameModifierFromDefault() {
600601
assertThat(option.getLongNames()).isEqualTo(new String[] { "xarg1" });
601602
});
602603
}
604+
605+
@Test
606+
void optionShouldBeSameInstance() {
607+
CommandRegistration registration = CommandRegistration.builder()
608+
.defaultOptionNameModifier(name -> "x" + name)
609+
.command("command1")
610+
.withOption()
611+
.longNames("arg1")
612+
.and()
613+
.withTarget()
614+
.consumer(ctx -> {})
615+
.and()
616+
.build();
617+
List<CommandOption> options1 = registration.getOptions();
618+
List<CommandOption> options2 = registration.getOptions();
619+
assertThat(options1).isEqualTo(options2);
620+
}
603621
}

0 commit comments

Comments
 (0)