]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-2325 Add the confidence level property on the Findbugs plugin
authorFabrice Bellingard <fabrice.bellingard@sonarsource.com>
Tue, 25 Sep 2012 15:11:06 +0000 (17:11 +0200)
committerFabrice Bellingard <fabrice.bellingard@sonarsource.com>
Tue, 25 Sep 2012 15:13:52 +0000 (17:13 +0200)
=> The Findbugs plugin should offer a way to filter bugs whose
   probability is not high enough

plugins/sonar-findbugs-plugin/src/main/java/org/sonar/plugins/findbugs/FindbugsConfiguration.java
plugins/sonar-findbugs-plugin/src/main/java/org/sonar/plugins/findbugs/FindbugsExecutor.java
plugins/sonar-findbugs-plugin/src/main/java/org/sonar/plugins/findbugs/FindbugsPlugin.java
plugins/sonar-findbugs-plugin/src/test/java/org/sonar/plugins/findbugs/FindbugsConfigurationTest.java
plugins/sonar-findbugs-plugin/src/test/java/org/sonar/plugins/findbugs/FindbugsExecutorTest.java
sonar-plugin-api/src/main/java/org/sonar/api/CoreProperties.java

index 8e127a8ccd267cc42de7acbc7684ba7e69f79f98..ad24fa026ae1afeb04cf94066c89dad9136352be 100644 (file)
@@ -34,7 +34,11 @@ import org.sonar.plugins.findbugs.xml.ClassFilter;
 import org.sonar.plugins.findbugs.xml.FindBugsFilter;
 import org.sonar.plugins.findbugs.xml.Match;
 
-import java.io.*;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
@@ -66,7 +70,7 @@ public class FindbugsConfiguration implements BatchExtension {
     File classesDir = project.getFileSystem().getBuildOutputDir();
     if (classesDir == null || !classesDir.exists()) {
       throw new SonarException("Findbugs needs sources to be compiled. "
-          + "Please build project before executing sonar and check the location of compiled classes.");
+        + "Please build project before executing sonar and check the location of compiled classes.");
     }
 
     edu.umd.cs.findbugs.Project findbugsProject = new edu.umd.cs.findbugs.Project();
@@ -121,6 +125,10 @@ public class FindbugsConfiguration implements BatchExtension {
     return StringUtils.lowerCase(settings.getString(CoreProperties.FINDBUGS_EFFORT_PROPERTY));
   }
 
+  public String getConfidenceLevel() {
+    return StringUtils.lowerCase(settings.getString(CoreProperties.FINDBUGS_CONFIDENCE_LEVEL_PROPERTY));
+  }
+
   public long getTimeout() {
     return settings.getLong(CoreProperties.FINDBUGS_TIMEOUT_PROPERTY);
   }
index 6e6d73e3e9fbb3e832cb10fda5c0bfdb5441ab84..e56768925948c4b01e2095ab356d9a292a7390a7 100644 (file)
 package org.sonar.plugins.findbugs;
 
 import com.google.common.collect.Lists;
-import edu.umd.cs.findbugs.*;
+import edu.umd.cs.findbugs.DetectorFactoryCollection;
+import edu.umd.cs.findbugs.FindBugs;
+import edu.umd.cs.findbugs.FindBugs2;
+import edu.umd.cs.findbugs.Plugin;
+import edu.umd.cs.findbugs.PluginException;
+import edu.umd.cs.findbugs.Priorities;
+import edu.umd.cs.findbugs.Project;
+import edu.umd.cs.findbugs.XMLBugReporter;
 import edu.umd.cs.findbugs.config.UserPreferences;
 import edu.umd.cs.findbugs.plugins.DuplicatePluginIdException;
 import org.apache.commons.io.FileUtils;
@@ -39,8 +46,10 @@ import java.io.PrintStream;
 import java.net.URL;
 import java.util.Collection;
 import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -55,6 +64,16 @@ public class FindbugsExecutor implements BatchExtension {
 
   private static final Logger LOG = LoggerFactory.getLogger(FindbugsExecutor.class);
 
+  /** Map of priority level names to their numeric values. */
+  private static Map<String, Integer> priorityNameToValueMap = new HashMap<String, Integer>();
+  static {
+    priorityNameToValueMap.put("high", (Priorities.HIGH_PRIORITY));
+    priorityNameToValueMap.put("medium", (Priorities.NORMAL_PRIORITY));
+    priorityNameToValueMap.put("low", (Priorities.LOW_PRIORITY));
+    priorityNameToValueMap.put("experimental", (Priorities.EXP_PRIORITY));
+  }
+  private final static Integer DEFAULT_PRIORITY = Priorities.NORMAL_PRIORITY;
+
   private FindbugsConfiguration configuration;
 
   public FindbugsExecutor(FindbugsConfiguration configuration) {
@@ -87,7 +106,7 @@ public class FindbugsExecutor implements BatchExtension {
       engine.setProject(project);
 
       XMLBugReporter xmlBugReporter = new XMLBugReporter(project);
-      xmlBugReporter.setPriorityThreshold(Priorities.LOW_PRIORITY);
+      xmlBugReporter.setPriorityThreshold(determinePriorityThreshold());
       xmlBugReporter.setAddMessages(true);
 
       File xmlReport = configuration.getTargetXMLReport();
@@ -135,6 +154,14 @@ public class FindbugsExecutor implements BatchExtension {
     }
   }
 
+  private Integer determinePriorityThreshold() {
+    Integer integer = priorityNameToValueMap.get(configuration.getConfidenceLevel());
+    if (integer == null) {
+      integer = DEFAULT_PRIORITY;
+    }
+    return integer;
+  }
+
   private static class FindbugsTask implements Callable<Object> {
 
     private FindBugs2 engine;
index c38f73aae77bce5ef197af9df2cdc1754ae9c136..2c6e87a53b22dd0bb1106e08678461acee60c505 100644 (file)
@@ -56,8 +56,17 @@ import java.util.List;
     project = true,
     module = true,
     global = true,
-    multiValues = true
-  )})
+    multiValues = true),
+  @Property(
+    key = CoreProperties.FINDBUGS_CONFIDENCE_LEVEL_PROPERTY,
+    defaultValue = CoreProperties.FINDBUGS_CONFIDENCE_LEVEL_DEFAULT_VALUE,
+    name = "Confidence Level",
+    description = "Specifies the confidence threshold (previously called \"priority\") for reporting issues. If set to \"low\", confidence is not used to filter bugs. " +
+      "If set to \"medium\" (the default), low confidence issues are supressed. If set to \"high\", only high confidence bugs are reported. ",
+    project = true,
+    module = true,
+    global = true)
+})
 public class FindbugsPlugin extends SonarPlugin {
 
   public List<Class<? extends Extension>> getExtensions() {
index 28662ceb8f95dcc04a2b8d193668ef290ee1508a..a2d2cc3643df0144080fb3b77c7ed6c0bd4fc9b2 100644 (file)
@@ -115,4 +115,11 @@ public class FindbugsConfigurationTest {
     assertThat(conf.getExcludesFilters()).hasSize(2);
   }
 
+  @Test
+  public void should_return_confidence_level() {
+    assertThat(conf.getConfidenceLevel()).as("default confidence level").isEqualTo("medium");
+    settings.setProperty(CoreProperties.FINDBUGS_EFFORT_PROPERTY, "HIGH");
+    assertThat(conf.getEffort()).isEqualTo("high");
+  }
+
 }
index c8bb43d02b12bc6a09e0062fd39accf015df7186..891ede6a9808d9d64c309d8e74029f50c882f9db 100644 (file)
@@ -49,6 +49,25 @@ public class FindbugsExecutorTest {
     String report = FileUtils.readFileToString(reportFile);
     assertThat(report).as("Report should contain bug instance").contains("<BugInstance");
     assertThat(report).as("Report should be generated with messages").contains("<Message>");
+    assertThat(report).contains("priority=\"1\"");
+    assertThat(report).doesNotContain("priority=\"3\"");
+  }
+
+  @Test
+  public void canGenerateXMLReportWithCustomConfidence() throws Exception {
+    FindbugsConfiguration conf = mockConf();
+    File reportFile = new File("target/test-tmp/customized-findbugs-report.xml");
+    when(conf.getTargetXMLReport()).thenReturn(reportFile);
+    when(conf.getConfidenceLevel()).thenReturn("low");
+
+    new FindbugsExecutor(conf).execute();
+
+    assertThat(reportFile.exists()).isTrue();
+    String report = FileUtils.readFileToString(reportFile);
+    assertThat(report).as("Report should contain bug instance").contains("<BugInstance");
+    assertThat(report).as("Report should be generated with messages").contains("<Message>");
+    assertThat(report).contains("priority=\"1\"");
+    assertThat(report).contains("priority=\"3\"");
     assertThat(report).contains("synthetic=\"true\"");
   }
 
index b3b55b5ab039b1e1d90d01d5b2d4e32973ee52aa..c6e91e815fc9ba9170fb8910ab645ab741467800 100644 (file)
@@ -254,6 +254,8 @@ public interface CoreProperties {
   String FINDBUGS_PLUGIN = "findbugs";
   String FINDBUGS_EFFORT_PROPERTY = "sonar.findbugs.effort";
   String FINDBUGS_EFFORT_DEFAULT_VALUE = "Default";
+  String FINDBUGS_CONFIDENCE_LEVEL_PROPERTY = "sonar.findbugs.confidenceLevel";
+  String FINDBUGS_CONFIDENCE_LEVEL_DEFAULT_VALUE = "medium";
   String FINDBUGS_REPORT_PATH = "sonar.findbugs.reportPath";
   String FINDBUGS_TIMEOUT_PROPERTY = "sonar.findbugs.timeout";
   long FINDBUGS_TIMEOUT_DEFAULT_VALUE = 600000;