ToolOption.java revision 3233:b5d08bc0d224
1221828Sgrehan/*
2221828Sgrehan * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
3221828Sgrehan * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4221828Sgrehan *
5221828Sgrehan * This code is free software; you can redistribute it and/or modify it
6221828Sgrehan * under the terms of the GNU General Public License version 2 only, as
7221828Sgrehan * published by the Free Software Foundation.  Oracle designates this
8221828Sgrehan * particular file as subject to the "Classpath" exception as provided
9221828Sgrehan * by Oracle in the LICENSE file that accompanied this code.
10221828Sgrehan *
11221828Sgrehan * This code is distributed in the hope that it will be useful, but WITHOUT
12221828Sgrehan * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13221828Sgrehan * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14221828Sgrehan * version 2 for more details (a copy is included in the LICENSE file that
15221828Sgrehan * accompanied this code).
16221828Sgrehan *
17221828Sgrehan * You should have received a copy of the GNU General Public License version
18221828Sgrehan * 2 along with this work; if not, write to the Free Software Foundation,
19221828Sgrehan * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20221828Sgrehan *
21221828Sgrehan * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22221828Sgrehan * or visit www.oracle.com if you need additional information or have any
23221828Sgrehan * questions.
24221828Sgrehan */
25221828Sgrehan
26221828Sgrehanpackage jdk.javadoc.internal.tool;
27221828Sgrehan
28221828Sgrehanimport java.util.ArrayList;
29221828Sgrehanimport java.util.LinkedHashMap;
30221828Sgrehanimport java.util.List;
31221828Sgrehanimport java.util.Map;
32221828Sgrehanimport java.util.StringTokenizer;
33221828Sgrehan
34221828Sgrehanimport com.sun.tools.javac.main.Option;
35221828Sgrehanimport com.sun.tools.javac.util.Options;
36221828Sgrehan
37221828Sgrehan/**
38221828Sgrehan * javadoc tool options.
39221828Sgrehan *
40221828Sgrehan *  <p><b>This is NOT part of any supported API.
41221828Sgrehan *  If you write code that depends on this, you do so at your own risk.
42221828Sgrehan *  This code and its internal interfaces are subject to change or
43240922Sneel *  deletion without notice.</b>
44240922Sneel */
45221828Sgrehanpublic enum ToolOption {
46221828Sgrehan    // ----- options for underlying compiler -----
47221828Sgrehan
48240894Sneel    BOOTCLASSPATH("-bootclasspath", true) {
49221828Sgrehan        @Override
50241147Sneel        public void process(Helper helper, String arg) {
51241147Sneel            helper.setFileManagerOpt(Option.BOOTCLASSPATH, arg);
52241147Sneel        }
53241147Sneel    },
54241147Sneel
55221828Sgrehan    CLASSPATH("-classpath", true) {
56221828Sgrehan        @Override
57221828Sgrehan        public void process(Helper helper, String arg) {
58221828Sgrehan            helper.setFileManagerOpt(Option.CLASSPATH, arg);
59221828Sgrehan        }
60221828Sgrehan    },
61221828Sgrehan
62221828Sgrehan    CP("-cp", true) {
63221828Sgrehan        @Override
64221828Sgrehan        public void process(Helper helper, String arg) {
65221828Sgrehan            helper.setFileManagerOpt(Option.CP, arg);
66221828Sgrehan        }
67221828Sgrehan    },
68221828Sgrehan
69221828Sgrehan    EXTDIRS("-extdirs", true) {
70221828Sgrehan        @Override
71221828Sgrehan        public void process(Helper helper, String arg) {
72221828Sgrehan            helper.setFileManagerOpt(Option.EXTDIRS, arg);
73221828Sgrehan        }
74221828Sgrehan    },
75221828Sgrehan
76241147Sneel    SOURCEPATH("-sourcepath", true) {
77241147Sneel        @Override
78221828Sgrehan        public void process(Helper helper, String arg) {
79221828Sgrehan            helper.setFileManagerOpt(Option.SOURCEPATH, arg);
80221828Sgrehan        }
81221828Sgrehan    },
82221828Sgrehan
83221828Sgrehan    SYSCLASSPATH("-sysclasspath", true) {
84221828Sgrehan        @Override
85221828Sgrehan        public void process(Helper helper, String arg) {
86221828Sgrehan            helper.setFileManagerOpt(Option.BOOTCLASSPATH, arg);
87221828Sgrehan        }
88221828Sgrehan    },
89221828Sgrehan
90221828Sgrehan    ENCODING("-encoding", true) {
91221828Sgrehan        @Override
92221828Sgrehan        public void process(Helper helper, String arg) {
93241041Sneel            helper.encoding = arg;
94221828Sgrehan            helper.setCompilerOpt(opt, arg);
95221828Sgrehan        }
96221828Sgrehan    },
97221828Sgrehan
98221828Sgrehan    RELEASE("-release", true) {
99221828Sgrehan        @Override
100221828Sgrehan        public void process(Helper helper, String arg) {
101221828Sgrehan            helper.setCompilerOpt(opt, arg);
102221828Sgrehan        }
103221828Sgrehan    },
104221828Sgrehan
105221828Sgrehan    SOURCE("-source", true) {
106221828Sgrehan        @Override
107221828Sgrehan        public void process(Helper helper, String arg) {
108221828Sgrehan            helper.setCompilerOpt(opt, arg);
109221828Sgrehan        }
110221828Sgrehan    },
111241982Sneel
112241982Sneel    XMAXERRS("-Xmaxerrs", true) {
113221828Sgrehan        @Override
114221828Sgrehan        public void process(Helper helper, String arg) {
115221828Sgrehan            helper.setCompilerOpt(opt, arg);
116221828Sgrehan        }
117240922Sneel    },
118240922Sneel
119221828Sgrehan    XMAXWARNS("-Xmaxwarns", true) {
120223621Sgrehan        @Override
121240894Sneel        public void process(Helper helper, String arg) {
122221828Sgrehan            helper.setCompilerOpt(opt, arg);
123221828Sgrehan        }
124221828Sgrehan    },
125221828Sgrehan
126221828Sgrehan    // ----- doclet options -----
127221828Sgrehan
128221828Sgrehan    DOCLET("-doclet", true), // handled in setDocletInvoker
129221828Sgrehan
130221828Sgrehan    DOCLETPATH("-docletpath", true), // handled in setDocletInvoker
131221828Sgrehan
132221828Sgrehan    // ----- selection options -----
133241489Sneel
134241489Sneel    SUBPACKAGES("-subpackages", true) {
135241489Sneel        @Override
136241489Sneel        public void process(Helper helper, String arg) {
137241489Sneel            helper.addToList(helper.subPackages, arg);
138221828Sgrehan        }
139241489Sneel    },
140241489Sneel
141221828Sgrehan    EXCLUDE("-exclude", true) {
142221828Sgrehan        @Override
143241489Sneel        public void process(Helper helper, String arg) {
144221828Sgrehan            helper.addToList(helper.excludedPackages, arg);
145241489Sneel        }
146221828Sgrehan    },
147221828Sgrehan
148241489Sneel    // ----- filtering options -----
149241489Sneel
150241489Sneel    PACKAGE("-package") {
151221828Sgrehan        @Override
152221828Sgrehan        public void process(Helper helper) {
153221828Sgrehan            helper.setFilter("package");
154221828Sgrehan        }
155221828Sgrehan    },
156221828Sgrehan
157221828Sgrehan    PRIVATE("-private") {
158221828Sgrehan        @Override
159221828Sgrehan        public void process(Helper helper) {
160221828Sgrehan            helper.setFilter("private");
161221828Sgrehan        }
162221828Sgrehan    },
163221828Sgrehan
164221828Sgrehan    PROTECTED("-protected") {
165221828Sgrehan        @Override
166221828Sgrehan        public void process(Helper helper) {
167221828Sgrehan            helper.setFilter("protected");
168221828Sgrehan        }
169221828Sgrehan    },
170221828Sgrehan
171221828Sgrehan    PUBLIC("-public") {
172221828Sgrehan        @Override
173221828Sgrehan        public void process(Helper helper) {
174221828Sgrehan            helper.setFilter("public");
175221828Sgrehan        }
176221828Sgrehan    },
177221828Sgrehan
178221828Sgrehan    // ----- output control options -----
179221828Sgrehan
180221828Sgrehan    PROMPT("-prompt") {
181221828Sgrehan        @Override
182221828Sgrehan        public void process(Helper helper) {
183221828Sgrehan            helper.compOpts.put("-prompt", "-prompt");
184221828Sgrehan            helper.promptOnError = true;
185221828Sgrehan        }
186221828Sgrehan    },
187221828Sgrehan
188221828Sgrehan    QUIET("-quiet") {
189221828Sgrehan        @Override
190221828Sgrehan        public void process(Helper helper) {
191221828Sgrehan            helper.quiet = true;
192221828Sgrehan        }
193221828Sgrehan    },
194221828Sgrehan
195221828Sgrehan    VERBOSE("-verbose") {
196221828Sgrehan        @Override
197221828Sgrehan        public void process(Helper helper) {
198221828Sgrehan            helper.compOpts.put("-verbose", "");
199221828Sgrehan        }
200221828Sgrehan    },
201221828Sgrehan
202221828Sgrehan    XWERROR("-Xwerror") {
203221828Sgrehan        @Override
204221828Sgrehan        public void process(Helper helper) {
205221828Sgrehan            helper.rejectWarnings = true;
206221828Sgrehan
207221828Sgrehan        }
208221828Sgrehan    },
209221828Sgrehan
210221828Sgrehan    // ----- other options -----
211221828Sgrehan
212221828Sgrehan    BREAKITERATOR("-breakiterator") {
213221828Sgrehan        @Override
214221828Sgrehan        public void process(Helper helper) {
215221828Sgrehan            helper.breakiterator = true;
216221828Sgrehan        }
217221828Sgrehan    },
218221828Sgrehan
219221828Sgrehan    LOCALE("-locale", true) {
220240922Sneel        @Override
221240922Sneel        public void process(Helper helper, String arg) {
222240922Sneel            helper.docLocale = arg;
223240922Sneel        }
224240922Sneel    },
225240922Sneel
226240922Sneel    // the doclet consumes this
227221828Sgrehan    OVERVIEW("-overview", true) {
228221828Sgrehan        @Override
229221828Sgrehan        public void process(Helper helper, String arg) {
230221828Sgrehan            helper.setOverviewpath(arg);
231221828Sgrehan        }
232221828Sgrehan    },
233221828Sgrehan
234221828Sgrehan    XCLASSES("-Xclasses") {
235221828Sgrehan        @Override
236221828Sgrehan        public void process(Helper helper) {
237221828Sgrehan            helper.docClasses = true;
238221828Sgrehan
239221828Sgrehan        }
240221828Sgrehan    },
241221828Sgrehan
242221828Sgrehan    // ----- help options -----
243221828Sgrehan
244221828Sgrehan    HELP("-help") {
245221828Sgrehan        @Override
246221828Sgrehan        public void process(Helper helper) {
247221828Sgrehan            helper.usage();
248221828Sgrehan        }
249234761Sgrehan    },
250240912Sneel
251234761Sgrehan    X("-X") {
252221828Sgrehan        @Override
253221828Sgrehan        public void process(Helper helper) {
254221828Sgrehan            helper.Xusage();
255221828Sgrehan        }
256221828Sgrehan    };
257221828Sgrehan
258221828Sgrehan    public final String opt;
259221828Sgrehan    public final boolean hasArg;
260221828Sgrehan
261221828Sgrehan    ToolOption(String opt) {
262221828Sgrehan        this(opt, false);
263221828Sgrehan    }
264221828Sgrehan
265221828Sgrehan    ToolOption(String opt, boolean hasArg) {
266221828Sgrehan        this.opt = opt;
267234761Sgrehan        this.hasArg = hasArg;
268234761Sgrehan    }
269241497Sgrehan
270241497Sgrehan    void process(Helper helper, String arg) { }
271234761Sgrehan
272221828Sgrehan    void process(Helper helper) { }
273221828Sgrehan
274221828Sgrehan    static ToolOption get(String name) {
275221828Sgrehan        for (ToolOption o: values()) {
276221828Sgrehan            if (name.equals(o.opt))
277221828Sgrehan                return o;
278221828Sgrehan        }
279221828Sgrehan        return null;
280221828Sgrehan    }
281221828Sgrehan
282221828Sgrehan    static abstract class Helper {
283221828Sgrehan        /** List of decoded options. */
284221828Sgrehan        final List<List<String>> options = new ArrayList<>();
285240912Sneel
286240912Sneel        /** Selected packages, from -subpackages. */
287240912Sneel        final List<String> subPackages = new ArrayList<>();
288240912Sneel
289221828Sgrehan        /** Excluded packages, from -exclude. */
290221828Sgrehan        final List<String> excludedPackages = new ArrayList<>();
291221828Sgrehan
292221828Sgrehan        // File manager options
293        final Map<Option, String> fileManagerOpts = new LinkedHashMap<>();
294
295        /** javac options, set by various options. */
296        Options compOpts; // = Options.instance(context)
297
298        /* Encoding for javac, and files written? set by -encoding. */
299        String encoding = null;
300
301        /** Set by -breakiterator. */
302        boolean breakiterator = false;
303
304        /** Set by -quiet. */
305        boolean quiet = false;
306
307        /** Set by -Xclasses. */
308        boolean docClasses = false;
309
310        /** Set by -Xwerror. */
311        boolean rejectWarnings = false;
312
313        /** Set by -prompt. */
314        boolean promptOnError;
315
316        /** Set by -locale. */
317        String docLocale = "";
318
319        /** Set by -public, private, -protected, -package. */
320        String showAccess = null;
321        String overviewpath;
322
323        abstract void usage();
324        abstract void Xusage();
325
326        abstract void usageError(String msg, Object... args);
327
328        void addToList(List<String> list, String str){
329            StringTokenizer st = new StringTokenizer(str, ":");
330            String current;
331            while(st.hasMoreTokens()){
332                current = st.nextToken();
333                list.add(current);
334            }
335        }
336
337        void setFilter(String showAccess) {
338            if (showAccess != null) {
339                if (!"public".equals(showAccess)
340                        && !"protected".equals(showAccess)
341                        && !"private".equals(showAccess)
342                        && !"package".equals(showAccess)) {
343                    usageError("main.incompatible.access.flags");
344                }
345                this.showAccess = showAccess;
346            }
347        }
348
349        void setCompilerOpt(String opt, String arg) {
350            if (compOpts.get(opt) != null) {
351                usageError("main.option.already.seen", opt);
352            }
353            compOpts.put(opt, arg);
354        }
355
356        void setFileManagerOpt(Option opt, String arg) {
357            fileManagerOpts.put(opt, arg);
358        }
359
360        private void setOverviewpath(String arg) {
361            this.overviewpath = arg;
362        }
363    }
364}
365