1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 package org.eluder.coveralls.maven.plugin.util;
26
27 import java.io.File;
28 import java.io.IOException;
29 import java.nio.file.Path;
30 import java.util.ArrayList;
31 import java.util.Collections;
32 import java.util.List;
33
34 import org.apache.maven.project.MavenProject;
35 import org.eluder.coveralls.maven.plugin.CoverageParser;
36 import org.eluder.coveralls.maven.plugin.parser.CloverParser;
37 import org.eluder.coveralls.maven.plugin.parser.CoberturaParser;
38 import org.eluder.coveralls.maven.plugin.parser.JaCoCoParser;
39 import org.eluder.coveralls.maven.plugin.parser.SagaParser;
40 import org.eluder.coveralls.maven.plugin.source.SourceLoader;
41
42
43
44
45 public class CoverageParsersFactory {
46
47
48 private static final String JACOCO_FILE = "jacoco.xml";
49
50
51 static final String DEFAULT_JACOCO_DIRECTORY = "jacoco";
52
53
54 static final String DEFAULT_JACOCO_IT_DIRECTORY = "jacoco-it";
55
56
57 static final String DEFAULT_JACOCO_MERGED_DIRECTORY = "jacoco-merged-report";
58
59
60 private static final String COBERTURA_FILE = "coverage.xml";
61
62
63 private static final String COBERTURA_DIRECTORY = "cobertura";
64
65
66 private static final String CLOVER_FILE = "clover.xml";
67
68
69 private static final String CLOVER_DIRECTORY = "clover";
70
71
72 private static final String SAGA_FILE = "total-coverage.xml";
73
74
75 private static final String SAGA_DIRECTORY = "saga-coverage";
76
77
78 private final MavenProject project;
79
80
81 private final SourceLoader sourceLoader;
82
83
84
85
86
87
88 private File jacocoAggregateReport;
89
90
91
92
93
94 private List<File> jacocoReports;
95
96
97 private List<File> coberturaReports;
98
99
100 private List<File> sagaReports;
101
102
103 private List<File> cloverReports;
104
105
106 private List<String> relativeReportDirs;
107
108
109
110
111
112
113
114
115
116 public CoverageParsersFactory(final MavenProject project, final SourceLoader sourceLoader) {
117 this.project = project;
118 this.sourceLoader = sourceLoader;
119 }
120
121
122
123
124
125
126
127
128
129
130
131
132
133 public CoverageParsersFactory withJacocoAggregateReport(final File jacocoAggregateReport) {
134 this.jacocoAggregateReport = jacocoAggregateReport;
135 return this;
136 }
137
138
139
140
141
142
143
144
145
146
147
148
149 public CoverageParsersFactory withJaCoCoReports(final List<File> jacocoReports) {
150 this.jacocoReports = jacocoReports;
151 return this;
152 }
153
154
155
156
157
158
159
160
161
162 public CoverageParsersFactory withCoberturaReports(final List<File> coberturaReports) {
163 this.coberturaReports = coberturaReports;
164 return this;
165 }
166
167
168
169
170
171
172
173
174
175 public CoverageParsersFactory withSagaReports(final List<File> sagaReports) {
176 this.sagaReports = sagaReports;
177 return this;
178 }
179
180
181
182
183
184
185
186
187
188 public CoverageParsersFactory withCloverReports(final List<File> cloverReports) {
189 this.cloverReports = cloverReports;
190 return this;
191 }
192
193
194
195
196
197
198
199
200
201 public CoverageParsersFactory withRelativeReportDirs(final List<String> relativeReportDirs) {
202 this.relativeReportDirs = relativeReportDirs;
203 return this;
204 }
205
206
207
208
209
210
211
212
213
214 public List<CoverageParser> createParsers() throws IOException {
215 final List<CoverageParser> parsers = new ArrayList<>();
216 final var projects = new MavenProjectCollector(this.project).collect();
217
218 final var jacocoFiles = this.jacocoAggregateReport != null
219 ? ExistingFiles.create(List.of(this.jacocoAggregateReport))
220 : ExistingFiles.create(this.jacocoReports);
221 final var coberturaFiles = ExistingFiles.create(this.coberturaReports);
222 final var sagaFiles = ExistingFiles.create(this.sagaReports);
223 final var cloverFiles = ExistingFiles.create(this.cloverReports);
224 for (final MavenProject p : projects) {
225 final var reportingDirectory = Path.of(p.getModel().getReporting().getOutputDirectory());
226 final var buildDirectory = Path.of(p.getBuild().getDirectory());
227
228 final var jacocoMergedReport = reportingDirectory
229 .resolve(CoverageParsersFactory.DEFAULT_JACOCO_MERGED_DIRECTORY)
230 .resolve(CoverageParsersFactory.JACOCO_FILE).toFile();
231
232
233
234
235
236 if (this.jacocoAggregateReport == null) {
237 if (jacocoMergedReport.exists() && jacocoMergedReport.canRead()) {
238 jacocoFiles.add(jacocoMergedReport);
239 } else {
240 jacocoFiles.add(reportingDirectory.resolve(CoverageParsersFactory.DEFAULT_JACOCO_DIRECTORY)
241 .resolve(CoverageParsersFactory.JACOCO_FILE).toFile());
242 jacocoFiles.add(reportingDirectory.resolve(CoverageParsersFactory.DEFAULT_JACOCO_IT_DIRECTORY)
243 .resolve(CoverageParsersFactory.JACOCO_FILE).toFile());
244 }
245 }
246
247 coberturaFiles.add(reportingDirectory.resolve(CoverageParsersFactory.COBERTURA_DIRECTORY)
248 .resolve(CoverageParsersFactory.COBERTURA_FILE).toFile());
249 sagaFiles.add(buildDirectory.resolve(CoverageParsersFactory.SAGA_DIRECTORY)
250 .resolve(CoverageParsersFactory.SAGA_FILE).toFile());
251 cloverFiles.add(reportingDirectory.resolve(CoverageParsersFactory.CLOVER_DIRECTORY)
252 .resolve(CoverageParsersFactory.CLOVER_FILE).toFile());
253 cloverFiles.add(buildDirectory.resolve(CoverageParsersFactory.CLOVER_DIRECTORY)
254 .resolve(CoverageParsersFactory.CLOVER_FILE).toFile());
255
256 this.setupRelativeReportDirs(jacocoFiles, coberturaFiles, sagaFiles, cloverFiles, reportingDirectory,
257 buildDirectory);
258 }
259
260
261 parsers.addAll(jacocoFiles.toParsers(file -> new JaCoCoParser(file, this.sourceLoader)));
262 parsers.addAll(coberturaFiles.toParsers(file -> new CoberturaParser(file, this.sourceLoader)));
263 parsers.addAll(sagaFiles.toParsers(file -> new SagaParser(file, this.sourceLoader)));
264 parsers.addAll(cloverFiles.toParsers(file -> new CloverParser(file, this.sourceLoader)));
265
266 if (parsers.isEmpty()) {
267 throw new IOException("No coverage report files found");
268 }
269
270 return Collections.unmodifiableList(parsers);
271 }
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289 private void setupRelativeReportDirs(final ExistingFiles jacocoFiles, final ExistingFiles coberturaFiles,
290 final ExistingFiles sagaFiles, final ExistingFiles cloverFiles, final Path reportingDirectory,
291 final Path buildDirectory) {
292 if (this.relativeReportDirs == null) {
293 return;
294 }
295
296 for (final String relativeReportPath : this.relativeReportDirs) {
297 var relativeReportingDirectory = reportingDirectory;
298 var relativeBuildDirectory = buildDirectory;
299 if (!relativeReportPath.isEmpty() && !File.separator.equals(relativeReportPath)) {
300 relativeReportingDirectory = reportingDirectory.resolve(relativeReportPath);
301 relativeBuildDirectory = buildDirectory.resolve(relativeReportPath);
302 }
303
304 jacocoFiles.add(relativeReportingDirectory.resolve(CoverageParsersFactory.JACOCO_FILE).toFile());
305 jacocoFiles.add(relativeBuildDirectory.resolve(CoverageParsersFactory.JACOCO_FILE).toFile());
306 coberturaFiles.add(relativeReportingDirectory.resolve(CoverageParsersFactory.COBERTURA_FILE).toFile());
307 coberturaFiles.add(relativeBuildDirectory.resolve(CoverageParsersFactory.COBERTURA_FILE).toFile());
308 sagaFiles.add(relativeReportingDirectory.resolve(CoverageParsersFactory.SAGA_FILE).toFile());
309 sagaFiles.add(relativeBuildDirectory.resolve(CoverageParsersFactory.SAGA_FILE).toFile());
310 cloverFiles.add(relativeReportingDirectory.resolve(CoverageParsersFactory.CLOVER_FILE).toFile());
311 cloverFiles.add(relativeBuildDirectory.resolve(CoverageParsersFactory.CLOVER_FILE).toFile());
312 }
313 }
314
315 }