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.util.Iterator;
12
13 public class XMLRenderer implements Renderer {
14
15 public String render(Report report) {
16 StringBuffer buf = new StringBuffer("<?xml version=\"1.0\"?><pmd>" + PMD.EOL);
17 String filename = null;
18
19
20 for (Iterator i = report.iterator(); i.hasNext();) {
21 RuleViolation rv = (RuleViolation) i.next();
22 if (!rv.getFilename().equals(filename)) {
23 if (filename != null)
24 buf.append("</file>");
25 filename = rv.getFilename();
26 buf.append("<file name=\"");
27 StringUtil.appendXmlEscaped(buf, filename);
28 buf.append("\">")
29 .append(PMD.EOL);
30 }
31
32 buf.append("<violation line=\"")
33 .append(rv.getLine())
34 .append("\" rule=\"");
35 StringUtil.appendXmlEscaped(buf, rv.getRule().getName());
36 buf.append("\">")
37 .append(PMD.EOL);
38 StringUtil.appendXmlEscaped(buf, rv.getDescription());
39
40 buf.append(PMD.EOL);
41 buf.append("</violation>");
42 buf.append(PMD.EOL);
43 }
44 if (filename != null) {
45 buf.append("</file>");
46 }
47
48
49 for (Iterator i = report.errors(); i.hasNext();) {
50 Report.ProcessingError pe = (Report.ProcessingError) i.next();
51 buf.append("<error ")
52 .append("filename=\"");
53 StringUtil.appendXmlEscaped(buf, pe.getFile());
54 buf.append("\" msg=\"");
55 StringUtil.appendXmlEscaped(buf, pe.getMsg());
56 buf.append("\"/>")
57 .append(PMD.EOL);
58 }
59
60 buf.append("</pmd>");
61 return buf.toString();
62 }
63
64 }