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 }