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.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