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 com.sun.tools.javadoc.main;
  27 
  28 import java.util.LinkedHashMap;
  29 import java.util.Map;
  30 import java.util.StringTokenizer;
  31 
  32 import com.sun.tools.javac.code.Flags;
  33 import com.sun.tools.javac.main.Option;
  34 import com.sun.tools.javac.main.Option.InvalidValueException;
  35 import com.sun.tools.javac.main.OptionHelper;
  36 import com.sun.tools.javac.util.ListBuffer;
  37 import com.sun.tools.javac.util.Options;
  38 
  39 
  40 /**
  41  * javadoc tool options.
  42  *
  43  *  <p><b>This is NOT part of any supported API.
  44  *  If you write code that depends on this, you do so at your own risk.
  45  *  This code and its internal interfaces are subject to change or
  46  *  deletion without notice.</b>
  47  */
  48 @Deprecated
  49 public enum ToolOption {
  50     // ----- options for underlying compiler -----
  51 
  52     BOOTCLASSPATH("-bootclasspath", true) {
  53         @Override
  54         public void process(Helper helper, String arg) {
  55             helper.setFileManagerOpt(Option.BOOT_CLASS_PATH, arg);
  56         }
  57     },
  58 
  59     CLASSPATH("-classpath", true) {
  60         @Override
  61         public void process(Helper helper, String arg) {
  62             helper.setFileManagerOpt(Option.CLASS_PATH, arg);
  63         }
  64     },
  65 
  66     CP("-cp", true) {
  67         @Override
  68         public void process(Helper helper, String arg) {
  69             helper.setFileManagerOpt(Option.CLASS_PATH, arg);
  70         }
  71     },
  72 
  73     CLASS_PATH("--class-path", true) {
  74         @Override
  75         public void process(Helper helper, String arg) {
  76             helper.setFileManagerOpt(Option.CLASS_PATH, arg);
  77         }
  78     },
  79 
  80     EXTDIRS("-extdirs", true) {
  81         @Override
  82         public void process(Helper helper, String arg) {
  83             helper.setFileManagerOpt(Option.EXTDIRS, arg);
  84         }
  85     },
  86 
  87     SOURCEPATH("-sourcepath", true) {
  88         @Override
  89         public void process(Helper helper, String arg) {
  90             helper.setFileManagerOpt(Option.SOURCE_PATH, arg);
  91         }
  92     },
  93 
  94     SOURCE_PATH("--source-path", true) {
  95         @Override
  96         public void process(Helper helper, String arg) {
  97             helper.setFileManagerOpt(Option.SOURCE_PATH, arg);
  98         }
  99     },
 100 
 101     SYSCLASSPATH("-sysclasspath", true) {
 102         @Override
 103         public void process(Helper helper, String arg) {
 104             helper.setFileManagerOpt(Option.BOOT_CLASS_PATH, arg);
 105         }
 106     },
 107 
 108     MODULE_SOURCE_PATH("--module-source-path", true) {
 109         @Override
 110         public void process(Helper helper, String arg) {
 111             helper.setFileManagerOpt(Option.MODULE_SOURCE_PATH, arg);
 112         }
 113     },
 114 
 115     UPGRADE_MODULE_PATH("--upgrade-module-path", true) {
 116         @Override
 117         public void process(Helper helper, String arg) {
 118             helper.setFileManagerOpt(Option.UPGRADE_MODULE_PATH, arg);
 119         }
 120     },
 121 
 122     SYSTEM_("--system", true) {
 123         @Override
 124         public void process(Helper helper, String arg) {
 125             helper.setFileManagerOpt(Option.SYSTEM, arg);
 126         }
 127     },
 128 
 129     MODULE_PATH("--module-path", true) {
 130         @Override
 131         public void process(Helper helper, String arg) {
 132             helper.setFileManagerOpt(Option.MODULE_PATH, arg);
 133         }
 134     },
 135 
 136     P("-p", true) {
 137         @Override
 138         public void process(Helper helper, String arg) {
 139             helper.setFileManagerOpt(Option.MODULE_PATH, arg);
 140         }
 141     },
 142 
 143     ADD_MODULES("--add-modules", true) {
 144         @Override
 145         public void process(Helper helper, String arg) throws InvalidValueException {
 146             Option.ADD_MODULES.process(helper.getOptionHelper(), opt, arg);
 147         }
 148     },
 149 
 150     LIMIT_MODULES("--limit-modules", true) {
 151         @Override
 152         public void process(Helper helper, String arg) throws InvalidValueException {
 153             Option.LIMIT_MODULES.process(helper.getOptionHelper(), opt, arg);
 154         }
 155     },
 156 
 157     ENCODING("-encoding", true) {
 158         @Override
 159         public void process(Helper helper, String arg) {
 160             helper.encoding = arg;
 161             helper.setCompilerOpt(opt, arg);
 162         }
 163     },
 164 
 165     RELEASE("--release", true) {
 166         @Override
 167         public void process(Helper helper, String arg) {
 168             helper.setCompilerOpt(opt, arg);
 169         }
 170     },
 171 
 172     SOURCE("-source", true) {
 173         @Override
 174         public void process(Helper helper, String arg) {
 175             helper.setCompilerOpt(opt, arg);
 176         }
 177     },
 178 
 179     XMAXERRS("-Xmaxerrs", true) {
 180         @Override
 181         public void process(Helper helper, String arg) {
 182             helper.setCompilerOpt(opt, arg);
 183         }
 184     },
 185 
 186     XMAXWARNS("-Xmaxwarns", true) {
 187         @Override
 188         public void process(Helper helper, String arg) {
 189             helper.setCompilerOpt(opt, arg);
 190         }
 191     },
 192 
 193     ADD_READS("--add-reads", true) {
 194         @Override
 195         public void process(Helper helper, String arg) throws InvalidValueException {
 196             Option.ADD_READS.process(helper.getOptionHelper(), opt, arg);
 197         }
 198     },
 199 
 200     ADD_EXPORTS("--add-exports", true) {
 201         @Override
 202         public void process(Helper helper, String arg) throws InvalidValueException {
 203             Option.ADD_EXPORTS.process(helper.getOptionHelper(), opt, arg);
 204         }
 205     },
 206 
 207     PATCH_MODULE("--patch-module", true) {
 208         @Override
 209         public void process(Helper helper, String arg) throws InvalidValueException {
 210             Option.PATCH_MODULE.process(helper.getOptionHelper(), opt, arg);
 211         }
 212     },
 213 
 214     // ----- doclet options -----
 215 
 216     DOCLET("-doclet", true), // handled in setDocletInvoker
 217 
 218     DOCLETPATH("-docletpath", true), // handled in setDocletInvoker
 219 
 220     // ----- selection options -----
 221 
 222     SUBPACKAGES("-subpackages", true) {
 223         @Override
 224         public void process(Helper helper, String arg) {
 225             helper.addToList(helper.subPackages, arg);
 226         }
 227     },
 228 
 229     EXCLUDE("-exclude", true) {
 230         @Override
 231         public void process(Helper helper, String arg) {
 232             helper.addToList(helper.excludedPackages, arg);
 233         }
 234     },
 235 
 236     // ----- filtering options -----
 237 
 238     PACKAGE("-package") {
 239         @Override
 240         public void process(Helper helper) {
 241             helper.setFilter(
 242                     Flags.PUBLIC | Flags.PROTECTED | ModifierFilter.PACKAGE);
 243         }
 244     },
 245 
 246     PRIVATE("-private") {
 247         @Override
 248         public void process(Helper helper) {
 249             helper.setFilter(ModifierFilter.ALL_ACCESS);
 250         }
 251     },
 252 
 253     PROTECTED("-protected") {
 254         @Override
 255         public void process(Helper helper) {
 256             helper.setFilter(Flags.PUBLIC | Flags.PROTECTED);
 257         }
 258     },
 259 
 260     PUBLIC("-public") {
 261         @Override
 262         public void process(Helper helper) {
 263             helper.setFilter(Flags.PUBLIC);
 264         }
 265     },
 266 
 267     // ----- output control options -----
 268 
 269     PROMPT("-prompt") {
 270         @Override
 271         public void process(Helper helper) {
 272             helper.compOpts.put("-prompt", "-prompt");
 273             helper.promptOnError = true;
 274         }
 275     },
 276 
 277     QUIET("-quiet") {
 278         @Override
 279         public void process(Helper helper) {
 280             helper.quiet = true;
 281         }
 282     },
 283 
 284     VERBOSE("-verbose") {
 285         @Override
 286         public void process(Helper helper) {
 287             helper.compOpts.put("-verbose", "");
 288         }
 289     },
 290 
 291     XWERROR("-Xwerror") {
 292         @Override
 293         public void process(Helper helper) {
 294             helper.rejectWarnings = true;
 295 
 296         }
 297     },
 298 
 299     // ----- other options -----
 300 
 301     BREAKITERATOR("-breakiterator") {
 302         @Override
 303         public void process(Helper helper) {
 304             helper.breakiterator = true;
 305         }
 306     },
 307 
 308     LOCALE("-locale", true) {
 309         @Override
 310         public void process(Helper helper, String arg) {
 311             helper.docLocale = arg;
 312         }
 313     },
 314 
 315     OVERVIEW("-overview", true),
 316 
 317     XCLASSES("-Xclasses") {
 318         @Override
 319         public void process(Helper helper) {
 320             helper.docClasses = true;
 321 
 322         }
 323     },
 324 
 325     // ----- help options -----
 326 
 327     HELP("-help") {
 328         @Override
 329         public void process(Helper helper) {
 330             helper.usage();
 331         }
 332     },
 333 
 334     X("-X") {
 335         @Override
 336         public void process(Helper helper) {
 337             helper.Xusage();
 338         }
 339     };
 340 
 341     public final String opt;
 342     public final boolean hasArg;
 343 
 344     ToolOption(String opt) {
 345         this(opt, false);
 346     }
 347 
 348     ToolOption(String opt, boolean hasArg) {
 349         this.opt = opt;
 350         this.hasArg = hasArg;
 351     }
 352 
 353     void process(Helper helper, String arg) throws Option.InvalidValueException { }
 354 
 355     void process(Helper helper) { }
 356 
 357     static ToolOption get(String name) {
 358         for (ToolOption o: values()) {
 359             if (name.equals(o.opt))
 360                 return o;
 361         }
 362         return null;
 363     }
 364 
 365     static abstract class Helper {
 366         /** List of decoded options. */
 367         final ListBuffer<String[]> options = new ListBuffer<>();
 368 
 369         /** Selected packages, from -subpackages. */
 370         final ListBuffer<String> subPackages = new ListBuffer<>();
 371 
 372         /** Excluded packages, from -exclude. */
 373         final ListBuffer<String> excludedPackages = new ListBuffer<>();
 374 
 375         // File manager options
 376         final Map<Option, String> fileManagerOpts = new LinkedHashMap<>();
 377 
 378         /** javac options, set by various options. */
 379         Options compOpts; // = Options.instance(context)
 380 
 381         /* Encoding for javac, and files written? set by -encoding. */
 382         String encoding = null;
 383 
 384         /** Set by -breakiterator. */
 385         boolean breakiterator = false;
 386 
 387         /** Set by -quiet. */
 388         boolean quiet = false;
 389 
 390         /** Set by -Xclasses. */
 391         boolean docClasses = false;
 392 
 393         /** Set by -Xwerror. */
 394         boolean rejectWarnings = false;
 395 
 396         /** Set by -prompt. */
 397         boolean promptOnError;
 398 
 399         /** Set by -locale. */
 400         String docLocale = "";
 401 
 402         /** Set by -public, private, -protected, -package. */
 403         ModifierFilter showAccess = null;
 404 
 405         abstract void usage();
 406         abstract void Xusage();
 407 
 408         abstract void usageError(String msg, Object... args);
 409         abstract OptionHelper getOptionHelper();
 410 
 411         void addToList(ListBuffer<String> list, String str){
 412             StringTokenizer st = new StringTokenizer(str, ":");
 413             String current;
 414             while(st.hasMoreTokens()){
 415                 current = st.nextToken();
 416                 list.append(current);
 417             }
 418         }
 419 
 420         void setFilter(long filterBits) {
 421             if (showAccess != null) {
 422                 usageError("main.incompatible.access.flags");
 423             }
 424             showAccess = new ModifierFilter(filterBits);
 425         }
 426 
 427         void setCompilerOpt(String opt, String arg) {
 428             if (compOpts.get(opt) != null) {
 429                 usageError("main.option.already.seen", opt);
 430             }
 431             compOpts.put(opt, arg);
 432         }
 433 
 434         void setFileManagerOpt(Option opt, String arg) {
 435             fileManagerOpts.put(opt, arg);
 436         }
 437     }
 438 }