diff options
author | SimonBrandhof <simon.brandhof@gmail.com> | 2013-04-04 16:30:01 +0200 |
---|---|---|
committer | SimonBrandhof <simon.brandhof@gmail.com> | 2013-04-04 16:30:01 +0200 |
commit | ffe66f347edd4ef1aa6cfb58d4614223dcf8ab79 (patch) | |
tree | f47d40790fd83d018b91b75480b1ff0194840959 /sonar-runner-api | |
parent | 0aba058c75832c2db746f09604a4ea467074a088 (diff) | |
download | sonar-scanner-cli-ffe66f347edd4ef1aa6cfb58d4614223dcf8ab79.tar.gz sonar-scanner-cli-ffe66f347edd4ef1aa6cfb58d4614223dcf8ab79.zip |
SONARPLUGINS-2574 ability to subscribe to output
Diffstat (limited to 'sonar-runner-api')
5 files changed, 96 insertions, 36 deletions
diff --git a/sonar-runner-api/src/main/java/org/sonar/runner/api/CommandExecutor.java b/sonar-runner-api/src/main/java/org/sonar/runner/api/CommandExecutor.java index e3ac470..4c87cfe 100644 --- a/sonar-runner-api/src/main/java/org/sonar/runner/api/CommandExecutor.java +++ b/sonar-runner-api/src/main/java/org/sonar/runner/api/CommandExecutor.java @@ -25,12 +25,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; +import java.util.concurrent.*; /** * Synchronously execute a native command line. It's much more limited than the Apache Commons Exec library. @@ -109,15 +104,6 @@ class CommandExecutor { } } - /** - * Execute command and display error and output streams in log. - * Method {@link #execute(Command, StreamConsumer, StreamConsumer, long)} is preferable, - * when fine-grained control of output of command required. - */ - int execute(Command command, long timeoutMilliseconds) { - return execute(command, new DefaultConsumer(), new DefaultConsumer(), timeoutMilliseconds); - } - private void closeStreams(Process process) { if (process != null) { IOUtils.closeQuietly(process.getInputStream()); @@ -181,15 +167,4 @@ class CommandExecutor { return exception; } } - - - interface StreamConsumer { - void consumeLine(String line); - } - - private static class DefaultConsumer implements StreamConsumer { - public void consumeLine(String line) { - System.out.println(line); - } - } } diff --git a/sonar-runner-api/src/main/java/org/sonar/runner/api/ForkedRunner.java b/sonar-runner-api/src/main/java/org/sonar/runner/api/ForkedRunner.java index 3e77267..8dca9fe 100644 --- a/sonar-runner-api/src/main/java/org/sonar/runner/api/ForkedRunner.java +++ b/sonar-runner-api/src/main/java/org/sonar/runner/api/ForkedRunner.java @@ -36,7 +36,7 @@ public class ForkedRunner extends Runner<ForkedRunner> { private final Map<String, String> jvmEnvVariables = new HashMap<String, String>(); private final List<String> jvmArguments = new ArrayList<String>(); private String javaCommand; - + private StreamConsumer stdOut = null, stdErr = null; private final JarExtractor jarExtractor; ForkedRunner(JarExtractor jarExtractor) { @@ -71,6 +71,22 @@ public class ForkedRunner extends Runner<ForkedRunner> { return this; } + /** + * Subscribe to the standard output. By default output is {@link System.out} + */ + public ForkedRunner setStdOut(@Nullable StreamConsumer stream) { + this.stdOut = stream; + return this; + } + + /** + * Subscribe to the error output. By default output is {@link System.err} + */ + public ForkedRunner setStdErr(@Nullable StreamConsumer stream) { + this.stdErr = stream; + return this; + } + @Override protected void doExecute() { fork(createCommand()); @@ -108,9 +124,16 @@ public class ForkedRunner extends Runner<ForkedRunner> { } private void fork(Command command) { - int status = CommandExecutor.create().execute(command, ONE_DAY_IN_MILLISECONDS); + if (stdOut == null) { + stdOut = new PrintStreamConsumer(System.out); + } + if (stdErr == null) { + stdErr = new PrintStreamConsumer(System.err); + } + int status = CommandExecutor.create().execute(command, stdOut, stdErr, ONE_DAY_IN_MILLISECONDS); if (status != 0) { throw new IllegalStateException("TODO"); } } + } diff --git a/sonar-runner-api/src/main/java/org/sonar/runner/api/PrintStreamConsumer.java b/sonar-runner-api/src/main/java/org/sonar/runner/api/PrintStreamConsumer.java new file mode 100644 index 0000000..e64ba7c --- /dev/null +++ b/sonar-runner-api/src/main/java/org/sonar/runner/api/PrintStreamConsumer.java @@ -0,0 +1,34 @@ +/* + * Sonar Runner - API + * Copyright (C) 2011 SonarSource + * dev@sonar.codehaus.org + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.runner.api; + +import java.io.PrintStream; + +public class PrintStreamConsumer implements StreamConsumer { + private final PrintStream output; + + public PrintStreamConsumer(PrintStream output) { + this.output = output; + } + + public void consumeLine(String line) { + output.println(line); + } +} diff --git a/sonar-runner-api/src/main/java/org/sonar/runner/api/StreamConsumer.java b/sonar-runner-api/src/main/java/org/sonar/runner/api/StreamConsumer.java new file mode 100644 index 0000000..7eac938 --- /dev/null +++ b/sonar-runner-api/src/main/java/org/sonar/runner/api/StreamConsumer.java @@ -0,0 +1,24 @@ +/* + * Sonar Runner - API + * Copyright (C) 2011 SonarSource + * dev@sonar.codehaus.org + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.runner.api; + +public interface StreamConsumer { + void consumeLine(String line); +} diff --git a/sonar-runner-api/src/test/java/org/sonar/runner/api/CommandExecutorTest.java b/sonar-runner-api/src/test/java/org/sonar/runner/api/CommandExecutorTest.java index d63a6a3..2d7cb97 100644 --- a/sonar-runner-api/src/test/java/org/sonar/runner/api/CommandExecutorTest.java +++ b/sonar-runner-api/src/test/java/org/sonar/runner/api/CommandExecutorTest.java @@ -44,7 +44,9 @@ public class CommandExecutorTest { @Rule public ExpectedException thrown = ExpectedException.none(); - private File workDir; + PrintStreamConsumer stdout = new PrintStreamConsumer(System.out); + PrintStreamConsumer stderr = new PrintStreamConsumer(System.err); + File workDir; @Before public void setUp() throws IOException { @@ -54,13 +56,13 @@ public class CommandExecutorTest { @Test public void should_consume_StdOut_and_StdErr() throws Exception { final StringBuilder stdOutBuilder = new StringBuilder(); - CommandExecutor.StreamConsumer stdOutConsumer = new CommandExecutor.StreamConsumer() { + StreamConsumer stdOutConsumer = new StreamConsumer() { public void consumeLine(String line) { stdOutBuilder.append(line).append(System.getProperty("line.separator")); } }; final StringBuilder stdErrBuilder = new StringBuilder(); - CommandExecutor.StreamConsumer stdErrConsumer = new CommandExecutor.StreamConsumer() { + StreamConsumer stdErrConsumer = new StreamConsumer() { public void consumeLine(String line) { stdErrBuilder.append(line).append(System.getProperty("line.separator")); } @@ -93,13 +95,13 @@ public class CommandExecutorTest { CommandExecutor.create().execute(command, NOP_CONSUMER, BAD_CONSUMER, 1000L); } - private static final CommandExecutor.StreamConsumer NOP_CONSUMER = new CommandExecutor.StreamConsumer() { + private static final StreamConsumer NOP_CONSUMER = new StreamConsumer() { public void consumeLine(String line) { // nop } }; - private static final CommandExecutor.StreamConsumer BAD_CONSUMER = new CommandExecutor.StreamConsumer() { + private static final StreamConsumer BAD_CONSUMER = new StreamConsumer() { public void consumeLine(String line) { throw new RuntimeException(); } @@ -113,7 +115,7 @@ public class CommandExecutorTest { .addArguments("1") .setEnvVariable("ENVVAR", "2") .build(); - int exitCode = CommandExecutor.create().execute(command, 1000L); + int exitCode = CommandExecutor.create().execute(command, stdout, stderr, 1000L); assertThat(exitCode).isEqualTo(0); File logFile = new File(workDir, "echo.log"); assertThat(logFile).exists(); @@ -128,7 +130,8 @@ public class CommandExecutorTest { String executable = getScript("forever"); long start = System.currentTimeMillis(); try { - CommandExecutor.create().execute(Command.builder().setExecutable(executable).setDirectory(workDir).build(), 300L); + Command command = Command.builder().setExecutable(executable).setDirectory(workDir).build(); + CommandExecutor.create().execute(command, stdout, stderr, 300L); fail(); } catch (CommandException e) { long duration = System.currentTimeMillis() - start; @@ -141,7 +144,8 @@ public class CommandExecutorTest { @Test public void should_fail_if_script_not_found() { thrown.expect(CommandException.class); - CommandExecutor.create().execute(Command.builder().setExecutable("notfound").setDirectory(workDir).build(), 1000L); + Command command = Command.builder().setExecutable("notfound").setDirectory(workDir).build(); + CommandExecutor.create().execute(command, stdout, stderr, 1000L); } private static String getScript(String name) throws IOException { |