Clover coverage report - PMD - 3.7 Coverage timestamp: Wed May 31 2006 09:25:59 EDT FRAMES NO FRAMES |

file stats: | LOC: | 193 |  | Methods: | 4
| NCLOC: | 110 |  | Classes: | 1

Source file | Conditionals | Statements | Methods | TOTAL
PapariTextRenderer.java | 0% | 0% | 0% | 0% |

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