Skip to content

Commit 75ff6e9

Browse files
committed
Fix use of default values
- Change parsing to extract and use option default value and also hook it with @ShellOption. - Fixes #409
1 parent 6738c92 commit 75ff6e9

File tree

4 files changed

+75
-0
lines changed

4 files changed

+75
-0
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.ArrayDeque;
1919
import java.util.ArrayList;
2020
import java.util.Arrays;
21+
import java.util.Collections;
2122
import java.util.Comparator;
2223
import java.util.Deque;
2324
import java.util.List;
@@ -313,6 +314,21 @@ ParserResults visit(List<List<String>> lexerResults, List<CommandOption> options
313314
}
314315
})
315316
.collect(Collectors.toList());
317+
318+
// Check options which didn't get matched and add parser result
319+
// for those having default value.
320+
List<CommandOption> defaultValueOptionsToCheck = new ArrayList<>(options);
321+
results.stream()
322+
.forEach(pr -> {
323+
if (pr.option != null) {
324+
defaultValueOptionsToCheck.remove(pr.option);
325+
}
326+
});
327+
defaultValueOptionsToCheck.stream()
328+
.filter(co -> co.getDefaultValue() != null)
329+
.forEach(co -> {
330+
results.add(ParserResult.of(co, Collections.emptyList(), co.getDefaultValue(), null));
331+
});
316332
return ParserResults.of(results);
317333
}
318334

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,25 @@ public void testDefaultValueAsNull() {
421421
assertThat(pojo1.method4Arg1).isNull();
422422
}
423423

424+
@Test
425+
public void testDefaultValue() {
426+
CommandRegistration r1 = CommandRegistration.builder()
427+
.command("command1")
428+
.withOption()
429+
.longNames("arg1")
430+
.defaultValue("defaultValue1")
431+
// .position(0)
432+
// .arity(OptionArity.EXACTLY_ONE)
433+
.and()
434+
.withTarget()
435+
.method(pojo1, "method4")
436+
.and()
437+
.build();
438+
execution.evaluate(r1, new String[]{});
439+
assertThat(pojo1.method4Count).isEqualTo(1);
440+
assertThat(pojo1.method4Arg1).isEqualTo("defaultValue1");
441+
}
442+
424443
@Test
425444
public void testRequiredArg() {
426445
CommandRegistration r1 = CommandRegistration.builder()

spring-shell-standard/src/main/java/org/springframework/shell/standard/StandardMethodTargetRegistrar.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,10 @@ else if (o.length() == stripped.length() + 1 && stripped.length() == 1) {
131131
if (so.arity() > -1) {
132132
optionSpec.arity(0, so.arity());
133133
}
134+
if (!ObjectUtils.nullSafeEquals(so.defaultValue(), ShellOption.NONE)
135+
&& !ObjectUtils.nullSafeEquals(so.defaultValue(), ShellOption.NULL)) {
136+
optionSpec.defaultValue(so.defaultValue());
137+
}
134138
}
135139
}
136140
else {

spring-shell-standard/src/test/java/org/springframework/shell/standard/StandardMethodTargetRegistrarTests.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,4 +323,40 @@ public void foo2() {
323323
public void foo3() {
324324
}
325325
}
326+
327+
@Test
328+
public void testOptionUseDefaultValue() {
329+
shellContext.setInteractionMode(InteractionMode.NONINTERACTIVE);
330+
applicationContext = new AnnotationConfigApplicationContext(DefaultValuesCommands.class);
331+
registrar.setApplicationContext(applicationContext);
332+
registrar.register(catalog);
333+
334+
assertThat(catalog.getRegistrations().get("foo1")).isNotNull();
335+
assertThat(catalog.getRegistrations().get("foo1").getOptions()).hasSize(1);
336+
assertThat(catalog.getRegistrations().get("foo1").getOptions().get(0).getDefaultValue()).isEqualTo("arg1Value");
337+
338+
assertThat(catalog.getRegistrations().get("foo2")).isNotNull();
339+
assertThat(catalog.getRegistrations().get("foo2").getOptions()).hasSize(1);
340+
assertThat(catalog.getRegistrations().get("foo2").getOptions().get(0).getDefaultValue()).isNull();
341+
342+
assertThat(catalog.getRegistrations().get("foo3")).isNotNull();
343+
assertThat(catalog.getRegistrations().get("foo3").getOptions()).hasSize(1);
344+
assertThat(catalog.getRegistrations().get("foo3").getOptions().get(0).getDefaultValue()).isNull();
345+
}
346+
347+
@ShellComponent
348+
public static class DefaultValuesCommands {
349+
350+
@ShellMethod(value = "foo1")
351+
public void foo1(@ShellOption(defaultValue = "arg1Value") String arg1) {
352+
}
353+
354+
@ShellMethod(value = "foo2")
355+
public void foo2(@ShellOption(defaultValue = ShellOption.NONE) String arg1) {
356+
}
357+
358+
@ShellMethod(value = "foo")
359+
public void foo3(@ShellOption(defaultValue = ShellOption.NULL) String arg1) {
360+
}
361+
}
326362
}

0 commit comments

Comments
 (0)