diff --git a/src/bld/java/rife/bld/extension/JacocoReportOperationBuild.java b/src/bld/java/rife/bld/extension/JacocoReportOperationBuild.java
index 1a2e032..5b0773d 100644
--- a/src/bld/java/rife/bld/extension/JacocoReportOperationBuild.java
+++ b/src/bld/java/rife/bld/extension/JacocoReportOperationBuild.java
@@ -42,10 +42,10 @@ public class JacocoReportOperationBuild extends Project {
var jacocoVersion = new VersionNumber(0, 8, 10);
scope(compile)
- .include(dependency("org.jacoco", "jacoco", jacocoVersion))
+ .include(dependency("org.jacoco", "jacoco", jacocoVersion).exclude("*", "org.jacoco.doc"))
.include(dependency("com.uwyn.rife2", "rife2", version(1, 6, 1)));
scope(runtime)
- .include(dependency("org.jacoco", "jacoco", jacocoVersion));
+ .include(dependency("org.jacoco", "jacoco", jacocoVersion).exclude("*", "org.jacoco.doc"));
scope(test)
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 9, 2)))
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 9, 2)))
diff --git a/src/main/java/rife/bld/extension/JacocoReportOperation.java b/src/main/java/rife/bld/extension/JacocoReportOperation.java
index 1330794..1b018cb 100644
--- a/src/main/java/rife/bld/extension/JacocoReportOperation.java
+++ b/src/main/java/rife/bld/extension/JacocoReportOperation.java
@@ -16,16 +16,27 @@
package rife.bld.extension;
+import org.jacoco.core.analysis.Analyzer;
+import org.jacoco.core.analysis.CoverageBuilder;
+import org.jacoco.core.analysis.IBundleCoverage;
+import org.jacoco.core.data.ExecutionDataStore;
+import org.jacoco.core.tools.ExecFileLoader;
+import org.jacoco.report.*;
+import org.jacoco.report.csv.CSVFormatter;
+import org.jacoco.report.html.HTMLFormatter;
+import org.jacoco.report.xml.XMLFormatter;
import rife.bld.BaseProject;
import rife.bld.operations.AbstractOperation;
-import rife.tools.FileUtils;
import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
-import java.util.regex.Pattern;
+
/**
* Generates JaCoCo reports.
@@ -41,16 +52,26 @@ public class JacocoReportOperation extends AbstractOperation classFiles) {
+ public JacocoReportOperation classFiles(List classFiles) {
this.classFiles.addAll(classFiles);
return this;
}
@@ -74,7 +95,7 @@ public class JacocoReportOperation extends AbstractOperation execFiles) {
+ public JacocoReportOperation execFiles(List execFiles) {
this.execFiles.addAll(execFiles);
return this;
}
@@ -92,27 +113,37 @@ public class JacocoReportOperation extends AbstractOperation getClassFiles(File directory) {
- return FileUtils.getFileList(directory, Pattern.compile("^.*\\.class$"), null)
- .stream().map(f -> new File(directory, f)).toList();
+ if (html == null) {
+ html = new File(buildJacocoReportsDir, "html");
+ }
+
+ if (xml == null) {
+ xml = new File(buildJacocoReportsDir, "jacocoTestReport.xml");
+ }
+
+ if (csv == null) {
+ csv = new File(buildJacocoReportsDir, "jacocoTestReport.csv");
+ }
+
+ //noinspection ResultOfMethodCallIgnored
+ buildJacocoReportsDir.mkdirs();
+
+ var loader = loadExecFiles();
+ var bundle = analyze(loader.getExecutionDataStore());
+ writeReports(bundle, loader);
+ }
}
/**
@@ -123,10 +154,6 @@ public class JacocoReportOperation extends AbstractOperation visitors = new ArrayList<>();
+
+ if (xml != null) {
+ var formatter = new XMLFormatter();
+ visitors.add(formatter.createVisitor(Files.newOutputStream(xml.toPath())));
+ }
+
+ if (csv != null) {
+ var formatter = new CSVFormatter();
+ visitors.add(formatter.createVisitor(Files.newOutputStream(csv.toPath())));
+ }
+
+ if (html != null) {
+ var formatter = new HTMLFormatter();
+ visitors.add(formatter.createVisitor(new FileMultiReportOutput(html)));
+ }
+
+ return new MultiReportVisitor(visitors);
+ }
+
/**
* Sets the locations of the source files.
**/
- public JacocoReportOperation sourceFiles(ArrayList sourceFiles) {
+ public JacocoReportOperation sourceFiles(List sourceFiles) {
this.sourceFiles.addAll(sourceFiles);
return this;
}
+ @SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops")
+ private ISourceFileLocator sourceLocator() {
+ var multi = new MultiSourceFileLocator(tabWidth);
+ for (var f : sourceFiles) {
+ multi.add(new DirectorySourceFileLocator(f, encoding, tabWidth));
+ }
+ return multi;
+ }
+
/**
* Sets the tab stop width for the source pages. Default is {@code 4}.
*/
- public JacocoReportOperation tabWidth(int tabWitdh) {
- this.tabWidth = tabWitdh;
+ public JacocoReportOperation tabWidth(int tabWidth) {
+ this.tabWidth = tabWidth;
return this;
}
+ private void writeReports(IBundleCoverage bundle, ExecFileLoader loader)
+ throws IOException {
+ if (LOGGER.isLoggable(Level.INFO) && !quiet) {
+ LOGGER.log(Level.INFO, "Analyzing {0} classes.",
+ bundle.getClassCounter().getTotalCount());
+ }
+ IReportVisitor visitor = reportVisitor();
+ visitor.visitInfo(loader.getSessionInfoStore().getInfos(),
+ loader.getExecutionDataStore().getContents());
+ visitor.visitBundle(bundle, sourceLocator());
+ visitor.visitEnd();
+ }
+
/**
* Sets the location of the XML report.
*/
@@ -174,4 +260,5 @@ public class JacocoReportOperation extends AbstractOperation