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 java.io.IOException;
    7   import java.io.Writer;
    8   import java.util.HashSet;
    9   import java.util.Iterator;
    10  import java.util.Set;
    11  import java.util.StringTokenizer;
    12
    13  import net.sourceforge.pmd.PMD;
    14  import net.sourceforge.pmd.RuleViolation;
    15  import net.sourceforge.pmd.lang.rule.properties.StringProperty;
    16
    17  /**
    18   * Renderer for IntelliJ IDEA integration.
    19   */
    20  public class IDEAJRenderer extends AbstractIncrementingRenderer {
    21
    22  	private String classAndMethodName;
    23  	private String fileName;
    24
    25  	public static final String NAME = "ideaj";
    26
    27  	public static final StringProperty FILE_NAME = new StringProperty("fileName", "File name.", "", 0);
    28  	public static final StringProperty SOURCE_PATH = new StringProperty("sourcePath", "Source path.", "", 1);
    29  	public static final StringProperty CLASS_AND_METHOD_NAME = new StringProperty("classAndMethodName", "Class and Method name, pass '.method' when processing a directory.", "", 2);
    30
    31  	private static final String FILE_SEPARATOR = System.getProperty("file.separator");
    32  	private static final String PATH_SEPARATOR = System.getProperty("path.separator");
    33
    34  	public IDEAJRenderer() {
    35  		super(NAME, "IntelliJ IDEA integration.");
    36  		definePropertyDescriptor(FILE_NAME);
    37  		definePropertyDescriptor(SOURCE_PATH);
    38  		definePropertyDescriptor(CLASS_AND_METHOD_NAME);
    39  	}
    40
    41  	 public String defaultFileExtension() { return "txt"; }
    42
    43  	/**
    44  	 * {@inheritDoc}
    45  	 */
    46  	@Override
    47  	public void renderFileViolations(Iterator<RuleViolation> violations) throws IOException {
    48  	    classAndMethodName = getProperty(CLASS_AND_METHOD_NAME);
    49  	    fileName = getProperty(FILE_NAME);
    50
    51  		Writer writer = getWriter();
    52  		if (".method".equals(classAndMethodName)) {
    53  			// working on a directory tree
    54  			renderDirectoy(writer, violations);
    55  		} else {
    56  			// working on one file
    57  			renderFile(writer, violations);
    58  		}
    59  	}
    60
    61  	private void renderDirectoy(Writer writer, Iterator<RuleViolation> violations) throws IOException {
    62  		SourcePath sourcePath = new SourcePath(getProperty(SOURCE_PATH));
    63  		StringBuilder buf = new StringBuilder();
    64  		while (violations.hasNext()) {
    65  			buf.setLength(0);
    66  			RuleViolation rv = violations.next();
    67  			buf.append(rv.getDescription() + PMD.EOL);
    68  			buf.append(" at ").append(
    69  					getFullyQualifiedClassName(rv.getFilename(), sourcePath)).append(".method(");
    70  			buf.append(getSimpleFileName(rv.getFilename())).append(':')
    71  					.append(rv.getBeginLine()).append(')').append(PMD.EOL);
    72  			writer.write(buf.toString());
    73  		}
    74  	}
    75
    76  	private void renderFile(Writer writer, Iterator<RuleViolation> violations) throws IOException {
    77  		StringBuilder buf = new StringBuilder();
    78  		while (violations.hasNext()) {
    79  			buf.setLength(0);
    80  			RuleViolation rv = violations.next();
    81  			buf.append(rv.getDescription()).append(PMD.EOL);
    82  			buf.append(" at ").append(classAndMethodName).append('(')
    83  					.append(fileName).append(':')
    84  					.append(rv.getBeginLine()).append(')').append(PMD.EOL);
    85  			writer.write(buf.toString());
    86  		}
    87  	}
    88
    89  	private String getFullyQualifiedClassName(String fileName, SourcePath sourcePath) {
    90  		String classNameWithSlashes = sourcePath.clipPath(fileName);
    91  		String className = classNameWithSlashes.replace(FILE_SEPARATOR.charAt(0), '.');
    92  		return className.substring(0, className.length() - 5);
    93  	}
    94
    95  	private String getSimpleFileName(String fileName) {
    96  		return fileName.substring(fileName.lastIndexOf(FILE_SEPARATOR) + 1);
    97  	}
    98
    99  	private static class SourcePath {
    100
    101 		private Set<String> paths = new HashSet<String>();
    102
    103 		public SourcePath(String sourcePathString) {
    104 			for (StringTokenizer st = new StringTokenizer(sourcePathString,
    105 					PATH_SEPARATOR); st.hasMoreTokens();) {
    106 				paths.add(st.nextToken());
    107 			}
    108 		}
    109
    110 		public String clipPath(String fullFilename) {
    111 			for (String path : paths) {
    112 				if (fullFilename.startsWith(path)) {
    113 					return fullFilename.substring(path.length() + 1);
    114 				}
    115 			}
    116 			throw new RuntimeException("Couldn't find src path for " + fullFilename);
    117 		}
    118 	}
    119 }