/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.renderers;
import net.sourceforge.pmd.PMD;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.RuleViolation;
import net.sourceforge.pmd.util.StringUtil;
import java.util.Iterator;
public class XMLRenderer implements Renderer {
public String render(Report report) {
StringBuffer buf = new StringBuffer("<?xml version=\"1.0\"?><pmd>" + PMD.EOL);
String filename = null;
// rule violations
for (Iterator i = report.iterator(); i.hasNext();) {
RuleViolation rv = (RuleViolation) i.next();
if (!rv.getFilename().equals(filename)) { // New File
if (filename != null) // Not first file ?
buf.append("</file>");
filename = rv.getFilename();
buf.append("<file name=\"");
StringUtil.appendXmlEscaped(buf, filename);
buf.append("\">")
.append(PMD.EOL);
}
buf.append("<violation line=\"")
.append(rv.getLine()) // int
.append("\" rule=\"");
StringUtil.appendXmlEscaped(buf, rv.getRule().getName());
buf.append("\">")
.append(PMD.EOL);
StringUtil.appendXmlEscaped(buf, rv.getDescription());
buf.append(PMD.EOL);
buf.append("</violation>");
buf.append(PMD.EOL);
}
if (filename != null) { // Not first file ?
buf.append("</file>");
}
// errors
for (Iterator i = report.errors(); i.hasNext();) {
Report.ProcessingError pe = (Report.ProcessingError) i.next();
buf.append("<error ")
.append("filename=\"");
StringUtil.appendXmlEscaped(buf, pe.getFile());
buf.append("\" msg=\"");
StringUtil.appendXmlEscaped(buf, pe.getMsg());
buf.append("\"/>")
.append(PMD.EOL);
}
buf.append("</pmd>");
return buf.toString();
}
}