langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConfigurationImpl.java
changeset 45417 f7479ee8de69
parent 45416 0d8bb33bdfa7
child 45418 8d478df92153
equal deleted inserted replaced
45416:0d8bb33bdfa7 45417:f7479ee8de69
     1 /*
       
     2  * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.  Oracle designates this
       
     8  * particular file as subject to the "Classpath" exception as provided
       
     9  * by Oracle in the LICENSE file that accompanied this code.
       
    10  *
       
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    14  * version 2 for more details (a copy is included in the LICENSE file that
       
    15  * accompanied this code).
       
    16  *
       
    17  * You should have received a copy of the GNU General Public License version
       
    18  * 2 along with this work; if not, write to the Free Software Foundation,
       
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    20  *
       
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    22  * or visit www.oracle.com if you need additional information or have any
       
    23  * questions.
       
    24  */
       
    25 
       
    26 package jdk.javadoc.internal.doclets.formats.html;
       
    27 
       
    28 import java.net.*;
       
    29 import java.util.*;
       
    30 
       
    31 import javax.lang.model.element.Element;
       
    32 import javax.lang.model.element.PackageElement;
       
    33 import javax.lang.model.element.TypeElement;
       
    34 import javax.tools.JavaFileManager;
       
    35 import javax.tools.JavaFileObject;
       
    36 import javax.tools.StandardJavaFileManager;
       
    37 
       
    38 import com.sun.source.util.DocTreePath;
       
    39 import com.sun.tools.doclint.DocLint;
       
    40 
       
    41 import jdk.javadoc.doclet.Doclet;
       
    42 import jdk.javadoc.doclet.DocletEnvironment;
       
    43 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
       
    44 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlVersion;
       
    45 import jdk.javadoc.internal.doclets.toolkit.Configuration;
       
    46 import jdk.javadoc.internal.doclets.toolkit.Content;
       
    47 import jdk.javadoc.internal.doclets.toolkit.Messages;
       
    48 import jdk.javadoc.internal.doclets.toolkit.Resources;
       
    49 import jdk.javadoc.internal.doclets.toolkit.WriterFactory;
       
    50 import jdk.javadoc.internal.doclets.toolkit.util.DocFile;
       
    51 import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
       
    52 import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
       
    53 import jdk.javadoc.internal.doclets.toolkit.util.Utils;
       
    54 
       
    55 import static javax.tools.Diagnostic.Kind.*;
       
    56 
       
    57 /**
       
    58  * Configure the output based on the command line options.
       
    59  * <p>
       
    60  * Also determine the length of the command line option. For example,
       
    61  * for a option "-header" there will be a string argument associated, then the
       
    62  * the length of option "-header" is two. But for option "-nohelp" no argument
       
    63  * is needed so it's length is 1.
       
    64  * </p>
       
    65  * <p>
       
    66  * Also do the error checking on the options used. For example it is illegal to
       
    67  * use "-helpfile" option when already "-nohelp" option is used.
       
    68  * </p>
       
    69  *
       
    70  *  <p><b>This is NOT part of any supported API.
       
    71  *  If you write code that depends on this, you do so at your own risk.
       
    72  *  This code and its internal interfaces are subject to change or
       
    73  *  deletion without notice.</b>
       
    74  *
       
    75  * @author Robert Field.
       
    76  * @author Atul Dambalkar.
       
    77  * @author Jamie Ho
       
    78  * @author Bhavesh Patel (Modified)
       
    79  */
       
    80 public class ConfigurationImpl extends Configuration {
       
    81 
       
    82     /**
       
    83      * The build date.  Note: For now, we will use
       
    84      * a version number instead of a date.
       
    85      */
       
    86     public static final String BUILD_DATE = System.getProperty("java.version");
       
    87 
       
    88     /**
       
    89      * Argument for command line option "-header".
       
    90      */
       
    91     public String header = "";
       
    92 
       
    93     /**
       
    94      * Argument for command line option "-packagesheader".
       
    95      */
       
    96     public String packagesheader = "";
       
    97 
       
    98     /**
       
    99      * Argument for command line option "-footer".
       
   100      */
       
   101     public String footer = "";
       
   102 
       
   103     /**
       
   104      * Argument for command line option "-doctitle".
       
   105      */
       
   106     public String doctitle = "";
       
   107 
       
   108     /**
       
   109      * Argument for command line option "-windowtitle".
       
   110      */
       
   111     public String windowtitle = "";
       
   112 
       
   113     /**
       
   114      * Argument for command line option "-top".
       
   115      */
       
   116     public String top = "";
       
   117 
       
   118     /**
       
   119      * Argument for command line option "-bottom".
       
   120      */
       
   121     public String bottom = "";
       
   122 
       
   123     /**
       
   124      * Argument for command line option "-helpfile".
       
   125      */
       
   126     public String helpfile = "";
       
   127 
       
   128     /**
       
   129      * Argument for command line option "-stylesheetfile".
       
   130      */
       
   131     public String stylesheetfile = "";
       
   132 
       
   133     /**
       
   134      * Argument for command line option "-Xdocrootparent".
       
   135      */
       
   136     public String docrootparent = "";
       
   137 
       
   138     /**
       
   139      * True if command line option "-nohelp" is used. Default value is false.
       
   140      */
       
   141     public boolean nohelp = false;
       
   142 
       
   143     /**
       
   144      * True if command line option "-splitindex" is used. Default value is
       
   145      * false.
       
   146      */
       
   147     public boolean splitindex = false;
       
   148 
       
   149     /**
       
   150      * False if command line option "-noindex" is used. Default value is true.
       
   151      */
       
   152     public boolean createindex = true;
       
   153 
       
   154     /**
       
   155      * True if command line option "-use" is used. Default value is false.
       
   156      */
       
   157     public boolean classuse = false;
       
   158 
       
   159     /**
       
   160      * False if command line option "-notree" is used. Default value is true.
       
   161      */
       
   162     public boolean createtree = true;
       
   163 
       
   164     /**
       
   165      * True if command line option "-nodeprecated" is used. Default value is
       
   166      * false.
       
   167      */
       
   168     public boolean nodeprecatedlist = false;
       
   169 
       
   170     /**
       
   171      * True if command line option "-nonavbar" is used. Default value is false.
       
   172      */
       
   173     public boolean nonavbar = false;
       
   174 
       
   175     /**
       
   176      * True if command line option "-nooverview" is used. Default value is
       
   177      * false
       
   178      */
       
   179     private boolean nooverview = false;
       
   180 
       
   181     /**
       
   182      * The overview path specified with "-overview" flag.
       
   183      */
       
   184     public String overviewpath = null;
       
   185 
       
   186     /**
       
   187      * This is true if option "-overview" is used or option "-overview" is not
       
   188      * used and number of packages is more than one.
       
   189      */
       
   190     public boolean createoverview = false;
       
   191 
       
   192     /**
       
   193      * Specifies whether or not frames should be generated.
       
   194      * Defaults to true; can be set by --frames; can be set to false by --no-frames; last one wins.
       
   195      */
       
   196     public boolean frames = true;
       
   197 
       
   198     /**
       
   199      * This is the HTML version of the generated pages. HTML 4.01 is the default output version.
       
   200      */
       
   201     public HtmlVersion htmlVersion = HtmlVersion.HTML4;
       
   202 
       
   203     /**
       
   204      * Collected set of doclint options
       
   205      */
       
   206     public Map<Doclet.Option, String> doclintOpts = new LinkedHashMap<>();
       
   207 
       
   208     public final Resources resources;
       
   209 
       
   210     /**
       
   211      * First file to appear in the right-hand frame in the generated
       
   212      * documentation.
       
   213      */
       
   214     public DocPath topFile = DocPath.empty;
       
   215 
       
   216     /**
       
   217      * The TypeElement for the class file getting generated.
       
   218      */
       
   219     public TypeElement currentTypeElement = null;  // Set this TypeElement in the ClassWriter.
       
   220 
       
   221     protected List<SearchIndexItem> memberSearchIndex = new ArrayList<>();
       
   222 
       
   223     protected List<SearchIndexItem> moduleSearchIndex = new ArrayList<>();
       
   224 
       
   225     protected List<SearchIndexItem> packageSearchIndex = new ArrayList<>();
       
   226 
       
   227     protected List<SearchIndexItem> tagSearchIndex = new ArrayList<>();
       
   228 
       
   229     protected List<SearchIndexItem> typeSearchIndex = new ArrayList<>();
       
   230 
       
   231     protected Map<Character,List<SearchIndexItem>> tagSearchIndexMap = new HashMap<>();
       
   232 
       
   233     protected Set<Character> tagSearchIndexKeys;
       
   234 
       
   235     protected Contents contents;
       
   236 
       
   237     protected Messages messages;
       
   238 
       
   239     /**
       
   240      * Constructor. Initializes resource for the
       
   241      * {@link com.sun.tools.doclets.internal.toolkit.util.MessageRetriever MessageRetriever}.
       
   242      */
       
   243     public ConfigurationImpl(Doclet doclet) {
       
   244         super(doclet);
       
   245         resources = new Resources(this,
       
   246                 Configuration.sharedResourceBundleName,
       
   247                 "jdk.javadoc.internal.doclets.formats.html.resources.standard");
       
   248 
       
   249         messages = new Messages(this);
       
   250         contents = new Contents(this);
       
   251     }
       
   252 
       
   253     private final String versionRBName = "jdk.javadoc.internal.tool.resources.version";
       
   254     private ResourceBundle versionRB;
       
   255 
       
   256     /**
       
   257      * Return the build date for the doclet.
       
   258      * @return the build date
       
   259      */
       
   260     @Override
       
   261     public String getDocletSpecificBuildDate() {
       
   262         if (versionRB == null) {
       
   263             try {
       
   264                 versionRB = ResourceBundle.getBundle(versionRBName, getLocale());
       
   265             } catch (MissingResourceException e) {
       
   266                 return BUILD_DATE;
       
   267             }
       
   268         }
       
   269 
       
   270         try {
       
   271             return versionRB.getString("release");
       
   272         } catch (MissingResourceException e) {
       
   273             return BUILD_DATE;
       
   274         }
       
   275     }
       
   276 
       
   277     @Override
       
   278     public Resources getResources() {
       
   279         return resources;
       
   280     }
       
   281 
       
   282     @Override
       
   283     public Messages getMessages() {
       
   284         return messages;
       
   285     }
       
   286 
       
   287     protected boolean validateOptions() {
       
   288         // check shared options
       
   289         if (!generalValidOptions()) {
       
   290             return false;
       
   291         }
       
   292         // check if helpfile exists
       
   293         if (!helpfile.isEmpty()) {
       
   294             DocFile help = DocFile.createFileForInput(this, helpfile);
       
   295             if (!help.exists()) {
       
   296                 reporter.print(ERROR, getText("doclet.File_not_found", helpfile));
       
   297                 return false;
       
   298             }
       
   299         }
       
   300 
       
   301         // In a more object-oriented world, this would be done by methods on the Option objects.
       
   302         // Note that -windowtitle silently removes any and all HTML elements, and so does not need
       
   303         // to be handled here.
       
   304         utils.checkJavaScriptInOption("-header", header);
       
   305         utils.checkJavaScriptInOption("-footer", footer);
       
   306         utils.checkJavaScriptInOption("-top", top);
       
   307         utils.checkJavaScriptInOption("-bottom", bottom);
       
   308         utils.checkJavaScriptInOption("-doctitle", doctitle);
       
   309         utils.checkJavaScriptInOption("-packagesheader", packagesheader);
       
   310 
       
   311         return true;
       
   312     }
       
   313 
       
   314 
       
   315     @Override
       
   316     public boolean finishOptionSettings() {
       
   317         if (!validateOptions()) {
       
   318             return false;
       
   319         }
       
   320         if (!getSpecifiedTypeElements().isEmpty()) {
       
   321             Map<String, PackageElement> map = new HashMap<>();
       
   322             PackageElement pkg;
       
   323             for (TypeElement aClass : getIncludedTypeElements()) {
       
   324                 pkg = utils.containingPackage(aClass);
       
   325                 if (!map.containsKey(utils.getPackageName(pkg))) {
       
   326                     map.put(utils.getPackageName(pkg), pkg);
       
   327                 }
       
   328             }
       
   329         }
       
   330         setCreateOverview();
       
   331         setTopFile(docEnv);
       
   332         workArounds.initDocLint(doclintOpts.values(), tagletManager.getCustomTagNames(),
       
   333                 Utils.toLowerCase(htmlVersion.name()));
       
   334         return true;
       
   335     }
       
   336 
       
   337     /**
       
   338      * Return true if the generated output is HTML5.
       
   339      */
       
   340     public boolean isOutputHtml5() {
       
   341         return htmlVersion == HtmlVersion.HTML5;
       
   342     }
       
   343 
       
   344     /**
       
   345      * Return true if the tag is allowed for this specific version of HTML.
       
   346      */
       
   347     public boolean allowTag(HtmlTag htmlTag) {
       
   348         return htmlTag.allowTag(this.htmlVersion);
       
   349     }
       
   350 
       
   351     /**
       
   352      * Decide the page which will appear first in the right-hand frame. It will
       
   353      * be "overview-summary.html" if "-overview" option is used or no
       
   354      * "-overview" but the number of packages is more than one. It will be
       
   355      * "package-summary.html" of the respective package if there is only one
       
   356      * package to document. It will be a class page(first in the sorted order),
       
   357      * if only classes are provided on the command line.
       
   358      *
       
   359      * @param docEnv the doclet environment
       
   360      */
       
   361     protected void setTopFile(DocletEnvironment docEnv) {
       
   362         if (!checkForDeprecation(docEnv)) {
       
   363             return;
       
   364         }
       
   365         if (createoverview) {
       
   366             topFile = DocPaths.overviewSummary(frames);
       
   367         } else {
       
   368             if (showModules) {
       
   369                 topFile = DocPath.empty.resolve(DocPaths.moduleSummary(modules.first()));
       
   370             } else if (packages.size() == 1 && packages.first().isUnnamed()) {
       
   371                 List<TypeElement> classes = new ArrayList<>(getIncludedTypeElements());
       
   372                 if (!classes.isEmpty()) {
       
   373                     TypeElement te = getValidClass(classes);
       
   374                     topFile = DocPath.forClass(utils, te);
       
   375                 }
       
   376             } else if (!packages.isEmpty()) {
       
   377                 topFile = DocPath.forPackage(packages.first()).resolve(DocPaths.PACKAGE_SUMMARY);
       
   378             }
       
   379         }
       
   380     }
       
   381 
       
   382     protected TypeElement getValidClass(List<TypeElement> classes) {
       
   383         if (!nodeprecated) {
       
   384             return classes.get(0);
       
   385         }
       
   386         for (TypeElement te : classes) {
       
   387             if (!utils.isDeprecated(te)) {
       
   388                 return te;
       
   389             }
       
   390         }
       
   391         return null;
       
   392     }
       
   393 
       
   394     protected boolean checkForDeprecation(DocletEnvironment docEnv) {
       
   395         for (TypeElement te : getIncludedTypeElements()) {
       
   396             if (isGeneratedDoc(te)) {
       
   397                 return true;
       
   398             }
       
   399         }
       
   400         return false;
       
   401     }
       
   402 
       
   403     /**
       
   404      * Generate "overview.html" page if option "-overview" is used or number of
       
   405      * packages is more than one. Sets {@link #createoverview} field to true.
       
   406      */
       
   407     protected void setCreateOverview() {
       
   408         if ((overviewpath != null || packages.size() > 1) && !nooverview) {
       
   409             createoverview = true;
       
   410         }
       
   411     }
       
   412 
       
   413     /**
       
   414      * {@inheritDoc}
       
   415      */
       
   416     @Override
       
   417     public WriterFactory getWriterFactory() {
       
   418         return new WriterFactoryImpl(this);
       
   419     }
       
   420 
       
   421     /**
       
   422      * {@inheritDoc}
       
   423      */
       
   424     @Override
       
   425     public Locale getLocale() {
       
   426         if (locale == null)
       
   427             return Locale.getDefault();
       
   428         return locale;
       
   429     }
       
   430 
       
   431     /**
       
   432      * Return the path of the overview file or null if it does not exist.
       
   433      *
       
   434      * @return the path of the overview file or null if it does not exist.
       
   435      */
       
   436     @Override
       
   437     public JavaFileObject getOverviewPath() {
       
   438         if (overviewpath != null && getFileManager() instanceof StandardJavaFileManager) {
       
   439             StandardJavaFileManager fm = (StandardJavaFileManager) getFileManager();
       
   440             return fm.getJavaFileObjects(overviewpath).iterator().next();
       
   441         }
       
   442         return null;
       
   443     }
       
   444 
       
   445     /**
       
   446      * {@inheritDoc}
       
   447      */
       
   448     @Override
       
   449     public JavaFileManager getFileManager() {
       
   450         return docEnv.getJavaFileManager();
       
   451     }
       
   452 
       
   453     @Override
       
   454     public boolean showMessage(DocTreePath path, String key) {
       
   455         return (path == null || workArounds.haveDocLint());
       
   456     }
       
   457 
       
   458     @Override
       
   459     public boolean showMessage(Element e, String key) {
       
   460         return (e == null || workArounds.haveDocLint());
       
   461     }
       
   462 
       
   463     @Override
       
   464     public String getText(String key) {
       
   465         return resources.getText(key);
       
   466     }
       
   467 
       
   468     @Override
       
   469     public String getText(String key, String... args) {
       
   470         return resources.getText(key, (Object[]) args);
       
   471     }
       
   472 
       
   473    /**
       
   474      * {@inheritdoc}
       
   475      */
       
   476     @Override
       
   477     public Content getContent(String key) {
       
   478         return contents.getContent(key);
       
   479     }
       
   480 
       
   481     /**
       
   482      * Get the configuration string as a content.
       
   483      *
       
   484      * @param key the key to look for in the configuration file
       
   485      * @param o   string or content argument added to configuration text
       
   486      * @return a content tree for the text
       
   487      */
       
   488     @Override
       
   489     public Content getContent(String key, Object o) {
       
   490         return contents.getContent(key, o);
       
   491     }
       
   492 
       
   493     /**
       
   494      * Get the configuration string as a content.
       
   495      *
       
   496      * @param key the key to look for in the configuration file
       
   497      * @param o1 resource argument
       
   498      * @param o2 resource argument
       
   499      * @return a content tree for the text
       
   500      */
       
   501     @Override
       
   502     public Content getContent(String key, Object o1, Object o2) {
       
   503         return contents.getContent(key, o1, o2);
       
   504     }
       
   505 
       
   506     /**
       
   507      * Get the configuration string as a content.
       
   508      *
       
   509      * @param key the key to look for in the configuration file
       
   510      * @param o0  string or content argument added to configuration text
       
   511      * @param o1  string or content argument added to configuration text
       
   512      * @param o2  string or content argument added to configuration text
       
   513      * @return a content tree for the text
       
   514      */
       
   515     @Override
       
   516     public Content getContent(String key, Object o0, Object o1, Object o2) {
       
   517         return contents.getContent(key, o0, o1, o2);
       
   518     }
       
   519 
       
   520     protected void buildSearchTagIndex() {
       
   521         for (SearchIndexItem sii : tagSearchIndex) {
       
   522             String tagLabel = sii.getLabel();
       
   523             Character unicode = (tagLabel.length() == 0)
       
   524                     ? '*'
       
   525                     : Character.toUpperCase(tagLabel.charAt(0));
       
   526             List<SearchIndexItem> list = tagSearchIndexMap.get(unicode);
       
   527             if (list == null) {
       
   528                 list = new ArrayList<>();
       
   529                 tagSearchIndexMap.put(unicode, list);
       
   530             }
       
   531             list.add(sii);
       
   532         }
       
   533         tagSearchIndexKeys = tagSearchIndexMap.keySet();
       
   534     }
       
   535 
       
   536     @Override
       
   537     public Set<Doclet.Option> getSupportedOptions() {
       
   538         Resources resources = getResources();
       
   539         Doclet.Option[] options = {
       
   540             new Option(resources, "-bottom", 1) {
       
   541                 @Override
       
   542                 public boolean process(String opt,  List<String> args) {
       
   543                     bottom = args.get(0);
       
   544                     return true;
       
   545                 }
       
   546             },
       
   547             new Option(resources, "-charset", 1) {
       
   548                 @Override
       
   549                 public boolean process(String opt,  List<String> args) {
       
   550                     charset = args.get(0);
       
   551                     return true;
       
   552                 }
       
   553             },
       
   554             new Option(resources, "-doctitle", 1) {
       
   555                 @Override
       
   556                 public boolean process(String opt,  List<String> args) {
       
   557                     doctitle = args.get(0);
       
   558                     return true;
       
   559                 }
       
   560             },
       
   561             new Option(resources, "-footer", 1) {
       
   562                 @Override
       
   563                 public boolean process(String opt, List<String> args) {
       
   564                     footer = args.get(0);
       
   565                     return true;
       
   566                 }
       
   567             },
       
   568             new Option(resources, "-header", 1) {
       
   569                 @Override
       
   570                 public boolean process(String opt,  List<String> args) {
       
   571                     header = args.get(0);
       
   572                     return true;
       
   573                 }
       
   574             },
       
   575             new Option(resources, "-helpfile", 1) {
       
   576                 @Override
       
   577                 public boolean process(String opt,  List<String> args) {
       
   578                     if (nohelp == true) {
       
   579                         reporter.print(ERROR, getText("doclet.Option_conflict",
       
   580                                 "-helpfile", "-nohelp"));
       
   581                         return false;
       
   582                     }
       
   583                     if (!helpfile.isEmpty()) {
       
   584                         reporter.print(ERROR, getText("doclet.Option_reuse",
       
   585                                 "-helpfile"));
       
   586                         return false;
       
   587                     }
       
   588                     helpfile = args.get(0);
       
   589                     return true;
       
   590                 }
       
   591             },
       
   592             new Option(resources, "-html4") {
       
   593                 @Override
       
   594                 public boolean process(String opt,  List<String> args) {
       
   595                     htmlVersion = HtmlVersion.HTML4;
       
   596                     return true;
       
   597                 }
       
   598             },
       
   599             new Option(resources, "-html5") {
       
   600                 @Override
       
   601                 public boolean process(String opt,  List<String> args) {
       
   602                     htmlVersion = HtmlVersion.HTML5;
       
   603                     return true;
       
   604                 }
       
   605             },
       
   606             new Option(resources, "-nohelp") {
       
   607                 @Override
       
   608                 public boolean process(String opt, List<String> args) {
       
   609                     nohelp = true;
       
   610                     if (!helpfile.isEmpty()) {
       
   611                         reporter.print(ERROR, getText("doclet.Option_conflict",
       
   612                                 "-nohelp", "-helpfile"));
       
   613                         return false;
       
   614                     }
       
   615                     return true;
       
   616                 }
       
   617             },
       
   618             new Option(resources, "-nodeprecatedlist") {
       
   619                 @Override
       
   620                 public boolean process(String opt,  List<String> args) {
       
   621                     nodeprecatedlist = true;
       
   622                     return true;
       
   623                 }
       
   624             },
       
   625             new Option(resources, "-noindex") {
       
   626                 @Override
       
   627                 public boolean process(String opt,  List<String> args) {
       
   628                     createindex = false;
       
   629                     if (splitindex == true) {
       
   630                         reporter.print(ERROR, getText("doclet.Option_conflict",
       
   631                                 "-noindex", "-splitindex"));
       
   632                         return false;
       
   633                     }
       
   634                     return true;
       
   635                 }
       
   636             },
       
   637             new Option(resources, "-nonavbar") {
       
   638                 @Override
       
   639                 public boolean process(String opt,  List<String> args) {
       
   640                     nonavbar = true;
       
   641                     return true;
       
   642                 }
       
   643             },
       
   644             new Hidden(resources, "-nooverview") {
       
   645                 @Override
       
   646                 public boolean process(String opt,  List<String> args) {
       
   647                     nooverview = true;
       
   648                     if (overviewpath != null) {
       
   649                         reporter.print(ERROR, getText("doclet.Option_conflict",
       
   650                                 "-nooverview", "-overview"));
       
   651                         return false;
       
   652                     }
       
   653                     return true;
       
   654                 }
       
   655             },
       
   656             new Option(resources, "-notree") {
       
   657                 @Override
       
   658                 public boolean process(String opt,  List<String> args) {
       
   659                     createtree = false;
       
   660                     return true;
       
   661                 }
       
   662             },
       
   663             new Option(resources, "-overview", 1) {
       
   664                 @Override
       
   665                 public boolean process(String opt,  List<String> args) {
       
   666                     overviewpath = args.get(0);
       
   667                     if (nooverview == true) {
       
   668                         reporter.print(ERROR, getText("doclet.Option_conflict",
       
   669                                 "-overview", "-nooverview"));
       
   670                         return false;
       
   671                     }
       
   672                     return true;
       
   673                 }
       
   674             },
       
   675             new Option(resources, "--frames") {
       
   676                 @Override
       
   677                 public boolean process(String opt,  List<String> args) {
       
   678                     frames = true;
       
   679                     return true;
       
   680                 }
       
   681             },
       
   682             new Option(resources, "--no-frames") {
       
   683                 @Override
       
   684                 public boolean process(String opt,  List<String> args) {
       
   685                     frames = false;
       
   686                     return true;
       
   687                 }
       
   688             },
       
   689             new Hidden(resources, "-packagesheader", 1) {
       
   690                 @Override
       
   691                 public boolean process(String opt,  List<String> args) {
       
   692                     packagesheader = args.get(0);
       
   693                     return true;
       
   694                 }
       
   695             },
       
   696             new Option(resources, "-splitindex") {
       
   697                 @Override
       
   698                 public boolean process(String opt, List<String> args) {
       
   699                     splitindex = true;
       
   700                     if (createindex == false) {
       
   701                         reporter.print(ERROR, getText("doclet.Option_conflict",
       
   702                                 "-splitindex", "-noindex"));
       
   703                         return false;
       
   704                     }
       
   705                     return true;
       
   706                 }
       
   707             },
       
   708             new Option(resources, "-stylesheetfile", 1) {
       
   709                 @Override
       
   710                 public boolean process(String opt,  List<String> args) {
       
   711                     stylesheetfile = args.get(0);
       
   712                     return true;
       
   713                 }
       
   714             },
       
   715             new Option(resources, "-top", 1) {
       
   716                 @Override
       
   717                 public boolean process(String opt,  List<String> args) {
       
   718                     top = args.get(0);
       
   719                     return true;
       
   720                 }
       
   721             },
       
   722             new Option(resources, "-use") {
       
   723                 @Override
       
   724                 public boolean process(String opt,  List<String> args) {
       
   725                     classuse = true;
       
   726                     return true;
       
   727                 }
       
   728             },
       
   729             new Option(resources, "-windowtitle", 1) {
       
   730                 @Override
       
   731                 public boolean process(String opt,  List<String> args) {
       
   732                     windowtitle = args.get(0).replaceAll("\\<.*?>", "");
       
   733                     return true;
       
   734                 }
       
   735             },
       
   736             new XOption(resources, "-Xdoclint") {
       
   737                 @Override
       
   738                 public boolean process(String opt,  List<String> args) {
       
   739                     doclintOpts.put(this, DocLint.XMSGS_OPTION);
       
   740                     return true;
       
   741                 }
       
   742             },
       
   743             new XOption(resources, "-Xdocrootparent", 1) {
       
   744                 @Override
       
   745                 public boolean process(String opt, List<String> args) {
       
   746                     docrootparent = args.get(0);
       
   747                     try {
       
   748                         URL ignored = new URL(docrootparent);
       
   749                     } catch (MalformedURLException e) {
       
   750                         reporter.print(ERROR, getText("doclet.MalformedURL", docrootparent));
       
   751                         return false;
       
   752                     }
       
   753                     return true;
       
   754                 }
       
   755             },
       
   756             new XOption(resources, "doclet.usage.xdoclint-extended", "-Xdoclint:", 0) {
       
   757                 @Override
       
   758                 public boolean process(String opt,  List<String> args) {
       
   759                     String dopt = opt.replace("-Xdoclint:", DocLint.XMSGS_CUSTOM_PREFIX);
       
   760                     doclintOpts.put(this, dopt);
       
   761                     if (dopt.contains("/")) {
       
   762                         reporter.print(ERROR, getText("doclet.Option_doclint_no_qualifiers"));
       
   763                         return false;
       
   764                     }
       
   765                     if (!DocLint.isValidOption(dopt)) {
       
   766                         reporter.print(ERROR, getText("doclet.Option_doclint_invalid_arg"));
       
   767                         return false;
       
   768                     }
       
   769                     return true;
       
   770                 }
       
   771             },
       
   772             new XOption(resources, "doclet.usage.xdoclint-package", "-Xdoclint/package:", 0) {
       
   773                 @Override
       
   774                 public boolean process(String opt,  List<String> args) {
       
   775                     String dopt = opt.replace("-Xdoclint/package:", DocLint.XCHECK_PACKAGE);
       
   776                     doclintOpts.put(this, dopt);
       
   777                     if (!DocLint.isValidOption(dopt)) {
       
   778                         reporter.print(ERROR, getText("doclet.Option_doclint_package_invalid_arg"));
       
   779                         return false;
       
   780                     }
       
   781                     return true;
       
   782                 }
       
   783             }
       
   784         };
       
   785         Set<Doclet.Option> oset = new TreeSet<>();
       
   786         oset.addAll(Arrays.asList(options));
       
   787         oset.addAll(super.getSupportedOptions());
       
   788         return oset;
       
   789     }
       
   790 }