aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-runner-api
diff options
context:
space:
mode:
authorSimonBrandhof <simon.brandhof@gmail.com>2013-04-04 16:30:01 +0200
committerSimonBrandhof <simon.brandhof@gmail.com>2013-04-04 16:30:01 +0200
commitffe66f347edd4ef1aa6cfb58d4614223dcf8ab79 (patch)
treef47d40790fd83d018b91b75480b1ff0194840959 /sonar-runner-api
parent0aba058c75832c2db746f09604a4ea467074a088 (diff)
downloadsonar-scanner-cli-ffe66f347edd4ef1aa6cfb58d4614223dcf8ab79.tar.gz
sonar-scanner-cli-ffe66f347edd4ef1aa6cfb58d4614223dcf8ab79.zip
SONARPLUGINS-2574 ability to subscribe to output
Diffstat (limited to 'sonar-runner-api')
-rw-r--r--sonar-runner-api/src/main/java/org/sonar/runner/api/CommandExecutor.java27
-rw-r--r--sonar-runner-api/src/main/java/org/sonar/runner/api/ForkedRunner.java27
-rw-r--r--sonar-runner-api/src/main/java/org/sonar/runner/api/PrintStreamConsumer.java34
-rw-r--r--sonar-runner-api/src/main/java/org/sonar/runner/api/StreamConsumer.java24
-rw-r--r--sonar-runner-api/src/test/java/org/sonar/runner/api/CommandExecutorTest.java20
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 {