Better handling of ResultHandler generics detection

This commit is contained in:
Eric Bottard
2017-08-30 18:20:43 +02:00
parent 9f88c03cf3
commit 993f49a81f
6 changed files with 21 additions and 12 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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