View Javadoc
1 /*** 2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html 3 */ 4 package net.sourceforge.pmd; 5 6 import net.sourceforge.pmd.ast.ASTCompilationUnit; 7 import net.sourceforge.pmd.ast.JavaParser; 8 import net.sourceforge.pmd.ast.ParseException; 9 import net.sourceforge.pmd.cpd.FileFinder; 10 import net.sourceforge.pmd.cpd.JavaLanguage; 11 import net.sourceforge.pmd.renderers.Renderer; 12 import net.sourceforge.pmd.symboltable.SymbolFacade; 13 14 import java.io.File; 15 import java.io.FileInputStream; 16 import java.io.FileNotFoundException; 17 import java.io.InputStream; 18 import java.io.InputStreamReader; 19 import java.io.Reader; 20 import java.util.ArrayList; 21 import java.util.Iterator; 22 import java.util.List; 23 import java.util.StringTokenizer; 24 25 public class PMD { 26 27 public static final String EOL = System.getProperty("line.separator", "\n"); 28 29 private TargetJDKVersion targetJDKVersion; 30 31 public PMD() { 32 targetJDKVersion = new TargetJDK1_4(); 33 } 34 35 public PMD(TargetJDKVersion targetJDKVersion) { 36 this.targetJDKVersion = targetJDKVersion; 37 } 38 39 /*** 40 * @param reader - a Reader to the Java code to analyse 41 * @param ruleSet - the set of rules to process against the file 42 * @param ctx - the context in which PMD is operating. This contains the Renderer and whatnot 43 */ 44 public void processFile(Reader reader, RuleSet ruleSet, RuleContext ctx) throws PMDException { 45 try { 46 JavaParser parser = targetJDKVersion.createParser(reader); 47 ASTCompilationUnit c = parser.CompilationUnit(); 48 Thread.yield(); 49 SymbolFacade stb = new SymbolFacade(); 50 stb.initializeWith(c); 51 List acus = new ArrayList(); 52 acus.add(c); 53 ruleSet.apply(acus, ctx); 54 reader.close(); 55 } catch (ParseException pe) { 56 throw new PMDException("Error while parsing " + ctx.getSourceCodeFilename(), pe); 57 } catch (Exception e) { 58 throw new PMDException("Error while processing " + ctx.getSourceCodeFilename(), e); 59 } 60 } 61 62 /*** 63 * @param fileContents - an InputStream to the Java code to analyse 64 * @param ruleSet - the set of rules to process against the file 65 * @param ctx - the context in which PMD is operating. This contains the Report and whatnot 66 */ 67 public void processFile(InputStream fileContents, RuleSet ruleSet, RuleContext ctx) throws PMDException { 68 processFile(new InputStreamReader(fileContents), ruleSet, ctx); 69 } 70 71 public static void main(String[] args) { 72 CommandLineOptions opts = new CommandLineOptions(args); 73 74 List files; 75 if (opts.containsCommaSeparatedFileList()) { 76 files = collectFromCommaDelimitedString(opts.getInputFileName()); 77 } else { 78 files = collectFilesFromOneName(opts.getInputFileName()); 79 } 80 81 PMD pmd; 82 if (opts.jdk13()) { 83 pmd = new PMD(new TargetJDK1_3()); 84 } else { 85 pmd = new PMD(); 86 } 87 88 RuleContext ctx = new RuleContext(); 89 ctx.setReport(new Report()); 90 91 try { 92 RuleSetFactory ruleSetFactory = new RuleSetFactory(); 93 RuleSet rules = ruleSetFactory.createRuleSet(opts.getRulesets()); 94 for (Iterator i = files.iterator(); i.hasNext();) { 95 File file = (File) i.next(); 96 ctx.setSourceCodeFilename(glomName(opts.shortNamesEnabled(), opts.getInputFileName(), file)); 97 try { 98 pmd.processFile(new FileInputStream(file), rules, ctx); 99 } catch (PMDException pmde) { 100 if (opts.debugEnabled()) { 101 pmde.getReason().printStackTrace(); 102 } 103 ctx.getReport().addError(new Report.ProcessingError(pmde.getMessage(), glomName(opts.shortNamesEnabled(), opts.getInputFileName(), file))); 104 } 105 } 106 } catch (FileNotFoundException fnfe) { 107 System.out.println(opts.usage()); 108 fnfe.printStackTrace(); 109 } catch (RuleSetNotFoundException rsnfe) { 110 System.out.println(opts.usage()); 111 rsnfe.printStackTrace(); 112 } 113 114 try { 115 Renderer r = opts.createRenderer(); 116 System.out.println(r.render(ctx.getReport())); 117 } catch (Exception e) { 118 System.out.println(e.getMessage()); 119 System.out.println(opts.usage()); 120 if (opts.debugEnabled()) { 121 e.printStackTrace(); 122 } 123 } 124 } 125 126 private static String glomName(boolean shortNames, String inputFileName, File file) { 127 if (shortNames && inputFileName.indexOf(',') == -1) { 128 if ((new File(inputFileName)).isDirectory()) { 129 return trimAnyPathSep(file.getAbsolutePath().substring(inputFileName.length())); 130 } else { 131 if (inputFileName.indexOf(System.getProperty("file.separator").charAt(0)) == -1) { 132 return inputFileName; 133 } 134 return trimAnyPathSep(inputFileName.substring(inputFileName.lastIndexOf(System.getProperty("file.separator")))); 135 } 136 } else { 137 return file.getAbsolutePath(); 138 } 139 } 140 141 private static String trimAnyPathSep(String name) { 142 if (name.startsWith(System.getProperty("file.separator"))) { 143 name = name.substring(1); 144 } 145 return name; 146 } 147 148 private static List collectFilesFromOneName(String inputFileName) { 149 return collect(inputFileName); 150 } 151 152 private static List collectFromCommaDelimitedString(String fileList) { 153 List files = new ArrayList(); 154 for (StringTokenizer st = new StringTokenizer(fileList, ","); st.hasMoreTokens();) { 155 files.addAll(collect(st.nextToken())); 156 } 157 return files; 158 } 159 160 private static List collect(String filename) { 161 File inputFile = new File(filename); 162 if (!inputFile.exists()) { 163 throw new RuntimeException("File " + inputFile.getName() + " doesn't exist"); 164 } 165 List files; 166 if (!inputFile.isDirectory()) { 167 files = new ArrayList(); 168 files.add(inputFile); 169 } else { 170 FileFinder finder = new FileFinder(); 171 files = finder.findFilesFrom(inputFile.getAbsolutePath(), new JavaLanguage.JavaFileOrDirectoryFilter(), true); 172 } 173 return files; 174 } 175 176 }

This page was automatically generated by Maven