From 4d7933d93151bc4f99e27fbeef6eb6efb0b9b755 Mon Sep 17 00:00:00 2001 From: Fabrice Bellingard Date: Fri, 7 Sep 2012 16:29:44 +0200 Subject: [PATCH] Improve API and its documentation. --- src/main/java/org/sonar/runner/Main.java | 17 +++++- src/main/java/org/sonar/runner/Runner.java | 52 ++++++++++++++++--- .../java/org/sonar/runner/RunnerTest.java | 28 ++++++++-- 3 files changed, 84 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/sonar/runner/Main.java b/src/main/java/org/sonar/runner/Main.java index 83f989c..89c8dcf 100644 --- a/src/main/java/org/sonar/runner/Main.java +++ b/src/main/java/org/sonar/runner/Main.java @@ -44,6 +44,11 @@ import java.util.Properties; */ public final class Main { + private static final String RUNNER_HOME = "runner.home"; + private static final String RUNNER_SETTINGS = "runner.settings"; + private static final String PROJECT_HOME = "project.home"; + private static final String PROJECT_SETTINGS = "project.settings"; + private static boolean debugMode = false; public static void main(String[] args) { @@ -106,11 +111,19 @@ public final class Main { result.putAll(loadRunnerProperties(commandLineProps)); result.putAll(loadProjectProperties(commandLineProps)); result.putAll(commandLineProps); + + if (result.contains(PROJECT_HOME)) { + // the real property of the Sonar Runner is "sonar.projectDir" + String baseDir = result.getProperty(PROJECT_HOME); + result.remove(PROJECT_HOME); + result.put(Runner.PROPERTY_PROJECT_DIR, baseDir); + } + return result; } static Properties loadRunnerProperties(Properties props) { - File settingsFile = locatePropertiesFile(props, "runner.home", "conf/sonar-runner.properties", "runner.settings"); + File settingsFile = locatePropertiesFile(props, RUNNER_HOME, "conf/sonar-runner.properties", RUNNER_SETTINGS); if (settingsFile != null && settingsFile.isFile() && settingsFile.exists()) { log("Runner configuration file: " + settingsFile.getAbsolutePath()); return toProperties(settingsFile); @@ -121,7 +134,7 @@ public final class Main { } static Properties loadProjectProperties(Properties props) { - File settingsFile = locatePropertiesFile(props, "project.home", "sonar-project.properties", "project.settings"); + File settingsFile = locatePropertiesFile(props, PROJECT_HOME, "sonar-project.properties", PROJECT_SETTINGS); if (settingsFile != null && settingsFile.isFile() && settingsFile.exists()) { log("Project configuration file: " + settingsFile.getAbsolutePath()); return toProperties(settingsFile); diff --git a/src/main/java/org/sonar/runner/Runner.java b/src/main/java/org/sonar/runner/Runner.java index ec7f8ae..85197d6 100644 --- a/src/main/java/org/sonar/runner/Runner.java +++ b/src/main/java/org/sonar/runner/Runner.java @@ -32,14 +32,25 @@ import java.net.URL; import java.util.Properties; /** + *

+ * Sonar Runner class that can be used to launch Sonar analyses. + *

+ *

+ * Configuration is all done through properties: + *

+ * + * * @since 1.1 */ public final class Runner { - public static final String PROPERTY_PROJECT_DIR = "sonar.runner.projectDir"; - public static final String PROPERTY_ENVIRONMENT_INFORMATION_KEY = "sonar.environment.information.key"; - public static final String PROPERTY_ENVIRONMENT_INFORMATION_VERSION = "sonar.environment.information.version"; - /** * @deprecated Replaced by sonar.verbose since 1.2 */ @@ -57,6 +68,21 @@ public final class Runner { public static final String PROPERTY_WORK_DIRECTORY = "sonar.working.directory"; public static final String DEF_VALUE_WORK_DIRECTORY = ".sonar"; + /** + * @since 1.5 + */ + public static final String PROPERTY_PROJECT_DIR = "sonar.projectDir"; + + /** + * @since 1.5 + */ + public static final String PROPERTY_ENVIRONMENT_INFORMATION_KEY = "sonar.environment.information.key"; + + /** + * @since 1.5 + */ + public static final String PROPERTY_ENVIRONMENT_INFORMATION_VERSION = "sonar.environment.information.version"; + /** * Array of prefixes of versions of Sonar without support of this runner. */ @@ -75,10 +101,24 @@ public final class Runner { initDirs(); } + /** + * Creates a Runner based only on the given properties. + */ public static Runner create(Properties props) { return new Runner(props); } + /** + * Creates a Runner based only on the properties and with the given base directory. + */ + public static Runner create(Properties props, File basedir) { + props.put(PROPERTY_PROJECT_DIR, basedir.getAbsolutePath()); + return new Runner(props); + } + + /** + * Runs a Sonar analysis. + */ public void execute() { Bootstrapper bootstrapper = new Bootstrapper("SonarRunner/" + SonarRunnerVersion.getVersion(), getSonarServerURL(), getWorkDir()); checkSonarVersion(bootstrapper); @@ -90,9 +130,9 @@ public final class Runner { } private void initDirs() { - String path = properties.getProperty("project.home", "."); + String path = properties.getProperty(PROPERTY_PROJECT_DIR, "."); projectDir = new File(path); - if (!projectDir.isDirectory() || !projectDir.exists()) { + if (!projectDir.isDirectory()) { throw new RunnerException("Project home must be an existing directory: " + path); } // project home exists: add its absolute path as "sonar.runner.projectDir" property diff --git a/src/test/java/org/sonar/runner/RunnerTest.java b/src/test/java/org/sonar/runner/RunnerTest.java index cd97858..7c5bd7d 100644 --- a/src/test/java/org/sonar/runner/RunnerTest.java +++ b/src/test/java/org/sonar/runner/RunnerTest.java @@ -24,6 +24,7 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.sonar.runner.bootstrapper.BootstrapException; import org.sonar.runner.bootstrapper.Bootstrapper; +import org.sonar.test.TestUtils; import java.io.File; import java.util.Properties; @@ -79,10 +80,10 @@ public class RunnerTest { @Test public void shouldInitDirs() throws Exception { Properties props = new Properties(); - File home = new File(getClass().getResource("/org/sonar/runner/RunnerTest/shouldInitDirs/").toURI()); - props.setProperty("project.home", home.getCanonicalPath()); + File home = TestUtils.getResource(this.getClass(), "shouldInitDirs"); + props.setProperty(Runner.PROPERTY_PROJECT_DIR, home.getCanonicalPath()); Runner runner = Runner.create(props); - assertThat(runner.getProperties().get("project.home")).isEqualTo(home.getCanonicalPath()); + assertThat(runner.getProperties().get(Runner.PROPERTY_PROJECT_DIR)).isEqualTo(home.getCanonicalPath()); assertThat(runner.getProjectDir()).isEqualTo(home); assertThat(runner.getWorkDir()).isEqualTo(new File(home, ".sonar")); @@ -96,6 +97,23 @@ public class RunnerTest { assertThat(runner.getProjectDir().exists()).isTrue(); } + @Test + public void shouldSetValidBaseDirOnConstructor() { + File baseDir = TestUtils.getResource(this.getClass(), "shouldInitDirs"); + Runner runner = Runner.create(new Properties(), baseDir); + assertThat(runner.getProjectDir()).isEqualTo(baseDir); + } + + @Test + public void shouldFailIfBaseDirDoesNotExist() { + File fakeBasedir = new File("fake"); + + thrown.expect(RunnerException.class); + thrown.expectMessage("Project home must be an existing directory: " + fakeBasedir.getAbsolutePath()); + + Runner.create(new Properties(), fakeBasedir); + } + @Test public void shouldSpecifyWorkingDirectory() { Properties properties = new Properties(); @@ -105,12 +123,12 @@ public class RunnerTest { // empty string properties.setProperty(Runner.PROPERTY_WORK_DIRECTORY, " "); runner = Runner.create(properties); - assertThat(runner.getWorkDir()).isEqualTo(new File(".", ".sonar")); + assertThat(runner.getWorkDir()).isEqualTo(new File(".", ".sonar").getAbsoluteFile()); // real relative path properties.setProperty(Runner.PROPERTY_WORK_DIRECTORY, "temp-dir"); runner = Runner.create(properties); - assertThat(runner.getWorkDir()).isEqualTo(new File(".", "temp-dir")); + assertThat(runner.getWorkDir()).isEqualTo(new File(".", "temp-dir").getAbsoluteFile()); // real asbolute path properties.setProperty(Runner.PROPERTY_WORK_DIRECTORY, new File("target").getAbsolutePath()); -- 2.39.5