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.renderers.CSVRenderer;
7 import net.sourceforge.pmd.renderers.EmacsRenderer;
8 import net.sourceforge.pmd.renderers.HTMLRenderer;
9 import net.sourceforge.pmd.renderers.IDEAJRenderer;
10 import net.sourceforge.pmd.renderers.PapariTextRenderer;
11 import net.sourceforge.pmd.renderers.Renderer;
12 import net.sourceforge.pmd.renderers.SummaryHTMLRenderer;
13 import net.sourceforge.pmd.renderers.TextRenderer;
14 import net.sourceforge.pmd.renderers.VBHTMLRenderer;
15 import net.sourceforge.pmd.renderers.XMLRenderer;
16 import net.sourceforge.pmd.renderers.YAHTMLRenderer;
17
18 import java.io.InputStreamReader;
19 import java.text.MessageFormat;
20
21 public class CommandLineOptions {
22
23 private boolean debugEnabled;
24 private String targetJDK = "1.4";
25 private boolean shortNamesEnabled;
26 private int cpus = Runtime.getRuntime().availableProcessors();
27
28 private String excludeMarker = PMD.EXCLUDE_MARKER;
29 private String inputPath;
30 private String reportFormat;
31 private String reportFile;
32 private String ruleSets;
33 private String encoding = new InputStreamReader(System.in).getEncoding();
34 private String linePrefix;
35 private String linkPrefix;
36 private int minPriority = Rule.LOWEST_PRIORITY;
37
38
39 private boolean checkJavaFiles = true;
40 private boolean checkJspFiles = false;
41
42 private String[] args;
43
44 public CommandLineOptions(String[] args) {
45
46 if (args == null || args.length < 3) {
47 throw new RuntimeException(usage());
48 }
49 int optIndex = 0;
50 if (args[0].charAt(0) == '-') {
51 optIndex = args.length - 3;
52 }
53
54 inputPath = args[optIndex];
55 reportFormat = args[optIndex+1];
56 ruleSets = new SimpleRuleSetNameMapper(args[optIndex+2]).getRuleSets();
57
58 this.args = args;
59
60 for (int i = 0; i < args.length; i++) {
61 if (args[i].equals("-debug")) {
62 debugEnabled = true;
63 } else if (args[i].equals("-shortnames")) {
64 shortNamesEnabled = true;
65 } else if (args[i].equals("-encoding")) {
66 encoding = args[++i];
67 } else if (args[i].equals("-cpus")) {
68 try {
69 cpus = Integer.parseInt(args[++i]);
70 } catch (NumberFormatException e) {
71 throw new RuntimeException(MessageFormat.format(
72 "cpus parameter must be a whole number, {0} received",
73 new String[] { args[i] }));
74 }
75 } else if (args[i].equals("-targetjdk")) {
76 targetJDK = args[++i];
77 } else if (args[i].equals("-excludemarker")) {
78 excludeMarker = args[++i];
79 } else if (args[i].equals("-jsp")) {
80 checkJspFiles = true;
81 } else if (args[i].equals("-nojava")) {
82 checkJavaFiles = false;
83 } else if (args[i].equals("-lineprefix")) {
84 linePrefix = args[++i];
85 } else if (args[i].equals("-linkprefix")) {
86 linkPrefix = args[++i];
87 } else if (args[i].equals("-minimumpriority")) {
88 try {
89 minPriority = Integer.parseInt(args[++i]);
90 } catch (NumberFormatException e) {
91 throw new RuntimeException(MessageFormat.format(
92 "minimumpriority parameter must be a whole number, {0} received",
93 new String[] { args[i] }));
94 }
95 } else if (args[i].equals("-reportfile")) {
96 reportFile = args[++i];
97 }
98 }
99 }
100
101 public Renderer createRenderer() {
102 if (reportFormat.equals("xml")) {
103 return new XMLRenderer();
104 } else if (reportFormat.equals("ideaj")) {
105 return new IDEAJRenderer(args);
106 } else if (reportFormat.equals("papari")) {
107 return new PapariTextRenderer();
108 } else if (reportFormat.equals("text")) {
109 return new TextRenderer();
110 } else if (reportFormat.equals("emacs")) {
111 return new EmacsRenderer();
112 } else if (reportFormat.equals("csv")) {
113 return new CSVRenderer();
114 } else if (reportFormat.equals("html")) {
115 return new HTMLRenderer();
116 } else if (reportFormat.equals("yahtml")) {
117 return new YAHTMLRenderer();
118 } else if (reportFormat.equals("summaryhtml")) {
119 return new SummaryHTMLRenderer(linkPrefix, linePrefix);
120 } else if (reportFormat.equals("vbhtml")) {
121 return new VBHTMLRenderer();
122 }
123 if (!reportFormat.equals("")) {
124 try {
125 return (Renderer) Class.forName(reportFormat).newInstance();
126 } catch (Exception e) {
127 throw new IllegalArgumentException("Can't find the custom format " + reportFormat + ": " + e.getClass().getName());
128 }
129 }
130
131 throw new IllegalArgumentException("Can't create report with format of " + reportFormat);
132 }
133
134 public boolean containsCommaSeparatedFileList() {
135 return inputPath.indexOf(',') != -1;
136 }
137
138 public String getInputPath() {
139 return this.inputPath;
140 }
141
142 public String getEncoding() {
143 return this.encoding;
144 }
145
146 public String getReportFormat() {
147 return this.reportFormat;
148 }
149
150 public String getReportFile() {
151 return this.reportFile;
152 }
153
154 public String getRulesets() {
155 return this.ruleSets;
156 }
157
158 public String getExcludeMarker() {
159 return this.excludeMarker;
160 }
161
162 public boolean debugEnabled() {
163 return debugEnabled;
164 }
165
166 public int getCpus() {
167 return cpus;
168 }
169
170 public String getTargetJDK() {
171 return targetJDK;
172 }
173
174 public boolean shortNamesEnabled() {
175 return shortNamesEnabled;
176 }
177
178 public int getMinPriority() {
179 return minPriority;
180 }
181
182 public String usage() {
183 return PMD.EOL + PMD.EOL +
184 "Mandatory arguments:" + PMD.EOL +
185 "1) A java source code filename or directory" + PMD.EOL +
186 "2) A report format " + PMD.EOL +
187 "3) A ruleset filename or a comma-delimited string of ruleset filenames" + PMD.EOL +
188 PMD.EOL +
189 "For example: " + PMD.EOL +
190 "c://> java -jar pmd-" + PMD.VERSION + ".jar c://my//source//code html unusedcode" + PMD.EOL +
191 PMD.EOL +
192 "Optional arguments that may be put before or after the mandatory arguments: " + PMD.EOL +
193 "-debug: prints debugging information" + PMD.EOL +
194 "-targetjdk: specifies a language version to target - 1.3, 1.4, 1.5 or 1.6" + PMD.EOL +
195 "-cpus: specifies the number of threads to create" + PMD.EOL +
196 "-encoding: specifies the character set encoding of the source code files PMD is reading (i.e., UTF-8)" + PMD.EOL +
197 "-excludemarker: specifies the String that marks the a line which PMD should ignore; default is NOPMD" + PMD.EOL +
198 "-shortnames: prints shortened filenames in the report" + PMD.EOL +
199 "-linkprefix: path to HTML source, for summary html renderer only" + PMD.EOL +
200 "-lineprefix: custom anchor to affected line in the source file, for summary html renderer only" + PMD.EOL +
201 "-minimumpriority: rule priority threshold; rules with lower priority than they will not be used" + PMD.EOL +
202 "-reportfile: send report output to a file; default to System.out" + PMD.EOL +
203 PMD.EOL +
204 "For example: " + PMD.EOL +
205 "c://> java -jar pmd-" + PMD.VERSION + ".jar c://my//source//code text unusedcode,imports -targetjdk 1.5 -debug" + PMD.EOL +
206 "c://> java -jar pmd-" + PMD.VERSION + ".jar c://my//source//code xml basic,design -encoding UTF-8" + PMD.EOL +
207 PMD.EOL;
208 }
209
210 /***
211 * @return Returns the checkJavaFiles.
212 */
213 public boolean isCheckJavaFiles() {
214 return checkJavaFiles;
215 }
216
217 /***
218 * @return Returns the checkJspFiles.
219 */
220 public boolean isCheckJspFiles() {
221 return checkJspFiles;
222 }
223 }
224
225
226
227