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 HTMLRenderer implements Renderer { 14 15 private String linkPrefix; 16 17 public HTMLRenderer(String linkPrefix) { 18 this.linkPrefix = linkPrefix; 19 } 20 21 public HTMLRenderer() { 22 this(null); 23 } 24 25 public String render(Report report) { 26 StringBuffer buf = new StringBuffer("<html><head><title>PMD</title></head><body>" + PMD.EOL + "<table align=\"center\" cellspacing=\"0\" cellpadding=\"3\"><tr>" + PMD.EOL + "<th>#</th><th>File</th><th>Line</th><th>Problem</th></tr>" + PMD.EOL); 27 buf.append(renderBody(report)); 28 buf.append("</table></body></html>"); 29 return buf.toString(); 30 } 31 32 public String renderBody(Report report) { 33 boolean colorize = true; 34 int violationCount = 1; 35 StringBuffer buf = new StringBuffer(); 36 for (Iterator i = report.iterator(); i.hasNext();) { 37 RuleViolation rv = (RuleViolation) i.next(); 38 buf.append("<tr"); 39 if (colorize) { 40 buf.append(" bgcolor=\"lightgrey\""); 41 colorize = false; 42 } else { 43 colorize = true; 44 } 45 buf.append("> " + PMD.EOL); 46 buf.append("<td align=\"center\">" + violationCount + "</td>" + PMD.EOL); 47 buf.append("<td width=\"*%\">" + maybeWrap(rv.getFilename(), Integer.toString(rv.getLine())) + "</td>" + PMD.EOL); 48 buf.append("<td align=\"center\" width=\"5%\">" + Integer.toString(rv.getLine()) + "</td>" + PMD.EOL); 49 50 String d = rv.getDescription(); 51 d = StringUtil.replaceString(d, '&', "&"); 52 d = StringUtil.replaceString(d, '<', "<"); 53 d = StringUtil.replaceString(d, '>', ">"); 54 if (rv.getRule().getExternalInfoUrl() != null && rv.getRule().getExternalInfoUrl().length() != 0) { 55 d = "<a href=\"" + rv.getRule().getExternalInfoUrl() + "\">" + d + "</a>"; 56 } 57 58 buf.append("<td width=\"*\">" + d + "</td>" + PMD.EOL); 59 60 buf.append("</tr>" + PMD.EOL); 61 62 violationCount++; 63 } 64 return buf.toString(); 65 } 66 67 private String maybeWrap(String filename, String line) { 68 if (linkPrefix == null) { 69 return filename; 70 } 71 String newFileName = filename.substring(0, filename.indexOf(".java")); 72 return "<a href=\"" + linkPrefix + newFileName + ".html#" + line + "\">" + newFileName + "</a>"; 73 } 74 }