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