Better handling of ResultHandler generics detection
This commit is contained in:
@@ -27,10 +27,10 @@ import org.springframework.stereotype.Component;
|
||||
* @author Eric Bottard
|
||||
*/
|
||||
@Component
|
||||
public class AttributedCharSequenceResultHandler extends TerminalAwareResultHandler implements ResultHandler<AttributedCharSequence> {
|
||||
public class AttributedCharSequenceResultHandler extends TerminalAwareResultHandler<AttributedCharSequence> {
|
||||
|
||||
@Override
|
||||
public void handleResult(AttributedCharSequence result) {
|
||||
protected void doHandleResult(AttributedCharSequence result) {
|
||||
terminal.writer().println(result.toAnsi(terminal));
|
||||
terminal.writer().flush();
|
||||
}
|
||||
|
||||
@@ -31,10 +31,10 @@ import org.springframework.stereotype.Component;
|
||||
* @author Eric Bottard
|
||||
*/
|
||||
@Component
|
||||
public class CommandNotFoundResultHandler extends TerminalAwareResultHandler implements ResultHandler<CommandNotFound> {
|
||||
public class CommandNotFoundResultHandler extends TerminalAwareResultHandler<CommandNotFound> {
|
||||
|
||||
@Override
|
||||
public void handleResult(CommandNotFound result) {
|
||||
protected void doHandleResult(CommandNotFound result) {
|
||||
terminal.writer().println(new AttributedString(result.getMessage(),
|
||||
AttributedStyle.DEFAULT.foreground(AttributedStyle.RED)).toAnsi());
|
||||
terminal.writer().flush();
|
||||
|
||||
@@ -20,17 +20,26 @@ import org.jline.terminal.Terminal;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.shell.ResultHandler;
|
||||
|
||||
/**
|
||||
* Base class for ResultHandlers that rely on JLine's {@link Terminal}.
|
||||
*
|
||||
* @author Eric Bottard
|
||||
*/
|
||||
public abstract class TerminalAwareResultHandler {
|
||||
public abstract class TerminalAwareResultHandler<T> implements ResultHandler<T> {
|
||||
protected Terminal terminal;
|
||||
|
||||
@Autowired @Lazy
|
||||
public void setTerminal(Terminal terminal) {
|
||||
this.terminal = terminal;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void handleResult(T result) {
|
||||
doHandleResult(result);
|
||||
terminal.writer().flush();
|
||||
}
|
||||
|
||||
protected abstract void doHandleResult(T result);
|
||||
}
|
||||
|
||||
@@ -24,13 +24,12 @@ import org.springframework.shell.TerminalSizeAware;
|
||||
*
|
||||
* @author Eric Bottard
|
||||
*/
|
||||
public class TerminalSizeAwareResultHandler extends TerminalAwareResultHandler implements ResultHandler<TerminalSizeAware> {
|
||||
public class TerminalSizeAwareResultHandler extends TerminalAwareResultHandler<TerminalSizeAware> {
|
||||
|
||||
|
||||
@Override
|
||||
public void handleResult(TerminalSizeAware result) {
|
||||
protected void doHandleResult(TerminalSizeAware result) {
|
||||
CharSequence toPrint = result.render(terminal.getWidth());
|
||||
terminal.writer().println(toPrint);
|
||||
terminal.writer().flush();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ import org.springframework.stereotype.Component;
|
||||
* @author Eric Bottard
|
||||
*/
|
||||
@Component
|
||||
public class ThrowableResultHandler extends TerminalAwareResultHandler implements ResultHandler<Throwable> {
|
||||
public class ThrowableResultHandler extends TerminalAwareResultHandler<Throwable> {
|
||||
|
||||
/**
|
||||
* The name of the command that may be used to print details about the last error.
|
||||
@@ -45,7 +45,7 @@ public class ThrowableResultHandler extends TerminalAwareResultHandler implement
|
||||
private CommandRegistry commandRegistry;
|
||||
|
||||
@Override
|
||||
public void handleResult(Throwable result) {
|
||||
protected void doHandleResult(Throwable result) {
|
||||
lastError = result;
|
||||
terminal.writer().println(new AttributedString(result.toString(),
|
||||
AttributedStyle.DEFAULT.foreground(AttributedStyle.RED)).toAnsi());
|
||||
|
||||
@@ -23,6 +23,7 @@ import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.core.ResolvableType;
|
||||
import org.springframework.shell.ResultHandler;
|
||||
|
||||
/**
|
||||
@@ -68,8 +69,8 @@ public class TypeHierarchyResultHandler implements ResultHandler<Object> {
|
||||
@Autowired
|
||||
public void setResultHandlers(Set<ResultHandler<?>> resultHandlers) {
|
||||
for (ResultHandler<?> resultHandler : resultHandlers) {
|
||||
Type type = ((ParameterizedType) resultHandler.getClass().getGenericInterfaces()[0]).getActualTypeArguments()[0];
|
||||
registerHandler((Class<?>) type, resultHandler);
|
||||
ResolvableType type = ResolvableType.forInstance(resultHandler).as(ResultHandler.class);
|
||||
registerHandler(type.resolveGeneric(0), resultHandler);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user