]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3074 Update code to use Findbugs 2.0
authorFabrice Bellingard <bellingard@gmail.com>
Tue, 15 May 2012 12:24:41 +0000 (14:24 +0200)
committerFabrice Bellingard <bellingard@gmail.com>
Tue, 15 May 2012 13:59:36 +0000 (15:59 +0200)
plugins/sonar-findbugs-plugin/pom.xml
plugins/sonar-findbugs-plugin/src/main/java/org/sonar/plugins/findbugs/FindbugsExecutor.java

index 28fa5eb4e032ddb69448e07dc8368801080cd93b..0e14cae61e0dc1df77420388fd4e3c36d8dfefa7 100644 (file)
@@ -14,7 +14,7 @@
   <description>FindBugs is a program that uses static analysis to look for bugs in Java code. It can detect a variety of common coding mistakes, including thread synchronization problems, misuse of API methods.</description>
 
   <properties>
-    <findbugs.version>1.3.9</findbugs.version>
+    <findbugs.version>2.0.0</findbugs.version>
   </properties>
 
   <dependencies>
       <artifactId>sonar-testing-harness</artifactId>
       <scope>test</scope>
     </dependency>
+    <!-- fbContrib used as a test dependency to test loading of custom plugins -->
+    <dependency>
+      <groupId>com.mebigfatguy</groupId>
+      <artifactId>fbcontrib</artifactId>
+      <version>4.6.1</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
             <configuration>
               <rules>
                 <requireFilesSize>
-                  <maxsize>4500000</maxsize>
+                  <maxsize>4600000</maxsize>
                   <minsize>4000000</minsize>
                   <files>
                     <file>${project.build.directory}/${project.build.finalName}.jar</file>
index 05eab0ff5166691219e4d96ffa316991e5d67ad9..e1d6464c3ac8e8af49521b2092ab742782e46861 100644 (file)
  */
 package org.sonar.plugins.findbugs;
 
-import edu.umd.cs.findbugs.Priorities;
-
 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;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.output.NullOutputStream;
@@ -31,7 +37,6 @@ import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.sonar.api.BatchExtension;
-import org.sonar.api.utils.Logs;
 import org.sonar.api.utils.SonarException;
 import org.sonar.api.utils.TimeProfiler;
 
@@ -39,8 +44,8 @@ import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.PrintStream;
-import java.lang.reflect.Field;
 import java.net.URL;
+import java.util.Collection;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.concurrent.Callable;
@@ -67,12 +72,13 @@ public class FindbugsExecutor implements BatchExtension {
     Thread.currentThread().setContextClassLoader(FindBugs2.class.getClassLoader());
 
     OutputStream xmlOutput = null;
+    Collection<Plugin> customPlugins = null;
     ExecutorService executorService = Executors.newSingleThreadExecutor();
     try {
-      DetectorFactoryCollection detectorFactory = loadFindbugsPlugins();
-
       final FindBugs2 engine = new FindBugs2();
 
+      customPlugins = loadFindbugsPlugins();
+
       Project project = configuration.getFindbugsProject();
       engine.setProject(project);
 
@@ -106,7 +112,7 @@ public class FindbugsExecutor implements BatchExtension {
         }
       }
 
-      engine.setDetectorFactoryCollection(detectorFactory);
+      engine.setDetectorFactoryCollection(DetectorFactoryCollection.instance());
       engine.setAnalysisFeatureSettings(FindBugs.DEFAULT_EFFORT);
 
       engine.finishSettings();
@@ -115,12 +121,11 @@ public class FindbugsExecutor implements BatchExtension {
 
       profiler.stop();
 
-      resetDetectorFactoryCollection();
-
       return xmlReport;
     } catch (Exception e) {
       throw new SonarException("Can not execute Findbugs", e);
     } finally {
+      resetCustomPluginList(customPlugins);
       executorService.shutdown();
       IOUtils.closeQuietly(xmlOutput);
       Thread.currentThread().setContextClassLoader(initialClassLoader);
@@ -145,40 +150,43 @@ public class FindbugsExecutor implements BatchExtension {
     }
   }
 
-  private DetectorFactoryCollection loadFindbugsPlugins() {
-    List<URL> plugins = Lists.newArrayList();
+  private Collection<Plugin> loadFindbugsPlugins() {
+    ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+
+    List<String> pluginJarPathList = Lists.newArrayList();
     try {
-      Enumeration<URL> urls = Thread.currentThread().getContextClassLoader().getResources("findbugs.xml");
+      Enumeration<URL> urls = contextClassLoader.getResources("findbugs.xml");
       while (urls.hasMoreElements()) {
         URL url = urls.nextElement();
-        String path = StringUtils.removeStart(StringUtils.substringBefore(url.toString(), "!"), "jar:");
-        Logs.INFO.info("Found findbugs plugin: " + path);
-        plugins.add(new URL(path));
+        pluginJarPathList.add(StringUtils.removeStart(StringUtils.substringBefore(url.toString(), "!"), "jar:file:"));
       }
     } catch (IOException e) {
       throw new SonarException(e);
     }
 
-    resetDetectorFactoryCollection();
-    DetectorFactoryCollection detectorFactory = DetectorFactoryCollection.rawInstance();
-    detectorFactory.setPluginList(plugins.toArray(new URL[plugins.size()]));
-    for (Plugin plugin : detectorFactory.plugins()) {
-      Logs.INFO.info("Loaded plugin " + plugin.getPluginId());
+    List<Plugin> customPluginList = Lists.newArrayList();
+    for (String path : pluginJarPathList) {
+      try {
+        Plugin plugin = Plugin.addCustomPlugin(new File(path).toURI(), contextClassLoader);
+        if (plugin != null) {
+          customPluginList.add(plugin);
+          LOG.info("Found findbugs plugin: " + path);
+        }
+      } catch (PluginException e) {
+        LOG.warn("Failed to load plugin for custom detector: " + path);
+      } catch (DuplicatePluginIdException e) {
+        // simply ignore this
+      }
     }
 
-    return detectorFactory;
+    return customPluginList;
   }
 
-  /**
-   * Unfortunately without reflection it's impossible to reset {@link DetectorFactoryCollection}.
-   */
-  private static void resetDetectorFactoryCollection() {
-    try {
-      Field field = DetectorFactoryCollection.class.getDeclaredField("theInstance");
-      field.setAccessible(true);
-      field.set(null, null);
-    } catch (Exception e) {
-      throw new SonarException(e);
+  private static void resetCustomPluginList(Collection<Plugin> customPlugins) {
+    if (customPlugins != null) {
+      for (Plugin plugin : customPlugins) {
+        Plugin.removeCustomPlugin(plugin);
+      }
     }
   }