17
17
18
18
package org .scoverage .plugin ;
19
19
20
+ import java .io .BufferedReader ;
20
21
import java .io .File ;
21
- //import java.io.IOException;
22
+ import java .io .FileInputStream ;
23
+ import java .io .InputStreamReader ;
24
+ import java .io .IOException ;
25
+ import java .util .ArrayList ;
26
+ import java .util .List ;
22
27
import java .util .Locale ;
23
28
import java .util .ResourceBundle ;
24
29
41
46
import org .codehaus .plexus .util .StringUtils ;
42
47
43
48
import scala .Predef$ ;
49
+ import scala .collection .JavaConversions ;
50
+
44
51
import scoverage .Coverage ;
45
52
import scoverage .IOUtils ;
46
53
import scoverage .Serializer ;
47
54
import scoverage .report .CoberturaXmlWriter ;
55
+ import scoverage .report .CoverageAggregator ;
48
56
import scoverage .report .ScoverageHtmlWriter ;
49
57
import scoverage .report .ScoverageXmlWriter ;
50
58
@@ -87,6 +95,21 @@ public class SCoverageReportMojo
87
95
@ Parameter ( defaultValue = "${project}" , readonly = true , required = true )
88
96
private MavenProject project ;
89
97
98
+ /**
99
+ * All Maven projects in the reactor.
100
+ */
101
+ @ Parameter ( defaultValue = "${reactorProjects}" , required = true , readonly = true )
102
+ protected List <MavenProject > reactorProjects ;
103
+
104
+ // /**
105
+ // * Source files directory.
106
+ // * <br/>
107
+ // *
108
+ // * @since 1.0.5
109
+ // */
110
+ // @Parameter( property = "scoverage.sourceDirectory", defaultValue = "${project.build.sourceDirectory}", required = true, readonly = true )
111
+ // private File sourceDirectory;
112
+
90
113
/**
91
114
* Directory where the coverage files should be written.
92
115
* <br/>
@@ -96,6 +119,24 @@ public class SCoverageReportMojo
96
119
@ Parameter ( property = "scoverage.dataDirectory" , defaultValue = "${project.build.directory}/scoverage-data" , required = true , readonly = true )
97
120
private File dataDirectory ;
98
121
122
+ /**
123
+ * ...
124
+ * <br/>
125
+ *
126
+ * @since 1.0.5
127
+ */
128
+ @ Parameter ( property = "scoverage.aggregate" , defaultValue = "false" )
129
+ private boolean aggregate ;
130
+
131
+ /**
132
+ * Directory where the measurements files ("scoverage.measurements.*") should be written.
133
+ * <br/>
134
+ *
135
+ * @since 1.0.5
136
+ */
137
+ @ Parameter ( property = "scoverage.measurementsDirectory" , defaultValue = "${project.build.directory}/scoverage-data" , required = true , readonly = true )
138
+ private File measurementsDirectory ;
139
+
99
140
/**
100
141
* Specifies the destination directory where SCoverage saves the generated HTML files.
101
142
*/
@@ -162,8 +203,6 @@ public void generate( Sink sink, Locale locale )
162
203
{
163
204
long ts = System .currentTimeMillis ();
164
205
165
- File sourceDir = new File ( project .getBuild ().getSourceDirectory () );
166
-
167
206
mkdirs ( outputDirectory );
168
207
mkdirs ( xmlOutputDirectory );
169
208
@@ -188,31 +227,84 @@ public void generate( Sink sink, Locale locale )
188
227
}
189
228
}*/
190
229
191
- File coverageFile = Serializer .coverageFile ( dataDirectory );
192
- Coverage coverage = Serializer .deserialize ( coverageFile );
230
+ if ( !"pom" .equals ( project .getPackaging () ) )
231
+ {
232
+ File coverageFile = Serializer .coverageFile ( dataDirectory );
233
+ Coverage coverage = Serializer .deserialize ( coverageFile );
234
+
235
+ List <File > compileSourceRoots = loadCompileSourceRootsFromFiles ( project );//TODO initialization not here
236
+
237
+ File [] measurementFiles = IOUtils .findMeasurementFiles ( measurementsDirectory );
238
+ scala .collection .Set <Object > measurements = IOUtils .invoked ( Predef$ .MODULE$
239
+ .wrapRefArray ( measurementFiles ) );
240
+ coverage .apply ( measurements );
241
+
242
+ getLog ().info ( "[scoverage] Generating cobertura XML report..." );
243
+ new CoberturaXmlWriter ( project .getBasedir (), xmlOutputDirectory ).write ( coverage );
244
+
245
+ getLog ().info ( "[scoverage] Generating scoverage XML report..." );
246
+ new ScoverageXmlWriter ( JavaConversions .asScalaBuffer ( compileSourceRoots ) /*sourceDirectory*/ , xmlOutputDirectory , false ).write ( coverage );
247
+
248
+ if ( !aggregate )
249
+ {
250
+ getLog ().info ( "[scoverage] Generating scoverage HTML report..." );
251
+ new ScoverageHtmlWriter ( JavaConversions .asScalaBuffer ( compileSourceRoots ), outputDirectory ).write ( coverage );
252
+ }
253
+ }
254
+ else // aggregation
255
+ {
256
+ List <File > scoverageXmlFiles = new ArrayList <File >();
257
+ List <File > compileSourceRoots = new ArrayList <File >();
193
258
194
- File [] measurementFiles = IOUtils .findMeasurementFiles ( dataDirectory );
195
- scala .collection .Set <Object > measurements = IOUtils .invoked ( Predef$ .MODULE$
196
- .wrapRefArray ( measurementFiles ) );
197
- coverage .apply ( measurements );
259
+ // List<File> measurementFiles2 = new ArrayList<File>();
260
+ for ( MavenProject module : reactorProjects )
261
+ {
262
+ if ( !module .isExecutionRoot () && !module .getPackaging ().equals ( "pom" ) )
263
+ {
264
+ File scoverageXmlFile = new File ( module .getBuild ().getDirectory (), "scoverage.xml" );
265
+ if ( scoverageXmlFile .isFile () )
266
+ {
267
+ scoverageXmlFiles .add ( scoverageXmlFile );
268
+ compileSourceRoots .addAll ( loadCompileSourceRootsFromFiles ( module ) );
269
+ }
270
+ }
271
+ }
272
+ if ( !scoverageXmlFiles .isEmpty () )
273
+ {
274
+ Coverage coverage = CoverageAggregator .aggregatedCoverage ( JavaConversions .asScalaBuffer ( scoverageXmlFiles ).toSeq () );
198
275
199
- getLog ().info ( "[scoverage] Generating cobertura XML report..." );
200
- new CoberturaXmlWriter ( project .getBasedir (), xmlOutputDirectory ).write ( coverage );
276
+ /*File[] measurementFiles = IOUtils.findMeasurementFiles( dataDirectory );
277
+ scala.collection.Set<Object> measurements = IOUtils.invoked( Predef$.MODULE$
278
+ .wrapRefArray( measurementFiles ) );
279
+ coverage.apply( measurements );*/
201
280
202
- getLog ().info ( "[scoverage] Generating scoverage XML report..." );
203
- new ScoverageXmlWriter ( sourceDir , xmlOutputDirectory , false ).write ( coverage );
281
+ getLog ().info ( "[scoverage] Generating cobertura XML report..." );
282
+ new CoberturaXmlWriter ( project . getBasedir () , xmlOutputDirectory ).write ( coverage );
204
283
205
- getLog ().info ( "[scoverage] Generating scoverage HTML report..." );
206
- new ScoverageHtmlWriter ( sourceDir , outputDirectory ).write ( coverage );
284
+ getLog ().info ( "[scoverage] Generating scoverage XML report..." );
285
+ new ScoverageXmlWriter ( JavaConversions .asScalaBuffer ( compileSourceRoots ) /*project.getBasedir()*/ /*TEST sourceDir*/ , xmlOutputDirectory , false ).write ( coverage );
286
+
287
+ getLog ().info ( "[scoverage] Generating scoverage HTML report..." );
288
+ new ScoverageHtmlWriter ( JavaConversions .asScalaBuffer ( compileSourceRoots ) /*project.getBasedir()*/ /*TEST sourceDir*/ , outputDirectory ).write ( coverage );
289
+ }
290
+ }
207
291
208
292
long te = System .currentTimeMillis ();
209
293
getLog ().debug ( String .format ( "Mojo execution time: %d ms" , te - ts ) );
210
294
}
295
+ catch ( IOException e )
296
+ {
297
+ if ( failOnError )
298
+ {
299
+ throw new MavenReportException ("Error while creating scoverage report" , e );
300
+ }
301
+ getLog ().error ( "Error while creating scoverage report: " + e .getMessage (), e );
302
+ }
211
303
catch ( RuntimeException e )
212
304
{
213
305
if ( failOnError )
214
306
{
215
- throw e ;
307
+ throw new MavenReportException ( "Error while creating scoverage report" , e ) ;
216
308
}
217
309
getLog ().error ( "Error while creating scoverage report: " + e .getMessage (), e );
218
310
}
@@ -241,6 +333,12 @@ public boolean canGenerateReport()
241
333
return false ;
242
334
}
243
335
336
+ // If aggregated report and we are in top-level parent pom
337
+ if ( aggregate && project .isExecutionRoot () && reactorProjects .size () > 1 )
338
+ {
339
+ return true ;
340
+ }
341
+
244
342
if ( "pom" .equals ( project .getPackaging () ) )
245
343
{
246
344
return false ;
@@ -249,7 +347,7 @@ public boolean canGenerateReport()
249
347
//return true;//TODO-don't generate for aggregator nodes
250
348
251
349
File coverageFile = Serializer .coverageFile ( dataDirectory );
252
- if ( !coverageFile .exists () || !coverageFile .isFile () )
350
+ if ( !coverageFile .exists () || !coverageFile .isFile () ) //TODO - check is any measurement file exists
253
351
{
254
352
// getLog().warn( "[scoverage] No coverage data, report generation skipped." );
255
353
return false ;
@@ -359,4 +457,39 @@ private void mkdirs( File directory )
359
457
}
360
458
}
361
459
460
+ private List <File > loadCompileSourceRootsFromFiles (MavenProject mavenProject ) throws IOException
461
+ {
462
+ List <String > paths = new ArrayList <String >();
463
+ File dataDirectory = new File ( mavenProject .getBuild ().getDirectory (), "scoverage-data" );//TEMP
464
+ File sourceRootsFile = new File ( dataDirectory , "sourceRoots" );
465
+ if ( sourceRootsFile .isFile () && sourceRootsFile .canRead () )
466
+ {
467
+ BufferedReader br = new BufferedReader ( new InputStreamReader ( new FileInputStream ( sourceRootsFile ), "UTF-8" ) );
468
+ try
469
+ {
470
+ String path = br .readLine ();
471
+ while ( path != null )
472
+ {
473
+ paths .add ( path );
474
+ path = br .readLine ();
475
+ }
476
+ }
477
+ finally
478
+ {
479
+ br .close ();
480
+ }
481
+ }
482
+ else
483
+ {
484
+ // add debug message
485
+ paths .addAll ( project .getCompileSourceRoots () );
486
+ }
487
+
488
+ List <File > result = new ArrayList <File >( paths .size () );
489
+ for ( String path : paths )
490
+ {
491
+ result .add ( new File ( path ) );
492
+ }
493
+ return result ;
494
+ }
362
495
}
0 commit comments