SpotBugsApplier.java

package io.github.jonloucks.gradle.kit;

import com.github.spotbugs.snom.SpotBugsExtension;
import com.github.spotbugs.snom.SpotBugsTask;
import org.gradle.api.Action;
import org.gradle.api.Project;
import org.gradle.api.file.DirectoryProperty;

final class SpotBugsApplier extends ProjectApplier {
    
    void apply() {
        applyOnce(() -> {
            log("Applying spotbugs plugin...");
            getProject().getPlugins().apply("com.github.spotbugs");
            
            getProject().afterEvaluate(project -> {
                log("After Evaluate SpotBugs Plugin...");
                configureSpotbugsPlugin();
                configureSpotbugsReports();
            });
        });
    }
    
    SpotBugsApplier(Project project) {
        super(project);
    }
    
    private void configureSpotbugsReports() {
        getProject().getTasks().withType(SpotBugsTask.class).configureEach(configureSpotbugsReport());
    }
    
    private Action<SpotBugsTask> configureSpotbugsReport() {
        final DirectoryProperty buildDir = getProject().getLayout().getBuildDirectory();
        
        return reportTask -> {
            if (isTestProject()) {
                reportTask.setEnabled(false);
            } else {
                reportTask.setEnabled(true);
                reportTask.reports(spotBugsReports -> spotBugsReports.maybeCreate("html"));
                reportTask.getReports().configureEach(report -> {
                    report.getRequired().set(true);
                    report.getOutputLocation().set(buildDir.file("reports/spotbugs/main/spotbugs.html"));
                    report.setStylesheet("fancy-hist.xsl");
                });
            }
        };
    }

    private void configureSpotbugsPlugin() {
        final DirectoryProperty buildDir = getProject().getLayout().getBuildDirectory();
        final SpotBugsExtension extension = getProject().getExtensions().getByType(SpotBugsExtension.class);
        extension.getToolVersion().set("4.9.6");
        extension.getIgnoreFailures().set(isTestProject());
        extension.getReportsDir().set(buildDir.dir("reports/spotbugs"));
    }
}