View Javadoc
1 package net.sourceforge.pmd; 2 3 import net.sourceforge.pmd.ast.ASTCompilationUnit; 4 import net.sourceforge.pmd.ast.JavaParser; 5 import net.sourceforge.pmd.ast.ParseException; 6 import net.sourceforge.pmd.cpd.FileFinder; 7 import net.sourceforge.pmd.cpd.JavaLanguage; 8 import net.sourceforge.pmd.renderers.CSVRenderer; 9 import net.sourceforge.pmd.renderers.EmacsRenderer; 10 import net.sourceforge.pmd.renderers.HTMLRenderer; 11 import net.sourceforge.pmd.renderers.IDEAJRenderer; 12 import net.sourceforge.pmd.renderers.Renderer; 13 import net.sourceforge.pmd.renderers.TextRenderer; 14 import net.sourceforge.pmd.renderers.XMLRenderer; 15 import net.sourceforge.pmd.symboltable.SymbolFacade; 16 17 import java.io.File; 18 import java.io.FileInputStream; 19 import java.io.FileNotFoundException; 20 import java.io.InputStream; 21 import java.io.InputStreamReader; 22 import java.io.Reader; 23 import java.util.ArrayList; 24 import java.util.Iterator; 25 import java.util.List; 26 import java.util.StringTokenizer; 27 28 public class PMD { 29 public static final String EOL = System.getProperty("line.separator", "\n"); 30 31 /*** 32 * @param reader - a Reader to the Java code to analyse 33 * @param ruleSet - the set of rules to process against the file 34 * @param ctx - the context in which PMD is operating. This contains the Renderer and whatnot 35 */ 36 public void processFile(Reader reader, RuleSet ruleSet, RuleContext ctx) throws PMDException { 37 try { 38 JavaParser parser = new JavaParser(reader); 39 ASTCompilationUnit c = parser.CompilationUnit(); 40 Thread.yield(); 41 SymbolFacade stb = new SymbolFacade(); 42 stb.initializeWith(c); 43 List acus = new ArrayList(); 44 acus.add(c); 45 ruleSet.apply(acus, ctx); 46 reader.close(); 47 } catch (ParseException pe) { 48 throw new PMDException("Error while parsing " + ctx.getSourceCodeFilename(), pe); 49 } catch (Exception e) { 50 throw new PMDException("Error while processing " + ctx.getSourceCodeFilename(), e); 51 } 52 } 53 54 /*** 55 * @param fileContents - an InputStream to the Java code to analyse 56 * @param ruleSet - the set of rules to process against the file 57 * @param ctx - the context in which PMD is operating. This contains the Report and whatnot 58 */ 59 public void processFile(InputStream fileContents, RuleSet ruleSet, RuleContext ctx) throws PMDException { 60 processFile(new InputStreamReader(fileContents), ruleSet, ctx); 61 } 62 63 public static void main(String[] args) { 64 if (args.length < 3) { 65 usage(); 66 System.exit(1); 67 } 68 69 String inputFileName = args[0]; 70 String reportFormat = args[1]; 71 String ruleSets = args[2]; 72 73 boolean shortNames = false; 74 boolean debug = false; 75 for (int i=0; i<args.length; i++) { 76 if (args[i].equals("-shortnames")) { 77 shortNames = true; 78 } 79 if (args[i].equals("-debug")) { 80 debug = true; 81 } 82 } 83 84 List files; 85 if (inputFileName.indexOf(',') != -1) { 86 files = collectFromCommaDelimitedString(inputFileName); 87 } else { 88 files = collectFilesFromOneName(inputFileName); 89 } 90 91 PMD pmd = new PMD(); 92 93 RuleContext ctx = new RuleContext(); 94 ctx.setReport(new Report()); 95 96 try { 97 RuleSetFactory ruleSetFactory = new RuleSetFactory(); 98 RuleSet rules = ruleSetFactory.createRuleSet(ruleSets); 99 for (Iterator i = files.iterator(); i.hasNext();) { 100 File file = (File) i.next(); 101 ctx.setSourceCodeFilename(glomName(shortNames, inputFileName, file)); 102 try { 103 pmd.processFile(new FileInputStream(file), rules, ctx); 104 } catch (PMDException pmde) { 105 if (debug) { 106 pmde.getReason().printStackTrace(); 107 } 108 ctx.getReport().addError(new Report.ProcessingError(pmde.getMessage(), glomName(shortNames, inputFileName, file))); 109 } 110 } 111 } catch (FileNotFoundException fnfe) { 112 fnfe.printStackTrace(); 113 } catch (RuleSetNotFoundException rsnfe) { 114 rsnfe.printStackTrace(); 115 } 116 117 Renderer renderer = null; 118 if (reportFormat.equals("xml")) { 119 renderer = new XMLRenderer(); 120 } else if (reportFormat.equals("ideaj")) { 121 renderer = new IDEAJRenderer(args); 122 } else if (reportFormat.equals("text")) { 123 renderer = new TextRenderer(); 124 } else if (reportFormat.equals("emacs")) { 125 renderer = new EmacsRenderer(); 126 } else if (reportFormat.equals("csv")) { 127 renderer = new CSVRenderer(); 128 } else if (reportFormat.equals("html")) { 129 renderer = new HTMLRenderer(); 130 } else if (!reportFormat.equals("")) { 131 try { 132 renderer = (Renderer)Class.forName(reportFormat).newInstance(); 133 } catch (Exception e) { 134 e.printStackTrace(); 135 return; 136 } 137 } else { 138 System.out.println("Please supply a renderer name"); 139 usage(); 140 return; 141 } 142 System.out.println(renderer.render(ctx.getReport())); 143 } 144 145 private static String glomName(boolean shortNames, String inputFileName, File file) { 146 if (shortNames && inputFileName.indexOf(',') == -1 && (new File(inputFileName)).isDirectory()) { 147 String name = file.getAbsolutePath().substring(inputFileName.length()); 148 if (name.startsWith(System.getProperty("file.separator"))) { 149 name = name.substring(1); 150 } 151 return name; 152 } else { 153 return file.getAbsolutePath(); 154 } 155 } 156 157 private static List collectFilesFromOneName(String inputFileName) { 158 return collect(inputFileName); 159 } 160 161 private static List collectFromCommaDelimitedString(String fileList) { 162 List files = new ArrayList(); 163 for (StringTokenizer st = new StringTokenizer(fileList, ","); st.hasMoreTokens();) { 164 files.addAll(collect(st.nextToken())); 165 } 166 return files; 167 } 168 169 private static List collect(String filename) { 170 File inputFile = new File(filename); 171 if (!inputFile.exists()) { 172 throw new RuntimeException("File " + inputFile.getName() + " doesn't exist"); 173 } 174 List files; 175 if (!inputFile.isDirectory()) { 176 files = new ArrayList(); 177 files.add(inputFile); 178 } else { 179 FileFinder finder = new FileFinder(); 180 files = finder.findFilesFrom(inputFile.getAbsolutePath(), new JavaLanguage.JavaFileOrDirectoryFilter(), true); 181 } 182 return files; 183 } 184 185 private static void usage() { 186 final String EOL = System.getProperty("line.separator"); 187 System.err.println(EOL + 188 "Please pass in a java source code filename or directory, a report format, " + EOL + 189 "and a ruleset filename or a comma-delimited string of ruleset filenames." + EOL + 190 "For example: " + EOL + 191 "c://> java -jar pmd-1.1.jar c://my//source//code html rulesets/unusedcode.xml," + 192 "rulesets/imports.xml" + EOL); 193 } 194 }

This page was automatically generated by Maven