/** * 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 java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.StringTokenizer; public class IDEAJRenderer implements Renderer { private static class SourcePath { private Set paths = new HashSet(); public SourcePath(String sourcePathString) { for (StringTokenizer st = new StringTokenizer(sourcePathString, System.getProperty("path.separator")); st.hasMoreTokens();) { paths.add(st.nextToken()); } } public String clipPath(String fullFilename) { for (Iterator i = paths.iterator(); i.hasNext();) { String path = (String) i.next(); if (fullFilename.startsWith(path)) { return fullFilename.substring(path.length() + 1); } } throw new RuntimeException("Couldn't find src path for " + fullFilename); } } private String[] args; public IDEAJRenderer(String[] args) { this.args = args; } public String render(Report report) { if (args[4].equals(".method")) { // working on a directory tree String sourcePath = args[3]; return render(report, sourcePath); } // working on one file String classAndMethodName = args[4]; String singleFileName = args[5]; return render(report, classAndMethodName, singleFileName); } private String render(Report report, String sourcePathString) { SourcePath sourcePath = new SourcePath(sourcePathString); StringBuffer buf = new StringBuffer(); for (Iterator i = report.iterator(); i.hasNext();) { RuleViolation rv = (RuleViolation) i.next(); buf.append(rv.getDescription() + PMD.EOL); buf.append(" at " + getFullyQualifiedClassName(rv.getFilename(), sourcePath) + ".method(" + getSimpleFileName(rv.getFilename()) + ":" + rv.getLine() + ")" + PMD.EOL); } return buf.toString(); } private String render(Report report, String classAndMethod, String file) { StringBuffer buf = new StringBuffer(); for (Iterator i = report.iterator(); i.hasNext();) { RuleViolation rv = (RuleViolation) i.next(); buf.append(rv.getDescription() + PMD.EOL); buf.append(" at " + classAndMethod + "(" + file + ":" + rv.getLine() + ")" + PMD.EOL); } return buf.toString(); } private String getFullyQualifiedClassName(String in, SourcePath sourcePath) { String classNameWithSlashes = sourcePath.clipPath(in); String className = classNameWithSlashes.replace(System.getProperty("file.separator").charAt(0), '.'); return className.substring(0, className.length()-5); } private String getSimpleFileName(String in) { return in.substring(in.lastIndexOf(System.getProperty("file.separator")) + 1); } }