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 }