| Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||||||
| BuildStatChartMojo |
|
| 1.6666666666666667;1.667 |
| 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; |
|
| 40 | ||
| 41 | import java.io.File; |
|
| 42 | import java.io.FileInputStream; |
|
| 43 | import java.io.FileNotFoundException; |
|
| 44 | import java.io.IOException; |
|
| 45 | ||
| 46 | import javax.xml.parsers.ParserConfigurationException; |
|
| 47 | import javax.xml.parsers.SAXParser; |
|
| 48 | import javax.xml.parsers.SAXParserFactory; |
|
| 49 | ||
| 50 | import net.objectlab.qalab.m2.util.Maven2TaskLogger; |
|
| 51 | import net.objectlab.qalab.m2.util.Utils; |
|
| 52 | import net.objectlab.qalab.parser.BuildStatForChartParser; |
|
| 53 | ||
| 54 | import org.apache.maven.plugin.AbstractMojo; |
|
| 55 | import org.apache.maven.plugin.MojoExecutionException; |
|
| 56 | import org.xml.sax.InputSource; |
|
| 57 | import org.xml.sax.SAXException; |
|
| 58 | ||
| 59 | /** |
|
| 60 | * Goal which generates the QALab BuildStat chart. |
|
| 61 | * |
|
| 62 | * @author <a href="http://www.davesag.com">Dave Sag</a>. |
|
| 63 | * @goal chart |
|
| 64 | * @phase site |
|
| 65 | */ |
|
| 66 | 0 | public class BuildStatChartMojo extends AbstractMojo { |
| 67 | ||
| 68 | // ~ Static fields/initializers |
|
| 69 | // ------------------------------------------------------------------------ |
|
| 70 | ||
| 71 | /** Default SAX parser. * */ |
|
| 72 | // private static final String DEFAULT_PARSER_NAME = "org.apache.xerces.parsers.SAXParser"; |
|
| 73 | ||
| 74 | /** Default Chart width. * */ |
|
| 75 | private static final int DEFAULT_WIDTH = 750; |
|
| 76 | ||
| 77 | /** Default Chart height. * */ |
|
| 78 | private static final int DEFAULT_HEIGHT = 500; |
|
| 79 | ||
| 80 | // ~ Instance fields ------------------------------------------------------- |
|
| 81 | ||
| 82 | /** |
|
| 83 | * The QALab properties file. |
|
| 84 | * |
|
| 85 | * @parameter expression="${project.basedir}/qalab.xml" |
|
| 86 | * @required |
|
| 87 | */ |
|
| 88 | 0 | private File qalabFile = null; |
| 89 | ||
| 90 | /** |
|
| 91 | * The directory to put the chart. |
|
| 92 | * |
|
| 93 | * @parameter expression="${project.reporting.outputDirectory}/qalab" |
|
| 94 | * @required |
|
| 95 | */ |
|
| 96 | 0 | private File toDir = null; |
| 97 | ||
| 98 | /** |
|
| 99 | * If true then any debug logging output will be suppressed. |
|
| 100 | * |
|
| 101 | * @parameter default-value=false |
|
| 102 | */ |
|
| 103 | 0 | private boolean quiet = false; |
| 104 | ||
| 105 | /** |
|
| 106 | * The Chart width. |
|
| 107 | * |
|
| 108 | * @parameter default-value=750 |
|
| 109 | */ |
|
| 110 | 0 | private int width = DEFAULT_WIDTH; |
| 111 | ||
| 112 | /** |
|
| 113 | * The Chart height. |
|
| 114 | * |
|
| 115 | * @parameter default-value=500 |
|
| 116 | */ |
|
| 117 | 0 | private int height = DEFAULT_HEIGHT; |
| 118 | ||
| 119 | /** |
|
| 120 | * If the movingAverage is <= 0 then there is no moving average, otherwise |
|
| 121 | * it shows the average based on the last n points, where n is the value of |
|
| 122 | * this field. |
|
| 123 | * |
|
| 124 | * @parameter default-value=0 |
|
| 125 | */ |
|
| 126 | 0 | private int movingAverage = 0; |
| 127 | ||
| 128 | /** |
|
| 129 | * If true then generate a summary chart only. |
|
| 130 | * |
|
| 131 | * @parameter default-value=false |
|
| 132 | */ |
|
| 133 | 0 | private boolean summaryOnly = false; |
| 134 | ||
| 135 | /** |
|
| 136 | * Statistic type, defaulted to |
|
| 137 | * 'checkstyle,pmd,findbugs,simian,pmd-cpd,cobertura-line,cobertura-branch'. |
|
| 138 | * |
|
| 139 | * @parameter default-value="checkstyle,pmd,findbugs,simian,pmd-cpd,cobertura-line,cobertura-branch" |
|
| 140 | */ |
|
| 141 | 0 | private String types = "checkstyle,pmd,findbugs,simian,pmd-cpd,cobertura-line,cobertura-branch"; |
| 142 | ||
| 143 | /** |
|
| 144 | * Statistic type to appear on summary chart, defaulted to |
|
| 145 | * 'checkstyle,pmd,findbugs,simian,pmd-cpd'. |
|
| 146 | * |
|
| 147 | * @parameter default-value="checkstyle,pmd,findbugs,simian,pmd-cpd" |
|
| 148 | */ |
|
| 149 | 0 | private String summaryTypes = "checkstyle,pmd,findbugs,simian,pmd-cpd"; |
| 150 | ||
| 151 | /** |
|
| 152 | * File prefix for the charts (e.g. cobertura-) Default empty. |
|
| 153 | * |
|
| 154 | * @parameter default-value="" |
|
| 155 | */ |
|
| 156 | 0 | private String filePrefix = ""; |
| 157 | ||
| 158 | /** |
|
| 159 | * X Axis Title |
|
| 160 | * |
|
| 161 | * @parameter default-value="Date" |
|
| 162 | */ |
|
| 163 | 0 | private String xAxisTitle = "Date"; |
| 164 | ||
| 165 | /** |
|
| 166 | * Y Axis Title |
|
| 167 | * |
|
| 168 | * @parameter default-value="Violation Count / Coverage Percent" |
|
| 169 | */ |
|
| 170 | 0 | private String yAxisTitle = "Violation Count / Coverage Percent"; |
| 171 | ||
| 172 | /** |
|
| 173 | * X Axis Title for Summary |
|
| 174 | * |
|
| 175 | * @parameter default-value="Date" |
|
| 176 | */ |
|
| 177 | 0 | private String xAxisSummaryTitle = "Date"; |
| 178 | ||
| 179 | /** |
|
| 180 | * Y Axis Title for Summary |
|
| 181 | * |
|
| 182 | * @parameter default-value="Violation Count" |
|
| 183 | */ |
|
| 184 | 0 | private String yAxisSummaryTitle = "Violation Count"; |
| 185 | ||
| 186 | /** |
|
| 187 | * validates the input then generates the charts. |
|
| 188 | * |
|
| 189 | * @throws MojoExecutionException |
|
| 190 | * if anything goes wrong. |
|
| 191 | */ |
|
| 192 | public final void execute() throws MojoExecutionException { |
|
| 193 | // validate the provided parameters |
|
| 194 | 0 | validate(); |
| 195 | ||
| 196 | // Display the files being processed |
|
| 197 | 0 | if (!quiet) { |
| 198 | 0 | getLog().info("QALab CHARTS ==> qalabFile='" + qalabFile.getPath() + "'"); |
| 199 | 0 | getLog().info("toDir='" + toDir.getPath()); |
| 200 | 0 | getLog().info("width='" + width + "' height='" + height + "' summaryOnly='" + isSummaryOnly() + "'"); |
| 201 | 0 | getLog().info("Types=" + types); |
| 202 | 0 | getLog().info("Summary Types=" + getSummaryTypes()); |
| 203 | 0 | getLog().info("File Prefix=" + getFilePrefix()); |
| 204 | } |
|
| 205 | ||
| 206 | 0 | generateCharts(); |
| 207 | ||
| 208 | 0 | } |
| 209 | ||
| 210 | /** |
|
| 211 | * Generate the charts by creating a SAX parser specialised in finding the |
|
| 212 | * elements of given type and creating charts in a given directory. |
|
| 213 | * |
|
| 214 | * @throws MojoExecutionException |
|
| 215 | * if anything goes wrong. |
|
| 216 | */ |
|
| 217 | private void generateCharts() throws MojoExecutionException { |
|
| 218 | // define a sax stuff... |
|
| 219 | 0 | final BuildStatForChartParser myForChartParser = new BuildStatForChartParser(new Maven2TaskLogger(this)); |
| 220 | ||
| 221 | 0 | myForChartParser.setChartHeight(height); |
| 222 | 0 | myForChartParser.setChartWidth(width); |
| 223 | 0 | myForChartParser.setToDir(toDir.getAbsolutePath() + "/"); |
| 224 | 0 | myForChartParser.setMovingAverage(movingAverage); |
| 225 | 0 | myForChartParser.setSummaryOnly(isSummaryOnly()); |
| 226 | 0 | myForChartParser.setAcceptedStyle(types); |
| 227 | 0 | myForChartParser.setSummaryStyle(getSummaryTypes()); |
| 228 | 0 | myForChartParser.setQuiet(quiet); |
| 229 | 0 | myForChartParser.setFilePrefix(getFilePrefix()); |
| 230 | 0 | myForChartParser.setXAxisSummaryTitle(xAxisSummaryTitle); |
| 231 | 0 | myForChartParser.setXAxisTitle(xAxisTitle); |
| 232 | 0 | myForChartParser.setYAxisSummaryTitle(yAxisSummaryTitle); |
| 233 | 0 | myForChartParser.setYAxisTitle(yAxisTitle); |
| 234 | ||
| 235 | try { |
|
| 236 | 0 | SAXParserFactory factory = SAXParserFactory.newInstance(); |
| 237 | 0 | SAXParser saxParser = factory.newSAXParser(); |
| 238 | ||
| 239 | 0 | if (!quiet) { |
| 240 | 0 | getLog().info("Parsing " + qalabFile); |
| 241 | } |
|
| 242 | ||
| 243 | 0 | saxParser.parse(new InputSource(new FileInputStream(qalabFile)), myForChartParser); |
| 244 | 0 | } catch (SAXException sex) { |
| 245 | 0 | getLog().error(sex.toString()); |
| 246 | 0 | throw new MojoExecutionException("Error generating charts.", sex); |
| 247 | 0 | } catch (FileNotFoundException fnfex) { |
| 248 | 0 | getLog().error(fnfex.toString()); |
| 249 | 0 | throw new MojoExecutionException("Error generating charts.", fnfex); |
| 250 | 0 | } catch (IOException ioex) { |
| 251 | 0 | getLog().error(ioex.toString()); |
| 252 | 0 | throw new MojoExecutionException("Error generating charts.", ioex); |
| 253 | 0 | } catch (ParserConfigurationException e) { |
| 254 | 0 | getLog().error(e.toString()); |
| 255 | 0 | throw new MojoExecutionException("Error generating charts.", e); |
| 256 | 0 | } |
| 257 | 0 | } |
| 258 | ||
| 259 | /** |
|
| 260 | * Validates the parameters supplied by maven. |
|
| 261 | * |
|
| 262 | * @throws MojoExecutionException |
|
| 263 | * if anything goes wrong. |
|
| 264 | */ |
|
| 265 | private void validate() throws MojoExecutionException { |
|
| 266 | try { |
|
| 267 | 0 | Utils.checkFile(qalabFile, "qalabFile"); |
| 268 | 0 | } catch (IOException ioex) { |
| 269 | 0 | throw new MojoExecutionException(ioex.getMessage(), ioex); |
| 270 | 0 | } |
| 271 | ||
| 272 | 0 | if (toDir == null) { |
| 273 | 0 | throw new MojoExecutionException("toDir is mandatory"); |
| 274 | } |
|
| 275 | ||
| 276 | 0 | if (toDir.exists() && !toDir.isDirectory()) { |
| 277 | 0 | final String message = "toDir must be a directory (" + toDir + ")"; |
| 278 | 0 | throw new MojoExecutionException(message); |
| 279 | } |
|
| 280 | ||
| 281 | 0 | if (!toDir.exists()) { |
| 282 | 0 | if (!quiet) { |
| 283 | 0 | getLog().debug("Creating directory: " + toDir.toString()); |
| 284 | } |
|
| 285 | ||
| 286 | 0 | toDir.mkdir(); |
| 287 | } |
|
| 288 | 0 | } |
| 289 | ||
| 290 | /** |
|
| 291 | * @return the summaryOnly |
|
| 292 | */ |
|
| 293 | public boolean isSummaryOnly() { |
|
| 294 | 0 | return summaryOnly; |
| 295 | } |
|
| 296 | ||
| 297 | /** |
|
| 298 | * @param summaryOnly the summaryOnly to set |
|
| 299 | */ |
|
| 300 | public void setSummaryOnly(boolean summaryOnly) { |
|
| 301 | 0 | this.summaryOnly = summaryOnly; |
| 302 | 0 | } |
| 303 | ||
| 304 | /** |
|
| 305 | * @return the summaryTypes |
|
| 306 | */ |
|
| 307 | public String getSummaryTypes() { |
|
| 308 | 0 | return summaryTypes; |
| 309 | } |
|
| 310 | ||
| 311 | /** |
|
| 312 | * @param summaryTypes the summaryTypes to set |
|
| 313 | */ |
|
| 314 | public void setSummaryTypes(String summaryTypes) { |
|
| 315 | 0 | this.summaryTypes = summaryTypes; |
| 316 | 0 | } |
| 317 | ||
| 318 | /** |
|
| 319 | * @return the filePrefix |
|
| 320 | */ |
|
| 321 | public String getFilePrefix() { |
|
| 322 | 0 | return filePrefix; |
| 323 | } |
|
| 324 | ||
| 325 | /** |
|
| 326 | * @param filePrefix the filePrefix to set |
|
| 327 | */ |
|
| 328 | public void setFilePrefix(String filePrefix) { |
|
| 329 | 0 | this.filePrefix = filePrefix; |
| 330 | 0 | } |
| 331 | ||
| 332 | /** |
|
| 333 | * @return the height |
|
| 334 | */ |
|
| 335 | public int getHeight() { |
|
| 336 | 0 | return height; |
| 337 | } |
|
| 338 | ||
| 339 | /** |
|
| 340 | * @param height the height to set |
|
| 341 | */ |
|
| 342 | public void setHeight(int height) { |
|
| 343 | 0 | this.height = height; |
| 344 | 0 | } |
| 345 | ||
| 346 | /** |
|
| 347 | * @return the movingAverage |
|
| 348 | */ |
|
| 349 | public int getMovingAverage() { |
|
| 350 | 0 | return movingAverage; |
| 351 | } |
|
| 352 | ||
| 353 | /** |
|
| 354 | * @param movingAverage the movingAverage to set |
|
| 355 | */ |
|
| 356 | public void setMovingAverage(int movingAverage) { |
|
| 357 | 0 | this.movingAverage = movingAverage; |
| 358 | 0 | } |
| 359 | ||
| 360 | /** |
|
| 361 | * @return the qalabFile |
|
| 362 | */ |
|
| 363 | public File getQalabFile() { |
|
| 364 | 0 | return qalabFile; |
| 365 | } |
|
| 366 | ||
| 367 | /** |
|
| 368 | * @param qalabFile the qalabFile to set |
|
| 369 | */ |
|
| 370 | public void setQalabFile(File qalabFile) { |
|
| 371 | 0 | this.qalabFile = qalabFile; |
| 372 | 0 | } |
| 373 | ||
| 374 | /** |
|
| 375 | * @return the quiet |
|
| 376 | */ |
|
| 377 | public boolean isQuiet() { |
|
| 378 | 0 | return quiet; |
| 379 | } |
|
| 380 | ||
| 381 | /** |
|
| 382 | * @param quiet the quiet to set |
|
| 383 | */ |
|
| 384 | public void setQuiet(boolean quiet) { |
|
| 385 | 0 | this.quiet = quiet; |
| 386 | 0 | } |
| 387 | ||
| 388 | /** |
|
| 389 | * @return the toDir |
|
| 390 | */ |
|
| 391 | public File getToDir() { |
|
| 392 | 0 | return toDir; |
| 393 | } |
|
| 394 | ||
| 395 | /** |
|
| 396 | * @param toDir the toDir to set |
|
| 397 | */ |
|
| 398 | public void setToDir(File toDir) { |
|
| 399 | 0 | this.toDir = toDir; |
| 400 | 0 | } |
| 401 | ||
| 402 | /** |
|
| 403 | * @return the types |
|
| 404 | */ |
|
| 405 | public String getTypes() { |
|
| 406 | 0 | return types; |
| 407 | } |
|
| 408 | ||
| 409 | /** |
|
| 410 | * @param types the types to set |
|
| 411 | */ |
|
| 412 | public void setTypes(String types) { |
|
| 413 | 0 | this.types = types; |
| 414 | 0 | } |
| 415 | ||
| 416 | /** |
|
| 417 | * @return the width |
|
| 418 | */ |
|
| 419 | public int getWidth() { |
|
| 420 | 0 | return width; |
| 421 | } |
|
| 422 | ||
| 423 | /** |
|
| 424 | * @param width the width to set |
|
| 425 | */ |
|
| 426 | public void setWidth(int width) { |
|
| 427 | 0 | this.width = width; |
| 428 | 0 | } |
| 429 | ||
| 430 | public void setXAxisSummaryTitle(String xAxisSummaryTitle) { |
|
| 431 | 0 | this.xAxisSummaryTitle = xAxisSummaryTitle; |
| 432 | 0 | } |
| 433 | ||
| 434 | public void setXAxisTitle(String xAxisTitle) { |
|
| 435 | 0 | this.xAxisTitle = xAxisTitle; |
| 436 | 0 | } |
| 437 | ||
| 438 | public void setYAxisSummaryTitle(String yAxisSummaryTitle) { |
|
| 439 | 0 | this.yAxisSummaryTitle = yAxisSummaryTitle; |
| 440 | 0 | } |
| 441 | ||
| 442 | public void setYAxisTitle(String yAxisTitle) { |
|
| 443 | 0 | this.yAxisTitle = yAxisTitle; |
| 444 | 0 | } |
| 445 | ||
| 446 | } |
|
| 447 | /* |
|
| 448 | * ObjectLab is sponsoring QALab |
|
| 449 | * |
|
| 450 | * Based in London, we are world leaders in the design and development |
|
| 451 | * of bespoke applications for the securities financing markets. |
|
| 452 | * |
|
| 453 | * <a href="http://www.objectlab.co.uk/open">Click here to learn more about us</a> |
|
| 454 | * ___ _ _ _ _ _ |
|
| 455 | * / _ \| |__ (_) ___ ___| |_| | __ _| |__ |
|
| 456 | * | | | | '_ \| |/ _ \/ __| __| | / _` | '_ \ |
|
| 457 | * | |_| | |_) | | __/ (__| |_| |__| (_| | |_) | |
|
| 458 | * \___/|_.__// |\___|\___|\__|_____\__,_|_.__/ |
|
| 459 | * |__/ |
|
| 460 | * |
|
| 461 | * www.ObjectLab.co.uk |
|
| 462 | */ |