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.RuleViolation;
9 import net.sourceforge.pmd.util.StringUtil;
10
11 import java.text.SimpleDateFormat;
12 import java.util.Date;
13 import java.util.Iterator;
14
15 public class XMLRenderer implements Renderer {
16
17 public String render(Report report) {
18
19 StringBuffer buf = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + PMD.EOL + createVersionAttr() + createTimestampAttr() + createTimeElapsedAttr(report) + ">" + PMD.EOL);
20 String filename = null;
21
22
23 for (Iterator i = report.iterator(); i.hasNext();) {
24 RuleViolation rv = (RuleViolation) i.next();
25 if (!rv.getFilename().equals(filename)) {
26 if (filename != null) {
27 buf.append("</file>"+PMD.EOL);
28 }
29 filename = rv.getFilename();
30 buf.append("<file name=\"");
31 StringUtil.appendXmlEscaped(buf, filename);
32 buf.append("\">").append(PMD.EOL);
33 }
34
35 buf.append("<violation line=\"").append(rv.getLine()).append("\"");
36 buf.append(" rule=\"");
37 StringUtil.appendXmlEscaped(buf, rv.getRule().getName());
38 buf.append("\"");
39 buf.append(" ruleset=\"");
40 StringUtil.appendXmlEscaped(buf, rv.getRule().getRuleSetName());
41 buf.append("\"");
42 maybeAdd("package", rv.getPackageName(), buf);
43 maybeAdd("class", rv.getClassName(), buf);
44 maybeAdd("method", rv.getMethodName(), buf);
45 maybeAdd("externalInfoUrl", rv.getRule().getExternalInfoUrl(), buf);
46 buf.append(" priority=\"");
47 buf.append(rv.getRule().getPriority());
48 buf.append("\">");
49 buf.append(PMD.EOL);
50 StringUtil.appendXmlEscaped(buf, rv.getDescription());
51
52 buf.append(PMD.EOL);
53 buf.append("</violation>");
54 buf.append(PMD.EOL);
55 }
56 if (filename != null) {
57 buf.append("</file>"+PMD.EOL);
58 }
59
60
61 for (Iterator i = report.errors(); i.hasNext();) {
62 Report.ProcessingError pe = (Report.ProcessingError) i.next();
63 buf.append("<error ").append("filename=\"");
64 StringUtil.appendXmlEscaped(buf, pe.getFile());
65 buf.append("\" msg=\"");
66 StringUtil.appendXmlEscaped(buf, pe.getMsg());
67 buf.append("\"/>").append(PMD.EOL);
68 }
69
70 buf.append("</pmd>");
71 return buf.toString();
72 }
73
74 private void maybeAdd(String attr, String value, StringBuffer buf) {
75 if (value != null && value.length() > 0) {
76 buf.append(" " + attr +"=\"");
77 StringUtil.appendXmlEscaped(buf, value);
78 buf.append("\"");
79 }
80 }
81
82 private String createVersionAttr() {
83 return "<pmd version=\"" + PMD.VERSION + "\"";
84 }
85
86 private String createTimestampAttr() {
87 return " timestamp=\"" + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(new Date()) + "\"";
88 }
89
90 private String createTimeElapsedAttr(Report rpt) {
91 Report.ReadableDuration d = new Report.ReadableDuration(rpt.getElapsedTimeInMillis());
92 return " elapsedTime=\"" + d.getTime() + "\"";
93 }
94
95 }