src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/Start.java
author pmuthuswamy
Wed, 17 Apr 2019 12:43:41 +0530
changeset 54561 6c4d8b7128d5
parent 54049 e4cc94318c37
permissions -rw-r--r--
8220382: Cleanup doclet instantiation Reviewed-by: jjg
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10
06bc494ca11e Initial load
duke
parents:
diff changeset
     1
/*
48840
5e2d2067da48 8194651: javadoc: mark the com.sun.javadoc API for removal
ksrini
parents: 47216
diff changeset
     2
 * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
06bc494ca11e Initial load
duke
parents:
diff changeset
     4
 *
06bc494ca11e Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
06bc494ca11e Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5520
86e4b9a9da40 6943119: Rebrand source copyright notices
ohair
parents: 1652
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
10
06bc494ca11e Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5520
86e4b9a9da40 6943119: Rebrand source copyright notices
ohair
parents: 1652
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    10
 *
06bc494ca11e Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
06bc494ca11e Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
06bc494ca11e Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
06bc494ca11e Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
06bc494ca11e Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
06bc494ca11e Initial load
duke
parents:
diff changeset
    16
 *
06bc494ca11e Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
06bc494ca11e Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
06bc494ca11e Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
06bc494ca11e Initial load
duke
parents:
diff changeset
    20
 *
5520
86e4b9a9da40 6943119: Rebrand source copyright notices
ohair
parents: 1652
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
86e4b9a9da40 6943119: Rebrand source copyright notices
ohair
parents: 1652
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
86e4b9a9da40 6943119: Rebrand source copyright notices
ohair
parents: 1652
diff changeset
    23
 * questions.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    24
 */
06bc494ca11e Initial load
duke
parents:
diff changeset
    25
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
    26
package jdk.javadoc.internal.tool;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    27
14258
8d2148961366 8000663: clean up langtools imports
jjg
parents: 11052
diff changeset
    28
import java.io.File;
8d2148961366 8000663: clean up langtools imports
jjg
parents: 11052
diff changeset
    29
import java.io.IOException;
8d2148961366 8000663: clean up langtools imports
jjg
parents: 11052
diff changeset
    30
import java.io.PrintWriter;
31936
02f1cfc234a0 8086737: Add support for -release to Javadoc
jlahoda
parents: 29780
diff changeset
    31
import java.nio.file.Path;
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
    32
import java.text.BreakIterator;
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
    33
import java.text.Collator;
14545
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
    34
import java.util.ArrayList;
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
    35
import java.util.Arrays;
14545
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
    36
import java.util.Collection;
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
    37
import java.util.Collections;
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
    38
import java.util.Comparator;
50611
69c59b667acc 8149565: -locale option issues
jjg
parents: 48840
diff changeset
    39
import java.util.IllformedLocaleException;
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
    40
import java.util.List;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
    41
import java.util.Locale;
45912
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
    42
import java.util.MissingResourceException;
29291
076c277565f7 8073550: java* tools: replace obj.getClass hacks with Assert.checkNonNull or Objects.requireNonNull
mcimadamore
parents: 27379
diff changeset
    43
import java.util.Objects;
45912
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
    44
import java.util.ResourceBundle;
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
    45
import java.util.Set;
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
    46
import java.util.stream.Collectors;
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
    47
import java.util.stream.Stream;
36526
3b41f1c69604 8142968: Module System implementation
alanb
parents: 35426
diff changeset
    48
14545
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
    49
import javax.tools.JavaFileManager;
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
    50
import javax.tools.JavaFileObject;
31936
02f1cfc234a0 8086737: Add support for -release to Javadoc
jlahoda
parents: 29780
diff changeset
    51
import javax.tools.StandardJavaFileManager;
02f1cfc234a0 8086737: Add support for -release to Javadoc
jlahoda
parents: 29780
diff changeset
    52
import javax.tools.StandardLocation;
14258
8d2148961366 8000663: clean up langtools imports
jjg
parents: 11052
diff changeset
    53
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
    54
import com.sun.tools.javac.api.JavacTrees;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
    55
import com.sun.tools.javac.file.BaseFileManager;
24897
655b72d7b96e 7026941: 199: path options ignored when reusing filemanager across tasks
jjg
parents: 22163
diff changeset
    56
import com.sun.tools.javac.file.JavacFileManager;
51423
b2319bbcc867 8208269: Javadoc does not support module-info in a multi-release jar
jlahoda
parents: 50611
diff changeset
    57
import com.sun.tools.javac.jvm.Target;
42260
2b4da2bf6660 8169676: boolean result of Option.process is often ignored
jjg
parents: 41990
diff changeset
    58
import com.sun.tools.javac.main.Arguments;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    59
import com.sun.tools.javac.main.CommandLine;
37393
a9ba8bd6697b 8152818: Javadoc must support module options supported by javac.
ksrini
parents: 36526
diff changeset
    60
import com.sun.tools.javac.main.OptionHelper;
a9ba8bd6697b 8152818: Javadoc must support module options supported by javac.
ksrini
parents: 36526
diff changeset
    61
import com.sun.tools.javac.main.OptionHelper.GrumpyHelper;
31936
02f1cfc234a0 8086737: Add support for -release to Javadoc
jlahoda
parents: 29780
diff changeset
    62
import com.sun.tools.javac.platform.PlatformDescription;
02f1cfc234a0 8086737: Add support for -release to Javadoc
jlahoda
parents: 29780
diff changeset
    63
import com.sun.tools.javac.platform.PlatformUtils;
14545
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
    64
import com.sun.tools.javac.util.ClientCodeException;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    65
import com.sun.tools.javac.util.Context;
11052
65b9fa7eaf55 7108668: allow Log to be initialized and used earlier
jjg
parents: 8633
diff changeset
    66
import com.sun.tools.javac.util.Log;
42260
2b4da2bf6660 8169676: boolean result of Option.process is often ignored
jjg
parents: 41990
diff changeset
    67
import com.sun.tools.javac.util.Log.WriterKind;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    68
import com.sun.tools.javac.util.Options;
42277
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
    69
import com.sun.tools.javac.util.StringUtils;
24897
655b72d7b96e 7026941: 199: path options ignored when reusing filemanager across tasks
jjg
parents: 22163
diff changeset
    70
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
    71
import jdk.javadoc.doclet.Doclet;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
    72
import jdk.javadoc.doclet.Doclet.Option;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
    73
import jdk.javadoc.doclet.DocletEnvironment;
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
    74
import jdk.javadoc.internal.tool.Main.Result;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    75
40508
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
    76
import static javax.tools.DocumentationTool.Location.*;
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
    77
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
    78
import static com.sun.tools.javac.main.Option.*;
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
    79
import static jdk.javadoc.internal.tool.Main.Result.*;
37750
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
    80
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    81
/**
06bc494ca11e Initial load
duke
parents:
diff changeset
    82
 * Main program of Javadoc.
06bc494ca11e Initial load
duke
parents:
diff changeset
    83
 * Previously named "Main".
06bc494ca11e Initial load
duke
parents:
diff changeset
    84
 *
14260
727a84636f12 8000665: fix "internal API" comments on javadoc files
jjg
parents: 14258
diff changeset
    85
 *  <p><b>This is NOT part of any supported API.
727a84636f12 8000665: fix "internal API" comments on javadoc files
jjg
parents: 14258
diff changeset
    86
 *  If you write code that depends on this, you do so at your own risk.
727a84636f12 8000665: fix "internal API" comments on javadoc files
jjg
parents: 14258
diff changeset
    87
 *  This code and its internal interfaces are subject to change or
727a84636f12 8000665: fix "internal API" comments on javadoc files
jjg
parents: 14258
diff changeset
    88
 *  deletion without notice.</b>
727a84636f12 8000665: fix "internal API" comments on javadoc files
jjg
parents: 14258
diff changeset
    89
 *
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    90
 * @author Robert Field
06bc494ca11e Initial load
duke
parents:
diff changeset
    91
 * @author Neal Gafter (rewrite)
06bc494ca11e Initial load
duke
parents:
diff changeset
    92
 */
14543
43edeaf6d0a9 8003257: refactor javadoc tool option handling
jjg
parents: 14442
diff changeset
    93
public class Start extends ToolOption.Helper {
37750
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
    94
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
    95
    private static final Class<?> StdDoclet =
44189
dd311cfb920b 8176331: Simplify new doclet packages
jjg
parents: 44020
diff changeset
    96
            jdk.javadoc.doclet.StandardDoclet.class;
14442
6dc10c88c07a 8002168: Cleanup initialization of javadoc Messager
jjg
parents: 14441
diff changeset
    97
    /** Context for this invocation. */
6dc10c88c07a 8002168: Cleanup initialization of javadoc Messager
jjg
parents: 14441
diff changeset
    98
    private final Context context;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    99
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   100
    private static final String ProgramName = "javadoc";
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   101
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   102
    private Messager messager;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   103
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   104
    private final String docletName;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   105
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   106
    private final ClassLoader classLoader;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   107
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   108
    private Class<?> docletClass;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   109
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   110
    private Doclet doclet;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   111
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   112
    // used to determine the locale for the messager
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   113
    private Locale locale;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   114
06bc494ca11e Initial load
duke
parents:
diff changeset
   115
14545
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
   116
    /**
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
   117
     * In API mode, exceptions thrown while calling the doclet are
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
   118
     * propagated using ClientCodeException.
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
   119
     */
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
   120
    private boolean apiMode;
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
   121
27320
f0739350a62d 8062504: javadoc Start does not close file managers that it opens
jjg
parents: 25874
diff changeset
   122
    private JavaFileManager fileManager;
f0739350a62d 8062504: javadoc Start does not close file managers that it opens
jjg
parents: 25874
diff changeset
   123
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   124
    Start() {
41448
6689bce0cd65 8159855: Create an SPI for tools
jjg
parents: 41252
diff changeset
   125
        this(null, null, null, null, null, null);
1365
ced0e3c4678f 6748546: javadoc API should be classloader-friendly
jjg
parents: 1363
diff changeset
   126
    }
ced0e3c4678f 6748546: javadoc API should be classloader-friendly
jjg
parents: 1363
diff changeset
   127
41448
6689bce0cd65 8159855: Create an SPI for tools
jjg
parents: 41252
diff changeset
   128
    Start(PrintWriter outWriter, PrintWriter errWriter) {
6689bce0cd65 8159855: Create an SPI for tools
jjg
parents: 41252
diff changeset
   129
        this(null, null, outWriter, errWriter, null, null);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   130
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   131
41448
6689bce0cd65 8159855: Create an SPI for tools
jjg
parents: 41252
diff changeset
   132
    Start(Context context, String programName,
6689bce0cd65 8159855: Create an SPI for tools
jjg
parents: 41252
diff changeset
   133
            PrintWriter outWriter, PrintWriter errWriter,
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   134
            String docletName, ClassLoader classLoader) {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   135
        this.context = context == null ? new Context() : context;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   136
        String pname = programName == null ? ProgramName : programName;
41448
6689bce0cd65 8159855: Create an SPI for tools
jjg
parents: 41252
diff changeset
   137
        this.messager = (outWriter == null && errWriter == null)
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   138
                ? new Messager(this.context, pname)
41448
6689bce0cd65 8159855: Create an SPI for tools
jjg
parents: 41252
diff changeset
   139
                : new Messager(this.context, pname, outWriter, errWriter);
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   140
        this.docletName = docletName;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   141
        this.classLoader = classLoader;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   142
        this.docletClass = null;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   143
        this.locale = Locale.getDefault();
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   144
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   145
14543
43edeaf6d0a9 8003257: refactor javadoc tool option handling
jjg
parents: 14442
diff changeset
   146
    public Start(Context context) {
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   147
        this.docletClass = null;
29291
076c277565f7 8073550: java* tools: replace obj.getClass hacks with Assert.checkNonNull or Objects.requireNonNull
mcimadamore
parents: 27379
diff changeset
   148
        this.context = Objects.requireNonNull(context);
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   149
        this.apiMode = true;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   150
        this.docletName = null;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   151
        this.classLoader = null;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   152
        this.locale = Locale.getDefault();
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   153
    }
14543
43edeaf6d0a9 8003257: refactor javadoc tool option handling
jjg
parents: 14442
diff changeset
   154
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   155
    void initMessager() {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   156
        if (!apiMode)
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   157
            return;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   158
        if (messager == null) {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   159
            Log log = context.get(Log.logKey);
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   160
            if (log instanceof Messager) {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   161
                messager = (Messager) log;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   162
            } else {
40232
4995ab1a4558 8162359: javac should use stdout for --help and --version
jjg
parents: 39179
diff changeset
   163
                PrintWriter out = context.get(Log.errKey);
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   164
                messager = (out == null)
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   165
                        ? new Messager(context, ProgramName)
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   166
                        : new Messager(context, ProgramName, out, out);
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   167
            }
14543
43edeaf6d0a9 8003257: refactor javadoc tool option handling
jjg
parents: 14442
diff changeset
   168
        }
43edeaf6d0a9 8003257: refactor javadoc tool option handling
jjg
parents: 14442
diff changeset
   169
    }
43edeaf6d0a9 8003257: refactor javadoc tool option handling
jjg
parents: 14442
diff changeset
   170
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   171
    /**
06bc494ca11e Initial load
duke
parents:
diff changeset
   172
     * Usage
06bc494ca11e Initial load
duke
parents:
diff changeset
   173
     */
14543
43edeaf6d0a9 8003257: refactor javadoc tool option handling
jjg
parents: 14442
diff changeset
   174
    @Override
43edeaf6d0a9 8003257: refactor javadoc tool option handling
jjg
parents: 14442
diff changeset
   175
    void usage() {
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   176
        usage("main.usage", OptionKind.STANDARD, "main.usage.foot");
14543
43edeaf6d0a9 8003257: refactor javadoc tool option handling
jjg
parents: 14442
diff changeset
   177
    }
43edeaf6d0a9 8003257: refactor javadoc tool option handling
jjg
parents: 14442
diff changeset
   178
43edeaf6d0a9 8003257: refactor javadoc tool option handling
jjg
parents: 14442
diff changeset
   179
    @Override
43edeaf6d0a9 8003257: refactor javadoc tool option handling
jjg
parents: 14442
diff changeset
   180
    void Xusage() {
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   181
        usage("main.Xusage", OptionKind.EXTENDED, "main.Xusage.foot");
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   182
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   183
45912
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   184
    @Override
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   185
    void version() {
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   186
        messager.notice("javadoc.version", messager.programName, version("release"));
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   187
    }
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   188
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   189
    @Override
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   190
    void fullVersion() {
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   191
        messager.notice("javadoc.fullversion", messager.programName, version("full"));
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   192
    }
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   193
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   194
    private void usage(String headerKey, OptionKind kind, String footerKey) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   195
        messager.notice(headerKey);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   196
        showToolOptions(kind);
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   197
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   198
        // let doclet print usage information
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   199
        if (docletClass != null) {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   200
            String name = doclet.getName();
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   201
            messager.notice("main.doclet.usage.header", name);
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   202
            showDocletOptions(kind == OptionKind.EXTENDED
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   203
                    ? Option.Kind.EXTENDED
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   204
                    : Option.Kind.STANDARD);
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   205
        }
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   206
        if (footerKey != null)
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   207
            messager.notice(footerKey);
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   208
    }
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   209
45912
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   210
    private static final String versionRBName = "jdk.javadoc.internal.tool.resources.version";
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   211
    private static ResourceBundle versionRB;
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   212
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   213
    private static String version(String key) {
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   214
        if (versionRB == null) {
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   215
            try {
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   216
                versionRB = ResourceBundle.getBundle(versionRBName);
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   217
            } catch (MissingResourceException e) {
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   218
                return Log.getLocalizedString("version.not.available");
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   219
            }
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   220
        }
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   221
        try {
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   222
            return versionRB.getString(key);
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   223
        } catch (MissingResourceException e) {
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   224
            return Log.getLocalizedString("version.not.available");
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   225
        }
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   226
    }
865870b7fe9b 8177048: javadoc should support -version and/or --version
pmuthuswamy
parents: 45742
diff changeset
   227
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   228
    void showToolOptions(OptionKind kind) {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   229
        Comparator<ToolOption> comp = new Comparator<ToolOption>() {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   230
            final Collator collator = Collator.getInstance(Locale.US);
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   231
            { collator.setStrength(Collator.PRIMARY); }
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   232
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   233
            @Override
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   234
            public int compare(ToolOption o1, ToolOption o2) {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   235
                return collator.compare(o1.primaryName, o2.primaryName);
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   236
            }
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   237
        };
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   238
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   239
        Stream.of(ToolOption.values())
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   240
                    .filter(opt -> opt.kind == kind)
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   241
                    .sorted(comp)
42827
36468b5fa7f4 8181370: Convert anonymous inner classes into lambdas/method references
mcimadamore
parents: 42277
diff changeset
   242
                    .forEach(this::showToolOption);
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   243
    }
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   244
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   245
    void showToolOption(ToolOption option) {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   246
        List<String> names = option.getNames();
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   247
        String parameters;
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   248
        if (option.hasArg || option.primaryName.endsWith(":")) {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   249
            String sep = (option == ToolOption.J) || option.primaryName.endsWith(":") ? "" : " ";
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   250
            parameters = sep + option.getParameters(messager);
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   251
        } else {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   252
            parameters = "";
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   253
        }
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   254
        String description = option.getDescription(messager);
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   255
        showUsage(names, parameters, description);
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   256
    }
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   257
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   258
    void showDocletOptions(Option.Kind kind) {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   259
        Comparator<Doclet.Option> comp = new Comparator<Doclet.Option>() {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   260
            final Collator collator = Collator.getInstance(Locale.US);
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   261
            { collator.setStrength(Collator.PRIMARY); }
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   262
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   263
            @Override
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   264
            public int compare(Doclet.Option o1, Doclet.Option o2) {
42277
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   265
                return collator.compare(o1.getNames().get(0), o2.getNames().get(0));
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   266
            }
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   267
        };
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   268
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   269
        doclet.getSupportedOptions().stream()
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   270
                .filter(opt -> opt.getKind() == kind)
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   271
                .sorted(comp)
42827
36468b5fa7f4 8181370: Convert anonymous inner classes into lambdas/method references
mcimadamore
parents: 42277
diff changeset
   272
                .forEach(this::showDocletOption);
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   273
    }
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   274
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   275
    void showDocletOption(Doclet.Option option) {
42277
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   276
        List<String> names = option.getNames();
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   277
        String parameters;
42277
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   278
        String optname = names.get(0);
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   279
        if (option.getArgumentCount() > 0 || optname.endsWith(":")) {
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   280
            String sep = optname.endsWith(":") ? "" : " ";
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   281
            parameters = sep + option.getParameters();
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   282
        } else {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   283
            parameters = "";
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   284
        }
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   285
        String description = option.getDescription();
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   286
        showUsage(names, parameters, description);
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   287
    }
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   288
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   289
    // The following constants are intended to format the output to
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   290
    // be similar to that of the java launcher: i.e. "java -help".
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   291
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   292
    /** The indent for the option synopsis. */
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   293
    private static final String SMALL_INDENT = "    ";
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   294
    /** The automatic indent for the description. */
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   295
    private static final String LARGE_INDENT = "                  ";
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   296
    /** The space allowed for the synopsis, if the description is to be shown on the same line. */
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   297
    private static final int DEFAULT_SYNOPSIS_WIDTH = 13;
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   298
    /** The nominal maximum line length, when seeing if text will fit on a line. */
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   299
    private static final int DEFAULT_MAX_LINE_LENGTH = 80;
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   300
    /** The format for a single-line help entry. */
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   301
    private static final String COMPACT_FORMAT = SMALL_INDENT + "%-" + DEFAULT_SYNOPSIS_WIDTH + "s %s";
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   302
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   303
    void showUsage(List<String> names, String parameters, String description) {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   304
        String synopses = names.stream()
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   305
                .map(s -> s + parameters)
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   306
                .collect(Collectors.joining(", "));
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   307
        // If option synopses and description fit on a single line of reasonable length,
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   308
        // display using COMPACT_FORMAT
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   309
        if (synopses.length() < DEFAULT_SYNOPSIS_WIDTH
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   310
                && !description.contains("\n")
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   311
                && (SMALL_INDENT.length() + DEFAULT_SYNOPSIS_WIDTH + 1 + description.length() <= DEFAULT_MAX_LINE_LENGTH)) {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   312
            messager.printNotice(String.format(COMPACT_FORMAT, synopses, description));
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   313
            return;
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   314
        }
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   315
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   316
        // If option synopses fit on a single line of reasonable length, show that;
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   317
        // otherwise, show 1 per line
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   318
        if (synopses.length() <= DEFAULT_MAX_LINE_LENGTH) {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   319
            messager.printNotice(SMALL_INDENT + synopses);
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   320
        } else {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   321
            for (String name: names) {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   322
                messager.printNotice(SMALL_INDENT + name + parameters);
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   323
            }
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   324
        }
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   325
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   326
        // Finally, show the description
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   327
        messager.printNotice(LARGE_INDENT + description.replace("\n", "\n" + LARGE_INDENT));
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   328
    }
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   329
37750
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   330
5850
6f095ff5b469 6958836: javadoc should support -Xmaxerrs and -Xmaxwarns
jjg
parents: 5520
diff changeset
   331
    /**
37750
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   332
     * Main program - external wrapper. In order to maintain backward
45742
36bf0f2436ad 8177511: Remove the old standard doclet
ksrini
parents: 44457
diff changeset
   333
     * CLI compatibility, the execution is dispatched to the appropriate
36bf0f2436ad 8177511: Remove the old standard doclet
ksrini
parents: 44457
diff changeset
   334
     * Start mechanism, depending on the doclet variant.
37750
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   335
     *
45742
36bf0f2436ad 8177511: Remove the old standard doclet
ksrini
parents: 44457
diff changeset
   336
     * The doclet tests are performed in the begin method, further on,
37750
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   337
     * this is to minimize argument processing and most importantly the impact
45742
36bf0f2436ad 8177511: Remove the old standard doclet
ksrini
parents: 44457
diff changeset
   338
     * of class loader creation, needed to detect the doclet class variants.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   339
     */
38614
364c1a6618c0 8157608: deprecate old entry points for javadoc tool
jjg
parents: 37938
diff changeset
   340
    @SuppressWarnings("deprecation")
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   341
    Result begin(String... argv) {
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   342
        // Preprocess @file arguments
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   343
        try {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   344
            argv = CommandLine.parse(argv);
45742
36bf0f2436ad 8177511: Remove the old standard doclet
ksrini
parents: 44457
diff changeset
   345
            return begin(Arrays.asList(argv), Collections.emptySet());
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   346
        } catch (IOException e) {
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   347
            error("main.cant.read", e.getMessage());
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   348
            return ERROR;
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   349
        }
14545
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
   350
    }
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
   351
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   352
    // Called by 199 API.
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   353
    public boolean begin(Class<?> docletClass,
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   354
            Iterable<String> options,
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   355
            Iterable<? extends JavaFileObject> fileObjects) {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   356
        this.docletClass = docletClass;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   357
        List<String> opts = new ArrayList<>();
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   358
        for (String opt: options)
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   359
            opts.add(opt);
37750
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   360
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   361
        return begin(opts, fileObjects).isOK();
14545
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
   362
    }
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
   363
48840
5e2d2067da48 8194651: javadoc: mark the com.sun.javadoc API for removal
ksrini
parents: 47216
diff changeset
   364
    @SuppressWarnings("removal")
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   365
    private Result begin(List<String> options, Iterable<? extends JavaFileObject> fileObjects) {
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   366
        fileManager = context.get(JavaFileManager.class);
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   367
        if (fileManager == null) {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   368
            JavacFileManager.preRegister(context);
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   369
            fileManager = context.get(JavaFileManager.class);
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   370
            if (fileManager instanceof BaseFileManager) {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   371
                ((BaseFileManager) fileManager).autoClose = true;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   372
            }
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   373
        }
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   374
37750
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   375
        // locale, doclet and maybe taglet, needs to be determined first
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   376
        try {
54561
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   377
            doclet = preprocess(fileManager, options);
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   378
        } catch (ToolException te) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   379
            if (!te.result.isOK()) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   380
                if (te.message != null) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   381
                    messager.printError(te.message);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   382
                }
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   383
                Throwable t = te.getCause();
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   384
                dumpStack(t == null ? te : t);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   385
            }
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   386
            return te.result;
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   387
        } catch (OptionException oe) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   388
            if (oe.message != null) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   389
                messager.printError(oe.message);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   390
            }
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   391
            oe.m.run();
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   392
            Throwable t = oe.getCause();
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   393
            dumpStack(t == null ? oe : t);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   394
            return oe.result;
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   395
        }
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   396
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   397
        Result result = OK;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   398
        try {
44020
ef5f709f4fd8 8175055: Errors reported by Arguments.validate should (probably) be fatal
ksrini
parents: 42828
diff changeset
   399
            result = parseAndExecute(options, fileObjects);
42260
2b4da2bf6660 8169676: boolean result of Option.process is often ignored
jjg
parents: 41990
diff changeset
   400
        } catch (com.sun.tools.javac.main.Option.InvalidValueException e) {
2b4da2bf6660 8169676: boolean result of Option.process is often ignored
jjg
parents: 41990
diff changeset
   401
            messager.printError(e.getMessage());
2b4da2bf6660 8169676: boolean result of Option.process is often ignored
jjg
parents: 41990
diff changeset
   402
            Throwable t = e.getCause();
2b4da2bf6660 8169676: boolean result of Option.process is often ignored
jjg
parents: 41990
diff changeset
   403
            dumpStack(t == null ? e : t);
2b4da2bf6660 8169676: boolean result of Option.process is often ignored
jjg
parents: 41990
diff changeset
   404
            return ERROR;
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   405
        } catch (OptionException toe) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   406
            if (toe.message != null)
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   407
                messager.printError(toe.message);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   408
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   409
            toe.m.run();
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   410
            Throwable t = toe.getCause();
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   411
            dumpStack(t == null ? toe : t);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   412
            return toe.result;
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   413
        } catch (ToolException exc) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   414
            if (exc.message != null) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   415
                messager.printError(exc.message);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   416
            }
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   417
            Throwable t = exc.getCause();
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   418
            if (result == ABNORMAL) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   419
                reportInternalError(t == null ? exc : t);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   420
            } else {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   421
                dumpStack(t == null ? exc : t);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   422
            }
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   423
            return exc.result;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   424
        } catch (OutOfMemoryError ee) {
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   425
            error("main.out.of.memory");
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   426
            result = SYSERR;
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   427
            dumpStack(ee);
14545
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
   428
        } catch (ClientCodeException e) {
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
   429
            // simply rethrow these exceptions, to be caught and handled by JavadocTaskImpl
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
   430
            throw e;
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   431
        } catch (Error | Exception ee) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   432
            error("main.fatal.error", ee);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   433
            reportInternalError(ee);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   434
            result = ABNORMAL;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   435
        } finally {
27379
5ae894733e09 8062579: JavacTask, DocumentationTask impls should close file manager when possible
jjg
parents: 27320
diff changeset
   436
            if (fileManager != null
5ae894733e09 8062579: JavacTask, DocumentationTask impls should close file manager when possible
jjg
parents: 27320
diff changeset
   437
                    && fileManager instanceof BaseFileManager
5ae894733e09 8062579: JavacTask, DocumentationTask impls should close file manager when possible
jjg
parents: 27320
diff changeset
   438
                    && ((BaseFileManager) fileManager).autoClose) {
27320
f0739350a62d 8062504: javadoc Start does not close file managers that it opens
jjg
parents: 25874
diff changeset
   439
                try {
f0739350a62d 8062504: javadoc Start does not close file managers that it opens
jjg
parents: 25874
diff changeset
   440
                    fileManager.close();
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   441
                } catch (IOException ignore) {}
27320
f0739350a62d 8062504: javadoc Start does not close file managers that it opens
jjg
parents: 25874
diff changeset
   442
            }
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   443
            boolean haveErrorWarnings = messager.hasErrors()
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   444
                    || (rejectWarnings && messager.hasWarnings());
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   445
            if (!result.isOK() && !haveErrorWarnings) {
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   446
                // the doclet failed, but nothing reported, flag it!.
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   447
                error("main.unknown.error");
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   448
            }
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   449
            if (haveErrorWarnings && result.isOK()) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   450
                result = ERROR;
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   451
            }
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   452
            messager.printErrorWarningCounts();
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   453
            messager.flush();
06bc494ca11e Initial load
duke
parents:
diff changeset
   454
        }
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   455
        return result;
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   456
    }
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   457
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   458
    private void reportInternalError(Throwable t) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   459
        messager.printErrorUsingKey("doclet.internal.report.bug");
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   460
        dumpStack(true, t);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   461
    }
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   462
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   463
    private void dumpStack(Throwable t) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   464
        dumpStack(false, t);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   465
    }
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   466
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   467
    private void dumpStack(boolean enabled, Throwable t) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   468
        if (t != null && (enabled || dumpOnError)) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   469
            t.printStackTrace(System.err);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   470
        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   471
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   472
06bc494ca11e Initial load
duke
parents:
diff changeset
   473
    /**
06bc494ca11e Initial load
duke
parents:
diff changeset
   474
     * Main program - internal
06bc494ca11e Initial load
duke
parents:
diff changeset
   475
     */
40508
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
   476
    @SuppressWarnings("unchecked")
44020
ef5f709f4fd8 8175055: Errors reported by Arguments.validate should (probably) be fatal
ksrini
parents: 42828
diff changeset
   477
    private Result parseAndExecute(List<String> argList, Iterable<? extends JavaFileObject> fileObjects)
42260
2b4da2bf6660 8169676: boolean result of Option.process is often ignored
jjg
parents: 41990
diff changeset
   478
            throws ToolException, OptionException, com.sun.tools.javac.main.Option.InvalidValueException {
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   479
        long tm = System.currentTimeMillis();
06bc494ca11e Initial load
duke
parents:
diff changeset
   480
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   481
        List<String> javaNames = new ArrayList<>();
5850
6f095ff5b469 6958836: javadoc should support -Xmaxerrs and -Xmaxwarns
jjg
parents: 5520
diff changeset
   482
14543
43edeaf6d0a9 8003257: refactor javadoc tool option handling
jjg
parents: 14442
diff changeset
   483
        compOpts = Options.instance(context);
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   484
19508
e2cd0ed6c9b0 8011043: Warn about use of 1.5 and earlier source and target values
darcy
parents: 18005
diff changeset
   485
        // Make sure no obsolete source/target messages are reported
42260
2b4da2bf6660 8169676: boolean result of Option.process is often ignored
jjg
parents: 41990
diff changeset
   486
        try {
2b4da2bf6660 8169676: boolean result of Option.process is often ignored
jjg
parents: 41990
diff changeset
   487
            com.sun.tools.javac.main.Option.XLINT_CUSTOM.process(getOptionHelper(), "-Xlint:-options");
2b4da2bf6660 8169676: boolean result of Option.process is often ignored
jjg
parents: 41990
diff changeset
   488
        } catch (com.sun.tools.javac.main.Option.InvalidValueException ignore) {
2b4da2bf6660 8169676: boolean result of Option.process is often ignored
jjg
parents: 41990
diff changeset
   489
        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   490
44450
eb4f067bae4c 8175277: javadoc AssertionError when specified with release 8
ksrini
parents: 44189
diff changeset
   491
        Arguments arguments = Arguments.instance(context);
eb4f067bae4c 8175277: javadoc AssertionError when specified with release 8
ksrini
parents: 44189
diff changeset
   492
        arguments.init(ProgramName);
eb4f067bae4c 8175277: javadoc AssertionError when specified with release 8
ksrini
parents: 44189
diff changeset
   493
        arguments.allowEmpty();
eb4f067bae4c 8175277: javadoc AssertionError when specified with release 8
ksrini
parents: 44189
diff changeset
   494
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   495
        doclet.init(locale, messager);
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   496
        parseArgs(argList, javaNames);
14543
43edeaf6d0a9 8003257: refactor javadoc tool option handling
jjg
parents: 14442
diff changeset
   497
44450
eb4f067bae4c 8175277: javadoc AssertionError when specified with release 8
ksrini
parents: 44189
diff changeset
   498
        if (!arguments.handleReleaseOptions(extra -> true)) {
eb4f067bae4c 8175277: javadoc AssertionError when specified with release 8
ksrini
parents: 44189
diff changeset
   499
            // Arguments does not always increase the error count in the
eb4f067bae4c 8175277: javadoc AssertionError when specified with release 8
ksrini
parents: 44189
diff changeset
   500
            // case of errors, so increment the error count only if it has
eb4f067bae4c 8175277: javadoc AssertionError when specified with release 8
ksrini
parents: 44189
diff changeset
   501
            // not been updated previously, preventing complaints by callers
eb4f067bae4c 8175277: javadoc AssertionError when specified with release 8
ksrini
parents: 44189
diff changeset
   502
            if (!messager.hasErrors() && !messager.hasWarnings())
eb4f067bae4c 8175277: javadoc AssertionError when specified with release 8
ksrini
parents: 44189
diff changeset
   503
                messager.nerrors++;
eb4f067bae4c 8175277: javadoc AssertionError when specified with release 8
ksrini
parents: 44189
diff changeset
   504
            return CMDERR;
eb4f067bae4c 8175277: javadoc AssertionError when specified with release 8
ksrini
parents: 44189
diff changeset
   505
        }
eb4f067bae4c 8175277: javadoc AssertionError when specified with release 8
ksrini
parents: 44189
diff changeset
   506
44020
ef5f709f4fd8 8175055: Errors reported by Arguments.validate should (probably) be fatal
ksrini
parents: 42828
diff changeset
   507
        if (!arguments.validate()) {
ef5f709f4fd8 8175055: Errors reported by Arguments.validate should (probably) be fatal
ksrini
parents: 42828
diff changeset
   508
            // Arguments does not always increase the error count in the
ef5f709f4fd8 8175055: Errors reported by Arguments.validate should (probably) be fatal
ksrini
parents: 42828
diff changeset
   509
            // case of errors, so increment the error count only if it has
ef5f709f4fd8 8175055: Errors reported by Arguments.validate should (probably) be fatal
ksrini
parents: 42828
diff changeset
   510
            // not been updated previously, preventing complaints by callers
ef5f709f4fd8 8175055: Errors reported by Arguments.validate should (probably) be fatal
ksrini
parents: 42828
diff changeset
   511
            if (!messager.hasErrors() && !messager.hasWarnings())
ef5f709f4fd8 8175055: Errors reported by Arguments.validate should (probably) be fatal
ksrini
parents: 42828
diff changeset
   512
                messager.nerrors++;
ef5f709f4fd8 8175055: Errors reported by Arguments.validate should (probably) be fatal
ksrini
parents: 42828
diff changeset
   513
            return CMDERR;
ef5f709f4fd8 8175055: Errors reported by Arguments.validate should (probably) be fatal
ksrini
parents: 42828
diff changeset
   514
        }
42260
2b4da2bf6660 8169676: boolean result of Option.process is often ignored
jjg
parents: 41990
diff changeset
   515
24897
655b72d7b96e 7026941: 199: path options ignored when reusing filemanager across tasks
jjg
parents: 22163
diff changeset
   516
        if (fileManager instanceof BaseFileManager) {
655b72d7b96e 7026941: 199: path options ignored when reusing filemanager across tasks
jjg
parents: 22163
diff changeset
   517
            ((BaseFileManager) fileManager).handleOptions(fileManagerOpts);
655b72d7b96e 7026941: 199: path options ignored when reusing filemanager across tasks
jjg
parents: 22163
diff changeset
   518
        }
655b72d7b96e 7026941: 199: path options ignored when reusing filemanager across tasks
jjg
parents: 22163
diff changeset
   519
51423
b2319bbcc867 8208269: Javadoc does not support module-info in a multi-release jar
jlahoda
parents: 50611
diff changeset
   520
        if (fileManager.isSupportedOption(MULTIRELEASE.primaryName) == 1) {
b2319bbcc867 8208269: Javadoc does not support module-info in a multi-release jar
jlahoda
parents: 50611
diff changeset
   521
            Target target = Target.instance(context);
b2319bbcc867 8208269: Javadoc does not support module-info in a multi-release jar
jlahoda
parents: 50611
diff changeset
   522
            List<String> list = List.of(target.multiReleaseValue());
b2319bbcc867 8208269: Javadoc does not support module-info in a multi-release jar
jlahoda
parents: 50611
diff changeset
   523
            fileManager.handleOption(MULTIRELEASE.primaryName, list.iterator());
b2319bbcc867 8208269: Javadoc does not support module-info in a multi-release jar
jlahoda
parents: 50611
diff changeset
   524
        }
14442
6dc10c88c07a 8002168: Cleanup initialization of javadoc Messager
jjg
parents: 14441
diff changeset
   525
        compOpts.notifyListeners();
40508
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
   526
        List<String> modules = (List<String>) jdtoolOpts.computeIfAbsent(ToolOption.MODULE,
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
   527
                s -> Collections.EMPTY_LIST);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   528
40508
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
   529
        if (modules.isEmpty()) {
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
   530
            List<String> subpkgs = (List<String>) jdtoolOpts.computeIfAbsent(ToolOption.SUBPACKAGES,
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
   531
                    s -> Collections.EMPTY_LIST);
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
   532
            if (subpkgs.isEmpty()) {
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
   533
                if (javaNames.isEmpty() && isEmpty(fileObjects)) {
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   534
                    String text = messager.getText("main.No_modules_packages_or_classes_specified");
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   535
                    throw new ToolException(CMDERR, text);
40508
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
   536
                }
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
   537
            }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   538
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   539
06bc494ca11e Initial load
duke
parents:
diff changeset
   540
        JavadocTool comp = JavadocTool.make0(context);
44020
ef5f709f4fd8 8175055: Errors reported by Arguments.validate should (probably) be fatal
ksrini
parents: 42828
diff changeset
   541
        if (comp == null) return ABNORMAL;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   542
40508
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
   543
        DocletEnvironment docEnv = comp.getEnvironment(jdtoolOpts,
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   544
                javaNames,
40508
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
   545
                fileObjects);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   546
14441
6c066a762e05 8002146: javadoc doesn't release resources in a timely manner
jjg
parents: 14260
diff changeset
   547
        // release resources
6c066a762e05 8002146: javadoc doesn't release resources in a timely manner
jjg
parents: 14260
diff changeset
   548
        comp = null;
6c066a762e05 8002146: javadoc doesn't release resources in a timely manner
jjg
parents: 14260
diff changeset
   549
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   550
        if (breakiterator || !locale.getLanguage().equals(Locale.ENGLISH.getLanguage())) {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   551
            JavacTrees trees = JavacTrees.instance(context);
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   552
            trees.setBreakIterator(BreakIterator.getSentenceInstance(locale));
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   553
        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   554
        // pass off control to the doclet
44020
ef5f709f4fd8 8175055: Errors reported by Arguments.validate should (probably) be fatal
ksrini
parents: 42828
diff changeset
   555
        Result returnStatus = docEnv != null && doclet.run(docEnv)
ef5f709f4fd8 8175055: Errors reported by Arguments.validate should (probably) be fatal
ksrini
parents: 42828
diff changeset
   556
                ? OK
ef5f709f4fd8 8175055: Errors reported by Arguments.validate should (probably) be fatal
ksrini
parents: 42828
diff changeset
   557
                : ERROR;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   558
06bc494ca11e Initial load
duke
parents:
diff changeset
   559
        // We're done.
06bc494ca11e Initial load
duke
parents:
diff changeset
   560
        if (compOpts.get("-verbose") != null) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   561
            tm = System.currentTimeMillis() - tm;
06bc494ca11e Initial load
duke
parents:
diff changeset
   562
            messager.notice("main.done_in", Long.toString(tm));
06bc494ca11e Initial load
duke
parents:
diff changeset
   563
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   564
44020
ef5f709f4fd8 8175055: Errors reported by Arguments.validate should (probably) be fatal
ksrini
parents: 42828
diff changeset
   565
        return returnStatus;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   566
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   567
42277
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   568
    boolean matches(List<String> names, String arg) {
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   569
        for (String name : names) {
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   570
            if (StringUtils.toLowerCase(name).equals(StringUtils.toLowerCase(arg)))
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   571
                return true;
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   572
        }
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   573
        return false;
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   574
    }
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   575
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   576
    boolean matches(Doclet.Option option, String arg) {
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   577
        if (matches(option.getNames(), arg))
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   578
             return true;
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   579
        int sep = arg.indexOf(':');
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   580
        String targ = arg.substring(0, sep + 1);
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   581
        return matches(option.getNames(), targ);
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   582
    }
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   583
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   584
    Set<? extends Doclet.Option> docletOptions = null;
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   585
    int handleDocletOptions(int idx, List<String> args, boolean isToolOption)
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   586
            throws OptionException {
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   587
        if (docletOptions == null) {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   588
            docletOptions = doclet.getSupportedOptions();
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   589
        }
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   590
        String arg = args.get(idx);
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   591
        String argBase, argVal;
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   592
        if (arg.startsWith("--") && arg.contains("=")) {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   593
            int sep = arg.indexOf("=");
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   594
            argBase = arg.substring(0, sep);
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   595
            argVal = arg.substring(sep + 1);
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   596
        } else {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   597
            argBase = arg;
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   598
            argVal = null;
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   599
        }
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   600
        String text = null;
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   601
        for (Doclet.Option opt : docletOptions) {
42277
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   602
            if (matches(opt, argBase)) {
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   603
                if (argVal != null) {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   604
                    switch (opt.getArgumentCount()) {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   605
                        case 0:
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   606
                            text = messager.getText("main.unnecessary_arg_provided", argBase);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   607
                            throw new OptionException(ERROR, this::usage, text);
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   608
                        case 1:
42277
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   609
                            opt.process(arg, Arrays.asList(argVal));
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   610
                            break;
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   611
                        default:
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   612
                            text = messager.getText("main.only_one_argument_with_equals", argBase);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   613
                            throw new OptionException(ERROR, this::usage, text);
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   614
                    }
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   615
                } else {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   616
                    if (args.size() - idx -1 < opt.getArgumentCount()) {
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   617
                        text = messager.getText("main.requires_argument", arg);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   618
                        throw new OptionException(ERROR, this::usage, text);
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   619
                    }
42277
2668b0bc7ad7 8164316: Refine the Doclet APIs
ksrini
parents: 42260
diff changeset
   620
                    opt.process(arg, args.subList(idx + 1, args.size()));
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   621
                    idx += opt.getArgumentCount();
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   622
                }
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   623
                return idx;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   624
            }
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   625
        }
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   626
        // check if arg is accepted by the tool before emitting error
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   627
        if (!isToolOption) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   628
            text = messager.getText("main.invalid_flag", arg);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   629
            throw new OptionException(ERROR, this::usage, text);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   630
        }
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   631
        return idx;
14545
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
   632
    }
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
   633
54561
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   634
    private Doclet preprocess(JavaFileManager jfm,
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   635
            List<String> argv) throws ToolException, OptionException {
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   636
        // doclet specifying arguments
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   637
        String userDocletPath = null;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   638
        String userDocletName = null;
14545
2e7bab0639b8 6493690: javadoc should have a javax.tools.Tool service provider installed in tools.jar
jjg
parents: 14543
diff changeset
   639
37750
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   640
        // taglet specifying arguments, since tagletpath is a doclet
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   641
        // functionality, assume they are repeated and inspect all.
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   642
        List<File> userTagletPath = new ArrayList<>();
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   643
        List<String> userTagletNames = new ArrayList<>();
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   644
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   645
        // Step 1: loop through the args, set locale early on, if found.
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   646
        for (int i = 0 ; i < argv.size() ; i++) {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   647
            String arg = argv.get(i);
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   648
            if (arg.equals(ToolOption.DUMPONERROR.primaryName)) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   649
                dumpOnError = true;
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   650
            } else if (arg.equals(ToolOption.LOCALE.primaryName)) {
40508
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
   651
                checkOneArg(argv, i++);
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   652
                String lname = argv.get(i);
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   653
                locale = getLocale(lname);
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   654
            } else if (arg.equals(ToolOption.DOCLET.primaryName)) {
40508
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
   655
                checkOneArg(argv, i++);
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   656
                if (userDocletName != null) {
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   657
                    if (apiMode) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   658
                        throw new IllegalArgumentException("More than one doclet specified (" +
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   659
                                userDocletName + " and " + argv.get(i) + ").");
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   660
                    }
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   661
                    String text = messager.getText("main.more_than_one_doclet_specified_0_and_1",
37750
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   662
                            userDocletName, argv.get(i));
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   663
                    throw new ToolException(CMDERR, text);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   664
                }
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   665
                if (docletName != null) {
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   666
                    if (apiMode) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   667
                        throw new IllegalArgumentException("More than one doclet specified (" +
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   668
                                docletName + " and " + argv.get(i) + ").");
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   669
                    }
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   670
                    String text = messager.getText("main.more_than_one_doclet_specified_0_and_1",
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   671
                            docletName, argv.get(i));
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   672
                    throw new ToolException(CMDERR, text);
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   673
                }
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   674
                userDocletName = argv.get(i);
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   675
            } else if (arg.equals(ToolOption.DOCLETPATH.primaryName)) {
40508
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
   676
                checkOneArg(argv, i++);
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   677
                if (userDocletPath == null) {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   678
                    userDocletPath = argv.get(i);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   679
                } else {
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   680
                    userDocletPath += File.pathSeparator + argv.get(i);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   681
                }
37750
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   682
            } else if ("-taglet".equals(arg)) {
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   683
                userTagletNames.add(argv.get(i + 1));
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   684
            } else if ("-tagletpath".equals(arg)) {
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   685
                for (String pathname : argv.get(i + 1).split(File.pathSeparator)) {
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   686
                    userTagletPath.add(new File(pathname));
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   687
                }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   688
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
   689
        }
37750
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   690
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   691
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   692
        // Step 3: doclet name specified ? if so find a ClassLoader,
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   693
        // and load it.
54561
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   694
        if(docletClass == null) {
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   695
            if (userDocletName != null) {
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   696
                ClassLoader cl = classLoader;
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   697
                if (cl == null) {
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   698
                    if (!fileManager.hasLocation(DOCLET_PATH)) {
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   699
                        List<File> paths = new ArrayList<>();
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   700
                        if (userDocletPath != null) {
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   701
                            for (String pathname : userDocletPath.split(File.pathSeparator)) {
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   702
                                paths.add(new File(pathname));
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   703
                            }
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   704
                        }
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   705
                        try {
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   706
                            ((StandardJavaFileManager)fileManager).setLocation(DOCLET_PATH, paths);
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   707
                        } catch (IOException ioe) {
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   708
                            if (apiMode) {
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   709
                                throw new IllegalArgumentException("Could not set location for " +
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   710
                                        userDocletPath, ioe);
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   711
                            }
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   712
                            String text = messager.getText("main.doclet_could_not_set_location",
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   713
                                    userDocletPath);
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   714
                            throw new ToolException(CMDERR, text, ioe);
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   715
                        }
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   716
                    }
54561
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   717
                    cl = fileManager.getClassLoader(DOCLET_PATH);
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   718
                    if (cl == null) {
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   719
                        // despite doclet specified on cmdline no classloader found!
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   720
                        if (apiMode) {
54561
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   721
                            throw new IllegalArgumentException("Could not obtain classloader to load "
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   722
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   723
                                    + userDocletPath);
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   724
                        }
54561
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   725
                        String text = messager.getText("main.doclet_no_classloader_found",
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   726
                                userDocletName);
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   727
                        throw new ToolException(CMDERR, text);
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   728
                    }
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   729
                }
54561
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   730
                docletClass = loadDocletClass(userDocletName, cl);
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   731
            } else if (docletName != null){
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   732
                docletClass = loadDocletClass(docletName, getClass().getClassLoader());
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   733
            } else {
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   734
                docletClass = StdDoclet;
37750
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   735
            }
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   736
        }
37750
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   737
54561
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   738
        if (jdk.javadoc.doclet.Doclet.class.isAssignableFrom(docletClass)) {
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   739
            // no need to dispatch to old, safe to init now
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   740
            initMessager();
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   741
            messager.setLocale(locale);
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   742
            try {
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   743
                Object o = docletClass.getConstructor().newInstance();
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   744
                doclet = (Doclet) o;
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   745
            } catch (ReflectiveOperationException exc) {
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   746
                if (apiMode) {
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   747
                    throw new ClientCodeException(exc);
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   748
                }
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   749
                String text = messager.getText("main.could_not_instantiate_class", docletClass.getName());
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   750
                throw new ToolException(ERROR, text);
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   751
            }
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   752
        } else {
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   753
            String text = messager.getText("main.not_a_doclet", docletClass.getName());
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   754
            throw new ToolException(ERROR, text);
37750
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   755
        }
54561
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   756
        return doclet;
37750
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   757
    }
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   758
54561
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   759
    private Class<?> loadDocletClass(String docletName, ClassLoader classLoader) throws ToolException {
44457
0cca46f400f7 8177484: The old standard doclet should be deprecated for removal.
jjg
parents: 44450
diff changeset
   760
        try {
54561
6c4d8b7128d5 8220382: Cleanup doclet instantiation
pmuthuswamy
parents: 54049
diff changeset
   761
            return classLoader == null ? Class.forName(docletName) : classLoader.loadClass(docletName);
44457
0cca46f400f7 8177484: The old standard doclet should be deprecated for removal.
jjg
parents: 44450
diff changeset
   762
        } catch (ClassNotFoundException cnfe) {
0cca46f400f7 8177484: The old standard doclet should be deprecated for removal.
jjg
parents: 44450
diff changeset
   763
            if (apiMode) {
0cca46f400f7 8177484: The old standard doclet should be deprecated for removal.
jjg
parents: 44450
diff changeset
   764
                throw new IllegalArgumentException("Cannot find doclet class " + docletName);
0cca46f400f7 8177484: The old standard doclet should be deprecated for removal.
jjg
parents: 44450
diff changeset
   765
            }
0cca46f400f7 8177484: The old standard doclet should be deprecated for removal.
jjg
parents: 44450
diff changeset
   766
            String text = messager.getText("main.doclet_class_not_found", docletName);
0cca46f400f7 8177484: The old standard doclet should be deprecated for removal.
jjg
parents: 44450
diff changeset
   767
            throw new ToolException(CMDERR, text, cnfe);
0cca46f400f7 8177484: The old standard doclet should be deprecated for removal.
jjg
parents: 44450
diff changeset
   768
        }
0cca46f400f7 8177484: The old standard doclet should be deprecated for removal.
jjg
parents: 44450
diff changeset
   769
    }
0cca46f400f7 8177484: The old standard doclet should be deprecated for removal.
jjg
parents: 44450
diff changeset
   770
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   771
    private void parseArgs(List<String> args, List<String> javaNames) throws ToolException,
42260
2b4da2bf6660 8169676: boolean result of Option.process is often ignored
jjg
parents: 41990
diff changeset
   772
            OptionException, com.sun.tools.javac.main.Option.InvalidValueException {
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   773
        for (int i = 0 ; i < args.size() ; i++) {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   774
            String arg = args.get(i);
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   775
            ToolOption o = ToolOption.get(arg);
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   776
            if (o != null) {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   777
                // handle a doclet argument that may be needed however
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   778
                // don't increment the index, and allow the tool to consume args
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   779
                handleDocletOptions(i, args, true);
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   780
                if (o.hasArg) {
41252
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   781
                    if (arg.startsWith("--") && arg.contains("=")) {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   782
                        o.process(this, arg.substring(arg.indexOf('=') + 1));
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   783
                    } else {
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   784
                        checkOneArg(args, i++);
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   785
                        o.process(this, args.get(i));
058d83c9b1c7 8166144: New javadoc options don't conform to JEP 293 (GNU style options)
jjg
parents: 40508
diff changeset
   786
                    }
37393
a9ba8bd6697b 8152818: Javadoc must support module options supported by javac.
ksrini
parents: 36526
diff changeset
   787
                } else if (o.hasSuffix) {
a9ba8bd6697b 8152818: Javadoc must support module options supported by javac.
ksrini
parents: 36526
diff changeset
   788
                    o.process(this, arg);
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   789
                } else {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   790
                    o.process(this);
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   791
                }
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   792
            } else if (arg.startsWith("-XD")) {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   793
                // hidden javac options
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   794
                String s = arg.substring("-XD".length());
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   795
                int eq = s.indexOf('=');
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   796
                String key = (eq < 0) ? s : s.substring(0, eq);
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   797
                String value = (eq < 0) ? s : s.substring(eq+1);
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   798
                compOpts.put(key, value);
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   799
            } else if (arg.startsWith("-")) {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   800
                i = handleDocletOptions(i, args, false);
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   801
            } else {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   802
                javaNames.add(arg);
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   803
            }
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   804
        }
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   805
    }
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   806
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   807
    private <T> boolean isEmpty(Iterable<T> iter) {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   808
        return !iter.iterator().hasNext();
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   809
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   810
06bc494ca11e Initial load
duke
parents:
diff changeset
   811
    /**
40508
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
   812
     * Check the one arg option.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   813
     * Error and exit if one argument is not provided.
06bc494ca11e Initial load
duke
parents:
diff changeset
   814
     */
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   815
    private void checkOneArg(List<String> args, int index) throws OptionException {
40508
74ef30d16fb9 8159305: Enhance the javadoc tool to support module related options
ksrini
parents: 40308
diff changeset
   816
        if ((index + 1) >= args.size() || args.get(index + 1).startsWith("-d")) {
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   817
            String text = messager.getText("main.requires_argument", args.get(index));
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   818
            throw new OptionException(CMDERR, this::usage, text);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   819
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   820
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   821
37750
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   822
    void error(String key, Object... args) {
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   823
        messager.printErrorUsingKey(key, args);
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   824
    }
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   825
37750
d213951c811b 8154482: javadoc tool must support legacy doclet and taglet
ksrini
parents: 37393
diff changeset
   826
    void warn(String key, Object... args)  {
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   827
        messager.printWarningUsingKey(key, args);
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   828
    }
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   829
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   830
    /**
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   831
     * Get the locale if specified on the command line
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   832
     * else return null and if locale option is not used
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   833
     * then return default locale.
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   834
     */
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   835
    private Locale getLocale(String localeName) throws ToolException {
50611
69c59b667acc 8149565: -locale option issues
jjg
parents: 48840
diff changeset
   836
        try {
69c59b667acc 8149565: -locale option issues
jjg
parents: 48840
diff changeset
   837
            // Tolerate, at least for a while, the older syntax accepted by javadoc,
69c59b667acc 8149565: -locale option issues
jjg
parents: 48840
diff changeset
   838
            // using _ as the separator
69c59b667acc 8149565: -locale option issues
jjg
parents: 48840
diff changeset
   839
            localeName = localeName.replace("_", "-");
69c59b667acc 8149565: -locale option issues
jjg
parents: 48840
diff changeset
   840
            Locale l =  new Locale.Builder().setLanguageTag(localeName).build();
69c59b667acc 8149565: -locale option issues
jjg
parents: 48840
diff changeset
   841
            // Ensure that a non-empty language is available for the <HTML lang=...> element
69c59b667acc 8149565: -locale option issues
jjg
parents: 48840
diff changeset
   842
            return (l.getLanguage().isEmpty()) ? Locale.ENGLISH : l;
69c59b667acc 8149565: -locale option issues
jjg
parents: 48840
diff changeset
   843
        } catch (IllformedLocaleException e) {
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   844
            String text = messager.getText("main.malformed_locale_name", localeName);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   845
            throw new ToolException(CMDERR, text);
35426
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   846
        }
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   847
    }
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   848
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   849
    /**
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   850
     * Search the locale for specified language, specified country and
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   851
     * specified variant.
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   852
     */
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   853
    private Locale searchLocale(String language, String country,
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   854
                                String variant) {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   855
        for (Locale loc : Locale.getAvailableLocales()) {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   856
            if (loc.getLanguage().equals(language) &&
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   857
                (country == null || loc.getCountry().equals(country)) &&
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   858
                (variant == null || loc.getVariant().equals(variant))) {
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   859
                return loc;
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   860
            }
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   861
        }
374342e56a56 8035473: [javadoc] Revamp the existing Doclet APIs
ksrini
parents: 31936
diff changeset
   862
        return null;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   863
    }
37393
a9ba8bd6697b 8152818: Javadoc must support module options supported by javac.
ksrini
parents: 36526
diff changeset
   864
a9ba8bd6697b 8152818: Javadoc must support module options supported by javac.
ksrini
parents: 36526
diff changeset
   865
    @Override
a9ba8bd6697b 8152818: Javadoc must support module options supported by javac.
ksrini
parents: 36526
diff changeset
   866
    OptionHelper getOptionHelper() {
42260
2b4da2bf6660 8169676: boolean result of Option.process is often ignored
jjg
parents: 41990
diff changeset
   867
        return new GrumpyHelper(messager) {
37393
a9ba8bd6697b 8152818: Javadoc must support module options supported by javac.
ksrini
parents: 36526
diff changeset
   868
            @Override
a9ba8bd6697b 8152818: Javadoc must support module options supported by javac.
ksrini
parents: 36526
diff changeset
   869
            public String get(com.sun.tools.javac.main.Option option) {
a9ba8bd6697b 8152818: Javadoc must support module options supported by javac.
ksrini
parents: 36526
diff changeset
   870
                return compOpts.get(option);
a9ba8bd6697b 8152818: Javadoc must support module options supported by javac.
ksrini
parents: 36526
diff changeset
   871
            }
a9ba8bd6697b 8152818: Javadoc must support module options supported by javac.
ksrini
parents: 36526
diff changeset
   872
a9ba8bd6697b 8152818: Javadoc must support module options supported by javac.
ksrini
parents: 36526
diff changeset
   873
            @Override
a9ba8bd6697b 8152818: Javadoc must support module options supported by javac.
ksrini
parents: 36526
diff changeset
   874
            public void put(String name, String value) {
a9ba8bd6697b 8152818: Javadoc must support module options supported by javac.
ksrini
parents: 36526
diff changeset
   875
                compOpts.put(name, value);
a9ba8bd6697b 8152818: Javadoc must support module options supported by javac.
ksrini
parents: 36526
diff changeset
   876
            }
41990
ffaf4e59538a 8166379: IAE while invoking javadoc with --patch-module
ksrini
parents: 41451
diff changeset
   877
ffaf4e59538a 8166379: IAE while invoking javadoc with --patch-module
ksrini
parents: 41451
diff changeset
   878
            @Override
ffaf4e59538a 8166379: IAE while invoking javadoc with --patch-module
ksrini
parents: 41451
diff changeset
   879
            public void remove(String name) {
ffaf4e59538a 8166379: IAE while invoking javadoc with --patch-module
ksrini
parents: 41451
diff changeset
   880
                compOpts.remove(name);
ffaf4e59538a 8166379: IAE while invoking javadoc with --patch-module
ksrini
parents: 41451
diff changeset
   881
            }
ffaf4e59538a 8166379: IAE while invoking javadoc with --patch-module
ksrini
parents: 41451
diff changeset
   882
ffaf4e59538a 8166379: IAE while invoking javadoc with --patch-module
ksrini
parents: 41451
diff changeset
   883
            @Override
ffaf4e59538a 8166379: IAE while invoking javadoc with --patch-module
ksrini
parents: 41451
diff changeset
   884
            public boolean handleFileManagerOption(com.sun.tools.javac.main.Option option, String value) {
ffaf4e59538a 8166379: IAE while invoking javadoc with --patch-module
ksrini
parents: 41451
diff changeset
   885
                fileManagerOpts.put(option, value);
ffaf4e59538a 8166379: IAE while invoking javadoc with --patch-module
ksrini
parents: 41451
diff changeset
   886
                return true;
ffaf4e59538a 8166379: IAE while invoking javadoc with --patch-module
ksrini
parents: 41451
diff changeset
   887
            }
37393
a9ba8bd6697b 8152818: Javadoc must support module options supported by javac.
ksrini
parents: 36526
diff changeset
   888
        };
a9ba8bd6697b 8152818: Javadoc must support module options supported by javac.
ksrini
parents: 36526
diff changeset
   889
    }
41451
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   890
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   891
    @Override
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   892
    String getLocalizedMessage(String msg, Object... args) {
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   893
        return messager.getText(msg, args);
a847c7aa25a7 8151102: Cleanup javadoc exception handling
ksrini
parents: 41448
diff changeset
   894
    }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   895
}