17
17
18
18
package org .scoverage .plugin ;
19
19
20
+ import java .io .BufferedReader ;
21
+ import java .io .InputStreamReader ;
22
+ import java .io .IOException ;
20
23
import java .io .File ;
24
+ import java .io .FileInputStream ;
21
25
import java .util .ArrayList ;
26
+ import java .util .Arrays ;
22
27
import java .util .List ;
23
28
import java .util .Locale ;
24
29
import java .util .ResourceBundle ;
25
- import javax .xml .parsers .ParserConfigurationException ;
26
- import javax .xml .parsers .SAXParser ;
27
- import javax .xml .parsers .SAXParserFactory ;
28
- import org .xml .sax .SAXException ;
29
30
30
31
import org .apache .maven .doxia .module .xhtml .decoration .render .RenderingContext ;
31
32
import org .apache .maven .doxia .siterenderer .sink .SiteRendererSink ;
43
44
import org .codehaus .plexus .util .StringUtils ;
44
45
45
46
import scala .Option ;
46
- import scala .Predef$ ;
47
- import scala .collection .Iterator ;
48
- import scala .collection .JavaConversions ;
47
+ import scala .collection .JavaConverters ;
49
48
import scala .collection .Seq ;
50
- import scala .xml .Elem ;
51
- import scala .xml .Node ;
52
- import scala .xml .NodeSeq ;
53
- import scala .xml .XML$ ;
54
49
55
50
import scoverage .Constants ;
56
51
import scoverage .Coverage ;
@@ -89,14 +84,26 @@ public class SCoverageReportMojo
89
84
private boolean skip ;
90
85
91
86
/**
92
- * Aggregate SCoverage reports .
87
+ * In multi-module project additionally generate aggregated SCoverage report .
93
88
* <br>
94
89
*
95
90
* @since 1.1.0
96
91
*/
97
92
@ Parameter ( property = "scoverage.aggregate" , defaultValue = "false" )
98
93
private boolean aggregate ;
99
94
95
+ /**
96
+ * In multi-module project generate only aggregated SCoverage report.
97
+ * <br>
98
+ * <br>
99
+ * Scoverage reports for individual modules will not be generated.
100
+ * <br>
101
+ *
102
+ * @since 1.4.0
103
+ */
104
+ @ Parameter ( property = "scoverage.aggregateOnly" , defaultValue = "false" )
105
+ private boolean aggregateOnly ;
106
+
100
107
/**
101
108
* The file encoding to use when reading Scala sources.
102
109
* <br>
@@ -297,6 +304,10 @@ private boolean canGenerateNonAggregatedReport()
297
304
{
298
305
return false ;
299
306
}
307
+ if ( aggregateOnly && reactorProjects .size () > 1 )
308
+ {
309
+ return false ;
310
+ }
300
311
File coverageFile = Serializer .coverageFile ( dataDirectory );
301
312
if ( !coverageFile .exists () || !coverageFile .isFile () )
302
313
{
@@ -307,12 +318,13 @@ private boolean canGenerateNonAggregatedReport()
307
318
308
319
private boolean canGenerateAggregatedReport ()
309
320
{
310
- return aggregate && reactorProjects .size () > 1 && project == reactorProjects .get ( reactorProjects .size () - 1 );
321
+ return ( aggregate || aggregateOnly ) && reactorProjects .size () > 1
322
+ && project == reactorProjects .get ( reactorProjects .size () - 1 );
311
323
}
312
324
313
325
private boolean canAttachAggregatedReportToSite ()
314
326
{
315
- return aggregate && reactorProjects .size () > 1 && project .isExecutionRoot ();
327
+ return ( aggregate || aggregateOnly ) && reactorProjects .size () > 1 && project .isExecutionRoot ();
316
328
}
317
329
318
330
/** {@inheritDoc} */
@@ -409,9 +421,8 @@ private void generateReports()
409
421
410
422
getLog ().info ( String .format ( "Reading scoverage measurements [%s*]..." ,
411
423
new File ( dataDirectory , Constants .MeasurementsPrefix () ).getAbsolutePath () ) );
412
- File [] measurementFiles = IOUtils .findMeasurementFiles ( dataDirectory );
413
- scala .collection .Set <Object > measurements = IOUtils .invoked ( Predef$ .MODULE$
414
- .wrapRefArray ( measurementFiles ) );
424
+ List <File > measurementFiles = Arrays .asList ( IOUtils .findMeasurementFiles ( dataDirectory ) );
425
+ scala .collection .Set <Object > measurements = IOUtils .invoked ( JavaConverters .asScalaBuffer ( measurementFiles ) );
415
426
coverage .apply ( measurements );
416
427
417
428
getLog ().info ( "Generating coverage reports..." );
@@ -422,24 +433,7 @@ private void generateReports()
422
433
private void generateAggregatedReports ()
423
434
throws MavenReportException
424
435
{
425
- SAXParser saxParser = null ;
426
- try
427
- {
428
- SAXParserFactory saxParserFactory = SAXParserFactory .newInstance ();
429
- saxParserFactory .setFeature ( "http://apache.org/xml/features/nonvalidating/load-dtd-grammar" , false );
430
- saxParserFactory .setFeature ( "http://apache.org/xml/features/nonvalidating/load-external-dtd" , false );
431
- saxParser = saxParserFactory .newSAXParser ();
432
- }
433
- catch ( ParserConfigurationException e )
434
- {
435
- throw new MavenReportException ( "Cannot configure SAXParser" , e );
436
- }
437
- catch ( SAXException e )
438
- {
439
- throw new MavenReportException ( "Cannot configure SAXParser" , e );
440
- }
441
-
442
- List <File > scoverageXmlFiles = new ArrayList <File >();
436
+ List <File > scoverageDataDirs = new ArrayList <File >();
443
437
List <File > sourceRoots = new ArrayList <File >();
444
438
MavenProject topLevelModule = null ;
445
439
for ( MavenProject module : reactorProjects )
@@ -450,51 +444,54 @@ private void generateAggregatedReports()
450
444
}
451
445
else if ( !module .getPackaging ().equals ( "pom" ) )
452
446
{
453
- File moduleXmlOutputDirectory = rebase ( xmlOutputDirectory , module );
454
- File scoverageXmlFile = new File ( moduleXmlOutputDirectory , "scoverage.xml" );
455
- if ( scoverageXmlFile .isFile () )
447
+ File scoverageDataDir = rebase ( dataDirectory , module );
448
+ if ( scoverageDataDir .isDirectory () )
456
449
{
457
- scoverageXmlFiles .add ( scoverageXmlFile );
450
+ scoverageDataDirs .add ( scoverageDataDir );
458
451
459
- File coberturaXmlFile = new File ( moduleXmlOutputDirectory , "cobertura.xml " );
460
- if ( coberturaXmlFile .isFile () )
452
+ File sourceRootsFile = new File ( scoverageDataDir , "source.roots " );
453
+ if ( sourceRootsFile .isFile () )
461
454
{
462
- Elem xml = ( Elem ) XML$ .MODULE$ .withSAXParser ( saxParser ).loadFile ( coberturaXmlFile );
463
- Node sources = xml .$bslash ( "sources" ).head ();
464
- NodeSeq sourceSeq = sources .$bslash ( "source" );
465
- Iterator <Node > it = sourceSeq .iterator ();
466
- while ( it .hasNext () )
455
+ try
467
456
{
468
- Node source = it .next ();
469
- String path = source .text ().trim ();
470
- if ( !"--source" .equals ( path ) )
457
+ BufferedReader r = new BufferedReader ( new InputStreamReader (
458
+ new FileInputStream ( sourceRootsFile ), "UTF-8" ) );
459
+ String path = r .readLine ();
460
+ while ( path != null )
471
461
{
472
462
sourceRoots .add ( new File ( path ) );
463
+ path = r .readLine ();
473
464
}
474
465
}
466
+ catch ( IOException e )
467
+ {
468
+ throw new MavenReportException ( "..." , e );
469
+ }
475
470
}
476
471
}
477
472
}
478
473
}
479
474
480
475
/* Empty report must be generated or top-level site will contain invalid link to non-existent Scoverage report
481
- if ( scoverageXmlFiles .isEmpty() )
476
+ if ( scoverageDataDirs .isEmpty() )
482
477
{
483
478
getLog().info( "No subproject data to aggregate, skipping SCoverage report generation" );
484
479
return;
485
480
}*/
486
481
487
- if ( getLog ().isDebugEnabled () && scoverageXmlFiles .size () > 0 )
482
+ if ( getLog ().isDebugEnabled () && scoverageDataDirs .size () > 0 )
488
483
{
489
- getLog ().debug ( String .format ( "Found %d subproject report files:" , scoverageXmlFiles .size () ) );
490
- for ( File file : scoverageXmlFiles )
484
+ getLog ().debug ( String .format ( "Found %d subproject subproject scoverage data directories:" ,
485
+ scoverageDataDirs .size () ) );
486
+ for ( File dataDir : scoverageDataDirs )
491
487
{
492
- getLog ().debug ( String .format ( "- %s" , file .getAbsolutePath () ) );
488
+ getLog ().debug ( String .format ( "- %s" , dataDir .getAbsolutePath () ) );
493
489
}
494
490
}
495
491
else
496
492
{
497
- getLog ().info ( String .format ( "Found %d subproject report files." , scoverageXmlFiles .size () ) );
493
+ getLog ().info ( String .format ( "Found %d subproject scoverage data directories." ,
494
+ scoverageDataDirs .size () ) );
498
495
}
499
496
500
497
File topLevelModuleOutputDirectory = rebase ( outputDirectory , topLevelModule );
@@ -504,7 +501,7 @@ else if ( !module.getPackaging().equals( "pom" ) )
504
501
mkdirs ( topLevelModuleXmlOutputDirectory );
505
502
506
503
Coverage coverage =
507
- CoverageAggregator .aggregatedCoverage ( JavaConversions .asScalaBuffer ( scoverageXmlFiles ).toSeq () );
504
+ CoverageAggregator .aggregatedCoverage ( JavaConverters .asScalaBuffer ( scoverageDataDirs ).toSeq () );
508
505
509
506
getLog ().info ( "Generating coverage aggregated reports..." );
510
507
writeReports ( coverage , sourceRoots , topLevelModuleXmlOutputDirectory , topLevelModuleXmlOutputDirectory ,
@@ -515,7 +512,7 @@ else if ( !module.getPackaging().equals( "pom" ) )
515
512
private void writeReports ( Coverage coverage , List <File > sourceRoots , File coberturaXmlOutputDirectory ,
516
513
File scoverageXmlOutputDirectory , File scoverageHtmlOutputDirectory )
517
514
{
518
- Seq <File > sourceRootsAsScalaSeq = JavaConversions .asScalaBuffer ( sourceRoots );
515
+ Seq <File > sourceRootsAsScalaSeq = JavaConverters .asScalaBuffer ( sourceRoots );
519
516
520
517
new CoberturaXmlWriter ( sourceRootsAsScalaSeq , coberturaXmlOutputDirectory ).write ( coverage );
521
518
getLog ().info ( String .format ( "Written Cobertura XML report [%s]" ,
0 commit comments