View Javadoc

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.IRuleViolation;
7   import net.sourceforge.pmd.PMD;
8   import net.sourceforge.pmd.Report;
9   
10  import java.io.IOException;
11  import java.io.Writer;
12  import java.util.HashSet;
13  import java.util.Iterator;
14  import java.util.Set;
15  import java.util.StringTokenizer;
16  
17  public class IDEAJRenderer extends AbstractRenderer {
18  
19  	private static final String FILE_SEPARATOR = System.getProperty("file.separator");
20  	private static final String PATH_SEPARATOR = System.getProperty("path.separator");
21  	
22      private static class SourcePath {
23  
24          private Set paths = new HashSet();
25  
26          public SourcePath(String sourcePathString) {
27              for (StringTokenizer st = new StringTokenizer(sourcePathString, PATH_SEPARATOR); st.hasMoreTokens();) {
28                  paths.add(st.nextToken());
29              }
30          }
31  
32          public String clipPath(String fullFilename) {
33              for (Iterator i = paths.iterator(); i.hasNext();) {
34                  String path = (String) i.next();
35                  if (fullFilename.startsWith(path)) {
36                      return fullFilename.substring(path.length() + 1);
37                  }
38              }
39              throw new RuntimeException("Couldn't find src path for " + fullFilename);
40          }
41      }
42  
43      private String[] args;
44  
45      public IDEAJRenderer(String[] args) {
46          this.args = args;
47      }
48  
49      public void render(Writer writer, Report report) throws IOException {
50          if (args[4].equals(".method")) {
51              // working on a directory tree
52              String sourcePath = args[3];
53              render(writer, report, sourcePath);
54              return;
55          }
56          // working on one file
57          String classAndMethodName = args[4];
58          String singleFileName = args[5];
59          render(writer, report, classAndMethodName, singleFileName);
60      }
61  
62      private void render(Writer writer, Report report, String sourcePathString) throws IOException {
63          SourcePath sourcePath = new SourcePath(sourcePathString);
64          StringBuffer buf = new StringBuffer();
65          for (Iterator i = report.iterator(); i.hasNext();) {
66              buf.setLength(0);
67              IRuleViolation rv = (IRuleViolation) i.next();
68              buf.append(rv.getDescription() + PMD.EOL);
69              buf.append(" at ").append(getFullyQualifiedClassName(rv.getFilename(), sourcePath)).append(".method(");
70              buf.append(getSimpleFileName(rv.getFilename())).append(':').append(rv.getBeginLine()).append(')').append(PMD.EOL);
71              writer.write(buf.toString());
72          }
73      }
74  
75      private void render(Writer writer, Report report, String classAndMethod, String file) throws IOException {
76          StringBuffer buf = new StringBuffer();
77          for (Iterator i = report.iterator(); i.hasNext();) {
78              buf.setLength(0);
79              IRuleViolation rv = (IRuleViolation) i.next();
80              buf.append(rv.getDescription()).append(PMD.EOL);
81              buf.append(" at ").append(classAndMethod).append('(').append(file).append(':').append(rv.getBeginLine()).append(')').append(PMD.EOL);
82              writer.write(buf.toString());
83          }
84      }
85  
86      private String getFullyQualifiedClassName(String in, SourcePath sourcePath) {
87          String classNameWithSlashes = sourcePath.clipPath(in);
88          String className = classNameWithSlashes.replace(FILE_SEPARATOR.charAt(0), '.');
89          return className.substring(0, className.length() - 5);
90      }
91  
92      private String getSimpleFileName(String in) {
93          return in.substring(in.lastIndexOf(FILE_SEPARATOR) + 1);
94      }
95  }