diff --git a/spring-shell-core/src/main/java/org/springframework/shell/result/AttributedCharSequenceResultHandler.java b/spring-shell-core/src/main/java/org/springframework/shell/result/AttributedCharSequenceResultHandler.java index fafc7e29..f7df75ff 100644 --- a/spring-shell-core/src/main/java/org/springframework/shell/result/AttributedCharSequenceResultHandler.java +++ b/spring-shell-core/src/main/java/org/springframework/shell/result/AttributedCharSequenceResultHandler.java @@ -27,10 +27,10 @@ import org.springframework.stereotype.Component; * @author Eric Bottard */ @Component -public class AttributedCharSequenceResultHandler extends TerminalAwareResultHandler implements ResultHandler { +public class AttributedCharSequenceResultHandler extends TerminalAwareResultHandler { @Override - public void handleResult(AttributedCharSequence result) { + protected void doHandleResult(AttributedCharSequence result) { terminal.writer().println(result.toAnsi(terminal)); terminal.writer().flush(); } diff --git a/spring-shell-core/src/main/java/org/springframework/shell/result/CommandNotFoundResultHandler.java b/spring-shell-core/src/main/java/org/springframework/shell/result/CommandNotFoundResultHandler.java index a5109aef..92fb3e43 100644 --- a/spring-shell-core/src/main/java/org/springframework/shell/result/CommandNotFoundResultHandler.java +++ b/spring-shell-core/src/main/java/org/springframework/shell/result/CommandNotFoundResultHandler.java @@ -31,10 +31,10 @@ import org.springframework.stereotype.Component; * @author Eric Bottard */ @Component -public class CommandNotFoundResultHandler extends TerminalAwareResultHandler implements ResultHandler { +public class CommandNotFoundResultHandler extends TerminalAwareResultHandler { @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(); diff --git a/spring-shell-core/src/main/java/org/springframework/shell/result/TerminalAwareResultHandler.java b/spring-shell-core/src/main/java/org/springframework/shell/result/TerminalAwareResultHandler.java index d9baf647..40fb5689 100644 --- a/spring-shell-core/src/main/java/org/springframework/shell/result/TerminalAwareResultHandler.java +++ b/spring-shell-core/src/main/java/org/springframework/shell/result/TerminalAwareResultHandler.java @@ -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 implements ResultHandler { 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); } diff --git a/spring-shell-core/src/main/java/org/springframework/shell/result/TerminalSizeAwareResultHandler.java b/spring-shell-core/src/main/java/org/springframework/shell/result/TerminalSizeAwareResultHandler.java index b3e361e0..c5d5cc02 100644 --- a/spring-shell-core/src/main/java/org/springframework/shell/result/TerminalSizeAwareResultHandler.java +++ b/spring-shell-core/src/main/java/org/springframework/shell/result/TerminalSizeAwareResultHandler.java @@ -24,13 +24,12 @@ import org.springframework.shell.TerminalSizeAware; * * @author Eric Bottard */ -public class TerminalSizeAwareResultHandler extends TerminalAwareResultHandler implements ResultHandler { +public class TerminalSizeAwareResultHandler extends TerminalAwareResultHandler { @Override - public void handleResult(TerminalSizeAware result) { + protected void doHandleResult(TerminalSizeAware result) { CharSequence toPrint = result.render(terminal.getWidth()); terminal.writer().println(toPrint); - terminal.writer().flush(); } } diff --git a/spring-shell-core/src/main/java/org/springframework/shell/result/ThrowableResultHandler.java b/spring-shell-core/src/main/java/org/springframework/shell/result/ThrowableResultHandler.java index 0966adef..68d46b8c 100644 --- a/spring-shell-core/src/main/java/org/springframework/shell/result/ThrowableResultHandler.java +++ b/spring-shell-core/src/main/java/org/springframework/shell/result/ThrowableResultHandler.java @@ -32,7 +32,7 @@ import org.springframework.stereotype.Component; * @author Eric Bottard */ @Component -public class ThrowableResultHandler extends TerminalAwareResultHandler implements ResultHandler { +public class ThrowableResultHandler extends TerminalAwareResultHandler { /** * 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()); diff --git a/spring-shell-core/src/main/java/org/springframework/shell/result/TypeHierarchyResultHandler.java b/spring-shell-core/src/main/java/org/springframework/shell/result/TypeHierarchyResultHandler.java index d1fea1ae..2dfab68b 100644 --- a/spring-shell-core/src/main/java/org/springframework/shell/result/TypeHierarchyResultHandler.java +++ b/spring-shell-core/src/main/java/org/springframework/shell/result/TypeHierarchyResultHandler.java @@ -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 { @Autowired public void setResultHandlers(Set> 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); } }