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