Skip to content

Commit d9076f8

Browse files
committed
Multiple source roots support (scoverage/scalac-scoverage-plugin#104), aggretated reports draft.
1 parent b89b55d commit d9076f8

File tree

3 files changed

+191
-20
lines changed

3 files changed

+191
-20
lines changed

Diff for: pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ under the License.
8585
<maven.version>2.2.1</maven.version>
8686
<maven-plugin-plugin.version>3.3</maven-plugin-plugin.version>
8787

88-
<scalac-scoverage-plugin.version>1.0.4</scalac-scoverage-plugin.version>
88+
<scalac-scoverage-plugin.version>1.0.5-SNAPSHOT</scalac-scoverage-plugin.version>
8989
</properties>
9090

9191
<dependencies>

Diff for: src/main/java/org/scoverage/plugin/SCoveragePreCompileMojo.java

+40-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@
1717

1818
package org.scoverage.plugin;
1919

20+
import java.io.BufferedWriter;
2021
import java.io.File;
22+
import java.io.FileOutputStream;
23+
import java.io.IOException;
24+
import java.io.OutputStreamWriter;
2125
import java.util.LinkedHashSet;
2226
import java.util.List;
2327
import java.util.Properties;
@@ -225,9 +229,9 @@ else if ( resolvedScalaVersion.startsWith( "2.11." ) )
225229
}
226230

227231
File classesDirectory = new File( project.getBuild().getOutputDirectory() );
228-
File scoverageClassesDirectory = new File( classesDirectory.getParentFile(), "scoverage-classes" );
232+
File scoverageClassesDirectory = new File( classesDirectory.getParentFile(), "scoverage-classes" );//TODO - "scoverage-classes" -> "scoverage-" + classesDirectory.getName()?
229233
project.getBuild().setOutputDirectory( scoverageClassesDirectory.getAbsolutePath() );
230-
for ( MavenProject reactorProject : reactorProjects )
234+
for ( MavenProject reactorProject : reactorProjects ) //TODO - is this loop required at all? check it!
231235
{
232236
if ( reactorProject != project ) // TODO - how to include only dependent reactor projects?
233237
{
@@ -314,6 +318,15 @@ else if ( resolvedScalaVersion.startsWith( "2.11." ) )
314318
throw new MojoExecutionException( "SCoverage preparation failed", e );
315319
}
316320

321+
try
322+
{
323+
saveCompileSourceRootsToFile();
324+
}
325+
catch ( IOException e)
326+
{
327+
throw new MojoExecutionException( "SCoverage preparation failed", e );
328+
}
329+
317330
long te = System.currentTimeMillis();
318331
getLog().debug( String.format( "Mojo execution time: %d ms", te - ts ) );
319332
}
@@ -472,4 +485,29 @@ private Artifact getResolvedArtifact( String groupId, String artifactId, String
472485
return artifact;
473486
}
474487

488+
private void saveCompileSourceRootsToFile()
489+
throws IOException
490+
{
491+
if ( !dataDirectory.exists() && ! dataDirectory.mkdirs() )
492+
{
493+
throw new IOException( String.format( "Cannot create \"s\" directory", dataDirectory.getAbsolutePath() ) );
494+
}
495+
File sourceRootsFile = new File( dataDirectory, "sourceRoots" );
496+
BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( sourceRootsFile ), "UTF-8" ) );
497+
try
498+
{
499+
List<String> compileSourceRoots = project.getCompileSourceRoots();
500+
for ( String path : compileSourceRoots )
501+
{
502+
//TEST bw.write( org.codehaus.plexus.util.PathTool.getRelativePath( project.getBasedir().getPath(), path ) );
503+
bw.write( path );
504+
bw.newLine();
505+
}
506+
}
507+
finally
508+
{
509+
bw.close();
510+
}
511+
}
512+
475513
}

Diff for: src/main/java/org/scoverage/plugin/SCoverageReportMojo.java

+150-17
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,13 @@
1717

1818
package org.scoverage.plugin;
1919

20+
import java.io.BufferedReader;
2021
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;
2227
import java.util.Locale;
2328
import java.util.ResourceBundle;
2429

@@ -41,10 +46,13 @@
4146
import org.codehaus.plexus.util.StringUtils;
4247

4348
import scala.Predef$;
49+
import scala.collection.JavaConversions;
50+
4451
import scoverage.Coverage;
4552
import scoverage.IOUtils;
4653
import scoverage.Serializer;
4754
import scoverage.report.CoberturaXmlWriter;
55+
import scoverage.report.CoverageAggregator;
4856
import scoverage.report.ScoverageHtmlWriter;
4957
import scoverage.report.ScoverageXmlWriter;
5058

@@ -87,6 +95,21 @@ public class SCoverageReportMojo
8795
@Parameter( defaultValue = "${project}", readonly = true, required = true )
8896
private MavenProject project;
8997

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+
90113
/**
91114
* Directory where the coverage files should be written.
92115
* <br/>
@@ -96,6 +119,24 @@ public class SCoverageReportMojo
96119
@Parameter( property = "scoverage.dataDirectory", defaultValue = "${project.build.directory}/scoverage-data", required = true, readonly = true )
97120
private File dataDirectory;
98121

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+
99140
/**
100141
* Specifies the destination directory where SCoverage saves the generated HTML files.
101142
*/
@@ -162,8 +203,6 @@ public void generate( Sink sink, Locale locale )
162203
{
163204
long ts = System.currentTimeMillis();
164205

165-
File sourceDir = new File( project.getBuild().getSourceDirectory() );
166-
167206
mkdirs( outputDirectory );
168207
mkdirs( xmlOutputDirectory );
169208

@@ -188,31 +227,84 @@ public void generate( Sink sink, Locale locale )
188227
}
189228
}*/
190229

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>();
193258

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() );
198275

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 );*/
201280

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 );
204283

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+
}
207291

208292
long te = System.currentTimeMillis();
209293
getLog().debug( String.format( "Mojo execution time: %d ms", te - ts ) );
210294
}
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+
}
211303
catch ( RuntimeException e )
212304
{
213305
if ( failOnError )
214306
{
215-
throw e;
307+
throw new MavenReportException("Error while creating scoverage report", e);
216308
}
217309
getLog().error( "Error while creating scoverage report: " + e.getMessage(), e );
218310
}
@@ -241,6 +333,12 @@ public boolean canGenerateReport()
241333
return false;
242334
}
243335

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+
244342
if ( "pom".equals( project.getPackaging() ) )
245343
{
246344
return false;
@@ -249,7 +347,7 @@ public boolean canGenerateReport()
249347
//return true;//TODO-don't generate for aggregator nodes
250348

251349
File coverageFile = Serializer.coverageFile( dataDirectory );
252-
if ( !coverageFile.exists() || !coverageFile.isFile() )
350+
if ( !coverageFile.exists() || !coverageFile.isFile() ) //TODO - check is any measurement file exists
253351
{
254352
// getLog().warn( "[scoverage] No coverage data, report generation skipped." );
255353
return false;
@@ -359,4 +457,39 @@ private void mkdirs( File directory )
359457
}
360458
}
361459

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+
}
362495
}

0 commit comments

Comments
 (0)