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