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 CSVRenderer extends AbstractRenderer {
16
17 public void render(Writer writer, Report report) throws IOException {
18 StringBuffer buf = new StringBuffer(300);
19 quoteAndCommify(buf, "Problem");
20 quoteAndCommify(buf, "Package");
21 quoteAndCommify(buf, "File");
22 quoteAndCommify(buf, "Priority");
23 quoteAndCommify(buf, "Line");
24 quoteAndCommify(buf, "Description");
25 quoteAndCommify(buf, "Rule set");
26 quote(buf, "Rule");
27 buf.append(PMD.EOL);
28 writer.write(buf.toString());
29
30 addViolations(writer, report, buf);
31 }
32
33 private void addViolations(Writer writer, Report report, StringBuffer buf) throws IOException {
34 int violationCount = 1;
35 IRuleViolation rv;
36 for (Iterator i = report.iterator(); i.hasNext();) {
37 buf.setLength(0);
38 rv = (IRuleViolation) i.next();
39 quoteAndCommify(buf, Integer.toString(violationCount));
40 quoteAndCommify(buf, rv.getPackageName());
41 quoteAndCommify(buf, rv.getFilename());
42 quoteAndCommify(buf, Integer.toString(rv.getRule().getPriority()));
43 quoteAndCommify(buf, Integer.toString(rv.getBeginLine()));
44 quoteAndCommify(buf, StringUtil.replaceString(rv.getDescription(), '\"', "'"));
45 quoteAndCommify(buf, rv.getRule().getRuleSetName());
46 quote(buf, rv.getRule().getName());
47 buf.append(PMD.EOL);
48 writer.write(buf.toString());
49 violationCount++;
50 }
51 }
52
53 private void quote(StringBuffer sb, String d) {
54 sb.append('"').append(d).append('"');
55 }
56
57 private void quoteAndCommify(StringBuffer sb, String d) {
58 quote(sb, d);
59 sb.append(',');
60 }
61 }