Clover coverage report - PMD - 3.9 Coverage timestamp: Tue Dec 19 2006 09:38:44 EST FRAMES NO FRAMES |
file stats: | LOC: | 149 |  | Methods: | 8
| NCLOC: | 130 |  | Classes: | 1
Source file | Conditionals | Statements | Methods | TOTAL
HTMLRenderer.java | 55.9% | 76.1% | 100% | 72.3% |

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 |  | import net.sourceforge.pmd.util.StringUtil;
10 |  |
11 |  | import java.io.IOException;
12 |  | import java.io.Writer;
13 |  | import java.util.Iterator;
14 |  |
15 |  | public class HTMLRenderer extends AbstractRenderer {
16 |  |
17 |  | private String linkPrefix;
18 |  | private String linePrefix;
19 |  |
20 | 10 | public HTMLRenderer(String linkPrefix, String linePrefix) {
21 | 10 | this.linkPrefix = linkPrefix;
22 | 10 | this.linePrefix = linePrefix;
23 |  |
24 |  | }
25 |  |
26 | 6 | public HTMLRenderer() {
27 | 6 | this(null, null);
28 |  | }
29 |  |
30 | 5 | public void render(Writer writer, Report report) throws IOException {
31 | 5 | writer.write("<html><head><title>PMD</title></head><body>" + PMD.EOL);
32 | 5 | renderBody(writer, report);
33 | 4 | writer.write("</body></html>");
34 |  | }
35 |  |
36 | 9 | public void renderBody(Writer writer, Report report) throws IOException {
37 | 9 | glomIRuleViolations(writer, report);
38 | 8 | glomProcessingErrors(writer, report);
39 | 8 | if (showSuppressedViolations) {
40 | 8 | glomSuppressions(writer, report);
41 |  | }
42 |  | }
43 |  |
44 | 9 | private void glomIRuleViolations(Writer writer, Report report) throws IOException {
45 | 9 | boolean colorize = true;
46 | 9 | int violationCount = 1;
47 | 9 | StringBuffer buf = new StringBuffer(500);
48 | 9 | writer.write("<center><h3>PMD report</h3></center>");
49 | 9 | writer.write("<center><h3>Problems found</h3></center>");
50 | 9 | writer.write("<table align=\"center\" cellspacing=\"0\" cellpadding=\"3\"><tr>" + PMD.EOL + "<th>#</th><th>File</th><th>Line</th><th>Problem</th></tr>" + PMD.EOL);
51 | 9 | for (Iterator i = report.iterator(); i.hasNext();) {
52 | 6 | IRuleViolation rv = (IRuleViolation) i.next();
53 | 6 | buf.setLength(0);
54 | 6 | buf.append("<tr");
55 | 6 | if (colorize) {
56 | 4 | buf.append(" bgcolor=\"lightgrey\"");
57 |  | }
58 | 6 | colorize = !colorize;
59 | 6 | buf.append("> " + PMD.EOL);
60 | 6 | buf.append("<td align=\"center\">" + violationCount + "</td>" + PMD.EOL);
61 | 6 | buf.append("<td width=\"*%\">" + maybeWrap(rv.getFilename(),linePrefix==null?"":linePrefix + Integer.toString(rv.getBeginLine())) + "</td>" + PMD.EOL);
62 | 6 | buf.append("<td align=\"center\" width=\"5%\">" + Integer.toString(rv.getBeginLine()) + "</td>" + PMD.EOL);
63 |  |
64 | 6 | String d = StringUtil.htmlEncode(rv.getDescription());
65 |  |
66 | 6 | if (rv.getRule().getExternalInfoUrl() != null && rv.getRule().getExternalInfoUrl().length() != 0) {
67 | 0 | d = "<a href=\"" + rv.getRule().getExternalInfoUrl() + "\">" + d + "</a>";
68 |  | }
69 | 6 | buf.append("<td width=\"*\">" + d + "</td>" + PMD.EOL);
70 | 6 | buf.append("</tr>" + PMD.EOL);
71 | 6 | writer.write(buf.toString());
72 | 6 | violationCount++;
73 |  | }
74 | 8 | if (violationCount > 0) {
75 | 8 | writer.write("</table>");
76 |  | }
77 |  | }
78 |  |
79 | 8 | private void glomProcessingErrors(Writer writer, Report report) throws IOException {
80 | 8 | boolean colorize = true;
81 | 8 | int violationCount;
82 |  | // errors
83 | 8 | if (report.errors().hasNext()) {
84 | 2 | writer.write("<hr/>");
85 | 2 | writer.write("<center><h3>Processing errors</h3></center>");
86 | 2 | writer.write("<table align=\"center\" cellspacing=\"0\" cellpadding=\"3\"><tr>" + PMD.EOL + "<th>File</th><th>Problem</th></tr>" + PMD.EOL);
87 |  | }
88 | 8 | violationCount = 0;
89 | 8 | StringBuffer buf = new StringBuffer(500);
90 | 8 | for (Iterator i = report.errors(); i.hasNext();) {
91 | 2 | Report.ProcessingError pe = (Report.ProcessingError) i.next();
92 | 2 | buf.setLength(0);
93 | 2 | buf.append("<tr");
94 | 2 | if (colorize) {
95 | 2 | buf.append(" bgcolor=\"lightgrey\"");
96 |  | }
97 | 2 | colorize = !colorize;
98 | 2 | buf.append("> " + PMD.EOL);
99 | 2 | buf.append("<td>" + pe.getFile() + "</td>" + PMD.EOL);
100 | 2 | buf.append("<td>" + pe.getMsg() + "</td>" + PMD.EOL);
101 | 2 | buf.append("</tr>" + PMD.EOL);
102 | 2 | writer.write(buf.toString());
103 | 2 | violationCount++;
104 |  | }
105 | 8 | if (violationCount > 0) {
106 | 2 | writer.write("</table>");
107 |  | }
108 |  | }
109 |  |
110 | 8 | private void glomSuppressions(Writer writer, Report report) throws IOException {
111 | 8 | boolean colorize = true;
112 | 8 | boolean hasSuppressedViolations = !report.getSuppressedRuleViolations().isEmpty();
113 | 8 | if (hasSuppressedViolations) {
114 | 0 | writer.write("<hr/>");
115 | 0 | writer.write("<center><h3>Suppressed warnings</h3></center>");
116 | 0 | writer.write("<table align=\"center\" cellspacing=\"0\" cellpadding=\"3\"><tr>" + PMD.EOL + "<th>File</th><th>Line</th><th>Rule</th><th>NOPMD or Annotation</th><th>Reason</th></tr>" + PMD.EOL);
117 |  | }
118 | 8 | Report.SuppressedViolation sv;
119 | 8 | StringBuffer buf = new StringBuffer(500);
120 | 8 | for (Iterator i = report.getSuppressedRuleViolations().iterator(); i.hasNext();) {
121 | 0 | sv = (Report.SuppressedViolation) i.next();
122 | 0 | buf.setLength(0);
123 | 0 | buf.append("<tr");
124 | 0 | if (colorize) {
125 | 0 | buf.append(" bgcolor=\"lightgrey\"");
126 |  | }
127 | 0 | colorize = !colorize;
128 | 0 | buf.append("> " + PMD.EOL);
129 | 0 | buf.append("<td align=\"left\">" + sv.getRuleViolation().getFilename() + "</td>" + PMD.EOL);
130 | 0 | buf.append("<td align=\"center\">" + sv.getRuleViolation().getBeginLine() + "</td>" + PMD.EOL);
131 | 0 | buf.append("<td align=\"center\">" + sv.getRuleViolation().getRule().getName() + "</td>" + PMD.EOL);
132 | 0 | buf.append("<td align=\"center\">" + (sv.suppressedByNOPMD() ? "NOPMD" : "Annotation") + "</td>" + PMD.EOL);
133 | 0 | buf.append("<td align=\"center\">" + (sv.getUserMessage() == null ? "" : sv.getUserMessage()) + "</td>" + PMD.EOL);
134 | 0 | buf.append("</tr>" + PMD.EOL);
135 | 0 | writer.write(buf.toString());
136 |  | }
137 | 8 | if (hasSuppressedViolations) {
138 | 0 | writer.write("</table>");
139 |  | }
140 |  | }
141 |  |
142 | 6 | private String maybeWrap(String filename, String line) {
143 | 6 | if (linkPrefix == null) {
144 | 6 | return filename;
145 |  | }
146 | 0 | String newFileName = filename.substring(0, filename.lastIndexOf('.')).replace('\\', '/');
147 | 0 | return "<a href=\"" + linkPrefix + newFileName + ".html#" + line + "\">" + newFileName + "</a>";
148 |  | }
149 |  | }