From 52fa86079bb778ad1b6b315e3ecc582182f6a4a7 Mon Sep 17 00:00:00 2001 From: Michele Sollecito Date: Thu, 31 May 2018 18:50:35 +0100 Subject: [PATCH] [CORDA-1569]: Shell doesn't yield control back to the user after a completed flow and throws NullPointerExceptions (#3281) * [CORDA-1569]: Shell doesn't yield control back to the user after a completed flow and throws NullPointerExceptions --- .../src/main/java/net/corda/tools/shell/FlowShellCommand.java | 2 +- .../src/main/java/net/corda/tools/shell/RunShellCommand.java | 2 +- .../src/main/java/net/corda/tools/shell/StartShellCommand.java | 2 +- .../src/main/kotlin/net/corda/tools/shell/InteractiveShell.kt | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/shell/src/main/java/net/corda/tools/shell/FlowShellCommand.java b/tools/shell/src/main/java/net/corda/tools/shell/FlowShellCommand.java index 56607c948d..6fbf4cb003 100644 --- a/tools/shell/src/main/java/net/corda/tools/shell/FlowShellCommand.java +++ b/tools/shell/src/main/java/net/corda/tools/shell/FlowShellCommand.java @@ -36,7 +36,7 @@ public class FlowShellCommand extends InteractiveShellCommand { @Usage("The class name of the flow to run, or an unambiguous substring") @Argument String name, @Usage("The data to pass as input") @Argument(unquote = false) List input ) { - logger.info("Executing command \"flow start {} {}\",", name, input.stream().collect(joining(" "))); + logger.info("Executing command \"flow start {} {}\",", name, (input != null) ? input.stream().collect(joining(" ")) : ""); startFlow(name, input, out, ops(), ansiProgressRenderer(), objectMapper()); } diff --git a/tools/shell/src/main/java/net/corda/tools/shell/RunShellCommand.java b/tools/shell/src/main/java/net/corda/tools/shell/RunShellCommand.java index 11ec5e8e76..9ac5cff1b9 100644 --- a/tools/shell/src/main/java/net/corda/tools/shell/RunShellCommand.java +++ b/tools/shell/src/main/java/net/corda/tools/shell/RunShellCommand.java @@ -37,7 +37,7 @@ public class RunShellCommand extends InteractiveShellCommand { ) @Usage("runs a method from the CordaRPCOps interface on the node.") public Object main(InvocationContext context, @Usage("The command to run") @Argument(unquote = false) List command) { - logger.info("Executing command \"run {}\",", command.stream().collect(joining(" "))); + logger.info("Executing command \"run {}\",", (command != null) ? command.stream().collect(joining(" ")) : ""); StringToMethodCallParser parser = new StringToMethodCallParser<>(CordaRPCOps.class, objectMapper()); if (command == null) { diff --git a/tools/shell/src/main/java/net/corda/tools/shell/StartShellCommand.java b/tools/shell/src/main/java/net/corda/tools/shell/StartShellCommand.java index 6fd3ffae7e..c37d4b78c3 100644 --- a/tools/shell/src/main/java/net/corda/tools/shell/StartShellCommand.java +++ b/tools/shell/src/main/java/net/corda/tools/shell/StartShellCommand.java @@ -21,7 +21,7 @@ public class StartShellCommand extends InteractiveShellCommand { public void main(@Usage("The class name of the flow to run, or an unambiguous substring") @Argument String name, @Usage("The data to pass as input") @Argument(unquote = false) List input) { - logger.info("Executing command \"start {} {}\",", name, input.stream().collect(joining(" "))); + logger.info("Executing command \"start {} {}\",", name, (input != null) ? input.stream().collect(joining(" ")) : ""); ANSIProgressRenderer ansiProgressRenderer = ansiProgressRenderer(); FlowShellCommand.startFlow(name, input, out, ops(), ansiProgressRenderer != null ? ansiProgressRenderer : new CRaSHANSIProgressRenderer(out), objectMapper()); } diff --git a/tools/shell/src/main/kotlin/net/corda/tools/shell/InteractiveShell.kt b/tools/shell/src/main/kotlin/net/corda/tools/shell/InteractiveShell.kt index e5ffe1e0ca..87b4ad4b8d 100644 --- a/tools/shell/src/main/kotlin/net/corda/tools/shell/InteractiveShell.kt +++ b/tools/shell/src/main/kotlin/net/corda/tools/shell/InteractiveShell.kt @@ -281,6 +281,7 @@ object InteractiveShell { while (!Thread.currentThread().isInterrupted) { try { latch.await() + break } catch (e: InterruptedException) { try { rpcOps.killFlow(stateObservable.id)