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.BOOT_CLASS_PATH, arg);
  53         }
  54     },
  55 
  56     CLASSPATH("-classpath", true) {
  57         @Override
  58         public void process(Helper helper, String arg) {
  59             helper.setFileManagerOpt(Option.CLASS_PATH, arg);
  60         }
  61     },
  62 
  63     CP("-cp", true) {
  64         @Override
  65         public void process(Helper helper, String arg) {
  66             helper.setFileManagerOpt(Option.CLASS_PATH, arg);
  67         }
  68     },
  69 
  70     CLASS_PATH("--class-path", true) {
  71         @Override
  72         public void process(Helper helper, String arg) {
  73             helper.setFileManagerOpt(Option.CLASS_PATH, arg);
  74         }
  75     },
  76 
  77     EXTDIRS("-extdirs", true) {
  78         @Override
  79         public void process(Helper helper, String arg) {
  80             helper.setFileManagerOpt(Option.EXTDIRS, arg);
  81         }
  82     },
  83 
  84     SOURCEPATH("-sourcepath", true) {
  85         @Override
  86         public void process(Helper helper, String arg) {
  87             helper.setFileManagerOpt(Option.SOURCE_PATH, arg);
  88         }
  89     },
  90 
  91     SOURCE_PATH("--source-path", true) {
  92         @Override
  93         public void process(Helper helper, String arg) {
  94             helper.setFileManagerOpt(Option.SOURCE_PATH, arg);
  95         }
  96     },
  97 
  98     SYSCLASSPATH("-sysclasspath", true) {
  99         @Override
 100         public void process(Helper helper, String arg) {
 101             helper.setFileManagerOpt(Option.BOOT_CLASS_PATH, arg);
 102         }
 103     },
 104 
 105     MODULESOURCEPATH("-modulesourcepath", true) {
 106         @Override
 107         public void process(Helper helper, String arg) {
 108             helper.setFileManagerOpt(Option.MODULE_SOURCE_PATH, arg);
 109         }
 110     },
 111 
 112     MODULE_SOURCE_PATH("--module-source-path", true) {
 113         @Override
 114         public void process(Helper helper, String arg) {
 115             helper.setFileManagerOpt(Option.MODULE_SOURCE_PATH, arg);
 116         }
 117     },
 118 
 119     UPGRADEMODULEPATH("-upgrademodulepath", true) {
 120         @Override
 121         public void process(Helper helper, String arg) {
 122             helper.setFileManagerOpt(Option.UPGRADE_MODULE_PATH, arg);
 123         }
 124     },
 125 
 126     UPGRADE_MODULE_PATH("--upgrade-module-path", true) {
 127         @Override
 128         public void process(Helper helper, String arg) {
 129             helper.setFileManagerOpt(Option.UPGRADE_MODULE_PATH, arg);
 130         }
 131     },
 132 
 133     SYSTEM("-system", true) {
 134         @Override
 135         public void process(Helper helper, String arg) {
 136             helper.setFileManagerOpt(Option.SYSTEM, arg);
 137         }
 138     },
 139 
 140     SYSTEM_("--system", true) {
 141         @Override
 142         public void process(Helper helper, String arg) {
 143             helper.setFileManagerOpt(Option.SYSTEM, arg);
 144         }
 145     },
 146 
 147     MODULEPATH("-modulepath", true) {
 148         @Override
 149         public void process(Helper helper, String arg) {
 150             helper.setFileManagerOpt(Option.MODULE_PATH, arg);
 151         }
 152     },
 153 
 154     MODULE_PATH("--module-path", true) {
 155         @Override
 156         public void process(Helper helper, String arg) {
 157             helper.setFileManagerOpt(Option.MODULE_PATH, arg);
 158         }
 159     },
 160 
 161     P("-p", true) {
 162         @Override
 163         public void process(Helper helper, String arg) {
 164             helper.setFileManagerOpt(Option.MODULE_PATH, arg);
 165         }
 166     },
 167 
 168     ADDMODS("-addmods", true) {
 169         @Override
 170         public void process(Helper helper, String arg) {
 171             Option.ADD_MODULES.process(helper.getOptionHelper(), opt, arg);
 172         }
 173     },
 174 
 175     ADD_MODULES("--add-modules", true) {
 176         @Override
 177         public void process(Helper helper, String arg) {
 178             Option.ADD_MODULES.process(helper.getOptionHelper(), opt, arg);
 179         }
 180     },
 181 
 182     LIMITMODS("-limitmods", true) {
 183         @Override
 184         public void process(Helper helper, String arg) {
 185             Option.LIMIT_MODULES.process(helper.getOptionHelper(), opt, arg);
 186         }
 187     },
 188 
 189     LIMIT_MODULES("--limit-modules", true) {
 190         @Override
 191         public void process(Helper helper, String arg) {
 192             Option.LIMIT_MODULES.process(helper.getOptionHelper(), opt, arg);
 193         }
 194     },
 195 
 196     ENCODING("-encoding", true) {
 197         @Override
 198         public void process(Helper helper, String arg) {
 199             helper.encoding = arg;
 200             helper.setFileManagerOpt(Option.ENCODING, arg);
 201         }
 202     },
 203 
 204     RELEASE("--release", true) {
 205         @Override
 206         public void process(Helper helper, String arg) {
 207             Option.RELEASE.process(helper.getOptionHelper(), opt, arg);
 208         }
 209     },
 210 
 211     RELEASE_OLD("-release", true) {
 212         @Override
 213         public void process(Helper helper, String arg) {
 214             Option.RELEASE.process(helper.getOptionHelper(), opt, arg);
 215         }
 216     },
 217 
 218     SOURCE("-source", true) {
 219         @Override
 220         public void process(Helper helper, String arg) {
 221             Option.SOURCE.process(helper.getOptionHelper(), opt, arg);
 222         }
 223     },
 224 
 225     XMAXERRS("-Xmaxerrs", true) {
 226         @Override
 227         public void process(Helper helper, String arg) {
 228             Option.XMAXERRS.process(helper.getOptionHelper(), opt, arg);
 229         }
 230     },
 231 
 232     XMAXWARNS("-Xmaxwarns", true) {
 233         @Override
 234         public void process(Helper helper, String arg) {
 235             Option.XMAXWARNS.process(helper.getOptionHelper(), opt, arg);
 236         }
 237     },
 238 
 239     XADDREADS("-XaddReads:", false) {
 240         @Override
 241         public void process(Helper helper, String arg) {
 242             Option.ADD_READS.process(helper.getOptionHelper(), arg);
 243         }
 244     },
 245 
 246     ADD_READS("--add-reads", true) {
 247         @Override
 248         public void process(Helper helper, String arg) {
 249             Option.ADD_READS.process(helper.getOptionHelper(), opt, arg);
 250         }
 251     },
 252 
 253     ADDEXPORTS("-XaddExports:", false) {
 254         @Override
 255         public void process(Helper helper, String arg) {
 256             Option.ADD_EXPORTS.process(helper.getOptionHelper(), arg);
 257         }
 258     },
 259 
 260     ADD_EXPORTS("--add-exports", true) {
 261         @Override
 262         public void process(Helper helper, String arg) {
 263             Option.ADD_EXPORTS.process(helper.getOptionHelper(), opt, arg);
 264         }
 265     },
 266 
 267     XMODULE("-Xmodule:", false) {
 268         @Override
 269         public void process(Helper helper, String arg) {
 270             Option.XMODULE.process(helper.getOptionHelper(), arg);
 271         }
 272     },
 273 
 274     XPATCH("-Xpatch:", false) {
 275         @Override
 276         public void process(Helper helper, String arg) {
 277             Option.XMODULE.process(helper.getOptionHelper(), arg);
 278         }
 279     },
 280 
 281     PATCH_MODULE("--patch-module", true) {
 282         @Override
 283         public void process(Helper helper, String arg) {
 284             Option.PATCH_MODULE.process(helper.getOptionHelper(), opt, arg);
 285         }
 286     },
 287 
 288     // ----- doclet options -----
 289 
 290     DOCLET("-doclet", true), // handled in setDocletInvoker
 291 
 292     DOCLETPATH("-docletpath", true), // handled in setDocletInvoker
 293 
 294     // ----- selection options -----
 295 
 296     SUBPACKAGES("-subpackages", true) {
 297         @Override
 298         public void process(Helper helper, String arg) {
 299             helper.addToList(helper.subPackages, arg);
 300         }
 301     },
 302 
 303     EXCLUDE("-exclude", true) {
 304         @Override
 305         public void process(Helper helper, String arg) {
 306             helper.addToList(helper.excludedPackages, arg);
 307         }
 308     },
 309 
 310     // ----- filtering options -----
 311 
 312     PACKAGE("-package") {
 313         @Override
 314         public void process(Helper helper) {
 315             helper.setFilter("package");
 316         }
 317     },
 318 
 319     PRIVATE("-private") {
 320         @Override
 321         public void process(Helper helper) {
 322             helper.setFilter("private");
 323         }
 324     },
 325 
 326     PROTECTED("-protected") {
 327         @Override
 328         public void process(Helper helper) {
 329             helper.setFilter("protected");
 330         }
 331     },
 332 
 333     PUBLIC("-public") {
 334         @Override
 335         public void process(Helper helper) {
 336             helper.setFilter("public");
 337         }
 338     },
 339 
 340     // ----- output control options -----
 341 
 342     PROMPT("-prompt") {
 343         @Override
 344         public void process(Helper helper) {
 345             helper.compOpts.put("-prompt", "-prompt");
 346             helper.promptOnError = true;
 347         }
 348     },
 349 
 350     QUIET("-quiet") {
 351         @Override
 352         public void process(Helper helper) {
 353             helper.quiet = true;
 354         }
 355     },
 356 
 357     VERBOSE("-verbose") {
 358         @Override
 359         public void process(Helper helper) {
 360             helper.compOpts.put("-verbose", "");
 361         }
 362     },
 363 
 364     XWERROR("-Xwerror") {
 365         @Override
 366         public void process(Helper helper) {
 367             helper.rejectWarnings = true;
 368 
 369         }
 370     },
 371 
 372     // ----- other options -----
 373 
 374     BREAKITERATOR("-breakiterator") {
 375         @Override
 376         public void process(Helper helper) {
 377             helper.breakiterator = true;
 378         }
 379     },
 380 
 381     LOCALE("-locale", true) {
 382         @Override
 383         public void process(Helper helper, String arg) {
 384             helper.docLocale = arg;
 385         }
 386     },
 387 
 388     // the doclet consumes this
 389     OVERVIEW("-overview", true) {
 390         @Override
 391         public void process(Helper helper, String arg) {
 392             helper.setOverviewpath(arg);
 393         }
 394     },
 395 
 396     XCLASSES("-Xclasses") {
 397         @Override
 398         public void process(Helper helper) {
 399             helper.docClasses = true;
 400 
 401         }
 402     },
 403 
 404     // ----- help options -----
 405 
 406     HELP("-help") {
 407         @Override
 408         public void process(Helper helper) {
 409             helper.usage();
 410         }
 411     },
 412 
 413     X("-X") {
 414         @Override
 415         public void process(Helper helper) {
 416             helper.Xusage();
 417         }
 418     };
 419 
 420     public final String opt;
 421     public final boolean hasArg;
 422     public final boolean hasSuffix; // ex: foo:bar or -foo=bar
 423 
 424     ToolOption(String opt) {
 425         this(opt, false);
 426     }
 427 
 428     ToolOption(String opt, boolean hasArg) {
 429         this.opt = opt;
 430         this.hasArg = hasArg;
 431         char lastChar = opt.charAt(opt.length() - 1);
 432         this.hasSuffix = lastChar == ':' || lastChar == '=';
 433     }
 434 
 435     void process(Helper helper, String arg) { }
 436 
 437     void process(Helper helper) { }
 438 
 439     static ToolOption get(String name) {
 440         String oname = name;
 441         if (name.contains(":")) {
 442             oname = name.substring(0, name.indexOf(':') + 1);
 443         } else if (name.contains("=")) {
 444             oname = name.substring(0, name.indexOf('=') + 1);
 445         }
 446         for (ToolOption o : values()) {
 447             if (oname.equals(o.opt)) {
 448                 return o;
 449             }
 450         }
 451         return null;
 452     }
 453 
 454     static abstract class Helper {
 455         /** List of decoded options. */
 456         final List<List<String>> options = new ArrayList<>();
 457 
 458         /** Selected packages, from -subpackages. */
 459         final List<String> subPackages = new ArrayList<>();
 460 
 461         /** Excluded packages, from -exclude. */
 462         final List<String> excludedPackages = new ArrayList<>();
 463 
 464         // File manager options
 465         final Map<Option, String> fileManagerOpts = new LinkedHashMap<>();
 466 
 467         /** javac options, set by various options. */
 468         Options compOpts; // = Options.instance(context)
 469 
 470         /* Encoding for javac, and files written? set by -encoding. */
 471         String encoding = null;
 472 
 473         /** Set by -breakiterator. */
 474         boolean breakiterator = false;
 475 
 476         /** Set by -quiet. */
 477         boolean quiet = false;
 478 
 479         /** Set by -Xclasses. */
 480         boolean docClasses = false;
 481 
 482         /** Set by -Xwerror. */
 483         boolean rejectWarnings = false;
 484 
 485         /** Set by -prompt. */
 486         boolean promptOnError;
 487 
 488         /** Set by -locale. */
 489         String docLocale = "";
 490 
 491         /** Set by -public, private, -protected, -package. */
 492         String showAccess = null;
 493         String overviewpath;
 494 
 495         abstract void usage();
 496         abstract void Xusage();
 497 
 498         abstract void usageError(String msg, Object... args);
 499         abstract OptionHelper getOptionHelper();
 500 
 501         void addToList(List<String> list, String str){
 502             StringTokenizer st = new StringTokenizer(str, ":");
 503             String current;
 504             while(st.hasMoreTokens()){
 505                 current = st.nextToken();
 506                 list.add(current);
 507             }
 508         }
 509 
 510         void setFilter(String showAccess) {
 511             if (showAccess != null) {
 512                 if (!"public".equals(showAccess)
 513                         && !"protected".equals(showAccess)
 514                         && !"private".equals(showAccess)
 515                         && !"package".equals(showAccess)) {
 516                     usageError("main.incompatible.access.flags");
 517                 }
 518                 this.showAccess = showAccess;
 519             }
 520         }
 521 
 522         void setFileManagerOpt(Option opt, String arg) {
 523             fileManagerOpts.put(opt, arg);
 524         }
 525 
 526         private void setOverviewpath(String arg) {
 527             this.overviewpath = arg;
 528         }
 529     }
 530 }