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