1 /*
   2  * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package jdk.javadoc.internal.tool;
  27 
  28 import java.util.ArrayList;
  29 import java.util.LinkedHashMap;
  30 import java.util.List;
  31 import java.util.Map;
  32 import java.util.StringTokenizer;
  33 
  34 import com.sun.tools.javac.main.Option;
  35 import com.sun.tools.javac.main.OptionHelper;
  36 import com.sun.tools.javac.util.Options;
  37 
  38 /**
  39  * javadoc tool options.
  40  *
  41  *  <p><b>This is NOT part of any supported API.
  42  *  If you write code that depends on this, you do so at your own risk.
  43  *  This code and its internal interfaces are subject to change or
  44  *  deletion without notice.</b>
  45  */
  46 public enum ToolOption {
  47     // ----- options for underlying compiler -----
  48 
  49     BOOTCLASSPATH("-bootclasspath", true) {
  50         @Override
  51         public void process(Helper helper, String arg) {
  52             helper.setFileManagerOpt(Option.BOOTCLASSPATH, arg);
  53         }
  54     },
  55 
  56     CLASSPATH("-classpath", true) {
  57         @Override
  58         public void process(Helper helper, String arg) {
  59             helper.setFileManagerOpt(Option.CLASSPATH, arg);
  60         }
  61     },
  62 
  63     CP("-cp", true) {
  64         @Override
  65         public void process(Helper helper, String arg) {
  66             helper.setFileManagerOpt(Option.CP, arg);
  67         }
  68     },
  69 
  70     EXTDIRS("-extdirs", true) {
  71         @Override
  72         public void process(Helper helper, String arg) {
  73             helper.setFileManagerOpt(Option.EXTDIRS, arg);
  74         }
  75     },
  76 
  77     SOURCEPATH("-sourcepath", true) {
  78         @Override
  79         public void process(Helper helper, String arg) {
  80             helper.setFileManagerOpt(Option.SOURCEPATH, arg);
  81         }
  82     },
  83 
  84     SYSCLASSPATH("-sysclasspath", true) {
  85         @Override
  86         public void process(Helper helper, String arg) {
  87             helper.setFileManagerOpt(Option.BOOTCLASSPATH, arg);
  88         }
  89     },
  90 
  91     MODULESOURCEPATH("-modulesourcepath", true) {
  92         @Override
  93         public void process(Helper helper, String arg) {
  94             helper.setFileManagerOpt(Option.MODULESOURCEPATH, arg);
  95         }
  96     },
  97 
  98     UPGRADEMODULEPATH("-upgrademodulepath", true) {
  99         @Override
 100         public void process(Helper helper, String arg) {
 101             helper.setFileManagerOpt(Option.UPGRADEMODULEPATH, arg);
 102         }
 103     },
 104 
 105     SYSTEM("-system", true) {
 106         @Override
 107         public void process(Helper helper, String arg) {
 108             helper.setFileManagerOpt(Option.SYSTEM, arg);
 109         }
 110     },
 111 
 112     MODULEPATH("-modulepath", true) {
 113         @Override
 114         public void process(Helper helper, String arg) {
 115             helper.setFileManagerOpt(Option.MODULEPATH, arg);
 116         }
 117     },
 118 
 119     ADDMODS("-addmods", true) {
 120         @Override
 121         public void process(Helper helper, String arg) {
 122             Option.ADDMODS.process(helper.getOptionHelper(), opt, arg);
 123         }
 124     },
 125 
 126     LIMITMODS("-limitmods", true) {
 127         @Override
 128         public void process(Helper helper, String arg) {
 129             Option.LIMITMODS.process(helper.getOptionHelper(), opt, arg);
 130         }
 131     },
 132 
 133     ENCODING("-encoding", true) {
 134         @Override
 135         public void process(Helper helper, String arg) {
 136             helper.encoding = arg;
 137             helper.setFileManagerOpt(Option.ENCODING, arg);
 138         }
 139     },
 140 
 141     RELEASE("-release", true) {
 142         @Override
 143         public void process(Helper helper, String arg) {
 144             Option.RELEASE.process(helper.getOptionHelper(), opt, arg);
 145         }
 146     },
 147 
 148     SOURCE("-source", true) {
 149         @Override
 150         public void process(Helper helper, String arg) {
 151             Option.SOURCE.process(helper.getOptionHelper(), opt, arg);
 152         }
 153     },
 154 
 155     XMAXERRS("-Xmaxerrs", true) {
 156         @Override
 157         public void process(Helper helper, String arg) {
 158             Option.XMAXERRS.process(helper.getOptionHelper(), opt, arg);
 159         }
 160     },
 161 
 162     XMAXWARNS("-Xmaxwarns", true) {
 163         @Override
 164         public void process(Helper helper, String arg) {
 165             Option.XMAXWARNS.process(helper.getOptionHelper(), opt, arg);
 166         }
 167     },
 168 
 169     XADDREADS("-XaddReads:", false) {
 170         @Override
 171         public void process(Helper helper, String arg) {
 172             Option.XADDREADS.process(helper.getOptionHelper(), arg);
 173         }
 174     },
 175 
 176     XADDEXPORTS("-XaddExports:", false) {
 177         @Override
 178         public void process(Helper helper, String arg) {
 179             Option.XADDEXPORTS.process(helper.getOptionHelper(), arg);
 180         }
 181     },
 182 
 183     XMODULE("-Xmodule:", false) {
 184         @Override
 185         public void process(Helper helper, String arg) {
 186             Option.XMODULE.process(helper.getOptionHelper(), arg);
 187         }
 188     },
 189 
 190     XPATCH("-Xpatch:", false) {
 191         @Override
 192         public void process(Helper helper, String arg) {
 193             Option.XMODULE.process(helper.getOptionHelper(), arg);
 194         }
 195     },
 196 
 197     // ----- doclet options -----
 198 
 199     DOCLET("-doclet", true), // handled in setDocletInvoker
 200 
 201     DOCLETPATH("-docletpath", true), // handled in setDocletInvoker
 202 
 203     // ----- selection options -----
 204 
 205     SUBPACKAGES("-subpackages", true) {
 206         @Override
 207         public void process(Helper helper, String arg) {
 208             helper.addToList(helper.subPackages, arg);
 209         }
 210     },
 211 
 212     EXCLUDE("-exclude", true) {
 213         @Override
 214         public void process(Helper helper, String arg) {
 215             helper.addToList(helper.excludedPackages, arg);
 216         }
 217     },
 218 
 219     // ----- filtering options -----
 220 
 221     PACKAGE("-package") {
 222         @Override
 223         public void process(Helper helper) {
 224             helper.setFilter("package");
 225         }
 226     },
 227 
 228     PRIVATE("-private") {
 229         @Override
 230         public void process(Helper helper) {
 231             helper.setFilter("private");
 232         }
 233     },
 234 
 235     PROTECTED("-protected") {
 236         @Override
 237         public void process(Helper helper) {
 238             helper.setFilter("protected");
 239         }
 240     },
 241 
 242     PUBLIC("-public") {
 243         @Override
 244         public void process(Helper helper) {
 245             helper.setFilter("public");
 246         }
 247     },
 248 
 249     // ----- output control options -----
 250 
 251     PROMPT("-prompt") {
 252         @Override
 253         public void process(Helper helper) {
 254             helper.compOpts.put("-prompt", "-prompt");
 255             helper.promptOnError = true;
 256         }
 257     },
 258 
 259     QUIET("-quiet") {
 260         @Override
 261         public void process(Helper helper) {
 262             helper.quiet = true;
 263         }
 264     },
 265 
 266     VERBOSE("-verbose") {
 267         @Override
 268         public void process(Helper helper) {
 269             helper.compOpts.put("-verbose", "");
 270         }
 271     },
 272 
 273     XWERROR("-Xwerror") {
 274         @Override
 275         public void process(Helper helper) {
 276             helper.rejectWarnings = true;
 277 
 278         }
 279     },
 280 
 281     // ----- other options -----
 282 
 283     BREAKITERATOR("-breakiterator") {
 284         @Override
 285         public void process(Helper helper) {
 286             helper.breakiterator = true;
 287         }
 288     },
 289 
 290     LOCALE("-locale", true) {
 291         @Override
 292         public void process(Helper helper, String arg) {
 293             helper.docLocale = arg;
 294         }
 295     },
 296 
 297     // the doclet consumes this
 298     OVERVIEW("-overview", true) {
 299         @Override
 300         public void process(Helper helper, String arg) {
 301             helper.setOverviewpath(arg);
 302         }
 303     },
 304 
 305     XCLASSES("-Xclasses") {
 306         @Override
 307         public void process(Helper helper) {
 308             helper.docClasses = true;
 309 
 310         }
 311     },
 312 
 313     // ----- help options -----
 314 
 315     HELP("-help") {
 316         @Override
 317         public void process(Helper helper) {
 318             helper.usage();
 319         }
 320     },
 321 
 322     X("-X") {
 323         @Override
 324         public void process(Helper helper) {
 325             helper.Xusage();
 326         }
 327     };
 328 
 329     public final String opt;
 330     public final boolean hasArg;
 331     public final boolean hasSuffix; // ex: foo:bar or -foo=bar
 332 
 333     ToolOption(String opt) {
 334         this(opt, false);
 335     }
 336 
 337     ToolOption(String opt, boolean hasArg) {
 338         this.opt = opt;
 339         this.hasArg = hasArg;
 340         char lastChar = opt.charAt(opt.length() - 1);
 341         this.hasSuffix = lastChar == ':' || lastChar == '=';
 342     }
 343 
 344     void process(Helper helper, String arg) { }
 345 
 346     void process(Helper helper) { }
 347 
 348     static ToolOption get(String name) {
 349         String oname = name;
 350         if (name.contains(":")) {
 351             oname = name.substring(0, name.indexOf(':') + 1);
 352         } else if (name.contains("=")) {
 353             oname = name.substring(0, name.indexOf('=') + 1);
 354         }
 355         for (ToolOption o : values()) {
 356             if (oname.equals(o.opt)) {
 357                 return o;
 358             }
 359         }
 360         return null;
 361     }
 362 
 363     static abstract class Helper {
 364         /** List of decoded options. */
 365         final List<List<String>> options = new ArrayList<>();
 366 
 367         /** Selected packages, from -subpackages. */
 368         final List<String> subPackages = new ArrayList<>();
 369 
 370         /** Excluded packages, from -exclude. */
 371         final List<String> excludedPackages = new ArrayList<>();
 372 
 373         // File manager options
 374         final Map<Option, String> fileManagerOpts = new LinkedHashMap<>();
 375 
 376         /** javac options, set by various options. */
 377         Options compOpts; // = Options.instance(context)
 378 
 379         /* Encoding for javac, and files written? set by -encoding. */
 380         String encoding = null;
 381 
 382         /** Set by -breakiterator. */
 383         boolean breakiterator = false;
 384 
 385         /** Set by -quiet. */
 386         boolean quiet = false;
 387 
 388         /** Set by -Xclasses. */
 389         boolean docClasses = false;
 390 
 391         /** Set by -Xwerror. */
 392         boolean rejectWarnings = false;
 393 
 394         /** Set by -prompt. */
 395         boolean promptOnError;
 396 
 397         /** Set by -locale. */
 398         String docLocale = "";
 399 
 400         /** Set by -public, private, -protected, -package. */
 401         String showAccess = null;
 402         String overviewpath;
 403 
 404         abstract void usage();
 405         abstract void Xusage();
 406 
 407         abstract void usageError(String msg, Object... args);
 408         abstract OptionHelper getOptionHelper();
 409 
 410         void addToList(List<String> list, String str){
 411             StringTokenizer st = new StringTokenizer(str, ":");
 412             String current;
 413             while(st.hasMoreTokens()){
 414                 current = st.nextToken();
 415                 list.add(current);
 416             }
 417         }
 418 
 419         void setFilter(String showAccess) {
 420             if (showAccess != null) {
 421                 if (!"public".equals(showAccess)
 422                         && !"protected".equals(showAccess)
 423                         && !"private".equals(showAccess)
 424                         && !"package".equals(showAccess)) {
 425                     usageError("main.incompatible.access.flags");
 426                 }
 427                 this.showAccess = showAccess;
 428             }
 429         }
 430 
 431         void setFileManagerOpt(Option opt, String arg) {
 432             fileManagerOpts.put(opt, arg);
 433         }
 434 
 435         private void setOverviewpath(String arg) {
 436             this.overviewpath = arg;
 437         }
 438     }
 439 }