1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 package net.objectlab.qalab.m2.report;
40
41 import java.io.File;
42 import java.io.IOException;
43 import java.util.Locale;
44 import java.util.ResourceBundle;
45 import java.io.FileInputStream;
46 import java.io.InputStream;
47
48 import net.objectlab.qalab.m2.BuildStatMoversMojo;
49 import net.objectlab.qalab.m2.util.Utils;
50 import net.objectlab.qalab.m2.util.XmlTransformer;
51
52 import org.apache.maven.plugin.MojoExecutionException;
53 import org.apache.maven.project.MavenProject;
54 import org.apache.maven.reporting.AbstractMavenReport;
55 import org.apache.maven.reporting.MavenReportException;
56
57 import org.codehaus.doxia.site.renderer.SiteRenderer;
58 import javax.xml.transform.TransformerException;
59
60 /**
61 * *** IMPORTANT: USE this Report AFTER the merge and chart report, it will calculate the
62 * movers and generate of the Movers report.
63 *
64 * @author Benoit Xhenseval.
65 * @goal report-movers-all
66 * @phase deploy
67 */
68 public class MoversReport extends AbstractMavenReport {
69
70 /**
71 * The qalabFile, typically qalab.xml.
72 *
73 * @parameter expression="${project.basedir}/qalab.xml"
74 */
75 private File qalabFile = null;
76
77 /**
78 * The number of hours to define the time window from now.
79 *
80 * @parameter default-value="54"
81 */
82 private String startTimeHoursOffset = null;
83
84 /**
85 * Statistic types to be taken into account
86 * (checkstyle|findbugs|pmd|simian|pmd-cpd|cobertura-line|cobertura-branch).
87 * Or comma separated combinations. Default is checkstyle, pmd and findbugs. Please note
88 * that there is no point of adding pmd-cpd or simian as no statistics are
89 * kept at file level for those.
90 *
91 * @parameter default-value="checkstyle,pmd,findbugs,cobertura-line,cobertura-branch"
92 */
93 private String types = "checkstyle,pmd,findbugs,cobertura-line,cobertura-branch";
94
95 /**
96 * The output XML file with ups and downs.
97 *
98 * @parameter expression="${project.build.directory}/qalab/qalab-movers.xml"
99 */
100 private File qalabMoversOutputFile;
101
102 /**
103 * If true then any debug logging output will be suppressed.
104 *
105 * @parameter default-value=false
106 */
107 private boolean quiet = false;
108
109 /**
110 * if true, adjust for weekend ie add 48h if start time falls on a weekend.
111 *
112 * @parameter default-value=true
113 */
114 private boolean weekendAdjustment = true;
115
116 /**
117 * Start Time Window (instead of using startTimeHoursOffset). parameter
118 */
119 private String startTimeWindow = null;
120
121 /**
122 * End Time Window (instead of assuming "now"). parameter
123 */
124 private String endTimeWindow = null;
125
126
127
128 /**
129 * The report file name.
130 *
131 * @parameter expression="movers.xml"
132 * @required
133 */
134 private String outputFileName;
135
136 /**
137 * The directory where the generated html report will go. @ parameter
138 * expression="${project.reporting.outputDirectory}/qalab"
139 * @parameter expression="${project.build.directory}/generated-site/xdoc"
140 * @required
141 */
142 private String outputDirectory;
143
144 /**
145 * The xslt stylesheet bundled, either qalab-movers-xdoc.xsl or
146 * qalab-movers-html.xsl.
147 *
148 * @parameter default-value="qalab-movers-xdoc.xsl";
149 */
150 private String moversBundledXsl = null;
151
152 /**
153 * Not sure what this is.
154 *
155 * @component
156 */
157 private SiteRenderer siteRenderer;
158
159 /**
160 * The maven project.
161 *
162 * @parameter expression="${project}"
163 * @required
164 * @readonly
165 */
166 private MavenProject project;
167
168 /**
169 * The xml input stream.
170 */
171 private InputStream theXmlStream = null;
172
173 /**
174 * The xslt style sheet.
175 *
176 * @parameter
177 */
178 private File moversStyleSheet = null;
179
180 /**
181 * The xslt style sheet input stream.
182 */
183 private InputStream theStyleSheetStream = null;
184
185 /**
186 * generate the actual report.
187 *
188 * @param aLocale
189 * ignored.
190 * @throws MavenReportException
191 * if anything goes wrong.
192 */
193 protected final void executeReport(final Locale aLocale) throws MavenReportException {
194 getLog().info("----------------------------------------");
195 getLog().info("QALab Movers Computation and Report");
196 try {
197 doCalculateMovers();
198 } catch (MojoExecutionException e) {
199 throw new MavenReportException("Issue creating the movers file", e);
200 }
201
202 validate();
203
204 final File outdir = new File(getOutputDirectory());
205 if (!outdir.exists()) {
206 outdir.mkdirs();
207 }
208 assert outdir.isDirectory() : "the output directory was not a directory";
209
210 final File output;
211 try {
212 output = new File(outdir, outputFileName);
213 output.createNewFile();
214 } catch (IOException ioex) {
215 throw new MavenReportException("could not create output file.", ioex);
216 }
217
218 final XmlTransformer t = new XmlTransformer(theXmlStream, theStyleSheetStream, output);
219 try {
220 t.transform();
221 } catch (TransformerException tex) {
222 throw new MavenReportException("transformation failed.", tex);
223 }
224
225 }
226
227 private void doCalculateMovers() throws MojoExecutionException {
228 BuildStatMoversMojo mojo = new BuildStatMoversMojo();
229 mojo.setEndTimeWindow(endTimeWindow);
230 mojo.setQalabFile(qalabFile);
231 mojo.setQalabMoversOutputFile(qalabMoversOutputFile);
232 mojo.setQuiet(quiet);
233 mojo.setStartTimeHoursOffset(startTimeHoursOffset);
234 mojo.setStartTimeWindow(startTimeWindow);
235 mojo.setTypes(types);
236 mojo.setWeekendAdjustment(weekendAdjustment);
237 mojo.setPluginContext(getPluginContext());
238
239 mojo.execute();
240 }
241
242 /**
243 * @return "outputFileName up to the first '.'"
244 * @see org.apache.maven.reporting.MavenReport#getOutputName()
245 */
246 public final String getOutputName() {
247
248 return outputFileName.substring(0, outputFileName.indexOf('.'));
249 }
250
251 /**
252 * @return The output directory as configured in your <code>pom.xml</code>.
253 * @see org.apache.maven.reporting.AbstractMavenReport#getOutputDirectory()
254 */
255 protected final String getOutputDirectory() {
256 return outputDirectory;
257 }
258
259 /**
260 * @return The Maven Project itself. Used internally to get access to Config
261 * params etc.
262 * @see org.apache.maven.reporting.AbstractMavenReport#getProject()
263 */
264 protected final MavenProject getProject() {
265 return project;
266 }
267
268 /**
269 * @return a direct reference to the site renderer.
270 * @see org.apache.maven.reporting.AbstractMavenReport#getSiteRenderer()
271 */
272 protected final SiteRenderer getSiteRenderer() {
273 return siteRenderer;
274 }
275
276 /**
277 * @param aLocale
278 * The locale.
279 * @return The locale specific report name.
280 * @see org.apache.maven.reporting.MavenReport#getName(java.util.Locale)
281 */
282 public final String getName(final Locale aLocale) {
283 return getBundle(aLocale).getString("report.qalab.movers.name");
284 }
285
286 /**
287 * @param aLocale
288 * The locale.
289 * @return The locale specific report description.
290 * @see org.apache.maven.reporting.MavenReport#getDescription(java.util.Locale)
291 */
292 public final String getDescription(final Locale aLocale) {
293 return getBundle(aLocale).getString("report.qalab.movers.description");
294 }
295
296 /**
297 * @return true.
298 * @see org.apache.maven.reporting.MavenReport#isExternalReport
299 */
300 public final boolean isExternalReport() {
301 return true;
302 }
303
304 /**
305 * @param aLocale
306 * The locale.
307 * @return the resource bundle for this report.
308 */
309 private static ResourceBundle getBundle(final Locale aLocale) {
310 return ResourceBundle.getBundle("qalab-report", aLocale, MainReport.class.getClassLoader());
311 }
312
313 /**
314 * Validates the parameters supplied by maven 2.
315 *
316 * @throws MavenReportException
317 * if any supplied params are wrong.
318 */
319 private void validate() throws MavenReportException {
320 try {
321 Utils.checkFile(qalabMoversOutputFile, "inputMoversFile");
322 theXmlStream = new FileInputStream(qalabMoversOutputFile);
323 } catch (IOException ioex) {
324 throw new MavenReportException(ioex.getMessage(), ioex);
325 }
326
327 if (moversStyleSheet == null) {
328 try {
329 theStyleSheetStream = Utils.extractAsInputStream(moversBundledXsl);
330 } catch (IOException ioex) {
331 throw new MavenReportException("Could not find the default stylesheet. " + ioex.getMessage(), ioex);
332 }
333 } else {
334 try {
335 Utils.checkFile(moversStyleSheet, "moversStyleSheet");
336 theStyleSheetStream = new FileInputStream(moversStyleSheet);
337 } catch (IOException ioex) {
338 throw new MavenReportException(ioex.getMessage(), ioex);
339 }
340 }
341 }
342 }
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358