Skip to content

Commit

Permalink
[executeCommandLine] should return STDERR if STDOUT is empty (openhab…
Browse files Browse the repository at this point in the history
…#2114)

Signed-off-by: Andrew Fiddian-Green <[email protected]>
  • Loading branch information
andrewfg authored Jan 16, 2021
1 parent 074bd7a commit 127724c
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,8 @@ public static void executeCommandLine(String... commandLine) {

Process processTemp = null;
Future<String> outputFuture = null;
Future<String> errorFuture = null;
cleanup: try {
Process process = processTemp = new ProcessBuilder(commandLine).start();
Process process = processTemp = new ProcessBuilder(commandLine).redirectErrorStream(true).start();

outputFuture = executor.submit(() -> {
try (InputStream inputStream = process.getInputStream();
Expand All @@ -91,32 +90,13 @@ public static void executeCommandLine(String... commandLine) {
}
});

errorFuture = executor.submit(() -> {
try (InputStream inputStream = process.getErrorStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
StringWriter output = new StringWriter();
reader.transferTo(output);
return output.toString();
}
});
int exitCode;
if (timeout == null) {
exitCode = process.waitFor();
} else if (process.waitFor(timeout.toMillis(), TimeUnit.MILLISECONDS)) {
exitCode = process.exitValue();
} else {
process.waitFor();
} else if (!process.waitFor(timeout.toMillis(), TimeUnit.MILLISECONDS)) {
logger.warn("Timeout occurred when executing commandLine '{}'", Arrays.toString(commandLine));
break cleanup;
}
if (exitCode == 0) {
return outputFuture.get();
} else {
if (logger.isDebugEnabled()) {
logger.debug("exit code '{}', result '{}', errors '{}'", exitCode, outputFuture.get(),
errorFuture.get());
}
return errorFuture.get();
}
return outputFuture.get();
} catch (ExecutionException e) {
if (logger.isDebugEnabled()) {
logger.warn("Error occurred when executing commandLine '{}'", Arrays.toString(commandLine),
Expand All @@ -139,9 +119,6 @@ public static void executeCommandLine(String... commandLine) {
if (outputFuture != null) {
outputFuture.cancel(true);
}
if (errorFuture != null) {
errorFuture.cancel(true);
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,17 @@ private boolean isWindowsSystem() {
String osName = System.getProperty("os.name").toLowerCase();
return osName.indexOf("windows") >= 0;
}

@Test
public void testExecuteCommandLineAndWaitStdErrRedirection() {
final String result;
if (isWindowsSystem()) {
result = ExecUtil.executeCommandLineAndWaitResponse(Duration.ofSeconds(1), "cmd", "/c", "dir", "xxx.xxx",
"1>", "nul");
} else {
result = ExecUtil.executeCommandLineAndWaitResponse(Duration.ofSeconds(1), "ls", "xxx.xxx");
}
assertNotNull(result);
assertNotEquals("", result);
}
}

0 comments on commit 127724c

Please sign in to comment.