1 /*
   2  * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package jdk.javadoc.doclet;
  27 
  28 import java.util.List;
  29 import java.util.Locale;
  30 import java.util.Set;
  31 
  32 import javax.lang.model.SourceVersion;
  33 
  34 /**
  35  * The user doclet must implement this interface, as described in the
  36  * <a href="package-summary.html#package.description">package description</a>.
  37  * Each implementation of a Doclet must provide a public no-argument constructor
  38  * to be used by tools to instantiate the doclet. The tool infrastructure will
  39  * interact with classes implementing this interface as follows:
  40  * <ol>
  41  * <li> The tool will create an instance of a doclet using the no-arg constructor
  42  *  of the doclet class.
  43  * <li> Next, the tool calls the {@link #init init} method with an appropriate locale
  44  *  and reporter.
  45  * <li> Afterwards, the tool calls {@link #getSupportedOptions getSupportedOptions},
  46  * and {@link #getSupportedSourceVersion getSupportedSourceVersion}.
  47  * These methods are only called once.
  48  * <li> As appropriate, the tool calls the {@link #run run} method on the doclet
  49  * object, giving it a DocletEnvironment object, from which the doclet can determine
  50  * the elements to be included in the documentation.
  51  * </ol>
  52  * <p>
  53  * If a doclet object is created and used without the above protocol being followed,
  54  * then the doclet's behavior is not defined by this interface specification.
  55  * <p> To start the doclet, pass {@code -doclet} followed by the fully-qualified
  56  * name of the entry point class (i.e. the implementation of this interface) on
  57  * the javadoc tool command line.
  58  *
  59  * @since 9
  60  */
  61 public interface Doclet {
  62 
  63     /**
  64      * Initializes this doclet with the given locale and error reporter.
  65      * This locale will be used by the reporter and the doclet components.
  66      *
  67      * @param locale the locale to be used
  68      * @param reporter the reporter to be used
  69      */
  70     void init(Locale locale, Reporter reporter);
  71 
  72     /**
  73      * Returns a name identifying the doclet. A name is a simple identifier
  74      * without white spaces, as defined in <cite>The Java&trade; Language Specification</cite>,
  75      * section 6.2 "Names and Identifiers".
  76      *
  77      * @return name of the Doclet
  78      */
  79     String getName();
  80 
  81     /**
  82      * Returns all the supported options.
  83      *
  84      * @return a set containing all the supported options, an empty set if none
  85      */
  86     Set<? extends Option> getSupportedOptions();
  87 
  88     /**
  89      * Returns the version of the Java Programming Language supported
  90      * by this doclet.
  91      *
  92      * @return  the language version supported by this doclet, usually
  93      * the latest version
  94      */
  95     SourceVersion getSupportedSourceVersion();
  96 
  97     /**
  98      * The entry point of the doclet. Further processing will commence as
  99      * instructed by this method.
 100      *
 101      * @param environment from which essential information can be extracted
 102      * @return true on success
 103      */
 104     boolean run(DocletEnvironment environment);
 105 
 106     /**
 107      * An encapsulation of option name, aliases, parameters and descriptions
 108      * as used by the Doclet.
 109      */
 110     interface Option {
 111         /**
 112          * Returns the number of arguments, this option will consume.
 113          * @return number of consumed arguments
 114          */
 115         int getArgumentCount();
 116 
 117         /**
 118          * Returns the description of the option. For instance, the option "group", would
 119          * return the synopsis of the option such as, "groups the documents".
 120          * @return description if set, otherwise an empty String
 121          */
 122         String getDescription();
 123 
 124         /**
 125          * Returns the option kind.
 126          * @return the kind of this option
 127          */
 128         Option.Kind getKind();
 129 
 130         /**
 131          * Returns the list of names that may be used to identify the option. For instance, the
 132          * list could be {@code ["-classpath", "--class-path"]} for the
 133          * option "-classpath", with an alias "--class-path".
 134          * @return the names of the option
 135          */
 136         List<String> getNames();
 137 
 138         /**
 139          * Returns the parameters of the option. For instance "name &lt;p1&gt;:&lt;p2&gt;.."
 140          * @return parameters if set, otherwise an empty String
 141          */
 142         String getParameters();
 143 
 144         /**
 145          * Processes the option and arguments as needed. This method will
 146          * be invoked if the given option name matches the option.
 147          * @param option the option
 148          * @param arguments a list encapsulating the arguments
 149          * @return true if operation succeeded, false otherwise
 150          */
 151         boolean process(String option, List<String> arguments);
 152 
 153         /**
 154          * The kind of an option.
 155          */
 156         enum Kind {
 157             /** An extended option, such as those prefixed with {@code -X}. */
 158             EXTENDED,
 159             /** A standard option. */
 160             STANDARD,
 161             /** An implementation-reserved option. */
 162             OTHER;
 163         }
 164     }
 165 }