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:
Janne Valkealahti
2021-12-24 08:50:40 +00:00
parent 2706da37cc
commit f6394a4531
33 changed files with 342 additions and 168 deletions

View File

@@ -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)

View File

@@ -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;
}
}

View File

@@ -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));

View File

@@ -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));

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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) {

View File

@@ -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;
}