From 36acadb1289b88527aab87d717ae65f697abe3a7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Ko=C5=BEusznik?= <jan@kozusznik.cz>
Date: Wed, 30 Jan 2019 13:38:07 +0100
Subject: [PATCH] throw exception if command execution fails

---
 .../it4i/fiji/scpclient/SshCommandClient.java |  9 ++++-
 .../scpclient/SshExecuteCommandException.java | 36 +++++++++++++++++++
 2 files changed, 44 insertions(+), 1 deletion(-)
 create mode 100644 java-scpclient/src/main/java/cz/it4i/fiji/scpclient/SshExecuteCommandException.java

diff --git a/java-scpclient/src/main/java/cz/it4i/fiji/scpclient/SshCommandClient.java b/java-scpclient/src/main/java/cz/it4i/fiji/scpclient/SshCommandClient.java
index 78c54aee..b4a097ef 100644
--- a/java-scpclient/src/main/java/cz/it4i/fiji/scpclient/SshCommandClient.java
+++ b/java-scpclient/src/main/java/cz/it4i/fiji/scpclient/SshCommandClient.java
@@ -49,11 +49,17 @@ public class SshCommandClient extends AbstractBaseSshClient {
 			channelExec.connect();
 
 			BufferedReader reader = new BufferedReader(new InputStreamReader(in));
+			BufferedReader errReader = new BufferedReader(new InputStreamReader(
+				channelExec.getErrStream()));
 			String line;
 
 			while ((line = reader.readLine()) != null) {
 				result.add(line);
 			}
+			List<String> errors = new LinkedList<>();
+			while ((line = errReader.readLine()) != null) {
+				errors.add(line);
+			}
 
 			int exitStatus = channelExec.getExitStatus();
 			channelExec.disconnect();
@@ -62,7 +68,8 @@ public class SshCommandClient extends AbstractBaseSshClient {
 				log.debug("Done, but exit status not set!");
 			}
 			else if (exitStatus > 0) {
-				log.debug("Done, but with error!");
+				log.debug("Done, but with error! ");
+				throw new SshExecuteCommandException(exitStatus, result, errors);
 			}
 			else {
 				log.debug("Done!");
diff --git a/java-scpclient/src/main/java/cz/it4i/fiji/scpclient/SshExecuteCommandException.java b/java-scpclient/src/main/java/cz/it4i/fiji/scpclient/SshExecuteCommandException.java
new file mode 100644
index 00000000..052ec9d9
--- /dev/null
+++ b/java-scpclient/src/main/java/cz/it4i/fiji/scpclient/SshExecuteCommandException.java
@@ -0,0 +1,36 @@
+
+package cz.it4i.fiji.scpclient;
+
+import com.jcraft.jsch.JSchException;
+
+import java.util.List;
+
+public class SshExecuteCommandException extends JSchException {
+
+	private int exitStatus;
+	private List<String> stdout;
+	private List<String> stderr;
+
+	public SshExecuteCommandException(int exitStatus, List<String> stdout,
+		List<String> stderr)
+	{
+		super("exitStatus: " + exitStatus + ", error output: " + String.join("\n",
+			stderr));
+		this.exitStatus = exitStatus;
+		this.stdout = stdout;
+		this.stderr = stderr;
+	}
+
+	public int getExitStatus() {
+		return exitStatus;
+	}
+
+	public List<String> getStdout() {
+		return stdout;
+	}
+
+	public List<String> getStderr() {
+		return stderr;
+	}
+
+}
-- 
GitLab