1 package org.apache.maven.plugins.surefire.report;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.File;
23 import java.util.ArrayList;
24 import java.util.Arrays;
25 import java.util.Iterator;
26 import java.util.List;
27 import java.util.Locale;
28 import java.util.ResourceBundle;
29
30 import org.apache.maven.doxia.siterenderer.Renderer;
31 import org.apache.maven.model.ReportPlugin;
32 import org.apache.maven.project.MavenProject;
33 import org.apache.maven.reporting.AbstractMavenReport;
34 import org.apache.maven.reporting.MavenReportException;
35 import org.codehaus.plexus.util.PathTool;
36 import org.codehaus.plexus.util.StringUtils;
37
38
39
40
41
42
43
44
45
46
47 public class SurefireReportMojo
48 extends AbstractMavenReport
49 {
50
51
52
53
54
55
56 private File outputDirectory;
57
58
59
60
61
62
63
64 private Renderer siteRenderer;
65
66
67
68
69
70
71
72
73 private MavenProject project;
74
75
76
77
78
79
80
81
82 private boolean showSuccess;
83
84
85
86
87
88
89
90 private File[] reportsDirectories;
91
92
93
94
95
96
97
98
99 private File reportsDirectory;
100
101
102
103
104
105
106
107
108
109 private List reactorProjects;
110
111
112
113
114
115
116
117
118 private String outputName;
119
120
121
122
123
124
125
126 private File xrefLocation;
127
128
129
130
131
132
133
134 private boolean linkXRef;
135
136
137
138
139
140
141
142 private boolean aggregate;
143
144
145
146
147 public void executeReport( Locale locale )
148 throws MavenReportException
149 {
150 final List reportsDirectoryList = new ArrayList();
151
152 if ( reportsDirectories != null )
153 {
154 reportsDirectoryList.addAll( Arrays.asList( reportsDirectories ) );
155 }
156
157 if ( reportsDirectory != null )
158 {
159
160 reportsDirectoryList.add( reportsDirectory );
161 }
162 if ( aggregate )
163 {
164 if ( !project.isExecutionRoot() )
165 {
166 return;
167 }
168 if ( reportsDirectories == null )
169 {
170 for ( Iterator i = getProjectsWithoutRoot().iterator(); i.hasNext(); )
171 {
172 reportsDirectoryList.add( getSurefireReportsDirectory( (MavenProject) i.next() ) );
173 }
174 }
175 else
176 {
177
178
179 String parentBaseDir = getProject().getBasedir().getAbsolutePath();
180 for ( Iterator i = getProjectsWithoutRoot().iterator(); i.hasNext(); )
181 {
182 MavenProject subProject = (MavenProject) i.next();
183 String moduleBaseDir = subProject.getBasedir().getAbsolutePath();
184 for ( int d = 0; d < reportsDirectories.length; d++ )
185 {
186 String reportDir = reportsDirectories[d].getPath();
187 if ( reportDir.startsWith( parentBaseDir ) )
188 {
189 reportDir = reportDir.substring( parentBaseDir.length() );
190 }
191 File reportsDirectory = new File( moduleBaseDir, reportDir );
192 if ( reportsDirectory.exists() && reportsDirectory.isDirectory() )
193 {
194 getLog().debug( "Adding report dir : " + moduleBaseDir + reportDir );
195 reportsDirectoryList.add( reportsDirectory );
196 }
197 }
198 }
199 }
200 }
201 else
202 {
203 if ( reportsDirectoryList.size() == 0 )
204 {
205
206 reportsDirectoryList.add( getSurefireReportsDirectory( project ) );
207 }
208 }
209
210 SurefireReportGenerator report =
211 new SurefireReportGenerator( reportsDirectoryList, locale, showSuccess, determineXrefLocation() );
212
213 report.doGenerateReport( getBundle( locale ), getSink() );
214 }
215
216 private File getSurefireReportsDirectory( MavenProject subProject )
217 {
218 String buildDir = subProject.getBuild().getDirectory();
219 return new File( buildDir + "/surefire-reports" );
220 }
221
222 private List getProjectsWithoutRoot()
223 {
224 List result = new ArrayList();
225 for ( Iterator i = reactorProjects.iterator(); i.hasNext(); )
226 {
227 MavenProject subProject = (MavenProject) i.next();
228 if ( !project.equals( subProject ) )
229 {
230 result.add( subProject );
231 }
232 }
233 return result;
234
235 }
236
237 private String determineXrefLocation()
238 {
239 String location = null;
240
241 if ( linkXRef )
242 {
243 String relativePath = PathTool.getRelativePath( getOutputDirectory(), xrefLocation.getAbsolutePath() );
244 if ( StringUtils.isEmpty( relativePath ) )
245 {
246 relativePath = ".";
247 }
248 relativePath = relativePath + "/" + xrefLocation.getName();
249 if ( xrefLocation.exists() )
250 {
251
252 location = relativePath;
253 }
254 else
255 {
256
257 for ( Iterator reports = project.getReportPlugins().iterator(); reports.hasNext(); )
258 {
259 ReportPlugin report = (ReportPlugin) reports.next();
260
261 String artifactId = report.getArtifactId();
262 if ( "maven-jxr-plugin".equals( artifactId ) || "jxr-maven-plugin".equals( artifactId ) )
263 {
264 location = relativePath;
265 }
266 }
267 }
268
269 if ( location == null )
270 {
271 getLog().warn( "Unable to locate Test Source XRef to link to - DISABLED" );
272 }
273 }
274 return location;
275 }
276
277
278
279
280 public String getName( Locale locale )
281 {
282 return getBundle( locale ).getString( "report.surefire.name" );
283 }
284
285
286
287
288 public String getDescription( Locale locale )
289 {
290 return getBundle( locale ).getString( "report.surefire.description" );
291 }
292
293
294
295
296 protected Renderer getSiteRenderer()
297 {
298 return siteRenderer;
299 }
300
301
302
303
304 protected MavenProject getProject()
305 {
306 return project;
307 }
308
309
310
311
312 public String getOutputName()
313 {
314 return outputName;
315 }
316
317
318
319
320 protected String getOutputDirectory()
321 {
322 return outputDirectory.getAbsolutePath();
323 }
324
325 private ResourceBundle getBundle( Locale locale )
326 {
327 return ResourceBundle.getBundle( "surefire-report", locale, this.getClass().getClassLoader() );
328 }
329 }