Rework bean handling
- Lot of rework to move better model to work around bean cycles - Remove use of @Lazy - Move StandardAPIAutoConfiguration to autoconfig package - Remove some of a direct ObjectProvider use in constructors - Adds spring-native support with most of a things working out of a box - Relates #324 - Relates #329 - Relates #323
This commit is contained in:
@@ -30,7 +30,6 @@ import java.util.stream.Collectors;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.validation.ConstraintViolation;
|
||||
import javax.validation.Validation;
|
||||
import javax.validation.Validator;
|
||||
import javax.validation.ValidatorFactory;
|
||||
|
||||
@@ -70,10 +69,9 @@ public class Shell {
|
||||
@Autowired
|
||||
protected ApplicationContext applicationContext;
|
||||
|
||||
@Autowired
|
||||
private CommandRegistry commandRegistry;
|
||||
|
||||
private Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
|
||||
private Validator validator = Utils.defaultValidator();
|
||||
|
||||
protected Map<String, MethodTarget> methodTargets = new HashMap<>();
|
||||
|
||||
@@ -85,8 +83,9 @@ public class Shell {
|
||||
*/
|
||||
protected static final Object UNRESOLVED = new Object();
|
||||
|
||||
public Shell(ResultHandlerService resultHandlerService) {
|
||||
public Shell(ResultHandlerService resultHandlerService, CommandRegistry commandRegistry) {
|
||||
this.resultHandlerService = resultHandlerService;
|
||||
this.commandRegistry = commandRegistry;
|
||||
}
|
||||
|
||||
@Autowired(required = false)
|
||||
|
||||
@@ -25,6 +25,10 @@ import java.util.stream.Collectors;
|
||||
import java.util.stream.IntStream;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import javax.validation.Validation;
|
||||
import javax.validation.Validator;
|
||||
import javax.validation.ValidatorFactory;
|
||||
|
||||
import org.springframework.core.DefaultParameterNameDiscoverer;
|
||||
import org.springframework.core.MethodParameter;
|
||||
|
||||
@@ -100,4 +104,30 @@ public class Utils {
|
||||
.collect(Collectors.toList());
|
||||
return words;
|
||||
}
|
||||
|
||||
private final static ValidatorFactory DEFAULT_VALIDATOR_FACTORY;
|
||||
private final static Validator DEFAULT_VALIDATOR;
|
||||
|
||||
static {
|
||||
DEFAULT_VALIDATOR_FACTORY = Validation.buildDefaultValidatorFactory();
|
||||
DEFAULT_VALIDATOR = DEFAULT_VALIDATOR_FACTORY.getValidator();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a default shared validation factory.
|
||||
*
|
||||
* @return default validation factory
|
||||
*/
|
||||
public static ValidatorFactory defaultValidatorFactory() {
|
||||
return DEFAULT_VALIDATOR_FACTORY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a default shared validator.
|
||||
*
|
||||
* @return default validator
|
||||
*/
|
||||
public static Validator defaultValidator() {
|
||||
return DEFAULT_VALIDATOR;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.springframework.shell.result;
|
||||
|
||||
import org.jline.terminal.Terminal;
|
||||
import org.jline.utils.AttributedCharSequence;
|
||||
|
||||
import org.springframework.shell.ResultHandler;
|
||||
@@ -27,6 +28,10 @@ import org.springframework.shell.ResultHandler;
|
||||
*/
|
||||
public class AttributedCharSequenceResultHandler extends TerminalAwareResultHandler<AttributedCharSequence> {
|
||||
|
||||
public AttributedCharSequenceResultHandler(Terminal terminal) {
|
||||
super(terminal);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doHandleResult(AttributedCharSequence result) {
|
||||
terminal.writer().println(result.toAnsi(terminal));
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package org.springframework.shell.result;
|
||||
|
||||
import org.jline.terminal.Terminal;
|
||||
|
||||
import org.springframework.shell.ResultHandler;
|
||||
|
||||
/**
|
||||
@@ -26,6 +28,10 @@ import org.springframework.shell.ResultHandler;
|
||||
*/
|
||||
public class DefaultResultHandler extends TerminalAwareResultHandler<Object> {
|
||||
|
||||
public DefaultResultHandler(Terminal terminal) {
|
||||
super(terminal);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doHandleResult(Object result) {
|
||||
terminal.writer().println(String.valueOf(result));
|
||||
|
||||
@@ -24,6 +24,7 @@ import java.util.stream.StreamSupport;
|
||||
import javax.validation.ElementKind;
|
||||
import javax.validation.Path;
|
||||
|
||||
import org.jline.terminal.Terminal;
|
||||
import org.jline.utils.AttributedString;
|
||||
import org.jline.utils.AttributedStringBuilder;
|
||||
import org.jline.utils.AttributedStyle;
|
||||
@@ -43,6 +44,10 @@ import org.springframework.shell.Utils;
|
||||
public class ParameterValidationExceptionResultHandler
|
||||
extends TerminalAwareResultHandler<ParameterValidationException> {
|
||||
|
||||
public ParameterValidationExceptionResultHandler(Terminal terminal) {
|
||||
super(terminal);
|
||||
}
|
||||
|
||||
@Autowired
|
||||
private List<ParameterResolver> parameterResolvers;
|
||||
|
||||
|
||||
@@ -16,10 +16,15 @@
|
||||
|
||||
package org.springframework.shell.result;
|
||||
|
||||
import org.jline.terminal.Terminal;
|
||||
|
||||
import org.springframework.beans.factory.ObjectProvider;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.shell.CommandRegistry;
|
||||
import org.springframework.shell.TerminalSizeAware;
|
||||
import org.springframework.shell.jline.InteractiveShellApplicationRunner;
|
||||
|
||||
/**
|
||||
* Used for explicit configuration of {@link org.springframework.shell.ResultHandler}s.
|
||||
@@ -32,28 +37,29 @@ public class ResultHandlerConfig {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnClass(TerminalSizeAware.class)
|
||||
public TerminalSizeAwareResultHandler terminalSizeAwareResultHandler() {
|
||||
return new TerminalSizeAwareResultHandler();
|
||||
public TerminalSizeAwareResultHandler terminalSizeAwareResultHandler(Terminal terminal) {
|
||||
return new TerminalSizeAwareResultHandler(terminal);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public AttributedCharSequenceResultHandler attributedCharSequenceResultHandler() {
|
||||
return new AttributedCharSequenceResultHandler();
|
||||
public AttributedCharSequenceResultHandler attributedCharSequenceResultHandler(Terminal terminal) {
|
||||
return new AttributedCharSequenceResultHandler(terminal);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public DefaultResultHandler defaultResultHandler() {
|
||||
return new DefaultResultHandler();
|
||||
public DefaultResultHandler defaultResultHandler(Terminal terminal) {
|
||||
return new DefaultResultHandler(terminal);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public ParameterValidationExceptionResultHandler parameterValidationExceptionResultHandler() {
|
||||
return new ParameterValidationExceptionResultHandler();
|
||||
public ParameterValidationExceptionResultHandler parameterValidationExceptionResultHandler(Terminal terminal) {
|
||||
return new ParameterValidationExceptionResultHandler(terminal);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public ThrowableResultHandler throwableResultHandler() {
|
||||
return new ThrowableResultHandler();
|
||||
public ThrowableResultHandler throwableResultHandler(Terminal terminal, CommandRegistry commandRegistry,
|
||||
ObjectProvider<InteractiveShellApplicationRunner> interactiveApplicationRunner) {
|
||||
return new ThrowableResultHandler(terminal, commandRegistry, interactiveApplicationRunner);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -18,8 +18,6 @@ package org.springframework.shell.result;
|
||||
|
||||
import org.jline.terminal.Terminal;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.shell.ResultHandler;
|
||||
|
||||
/**
|
||||
@@ -28,10 +26,10 @@ import org.springframework.shell.ResultHandler;
|
||||
* @author Eric Bottard
|
||||
*/
|
||||
public abstract class TerminalAwareResultHandler<T> implements ResultHandler<T> {
|
||||
|
||||
protected Terminal terminal;
|
||||
|
||||
@Autowired @Lazy
|
||||
public void setTerminal(Terminal terminal) {
|
||||
protected TerminalAwareResultHandler(Terminal terminal) {
|
||||
this.terminal = terminal;
|
||||
}
|
||||
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package org.springframework.shell.result;
|
||||
|
||||
import org.jline.terminal.Terminal;
|
||||
|
||||
import org.springframework.shell.TerminalSizeAware;
|
||||
|
||||
/**
|
||||
@@ -25,6 +27,9 @@ import org.springframework.shell.TerminalSizeAware;
|
||||
*/
|
||||
public class TerminalSizeAwareResultHandler extends TerminalAwareResultHandler<TerminalSizeAware> {
|
||||
|
||||
public TerminalSizeAwareResultHandler(Terminal terminal) {
|
||||
super(terminal);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doHandleResult(TerminalSizeAware result) {
|
||||
|
||||
@@ -16,12 +16,12 @@
|
||||
|
||||
package org.springframework.shell.result;
|
||||
|
||||
import org.jline.terminal.Terminal;
|
||||
import org.jline.utils.AttributedString;
|
||||
import org.jline.utils.AttributedStringBuilder;
|
||||
import org.jline.utils.AttributedStyle;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.beans.factory.ObjectProvider;
|
||||
import org.springframework.shell.CommandRegistry;
|
||||
import org.springframework.shell.ResultHandler;
|
||||
import org.springframework.shell.jline.InteractiveShellApplicationRunner;
|
||||
@@ -43,11 +43,16 @@ public class ThrowableResultHandler extends TerminalAwareResultHandler<Throwable
|
||||
|
||||
private Throwable lastError;
|
||||
|
||||
@Autowired @Lazy
|
||||
private CommandRegistry commandRegistry;
|
||||
|
||||
@Autowired @Lazy
|
||||
private InteractiveShellApplicationRunner interactiveRunner;
|
||||
private ObjectProvider<InteractiveShellApplicationRunner> interactiveRunner;
|
||||
|
||||
public ThrowableResultHandler(Terminal terminal, CommandRegistry commandRegistry,
|
||||
ObjectProvider<InteractiveShellApplicationRunner> interactiveRunner) {
|
||||
super(terminal);
|
||||
this.commandRegistry = commandRegistry;
|
||||
this.interactiveRunner = interactiveRunner;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doHandleResult(Throwable result) {
|
||||
@@ -55,7 +60,7 @@ public class ThrowableResultHandler extends TerminalAwareResultHandler<Throwable
|
||||
String toPrint = StringUtils.hasLength(result.getMessage()) ? result.getMessage() : result.toString();
|
||||
terminal.writer().println(new AttributedString(toPrint,
|
||||
AttributedStyle.DEFAULT.foreground(AttributedStyle.RED)).toAnsi());
|
||||
if (interactiveRunner.isEnabled() && commandRegistry.listCommands().containsKey(DETAILS_COMMAND_NAME)) {
|
||||
if (interactiveRunner.getIfAvailable().isEnabled() && commandRegistry.listCommands().containsKey(DETAILS_COMMAND_NAME)) {
|
||||
terminal.writer().println(
|
||||
new AttributedStringBuilder()
|
||||
.append("Details of the error have been omitted. You can use the ", AttributedStyle.DEFAULT.foreground(AttributedStyle.RED))
|
||||
@@ -65,7 +70,7 @@ public class ThrowableResultHandler extends TerminalAwareResultHandler<Throwable
|
||||
);
|
||||
}
|
||||
terminal.writer().flush();
|
||||
if (!interactiveRunner.isEnabled()) {
|
||||
if (!interactiveRunner.getIfAvailable().isEnabled()) {
|
||||
if (result instanceof RuntimeException) {
|
||||
throw (RuntimeException) result;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user