]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-1772: Execute findbugs in separate thread and terminate after "sonar.findbugs...
authorGodin <mandrikov@gmail.com>
Mon, 18 Oct 2010 16:53:34 +0000 (16:53 +0000)
committerGodin <mandrikov@gmail.com>
Mon, 18 Oct 2010 16:53:34 +0000 (16:53 +0000)
plugins/sonar-findbugs-plugin/src/main/java/org/sonar/plugins/findbugs/FindbugsConfiguration.java
plugins/sonar-findbugs-plugin/src/main/java/org/sonar/plugins/findbugs/FindbugsConstants.java
plugins/sonar-findbugs-plugin/src/main/java/org/sonar/plugins/findbugs/FindbugsExecutor.java
plugins/sonar-findbugs-plugin/src/test/java/org/sonar/plugins/findbugs/FindbugsExecutorTest.java

index 7969741cdb6c0c4cceaa5ae2f1ec80b0d2642199..7d0510c685533733d15d51c7e1860e2bfc4280c0 100644 (file)
@@ -72,4 +72,8 @@ public class FindbugsConfiguration implements BatchExtension {
   public String getEffort() {
     return StringUtils.lowerCase(project.getConfiguration().getString(CoreProperties.FINDBUGS_EFFORT_PROPERTY, CoreProperties.FINDBUGS_EFFORT_DEFAULT_VALUE));
   }
+
+  public long getTimeout() {
+    return project.getConfiguration().getLong(CoreProperties.FINDBUGS_TIMEOUT_PROPERTY, FindbugsConstants.FINDBUGS_TIMEOUT_DEFAULT_VALUE);
+  }
 }
index 363cf01ddf2116a9be04d224b76727b7bb2adbea..69d72ee3e13c92ce24f82daa6f90f0304e2d84d8 100644 (file)
@@ -33,4 +33,5 @@ public final class FindbugsConstants {
    */
   public static final String GENERATE_XML_KEY = "sonar.findbugs.generateXml";
   public static final boolean GENERATE_XML_DEFAULT_VALUE = true; // TODO should be false
+  public static final long FINDBUGS_TIMEOUT_DEFAULT_VALUE = 600000;
 }
index 8953f01327043f6881a86dad102faacc6763d0a1..cc9cc188b3e5b925e4309c3dcd8faedc19adfc96 100644 (file)
@@ -16,6 +16,9 @@ import edu.umd.cs.findbugs.config.UserPreferences;
 import java.io.File;
 import java.io.OutputStream;
 import java.io.PrintStream;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @since 2.4
@@ -70,7 +73,9 @@ public class FindbugsExecutor implements BatchExtension {
 
       engine.finishSettings();
 
-      engine.execute();
+      Executors.newSingleThreadExecutor()
+        .submit(new FindbugsTask(engine))
+        .get(configuration.getTimeout(), TimeUnit.MILLISECONDS);
 
       profiler.stop();
       return xmlReport;
@@ -82,4 +87,16 @@ public class FindbugsExecutor implements BatchExtension {
     }
   }
 
+  private class FindbugsTask implements Callable<Object> {
+    private FindBugs2 engine;
+
+    public FindbugsTask(FindBugs2 engine) {
+      this.engine = engine;
+    }
+
+    public Object call() throws Exception {
+      engine.execute();
+      return null;
+    }
+  }
 }
index 6d8801b985a2a7da614a8d885fb3eb2df4ac88d1..a8077941984258b04eb237ab1048ef6a5736a2fc 100644 (file)
@@ -2,6 +2,7 @@ package org.sonar.plugins.findbugs;
 
 import org.apache.commons.io.FileUtils;
 import org.junit.Test;
+import org.sonar.api.utils.SonarException;
 
 import edu.umd.cs.findbugs.Project;
 
@@ -20,13 +21,21 @@ public class FindbugsExecutorTest {
     FindbugsConfiguration conf = mockConf();
     File report = new File("target/test-tmp/findbugs-report.xml");
     when(conf.getTargetXMLReport()).thenReturn(report);
-    FindbugsExecutor executor = new FindbugsExecutor(conf);
-    executor.execute();
+
+    new FindbugsExecutor(conf).execute();
 
     assertThat(report.exists(), is(true));
     assertThat(FileUtils.readFileToString(report), containsString("<BugInstance"));
   }
 
+  @Test(expected = SonarException.class)
+  public void shouldTerminateOnTimeout() throws Exception {
+    FindbugsConfiguration conf = mockConf();
+    when(conf.getTimeout()).thenReturn(1L);
+
+    new FindbugsExecutor(conf).execute();
+  }
+
   private FindbugsConfiguration mockConf() throws Exception {
     FindbugsConfiguration conf = mock(FindbugsConfiguration.class);
     Project project = new Project();
@@ -37,6 +46,7 @@ public class FindbugsExecutorTest {
     when(conf.saveExcludeConfigXml()).thenReturn(new File("test-resources/findbugs-exclude.xml"));
     when(conf.saveIncludeConfigXml()).thenReturn(new File("test-resources/findbugs-include.xml"));
     when(conf.getEffort()).thenReturn("default");
+    when(conf.getTimeout()).thenReturn(FindbugsConstants.FINDBUGS_TIMEOUT_DEFAULT_VALUE);
     return conf;
   }