/** * 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(); } }