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