diff --git a/spring-shell-core/src/main/java/org/springframework/shell/component/ConfirmationInput.java b/spring-shell-core/src/main/java/org/springframework/shell/component/ConfirmationInput.java index 0ab3b967..94d32858 100644 --- a/spring-shell-core/src/main/java/org/springframework/shell/component/ConfirmationInput.java +++ b/spring-shell-core/src/main/java/org/springframework/shell/component/ConfirmationInput.java @@ -72,9 +72,11 @@ public class ConfirmationInput extends AbstractTextComponent { - currentContext.put(e.getKey(), e.getValue()); - }); + if (context != null) { + context.stream().forEach(e -> { + currentContext.put(e.getKey(), e.getValue()); + }); + } return currentContext; } diff --git a/spring-shell-core/src/main/java/org/springframework/shell/component/MultiItemSelector.java b/spring-shell-core/src/main/java/org/springframework/shell/component/MultiItemSelector.java index 1ed49779..4b40fe64 100644 --- a/spring-shell-core/src/main/java/org/springframework/shell/component/MultiItemSelector.java +++ b/spring-shell-core/src/main/java/org/springframework/shell/component/MultiItemSelector.java @@ -63,9 +63,11 @@ public class MultiItemSelector { - currentContext.put(e.getKey(), e.getValue()); - }); + if (context != null) { + context.stream().forEach(e -> { + currentContext.put(e.getKey(), e.getValue()); + }); + } return currentContext; } diff --git a/spring-shell-core/src/main/java/org/springframework/shell/component/PathInput.java b/spring-shell-core/src/main/java/org/springframework/shell/component/PathInput.java index f8784e47..e1006355 100644 --- a/spring-shell-core/src/main/java/org/springframework/shell/component/PathInput.java +++ b/spring-shell-core/src/main/java/org/springframework/shell/component/PathInput.java @@ -69,9 +69,11 @@ public class PathInput extends AbstractTextComponent { } currentContext = PathInputContext.empty(); currentContext.setName(getName()); - context.stream().forEach(e -> { - currentContext.put(e.getKey(), e.getValue()); - }); + if (context != null) { + context.stream().forEach(e -> { + currentContext.put(e.getKey(), e.getValue()); + }); + } return currentContext; } diff --git a/spring-shell-core/src/main/java/org/springframework/shell/component/PathSearch.java b/spring-shell-core/src/main/java/org/springframework/shell/component/PathSearch.java index 667e395c..577a5b06 100644 --- a/spring-shell-core/src/main/java/org/springframework/shell/component/PathSearch.java +++ b/spring-shell-core/src/main/java/org/springframework/shell/component/PathSearch.java @@ -124,9 +124,11 @@ public class PathSearch extends AbstractTextComponent { currentContext.setTerminalWidth(getTerminal().getWidth()); currentContext.setPathSearchConfig(this.config); currentContext.setMessage("Type ' ' to search", MessageLevel.INFO); - context.stream().forEach(e -> { - currentContext.put(e.getKey(), e.getValue()); - }); + if (context != null) { + context.stream().forEach(e -> { + currentContext.put(e.getKey(), e.getValue()); + }); + } return currentContext; } diff --git a/spring-shell-core/src/main/java/org/springframework/shell/component/SingleItemSelector.java b/spring-shell-core/src/main/java/org/springframework/shell/component/SingleItemSelector.java index cf3e2145..dff5f6e1 100644 --- a/spring-shell-core/src/main/java/org/springframework/shell/component/SingleItemSelector.java +++ b/spring-shell-core/src/main/java/org/springframework/shell/component/SingleItemSelector.java @@ -63,9 +63,11 @@ public class SingleItemSelector { - currentContext.put(e.getKey(), e.getValue()); - }); + if (context != null) { + context.stream().forEach(e -> { + currentContext.put(e.getKey(), e.getValue()); + }); + } return currentContext; } diff --git a/spring-shell-core/src/main/java/org/springframework/shell/component/StringInput.java b/spring-shell-core/src/main/java/org/springframework/shell/component/StringInput.java index 57386dd1..99be3311 100644 --- a/spring-shell-core/src/main/java/org/springframework/shell/component/StringInput.java +++ b/spring-shell-core/src/main/java/org/springframework/shell/component/StringInput.java @@ -77,9 +77,11 @@ public class StringInput extends AbstractTextComponent { - currentContext.put(e.getKey(), e.getValue()); - }); + if (context != null) { + context.stream().forEach(e -> { + currentContext.put(e.getKey(), e.getValue()); + }); + } return currentContext; } diff --git a/spring-shell-core/src/main/java/org/springframework/shell/jline/ExtendedDefaultParser.java b/spring-shell-core/src/main/java/org/springframework/shell/jline/ExtendedDefaultParser.java index 5e6dc26e..2a90d6fd 100644 --- a/spring-shell-core/src/main/java/org/springframework/shell/jline/ExtendedDefaultParser.java +++ b/spring-shell-core/src/main/java/org/springframework/shell/jline/ExtendedDefaultParser.java @@ -125,23 +125,24 @@ public class ExtendedDefaultParser implements Parser { } } - if (current.length() > 0 || cursor == line.length()) { + if (current.length() > 0 || (line != null && cursor == line.length())) { words.add(current.toString()); } - if (cursor == line.length()) { + if (line != null && cursor == line.length()) { wordIndex = words.size() - 1; wordCursor = words.get(words.size() - 1).length(); } - if (eofOnEscapedNewLine && isEscapeChar(line, line.length() - 1)) { + if (eofOnEscapedNewLine && (line != null && isEscapeChar(line, line.length() - 1))) { throw new EOFError(-1, -1, "Escaped new line", "newline"); } if (eofOnUnclosedQuote && quoteStart >= 0 && context != ParseContext.COMPLETE) { - throw new EOFError(-1, -1, "Missing closing quote", line.charAt(quoteStart) == '\'' ? "quote" : "dquote"); + throw new EOFError(-1, -1, "Missing closing quote", + (line != null && line.charAt(quoteStart) == '\'') ? "quote" : "dquote"); } - String openingQuote = quoteStart >= 0 ? line.substring(quoteStart, quoteStart + 1) : null; + String openingQuote = (quoteStart >= 0 && line != null) ? line.substring(quoteStart, quoteStart + 1) : null; return wrap(new ExtendedArgumentList(line, words, wordIndex, wordCursor, cursor, openingQuote)); } diff --git a/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/Stacktrace.java b/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/Stacktrace.java index f0c676b1..eff075ef 100644 --- a/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/Stacktrace.java +++ b/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/Stacktrace.java @@ -54,8 +54,11 @@ public class Stacktrace extends AbstractShellComponent { value = "Display the full stacktrace of the last error.", interactionMode = InteractionMode.INTERACTIVE) public void stacktrace() { - if (throwableResultHandler.getIfAvailable().getLastError() != null) { - throwableResultHandler.getIfAvailable().getLastError().printStackTrace(getTerminal().writer()); + ThrowableResultHandler handler = throwableResultHandler.getIfAvailable(); + if (handler != null) { + if (handler.getLastError() != null) { + handler.getLastError().printStackTrace(getTerminal().writer()); + } } } } diff --git a/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/StandardCommandsModelsRuntimeHints.java b/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/StandardCommandsModelsRuntimeHints.java index 20674106..747324cc 100644 --- a/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/StandardCommandsModelsRuntimeHints.java +++ b/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/StandardCommandsModelsRuntimeHints.java @@ -23,6 +23,7 @@ import org.springframework.aot.hint.ReflectionHints; import org.springframework.aot.hint.RuntimeHints; import org.springframework.aot.hint.RuntimeHintsRegistrar; import org.springframework.aot.hint.TypeReference; +import org.springframework.lang.Nullable; /** * {@link RuntimeHintsRegistrar} for Shell Standard Commands temlate model classes. @@ -32,7 +33,7 @@ import org.springframework.aot.hint.TypeReference; class StandardCommandsModelsRuntimeHints implements RuntimeHintsRegistrar { @Override - public void registerHints(RuntimeHints hints, ClassLoader classLoader) { + public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader) { ReflectionHints reflection = hints.reflection(); registerForDeclaredMethodsInvocation(reflection, CommandAvailabilityInfoModel.class, CommandInfoModel.class, CommandParameterInfoModel.class, GroupCommandInfoModel.class, GroupsInfoModel.class); diff --git a/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/StandardCommandsResourcesRuntimeHints.java b/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/StandardCommandsResourcesRuntimeHints.java index 8743f786..8818b33f 100644 --- a/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/StandardCommandsResourcesRuntimeHints.java +++ b/spring-shell-standard-commands/src/main/java/org/springframework/shell/standard/commands/StandardCommandsResourcesRuntimeHints.java @@ -17,6 +17,7 @@ package org.springframework.shell.standard.commands; import org.springframework.aot.hint.RuntimeHints; import org.springframework.aot.hint.RuntimeHintsRegistrar; +import org.springframework.lang.Nullable; /** * {@link RuntimeHintsRegistrar} for Shell Standard Commands resources. @@ -26,7 +27,7 @@ import org.springframework.aot.hint.RuntimeHintsRegistrar; class StandardCommandsResourcesRuntimeHints implements RuntimeHintsRegistrar { @Override - public void registerHints(RuntimeHints hints, ClassLoader classLoader) { + public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader) { hints.resources() .registerPattern("template/*.st") .registerPattern("template/*.stg"); diff --git a/spring-shell-standard/src/main/java/org/springframework/shell/standard/ShellOptionMethodArgumentResolver.java b/spring-shell-standard/src/main/java/org/springframework/shell/standard/ShellOptionMethodArgumentResolver.java index ea0de2da..c6e513dc 100644 --- a/spring-shell-standard/src/main/java/org/springframework/shell/standard/ShellOptionMethodArgumentResolver.java +++ b/spring-shell-standard/src/main/java/org/springframework/shell/standard/ShellOptionMethodArgumentResolver.java @@ -50,7 +50,9 @@ public class ShellOptionMethodArgumentResolver extends AbstractArgumentMethodArg protected NamedValueInfo createNamedValueInfo(MethodParameter parameter) { ShellOption annot = parameter.getParameterAnnotation(ShellOption.class); Assert.state(annot != null, "No ShellOption annotation"); - List names = Arrays.stream(annot.value()).map(v -> StringUtils.trimLeadingCharacter(v, '-')).collect(Collectors.toList()); + List names = Arrays.stream(annot != null ? annot.value() : new String[0]) + .map(v -> StringUtils.trimLeadingCharacter(v, '-')) + .collect(Collectors.toList()); return new HeaderNamedValueInfo(annot, names); }