package hudson.plugins.findbugs; import hudson.maven.MavenBuildProxy; import hudson.maven.MojoInfo; import hudson.maven.MavenBuild; import hudson.maven.MavenModule; import hudson.model.Action; import hudson.model.BuildListener; import hudson.plugins.analysis.core.BuildResult; import hudson.plugins.analysis.core.FilesParser; import hudson.plugins.analysis.core.HealthAwareMavenReporter; import hudson.plugins.analysis.core.ParserResult; import hudson.plugins.analysis.util.PluginLogger; import hudson.plugins.findbugs.parser.FindBugsParser; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.component.configurator.ComponentConfigurationException; import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration; import org.kohsuke.stapler.DataBoundConstructor; /** * Publishes the results of the FindBugs analysis (maven 2 project type). * * @author Ulli Hafner */ // CHECKSTYLE:COUPLING-OFF public class FindBugsReporter extends HealthAwareMavenReporter { private static final long serialVersionUID = -288391908253344862L; /** FindBugs filename if maven findbugsXmlOutput is activated. */ private static final String FINDBUGS_XML_FILE = "findbugsXml.xml"; /** FindBugs filename if maven findbugsXmlOutput is not activated. */ private static final String MAVEN_FINDBUGS_XML_FILE = "findbugs.xml"; /** * Creates a new instance of <code>FindBugsReporter</code>. * * @param threshold * Annotation threshold to be reached if a build should be considered as * unstable. * @param newThreshold * New annotations threshold to be reached if a build should be * considered as unstable. * @param failureThreshold * Annotation threshold to be reached if a build should be considered as * failure. * @param newFailureThreshold * New annotations threshold to be reached if a build should be * considered as failure. * @param healthy * Report health as 100% when the number of warnings is less than * this value * @param unHealthy * Report health as 0% when the number of warnings is greater * than this value * @param thresholdLimit * determines which warning priorities should be considered when * evaluating the build stability and health * @param canRunOnFailed * determines whether the plug-in can run for failed builds, too */ // CHECKSTYLE:OFF @SuppressWarnings("PMD.ExcessiveParameterList") @DataBoundConstructor public FindBugsReporter(final String threshold, final String newThreshold, final String failureThreshold, final String newFailureThreshold, final String healthy, final String unHealthy, final String thresholdLimit, final boolean canRunOnFailed) { super(threshold, newThreshold, failureThreshold, newFailureThreshold, healthy, unHealthy, thresholdLimit, canRunOnFailed, "FINDBUGS"); } // CHECKSTYLE:ON /** {@inheritDoc} */ @Override public boolean preExecute(final MavenBuildProxy build, final MavenProject pom, final MojoInfo mojo, final BuildListener listener) throws InterruptedException, IOException { if ("findbugs".equals(mojo.getGoal())) { activateProperty(mojo, "xmlOutput"); activateProperty(mojo, "findbugsXmlOutput"); } return true; } /** * Activates the specified property of the mojo. * * @param mojo * the mojo to change * @param property * the property toset to <code>true</code> */ private void activateProperty(final MojoInfo mojo, final String property) { XmlPlexusConfiguration configuration = (XmlPlexusConfiguration) mojo.configuration.getChild(property); if (configuration != null) { configuration.setValue("true"); } } /** {@inheritDoc} */ @Override protected boolean acceptGoal(final String goal) { return "findbugs".equals(goal) || "site".equals(goal); } /** {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public ParserResult perform(final MavenBuildProxy build, final MavenProject pom, final MojoInfo mojo, final PluginLogger logger) throws InterruptedException, IOException { List<String> sources = new ArrayList<String>(pom.getCompileSourceRoots()); sources.addAll(pom.getTestCompileSourceRoots()); FilesParser findBugsCollector = new FilesParser(logger, determineFileName(mojo), new FindBugsParser(sources), getModuleName(pom)); return getTargetPath(pom).act(findBugsCollector); } /** {@inheritDoc} */ @Override protected BuildResult persistResult(final ParserResult project, final MavenBuild build) { FindBugsResult result = new FindBugsResult(build, getDefaultEncoding(), project); build.getActions().add(new MavenFindBugsResultAction(build, this, getDefaultEncoding(), result)); build.registerAsProjectAction(FindBugsReporter.this); return result; } /** * Determines the filename of the FindBugs results. * * @param mojo the mojo containing the FindBugs configuration * @return filename of the FindBugs results */ private String determineFileName(final MojoInfo mojo) { String fileName = FINDBUGS_XML_FILE; try { Boolean isNativeFormat = mojo.getConfigurationValue("findbugsXmlOutput", Boolean.class); if (Boolean.FALSE.equals(isNativeFormat)) { fileName = MAVEN_FINDBUGS_XML_FILE; } } catch (ComponentConfigurationException exception) { // ignore and assume new format } return fileName; } /** {@inheritDoc} */ @Override public List<FindBugsProjectAction> getProjectActions(final MavenModule module) { return Collections.singletonList(new FindBugsProjectAction(module)); } /** {@inheritDoc} */ @Override protected Class<? extends Action> getResultActionClass() { return MavenFindBugsResultAction.class; } /** Ant file-set pattern of files to work with. @deprecated */ @SuppressWarnings("unused") @edu.umd.cs.findbugs.annotations.SuppressWarnings("SE") @Deprecated private transient String pattern; // obsolete since release 2.5 }