View Javadoc

1   ////////////////////////////////////////////////////////////////////////////////
2   //
3   //                  ObjectLab is sponsoring QALab
4   //
5   // Based in London, we are world leaders in the design and development
6   // of bespoke applications for the Securities Financing markets.
7   //
8   // <a href="http://www.objectlab.co.uk/open">Click here to learn more</a>
9   //           ___  _     _           _   _          _
10  //          / _ \| |__ (_) ___  ___| |_| |    __ _| |__
11  //         | | | | '_ \| |/ _ \/ __| __| |   / _` | '_ \
12  //         | |_| | |_) | |  __/ (__| |_| |__| (_| | |_) |
13  //          \___/|_.__// |\___|\___|\__|_____\__,_|_.__/
14  //                   |__/
15  //
16  //                   http://www.ObjectLab.co.uk
17  // ---------------------------------------------------------------------------
18  //
19  //QALab is released under the GNU General Public License.
20  //
21  //QALab: Collects QA Statistics from your build over time.
22  //2005+, ObjectLab Ltd
23  //
24  //This library is free software; you can redistribute it and/or
25  //modify it under the terms of the GNU General Public
26  //License as published by the Free Software Foundation; either
27  //version 2.1 of the License, or (at your option) any later version.
28  //
29  //This library is distributed in the hope that it will be useful,
30  //but WITHOUT ANY WARRANTY; without even the implied warranty of
31  //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
32  //General Public License for more details.
33  //
34  //You should have received a copy of the GNU General Public
35  //License along with this library; if not, write to the Free Software
36  //Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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      // ~ Movers COMPUTATION -------------------------------------------------------
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     // ~ Instance fields -------------------------------------------------------
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         // return "movers";
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  *                   ObjectLab is sponsoring QALab
345  * 
346  * Based in London, we are world leaders in the design and development 
347  * of bespoke applications for the securities financing markets.
348  * 
349  * <a href="http://www.objectlab.co.uk/open">Click here to learn more about us</a>
350  *           ___  _     _           _   _          _
351  *          / _ \| |__ (_) ___  ___| |_| |    __ _| |__
352  *         | | | | '_ \| |/ _ \/ __| __| |   / _` | '_ \
353  *         | |_| | |_) | |  __/ (__| |_| |__| (_| | |_) |
354  *          \___/|_.__// |\___|\___|\__|_____\__,_|_.__/
355  *                   |__/
356  *
357  *                     www.ObjectLab.co.uk
358  */