ToolOption.java revision 3573:c4a18ee691c4
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
26package jdk.javadoc.internal.tool;
27
28import java.util.ArrayList;
29import java.util.LinkedHashMap;
30import java.util.List;
31import java.util.Map;
32import java.util.StringTokenizer;
33
34import com.sun.tools.javac.main.Option;
35import com.sun.tools.javac.main.OptionHelper;
36import 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 */
46public 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}
531