]> source.dussan.org Git - sonar-scanner-cli.git/commitdiff
SONAR-RUNNER
authorEvgeny Mandrikov <mandrikov@gmail.com>
Thu, 3 Feb 2011 05:11:51 +0000 (05:11 +0000)
committerEvgeny Mandrikov <mandrikov@gmail.com>
Thu, 3 Feb 2011 05:11:51 +0000 (05:11 +0000)
src/it/example/pom.xml [new file with mode: 0644]
src/it/example/sonar-project.properties
src/it/example/src/main/java/HelloWorld.java [new file with mode: 0644]
src/it/example/src/org/sonar/cli/example/HelloWorld.java [deleted file]
src/main/assembly/bin/sonar-runner.sh
src/main/assembly/conf/sonar-runner.properties
src/main/java/org/sonar/runner/Launcher.java
src/main/java/org/sonar/runner/Main.java

diff --git a/src/it/example/pom.xml b/src/it/example/pom.xml
new file mode 100644 (file)
index 0000000..8789ee4
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.example</groupId>
+  <artifactId>example</artifactId>
+  <version>0.1-SNAPSHOT</version>
+
+</project>
index f02c99868889abe943605851401f4dc59936695e..5ebbca2f4a527aae286de3b676f9c92543d00960 100644 (file)
@@ -1,10 +1,3 @@
 sonar.projectKey=my:project
 sonar.projectName=My project
 sonar.projectVersion=1.0
-
-#project.sources=src/main/java
-#project.sources=src/main/resources
-#project.binaries=output/classes
-#project.language=java
-#sonar.dynamicAnalysis=reuseReports
-#sonar.surefire.reports=output/junit/
diff --git a/src/it/example/src/main/java/HelloWorld.java b/src/it/example/src/main/java/HelloWorld.java
new file mode 100644 (file)
index 0000000..4d4bbb8
--- /dev/null
@@ -0,0 +1,5 @@
+class HelloWorld {
+  public void sayHello() {
+    System.out.println("Hello world");
+  }
+}
diff --git a/src/it/example/src/org/sonar/cli/example/HelloWorld.java b/src/it/example/src/org/sonar/cli/example/HelloWorld.java
deleted file mode 100644 (file)
index beed553..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.sonar.cli.example;
-
-class HelloWorld {
-  public void sayHello() {
-    System.out.println("Hello world");
-  }
-}
index abad57b73ab6850621148de712de7e270f91b7f9..1012948ae9b3fce3fff28a322dd5ef4a7fca934b 100755 (executable)
@@ -17,9 +17,9 @@ JAVACMD="`which java`"
 JAVACLASSPATH="${SONAR_RUNNER_HOME}"/lib/sonar-runner.jar
 JAVACLASSPATH=$JAVACLASSPATH:"${SONAR_RUNNER_HOME}"/lib/sonar-batch-bootstrapper.jar
 
-echo "Info: Using sonar-runner at $SONAR_RUNNER_HOME"
-echo "Info: Using java at $JAVACMD"
-echo "Info: Using classpath $JAVACLASSPATH"
+#echo "Info: Using sonar-runner at $SONAR_RUNNER_HOME"
+#echo "Info: Using java at $JAVACMD"
+#echo "Info: Using classpath $JAVACLASSPATH"
 
 exec "$JAVACMD" \
   -classpath $JAVACLASSPATH \
index 58e14fd69c8ed355a5674e44e347ffc47374cafe..5f016220a2fd0c1a154954092d415bcd633cb59c 100644 (file)
@@ -1,3 +1,11 @@
+#----- Default directory layout
+sources=src/main/java
+tests=src/test/java
+binaries=target/classes
+
+sonar.sourceEncoding=UTF-8
+
+#----- Default Sonar server
 #sonar.host.url=http://localhost:9000
 
 #----- PostgreSQL
index 04deaaba58e2d9d9a081ad885675b2cd1a6513e3..72f89a0dd4f2f469d35606bd9126cc6b5a05b31c 100644 (file)
@@ -25,6 +25,7 @@ import ch.qos.logback.classic.joran.JoranConfigurator;
 import ch.qos.logback.core.joran.spi.JoranException;
 import org.apache.commons.configuration.*;
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.LoggerFactory;
 import org.sonar.api.platform.Environment;
 import org.sonar.api.utils.SonarException;
@@ -65,8 +66,7 @@ public class Launcher {
     jc.setContext(context);
     context.reset();
     InputStream input = Batch.class.getResourceAsStream("/org/sonar/batch/logback.xml");
-    // System.setProperty("ROOT_LOGGER_LEVEL", getLog().isDebugEnabled() ? "DEBUG" : "INFO");
-    System.setProperty("ROOT_LOGGER_LEVEL", "INFO");
+    System.setProperty("ROOT_LOGGER_LEVEL", task.isDebugEnabled() ? "DEBUG" : "INFO");
     try {
       jc.doConfigure(input);
 
@@ -82,14 +82,25 @@ public class Launcher {
     File baseDir = task.getProjectDir();
     Properties properties = task.getProperties();
     ProjectDefinition definition = new ProjectDefinition(baseDir, task.getWorkDir(), properties);
-    // TODO for some reason it can't be relative
-    definition.addSourceDir(new File(baseDir, "src").getAbsolutePath()); // TODO hard-coded value
-    // TODO definition.addTestDir(path);
-    // TODO definition.addBinaryDir(path);
-    // TODO definition.addLibrary(path);
+    for (String dir : getList(properties, "sources")) {
+      definition.addSourceDir(dir);
+    }
+    for (String dir : getList(properties, "tests")) {
+      definition.addTestDir(dir);
+    }
+    for (String dir : getList(properties, "binaries")) {
+      definition.addBinaryDir(dir);
+    }
+    for (String file : getList(properties, "libraries")) {
+      definition.addLibrary(file);
+    }
     return definition;
   }
 
+  private String[] getList(Properties properties, String key) {
+    return StringUtils.split(properties.getProperty(key, ""), ',');
+  }
+
   private Configuration getInitialConfiguration(ProjectDefinition project) {
     CompositeConfiguration configuration = new CompositeConfiguration();
     configuration.addConfiguration(new SystemConfiguration());
index eb38033ab88d9326c36251e82a167862d0185861..ba4c63e3f762af98ce0f317ddae393242017be34 100644 (file)
@@ -30,29 +30,41 @@ import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Properties;
 
 public class Main {
 
-  private String[] args;
+  private static boolean debug = false;
 
   private File workDir;
-
-  private Properties properties;
-
+  private Properties properties = new Properties();
   private Bootstrapper bootstrapper;
 
-  public static void main(String[] args) throws Exception {
-    new Main(args).execute();
+  public static void main(String[] args) {
+    log("Sonar Standalone Runner version: " + getRunnerVersion());
+    Map<String, String> cmdProps = parseArguments(args);
+    new Main().execute(cmdProps);
   }
 
-  public Main(String[] args) {
-    this.args = args;
+  public void execute(Map<String, String> cmdProps) {
     String home = System.getProperty("runner.home");
-    properties = new Properties();
+    // Load global configuration
     loadProperties(new File(home + "/conf/sonar-runner.properties"));
+    // Load project configuration
     loadProperties(new File(getProjectDir(), "sonar-project.properties"));
-    // TODO load properties from command-line
+    // Load properties from command-line
+    for (Map.Entry<String, String> entry : cmdProps.entrySet()) {
+      properties.setProperty(entry.getKey(), entry.getValue());
+    }
+
+    String serverUrl = properties.getProperty("sonar.host.url", "http://localhost:9000");
+    log("Sonar server: " + serverUrl);
+    log("Sonar work directory: " + getWorkDir().getAbsolutePath());
+    bootstrapper = new Bootstrapper(serverUrl, getWorkDir());
+    checkSonarVersion();
+    delegateExecution(createClassLoader());
   }
 
   /**
@@ -79,12 +91,16 @@ public class Main {
     return properties;
   }
 
+  public boolean isDebugEnabled() {
+    return debug;
+  }
+
   /**
    * Loads {@link Launcher} from specified {@link BootstrapClassLoader} and passes control to it.
    * 
    * @see Launcher#execute()
    */
-  private void delegateExecution(BootstrapClassLoader sonarClassLoader) throws Exception {
+  private void delegateExecution(BootstrapClassLoader sonarClassLoader) {
     ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
     try {
       Thread.currentThread().setContextClassLoader(sonarClassLoader);
@@ -121,16 +137,6 @@ public class Main {
     }
   }
 
-  public void execute() throws Exception {
-    String serverUrl = properties.getProperty("sonar.host.url", "http://localhost:9000");
-    log("Sonar Standalone Runner version: " + getRunnerVersion());
-    log("Sonar server: " + serverUrl);
-    log("Sonar work directory: " + getWorkDir().getAbsolutePath());
-    bootstrapper = new Bootstrapper(serverUrl, getWorkDir());
-    checkSonarVersion();
-    delegateExecution(createClassLoader());
-  }
-
   private void checkSonarVersion() {
     String serverVersion = bootstrapper.getServerVersion();
     log("Sonar version: " + serverVersion);
@@ -176,7 +182,55 @@ public class Main {
     }
   }
 
-  private void log(String message) {
-    System.out.println(message);
+  private static Map<String, String> parseArguments(String[] args) {
+    HashMap<String, String> cmdProps = new HashMap<String, String>();
+    for (int i = 0; i < args.length; i++) {
+      String arg = args[i];
+      if ("-h".equals(arg) || "--help".equals(arg)) {
+        printUsage();
+      } else if ("-X".equals(arg) || "--debug".equals(arg)) {
+        debug = true;
+      } else if ("-D".equals(arg) || "--define".equals(arg)) {
+        i++;
+        if (i >= args.length) {
+          printError("Missing argument for option --define");
+        }
+        arg = args[i];
+        final String key, value;
+        int j = arg.indexOf('=');
+        if (j == -1) {
+          key = arg;
+          value = "true";
+        } else {
+          key = arg.substring(0, j);
+          value = arg.substring(j + 1);
+        }
+        cmdProps.put(key, value);
+      } else {
+        printError("Unrecognized option: " + arg);
+      }
+    }
+    return cmdProps;
+  }
+
+  private static void printUsage() {
+    log("");
+    log("usage: sonar-runner [options]");
+    log("");
+    log("Options:");
+    log(" -h,--help             Display help information");
+    log(" -X,--debug            Produce execution debug output");
+    log(" -D,--define <arg>     Define property");
+    System.exit(0); // NOSONAR
+  }
+
+  private static void printError(String message) {
+    log("");
+    log(message);
+    printUsage();
+  }
+
+  private static void log(String message) {
+    System.out.println(message); // NOSONAR
   }
 }