Clover coverage report - PMD - 3.9
Coverage timestamp: Tue Dec 19 2006 09:38:44 EST
file stats: LOC: 199   Methods: 4
NCLOC: 117   Classes: 1
 
 Source file Conditionals Statements Methods TOTAL
PapariTextRenderer.java 0% 0% 0% 0%
coverage
 1    /**
 2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
 3    */
 4    package net.sourceforge.pmd.renderers;
 5   
 6    import net.sourceforge.pmd.IRuleViolation;
 7    import net.sourceforge.pmd.PMD;
 8    import net.sourceforge.pmd.Report;
 9   
 10    import java.io.BufferedReader;
 11    import java.io.File;
 12    import java.io.FileReader;
 13    import java.io.IOException;
 14    import java.io.Writer;
 15    import java.util.Iterator;
 16    import java.util.Map;
 17   
 18    /**
 19    * <p>A console renderer with optional color support under *nix systems.</p>
 20    * <p/>
 21    * <pre>
 22    * * file: ./src/gilot/Test.java
 23    * src: Test.java:12
 24    * rule: AtLeastOneConstructor
 25    * msg: Each class should declare at least one constructor
 26    * code: public class Test
 27    * <p/>
 28    * * file: ./src/gilot/log/format/LogInterpreter.java
 29    * src: LogInterpreter.java:317
 30    * rule: AvoidDuplicateLiterals
 31    * msg: The same String literal appears 4 times in this file; the first occurrence is on line 317
 32    * code: logger.error( "missing attribute 'app_arg' in rule '" + ((Element)element.getParent()).getAttributeValue( "name" ) + "'" );
 33    * <p/>
 34    * src: LogInterpreter.java:317
 35    * rule: AvoidDuplicateLiterals
 36    * msg: The same String literal appears 5 times in this file; the first occurrence is on line 317
 37    * code: logger.error( "missing attribute 'app_arg' in rule '" + ((Element)element.getParent()).getAttributeValue( "name" ) + "'" );
 38    * <p/>
 39    * * warnings: 3
 40    * <p/>
 41    * </pre>
 42    * <p/>
 43    * <p>Colorization is turned on by supplying -D<b>pmd.color</b> - any value other than
 44    * '0' or 'false', enables color - including an empty value (''). <b>Nota Bene:</b>
 45    * colorization is atm only supported under *nix terminals accepting ansi escape
 46    * sequences, such as xterm, rxvt et cetera.</p>
 47    */
 48    public class PapariTextRenderer extends AbstractRenderer {
 49    /**
 50    * Directory from where java was invoked.
 51    */
 52    private String pwd;
 53   
 54    private String yellowBold = "";
 55    private String whiteBold = "";
 56    private String redBold = "";
 57    private String cyan = "";
 58    private String green = "";
 59   
 60    private String colorReset = "";
 61   
 62    /**
 63    * Enables colors on *nix systems - not windows. Color support depends
 64    * on the pmd.color property, which should be set with the -D option
 65    * during execution - a set value other than 'false' or '0' enables color.
 66    * <p/>
 67    * btw, is it possible to do this on windows (ie; console colors)?
 68    */
 69  0 private void initializeColorsIfSupported() {
 70  0 if (System.getProperty("pmd.color") != null &&
 71    !(System.getProperty("pmd.color").equals("0") || System.getProperty("pmd.color").equals("false"))) {
 72  0 this.yellowBold = "\u001B[1;33m";
 73  0 this.whiteBold = "\u001B[1;37m";
 74  0 this.redBold = "\u001B[1;31m";
 75  0 this.green = "\u001B[0;32m";
 76  0 this.cyan = "\u001B[0;36m";
 77   
 78  0 this.colorReset = "\u001B[0m";
 79    }
 80    }
 81   
 82  0 public void render(Writer writer, Report report) throws IOException {
 83  0 StringBuffer buf = new StringBuffer(PMD.EOL);
 84  0 initializeColorsIfSupported();
 85  0 String lastFile = null;
 86  0 int numberOfErrors = 0;
 87  0 int numberOfWarnings = 0;
 88   
 89  0 for (Iterator i = report.iterator(); i.hasNext();) {
 90  0 buf.setLength(0);
 91  0 numberOfWarnings++;
 92  0 IRuleViolation rv = (IRuleViolation) i.next();
 93  0 if (!rv.getFilename().equals(lastFile)) {
 94  0 lastFile = rv.getFilename();
 95  0 buf.append(this.yellowBold + "*" + this.colorReset + " file: " + this.whiteBold + this.getRelativePath(lastFile) + this.colorReset + PMD.EOL);
 96    }
 97  0 buf.append(this.green + " src: " + this.cyan + lastFile.substring(lastFile.lastIndexOf(File.separator) + 1) + this.colorReset + ":" + this.cyan + rv.getBeginLine() + (rv.getEndLine() == -1 ? "" : ":" + rv.getEndLine()) + this.colorReset + PMD.EOL);
 98  0 buf.append(this.green + " rule: " + this.colorReset + rv.getRule().getName() + PMD.EOL);
 99  0 buf.append(this.green + " msg: " + this.colorReset + rv.getDescription() + PMD.EOL);
 100  0 buf.append(this.green + " code: " + this.colorReset + this.getLine(lastFile, rv.getBeginLine()) + PMD.EOL + PMD.EOL);
 101  0 writer.write(buf.toString());
 102    }
 103  0 writer.write(PMD.EOL + PMD.EOL);
 104  0 writer.write("Summary:" + PMD.EOL + PMD.EOL);
 105  0 Map summary = report.getCountSummary();
 106  0 for (Iterator i = summary.entrySet().iterator(); i.hasNext();) {
 107  0 buf.setLength(0);
 108  0 Map.Entry entry = (Map.Entry) i.next();
 109  0 String key = (String) entry.getKey();
 110  0 buf.append(key + " : " + ((Integer) entry.getValue()).intValue() + PMD.EOL);
 111  0 writer.write(buf.toString());
 112    }
 113   
 114  0 for (Iterator i = report.errors(); i.hasNext();) {
 115  0 buf.setLength(0);
 116  0 numberOfErrors++;
 117  0 Report.ProcessingError error = (Report.ProcessingError) i.next();
 118  0 if (error.getFile().equals(lastFile)) {
 119  0 lastFile = error.getFile();
 120  0 buf.append(this.redBold + "*" + this.colorReset + " file: " + this.whiteBold + this.getRelativePath(lastFile) + this.colorReset + PMD.EOL);
 121    }
 122  0 buf.append(this.green + " err: " + this.cyan + error.getMsg() + this.colorReset + PMD.EOL + PMD.EOL);
 123  0 writer.write(buf.toString());
 124    }
 125   
 126    // adding error message count, if any
 127  0 if (numberOfErrors > 0) {
 128  0 writer.write(this.redBold + "*" + this.colorReset + " errors: " + this.whiteBold + numberOfWarnings + this.colorReset + PMD.EOL);
 129    }
 130  0 writer.write(this.yellowBold + "*" + this.colorReset + " warnings: " + this.whiteBold + numberOfWarnings + this.colorReset + PMD.EOL);
 131    }
 132   
 133    /**
 134    * Retrieves the requested line from the specified file.
 135    *
 136    * @param sourceFile the java or cpp source file
 137    * @param line line number to extract
 138    * @return a trimmed line of source code
 139    */
 140  0 private String getLine(String sourceFile, int line) {
 141  0 String code = null;
 142  0 BufferedReader br = null;
 143  0 try {
 144  0 br = new BufferedReader(new FileReader(new File(sourceFile)));
 145  0 for (int i = 0; line > i; i++) {
 146  0 code = br.readLine().trim();
 147    }
 148    } catch (IOException ioErr) {
 149  0 ioErr.printStackTrace();
 150    } finally {
 151  0 if (br != null) {
 152  0 try {
 153  0 br.close();
 154    } catch (IOException ioErr) {
 155  0 ioErr.printStackTrace();
 156    }
 157    }
 158    }
 159  0 return code;
 160    }
 161   
 162    /**
 163    * Attempts to determine the relative path to the file. If relative path cannot be found,
 164    * the original path is returnedi, ie - the current path for the supplied file.
 165    *
 166    * @param fileName well, the file with its original path.
 167    * @return the relative path to the file
 168    */
 169  0 private String getRelativePath(String fileName) {
 170  0 String relativePath;
 171   
 172    // check if working directory need to be assigned
 173  0 if (pwd == null) {
 174  0 try {
 175  0 this.pwd = new File(".").getCanonicalPath();
 176    } catch (IOException ioErr) {
 177    // to avoid further error
 178  0 this.pwd = "";
 179    }
 180    }
 181   
 182    // make sure that strings match before doing any substring-ing
 183  0 if (fileName.indexOf(this.pwd) == 0) {
 184  0 relativePath = "." + fileName.substring(this.pwd.length());
 185   
 186    // remove current dir occuring twice - occurs if . was supplied as path
 187  0 if (relativePath.startsWith("." + File.separator + "." + File.separator)) {
 188  0 relativePath = relativePath.substring(2);
 189    }
 190    } else {
 191    // this happens when pmd's supplied argument deviates from the pwd 'branch' (god knows this terminolgy - i hope i make some sense).
 192    // for instance, if supplied=/usr/lots/of/src and pwd=/usr/lots/of/shared/source
 193    // TODO: a fix to get relative path?
 194  0 relativePath = fileName;
 195    }
 196   
 197  0 return relativePath;
 198    }
 199    }