8254721: Improve support for conditionally generated files

Reviewed-by: hannesw
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstantsSummaryWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstantsSummaryWriterImpl.java
index a7553f4..f146cc5 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstantsSummaryWriterImpl.java
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstantsSummaryWriterImpl.java
@@ -89,6 +89,7 @@
         constantsTableHeader = new TableHeader(
                 contents.modifierAndTypeLabel, contents.constantFieldLabel, contents.valueLabel);
         this.navBar = new Navigation(null, configuration, PageMode.CONSTANT_VALUES, path);
+        configuration.conditionalPages.add(HtmlConfiguration.ConditionalPage.CONSTANT_VALUES);
     }
 
     @Override
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java
index 696e6ba..14bc4a6 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java
@@ -263,32 +263,33 @@
      * @throws DocFileIOException if there is a problem writing the deprecated list
      */
     public static void generate(HtmlConfiguration configuration) throws DocFileIOException {
-        DocPath filename = DocPaths.DEPRECATED_LIST;
-        DeprecatedListWriter depr = new DeprecatedListWriter(configuration, filename);
-        depr.generateDeprecatedListFile(
-               new DeprecatedAPIListBuilder(configuration));
+        if (configuration.conditionalPages.contains(HtmlConfiguration.ConditionalPage.DEPRECATED)) {
+            DocPath filename = DocPaths.DEPRECATED_LIST;
+            DeprecatedListWriter depr = new DeprecatedListWriter(configuration, filename);
+            depr.generateDeprecatedListFile(configuration.deprecatedAPIListBuilder);
+        }
     }
 
     /**
      * Generate the deprecated API list.
      *
-     * @param deprapi list of deprecated API built already.
+     * @param deprAPI list of deprecated API built already.
      * @throws DocFileIOException if there is a problem writing the deprecated list
      */
-    protected void generateDeprecatedListFile(DeprecatedAPIListBuilder deprapi)
+    protected void generateDeprecatedListFile(DeprecatedAPIListBuilder deprAPI)
             throws DocFileIOException {
         HtmlTree body = getHeader();
-        bodyContents.addMainContent(getContentsList(deprapi));
+        bodyContents.addMainContent(getContentsList(deprAPI));
         String memberTableSummary;
         Content content = new ContentBuilder();
         for (DeprElementKind kind : DeprElementKind.values()) {
-            if (deprapi.hasDocumentation(kind)) {
+            if (deprAPI.hasDocumentation(kind)) {
                 memberTableSummary = resources.getText("doclet.Member_Table_Summary",
                         resources.getText(getHeadingKey(kind)),
                         resources.getText(getSummaryKey(kind)));
                 TableHeader memberTableHeader = new TableHeader(
                         contents.getContent(getHeaderKey(kind)), contents.descriptionLabel);
-                addDeprecatedAPI(deprapi.getSet(kind), getAnchorName(kind),
+                addDeprecatedAPI(deprAPI.getSet(kind), getAnchorName(kind),
                             getHeadingKey(kind), memberTableSummary, memberTableHeader, content);
             }
         }
@@ -302,7 +303,7 @@
         body.add(bodyContents);
         printHtmlDocument(null, description, body);
 
-        if (!deprapi.isEmpty() && configuration.mainIndex != null) {
+        if (!deprAPI.isEmpty() && configuration.mainIndex != null) {
             configuration.mainIndex.add(IndexItem.of(IndexItem.Category.TAGS,
                     resources.getText("doclet.Deprecated_API"), path));
         }
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java
index 56eee93..4f9124f 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java
@@ -235,7 +235,7 @@
         }
 
         // Deprecated
-        if (!(options.noDeprecatedList() || options.noDeprecated())) {
+        if (configuration.conditionalPages.contains(HtmlConfiguration.ConditionalPage.DEPRECATED)) {
             section = newHelpSection(contents.deprecatedAPI);
             Content deprBody = getContent("doclet.help.deprecated.body",
                     links.createLink(DocPaths.DEPRECATED_LIST, resources.getText("doclet.Deprecated_API")));
@@ -255,34 +255,49 @@
         }
 
         // Serialized Form
-        section = newHelpSection(contents.serializedForm)
-                .add(HtmlTree.P(getContent("doclet.help.serial_form.body")));
-        contentTree.add(section);
+        if (configuration.conditionalPages.contains(HtmlConfiguration.ConditionalPage.SERIALIZED_FORM)) {
+            section = newHelpSection(contents.serializedForm)
+                    .add(HtmlTree.P(getContent("doclet.help.serial_form.body")));
+            contentTree.add(section);
+        }
 
         // Constant Field Values
-        section = newHelpSection(contents.constantsSummaryTitle);
-        Content constantsBody = getContent("doclet.help.constants.body",
-                links.createLink(DocPaths.CONSTANT_VALUES, resources.getText("doclet.Constants_Summary")));
-        section.add(HtmlTree.P(constantsBody));
-        contentTree.add(section);
+        if (configuration.conditionalPages.contains(HtmlConfiguration.ConditionalPage.CONSTANT_VALUES)) {
+            section = newHelpSection(contents.constantsSummaryTitle);
+            Content constantsBody = getContent("doclet.help.constants.body",
+                    links.createLink(DocPaths.CONSTANT_VALUES, resources.getText("doclet.Constants_Summary")));
+            section.add(HtmlTree.P(constantsBody));
+            contentTree.add(section);
+        }
+
+        // System Properties
+        if (configuration.conditionalPages.contains(HtmlConfiguration.ConditionalPage.SYSTEM_PROPERTIES)) {
+            section = newHelpSection(contents.systemPropertiesLabel);
+            Content sysPropsBody = getContent("doclet.help.systemProperties.body",
+                    links.createLink(DocPaths.SYSTEM_PROPERTIES, resources.getText("doclet.systemProperties")));
+            section.add(HtmlTree.P(sysPropsBody));
+            contentTree.add(section);
+        }
 
         // Search
-        section = newHelpSection(getContent("doclet.help.search.head"));
-        Content searchIntro = HtmlTree.P(getContent("doclet.help.search.intro"));
-        Content searchExamples = new HtmlTree(TagName.UL).setStyle(HtmlStyle.helpSectionList);
-        for (String[] example : SEARCH_EXAMPLES) {
-            searchExamples.add(HtmlTree.LI(
-                    getContent("doclet.help.search.example",
-                            HtmlTree.CODE(new StringContent(example[0])), example[1])));
+        if (options.createIndex()) {
+            section = newHelpSection(getContent("doclet.help.search.head"));
+            Content searchIntro = HtmlTree.P(getContent("doclet.help.search.intro"));
+            Content searchExamples = new HtmlTree(TagName.UL).setStyle(HtmlStyle.helpSectionList);
+            for (String[] example : SEARCH_EXAMPLES) {
+                searchExamples.add(HtmlTree.LI(
+                        getContent("doclet.help.search.example",
+                                HtmlTree.CODE(new StringContent(example[0])), example[1])));
+            }
+            Content searchSpecLink = HtmlTree.A(
+                    resources.getText("doclet.help.search.spec.url", configuration.getDocletVersion().feature()),
+                    getContent("doclet.help.search.spec.title"));
+            Content searchRefer = HtmlTree.P(getContent("doclet.help.search.refer", searchSpecLink));
+            section.add(searchIntro)
+                    .add(searchExamples)
+                    .add(searchRefer);
+            contentTree.add(section);
         }
-        Content searchSpecLink = HtmlTree.A(
-                resources.getText("doclet.help.search.spec.url", configuration.getDocletVersion().feature()),
-                getContent("doclet.help.search.spec.title"));
-        Content searchRefer = HtmlTree.P(getContent("doclet.help.search.refer", searchSpecLink));
-        section.add(searchIntro)
-            .add(searchExamples)
-            .add(searchRefer);
-        contentTree.add(section);
 
         contentTree.add(new HtmlTree(TagName.HR))
                 .add(HtmlTree.SPAN(HtmlStyle.helpFootnote,
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java
index 3770f6c..19a354d 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java
@@ -27,10 +27,12 @@
 
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.PackageElement;
@@ -47,14 +49,15 @@
 import jdk.javadoc.doclet.Taglet;
 import jdk.javadoc.internal.Versions;
 import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration;
+import jdk.javadoc.internal.doclets.toolkit.BaseOptions;
 import jdk.javadoc.internal.doclets.toolkit.DocletException;
 import jdk.javadoc.internal.doclets.toolkit.Messages;
 import jdk.javadoc.internal.doclets.toolkit.Resources;
 import jdk.javadoc.internal.doclets.toolkit.WriterFactory;
+import jdk.javadoc.internal.doclets.toolkit.util.DeprecatedAPIListBuilder;
 import jdk.javadoc.internal.doclets.toolkit.util.DocFile;
 import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
 import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
-import jdk.javadoc.internal.doclets.toolkit.util.IndexBuilder;
 
 /**
  * Configure the output based on the command-line options.
@@ -105,6 +108,16 @@
      */
     protected HtmlIndexBuilder mainIndex;
 
+    /**
+     * The collection of deprecated items, if any, to be displayed on the deprecated-list page,
+     * or null if the page should not be generated.
+     * The page will not be generated if {@link BaseOptions#noDeprecated() no deprecated items}
+     * are to be included in the documentation,
+     * or if the page is {@link HtmlOptions#noDeprecatedList() not wanted},
+     * or if there are no deprecated elements being documented.
+     */
+    protected DeprecatedAPIListBuilder deprecatedAPIListBuilder;
+
     public final Contents contents;
 
     protected final Messages messages;
@@ -116,6 +129,23 @@
     private final HtmlOptions options;
 
     /**
+     * Kinds of conditional pages.
+     */
+    // Note: this should (eventually) be merged with Navigation.PageMode,
+    // which performs a somewhat similar role
+    public enum ConditionalPage {
+        CONSTANT_VALUES, DEPRECATED, SERIALIZED_FORM, SYSTEM_PROPERTIES
+    }
+
+    /**
+     * A set of values indicating which conditional pages should be generated.
+     * The set is computed lazily, although values must (obviously) be set before
+     * they are required, such as when deciding whether or not to generate links
+     * to these files in the navigation par, on each page, the help file, and so on.
+     */
+    public final Set<ConditionalPage> conditionalPages;
+
+    /**
      * Constructs the full configuration needed by the doclet, including
      * the format-specific part, defined in this class, and the format-independent
      * part, defined in the supertype.
@@ -162,6 +192,8 @@
             v = Runtime.version(); // arguably, the only sensible default
         }
         docletVersion = v;
+
+        conditionalPages = EnumSet.noneOf(ConditionalPage.class);
     }
 
     private final Runtime.Version docletVersion;
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java
index 2449041..8a3aea4 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java
@@ -40,6 +40,7 @@
 import jdk.javadoc.internal.doclets.toolkit.builders.AbstractBuilder;
 import jdk.javadoc.internal.doclets.toolkit.builders.BuilderFactory;
 import jdk.javadoc.internal.doclets.toolkit.util.ClassTree;
+import jdk.javadoc.internal.doclets.toolkit.util.DeprecatedAPIListBuilder;
 import jdk.javadoc.internal.doclets.toolkit.util.DocFile;
 import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
 import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
@@ -115,6 +116,21 @@
         return configuration;
     }
 
+    @Override // defined by AbstractDoclet
+    public void generateClassFiles(DocletEnvironment docEnv, ClassTree classTree) throws DocletException {
+
+        if (!(configuration.getOptions().noDeprecated()
+                || configuration.getOptions().noDeprecatedList())) {
+            DeprecatedAPIListBuilder builder = new DeprecatedAPIListBuilder(configuration);
+            if (!builder.isEmpty()) {
+                configuration.deprecatedAPIListBuilder = builder;
+                configuration.conditionalPages.add(HtmlConfiguration.ConditionalPage.DEPRECATED);
+            }
+        }
+
+        super.generateClassFiles(docEnv, classTree);
+    }
+
     /**
      * Start the generation of files. Call generate methods in the individual
      * writers, which will in turn generate the documentation files. Call the
@@ -155,7 +171,7 @@
             TreeWriter.generate(configuration, classtree);
         }
 
-        if (!(options.noDeprecatedList() || nodeprecated)) {
+        if (configuration.conditionalPages.contains((HtmlConfiguration.ConditionalPage.DEPRECATED))) {
             DeprecatedListWriter.generate(configuration);
         }
 
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlOptions.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlOptions.java
index 61ddf05..88fd3d6 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlOptions.java
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlOptions.java
@@ -128,8 +128,8 @@
     private String helpFile = "";
 
     /**
-     * Argument for command-line option {@code -nodeprecated}.
-     * True if command-line option "-nodeprecated" is used. Default value is
+     * Argument for command-line option {@code -nodeprecatedlist}.
+     * True if command-line option "-nodeprecatedlist" is used. Default value is
      * false.
      */
     private boolean noDeprecatedList = false;
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java
index a1234c2..3ce649e 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java
@@ -308,8 +308,8 @@
                 addPageLabel(tree, contents.useLabel, options.classUse());
                 addTreeLink(tree);
                 if (documentedPage == PageMode.DEPRECATED) {
-                    addActivePageLink(tree, contents.deprecatedLabel, !(options.noDeprecated()
-                            || options.noDeprecatedList()));
+                    addActivePageLink(tree, contents.deprecatedLabel,
+                            configuration.conditionalPages.contains(HtmlConfiguration.ConditionalPage.DEPRECATED));
                 } else {
                     addDeprecatedLink(tree);
                 }
@@ -863,7 +863,7 @@
     }
 
     private void addDeprecatedLink(Content tree) {
-        if (!(options.noDeprecated() || options.noDeprecatedList())) {
+        if (configuration.conditionalPages.contains(HtmlConfiguration.ConditionalPage.DEPRECATED)) {
             tree.add(HtmlTree.LI(links.createLink(pathToRoot.resolve(DocPaths.DEPRECATED_LIST),
                     contents.deprecatedLabel, "", "")));
         }
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerializedFormWriterImpl.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerializedFormWriterImpl.java
index b098052..3aa0db0 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerializedFormWriterImpl.java
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SerializedFormWriterImpl.java
@@ -64,6 +64,7 @@
         super(configuration, DocPaths.SERIALIZED_FORM);
         visibleClasses = configuration.getIncludedTypeElements();
         this.navBar = new Navigation(null, configuration, PageMode.SERIALIZED_FORM, path);
+        configuration.conditionalPages.add(HtmlConfiguration.ConditionalPage.SERIALIZED_FORM);
     }
 
     /**
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SystemPropertiesWriter.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SystemPropertiesWriter.java
index 95f7d49..503eeb1 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SystemPropertiesWriter.java
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SystemPropertiesWriter.java
@@ -41,7 +41,6 @@
 import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
 import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
 import jdk.javadoc.internal.doclets.toolkit.util.IndexItem;
-import jdk.javadoc.internal.doclets.toolkit.util.IndexItem.Category;
 
 import javax.lang.model.element.Element;
 import java.nio.file.Path;
@@ -100,6 +99,7 @@
         }
         SystemPropertiesWriter systemPropertiesGen = new SystemPropertiesWriter(configuration, fileName);
         systemPropertiesGen.buildSystemPropertiesPage();
+        configuration.conditionalPages.add(HtmlConfiguration.ConditionalPage.SYSTEM_PROPERTIES);
     }
 
     /**
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties
index 765395c..3a8fcc0 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties
@@ -205,6 +205,8 @@
     description.
 doclet.help.constants.body=\
     The {0} page lists the static final fields and their values.
+doclet.help.systemProperties.body=\
+    The {0) page lists references to system properties.
 doclet.help.footnote=\
     This help file applies to API documentation generated by the standard doclet.
 doclet.help.enum.intro=\
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/BuilderFactory.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/BuilderFactory.java
index 1b12113..b93decb 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/BuilderFactory.java
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/BuilderFactory.java
@@ -76,8 +76,7 @@
      * @return the builder that builds the constant summary.
      */
     public AbstractBuilder getConstantsSummaryBuilder() {
-        return ConstantsSummaryBuilder.getInstance(context,
-            writerFactory.getConstantsSummaryWriter());
+        return ConstantsSummaryBuilder.getInstance(context);
     }
 
     /**
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstantsSummaryBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstantsSummaryBuilder.java
index aefa8e5..e4beda0 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstantsSummaryBuilder.java
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstantsSummaryBuilder.java
@@ -58,7 +58,7 @@
     /**
      * The writer used to write the results.
      */
-    protected final ConstantsSummaryWriter writer;
+    protected ConstantsSummaryWriter writer;
 
     /**
      * The set of TypeElements that have constant fields.
@@ -89,12 +89,9 @@
      * Construct a new ConstantsSummaryBuilder.
      *
      * @param context       the build context.
-     * @param writer        the writer for the summary.
      */
-    private ConstantsSummaryBuilder(Context context,
-            ConstantsSummaryWriter writer) {
+    private ConstantsSummaryBuilder(Context context) {
         super(context);
-        this.writer = writer;
         this.typeElementsWithConstFields = new HashSet<>();
         this.printedPackageHeaders = new TreeSet<>(utils.comparators.makePackageComparator());
     }
@@ -103,16 +100,20 @@
      * Construct a ConstantsSummaryBuilder.
      *
      * @param context       the build context.
-     * @param writer        the writer for the summary.
      * @return the new ConstantsSummaryBuilder
      */
-    public static ConstantsSummaryBuilder getInstance(Context context,
-            ConstantsSummaryWriter writer) {
-        return new ConstantsSummaryBuilder(context, writer);
+    public static ConstantsSummaryBuilder getInstance(Context context) {
+        return new ConstantsSummaryBuilder(context);
     }
 
     @Override
     public void build() throws DocletException {
+        boolean anyConstants = configuration.packages.stream().anyMatch(this::hasConstantField);
+        if (!anyConstants) {
+            return;
+        }
+
+        writer = configuration.getWriterFactory().getConstantsSummaryWriter();
         if (writer == null) {
             //Doclet does not support this output.
             return;
diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java
index e599aac..e2a85f3 100644
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DeprecatedAPIListBuilder.java
@@ -84,7 +84,7 @@
     }
 
     public boolean isEmpty() {
-        return deprecatedMap.values().stream().allMatch(Collection::isEmpty);
+        return deprecatedMap.values().stream().allMatch(Set::isEmpty);
     }
 
     /**
diff --git a/test/langtools/jdk/javadoc/doclet/WindowTitles/p1/C1.java b/test/langtools/jdk/javadoc/doclet/WindowTitles/p1/C1.java
index 85dc58c..154db44 100644
--- a/test/langtools/jdk/javadoc/doclet/WindowTitles/p1/C1.java
+++ b/test/langtools/jdk/javadoc/doclet/WindowTitles/p1/C1.java
@@ -26,4 +26,6 @@
 import java.io.Serializable;
 
 public class C1 implements Serializable {
+    @Deprecated
+    public static final int ZERO = 0;
 }
diff --git a/test/langtools/jdk/javadoc/doclet/testConditionalPages/TestConditionalPages.java b/test/langtools/jdk/javadoc/doclet/testConditionalPages/TestConditionalPages.java
new file mode 100644
index 0000000..01f75e5
--- /dev/null
+++ b/test/langtools/jdk/javadoc/doclet/testConditionalPages/TestConditionalPages.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug      8254721
+ * @summary  Improve support for conditionally generated files
+ * @library  /tools/lib ../../lib
+ * @modules  jdk.javadoc/jdk.javadoc.internal.tool
+ * @build    toolbox.ToolBox javadoc.tester.* TestConditionalPages
+ * @run main TestConditionalPages
+ */
+
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.function.Consumer;
+
+import javadoc.tester.JavadocTester;
+import toolbox.Task;
+import toolbox.ToolBox;
+
+public class TestConditionalPages extends JavadocTester {
+
+    public static void main(String... args) throws Exception {
+        TestConditionalPages tester = new TestConditionalPages();
+        tester.runTests(m -> new Object[] { Path.of(m.getName()) });
+    }
+
+    ToolBox tb = new ToolBox();
+
+    @Test
+    public void testConstantValues(Path base) throws IOException {
+        test(base, """
+                package p;
+                public class C {
+                    public static final int ZERO = 0;
+                }
+                """,
+                "constant-values.html",
+                b -> checkOutput("index-all.html", b, "Constant&nbsp;Field&nbsp;Values"));
+    }
+
+    @Test
+    public void testDeprecated(Path base) throws IOException {
+        test(base, """
+                package p;
+                @Deprecated
+                public class C {  }
+                """,
+                "deprecated-list.html",
+                b -> checkOutput("index-all.html", b, "Deprecated"));
+    }
+
+    @Test
+    public void testSerializedForm(Path base) throws IOException {
+        test(base, """
+                package p;
+                import java.io.Serializable;
+                public class C implements Serializable {  }
+                """,
+                "serialized-form.html",
+                b -> checkOutput("index-all.html", b, "Serialized&nbsp;Form"));
+    }
+
+    @Test
+    public void testSystemProperties(Path base) throws IOException {
+        test(base, """
+                package p;
+                /** This class uses {@systemProperty line.separator}. */
+                public class C {  }
+                """,
+                "system-properties.html",
+                b -> checkOutput("index-all.html", b, "System&nbsp;Properties"));
+    }
+
+    void test(Path base, String code, String file, Consumer<Boolean> extraChecks) throws IOException {
+        test(base.resolve("a"), code, file, extraChecks, true);
+        test(base.resolve("b"), "package p; public class C { }", file, extraChecks, false);
+    }
+
+    void test(Path base, String code, String file, Consumer<Boolean> extraChecks, boolean expect) throws IOException {
+        Path src = Files.createDirectories(base.resolve("src"));
+        tb.writeJavaFiles(src, code);
+
+        javadoc("-d", base.resolve("out").toString(),
+                "-sourcepath", src.toString(),
+                "p");
+        checkExit(Exit.OK);
+
+        checkFiles(expect, file);
+        checkOutput(Output.OUT, expect, "Generating " + base.resolve("out").resolve(file));
+        extraChecks.accept(expect);
+    }
+}
diff --git a/test/langtools/jdk/javadoc/doclet/testCopyFiles/modules/acme.mdle/p/Foo.java b/test/langtools/jdk/javadoc/doclet/testCopyFiles/modules/acme.mdle/p/Foo.java
index 204b866..4817b99 100644
--- a/test/langtools/jdk/javadoc/doclet/testCopyFiles/modules/acme.mdle/p/Foo.java
+++ b/test/langtools/jdk/javadoc/doclet/testCopyFiles/modules/acme.mdle/p/Foo.java
@@ -26,4 +26,5 @@
 /**
  * A test class.
  */
+@Deprecated
 public class Foo {}
diff --git a/test/langtools/jdk/javadoc/doclet/testGeneratedBy/pkg/MyClass.java b/test/langtools/jdk/javadoc/doclet/testGeneratedBy/pkg/MyClass.java
index b3b699b..cf58296 100644
--- a/test/langtools/jdk/javadoc/doclet/testGeneratedBy/pkg/MyClass.java
+++ b/test/langtools/jdk/javadoc/doclet/testGeneratedBy/pkg/MyClass.java
@@ -26,4 +26,6 @@
 import java.io.Serializable;
 
 public class MyClass implements Serializable {
+    @Deprecated
+    public static final int ZERO = 0;
 }
diff --git a/test/langtools/jdk/javadoc/doclet/testHelpFile/TestHelpFile.java b/test/langtools/jdk/javadoc/doclet/testHelpFile/TestHelpFile.java
index 68bbd99..7497d4b 100644
--- a/test/langtools/jdk/javadoc/doclet/testHelpFile/TestHelpFile.java
+++ b/test/langtools/jdk/javadoc/doclet/testHelpFile/TestHelpFile.java
@@ -34,6 +34,8 @@
 import javadoc.tester.JavadocTester;
 
 public class TestHelpFile extends JavadocTester {
+    /** A constant value to be documented. */
+    public static final int ZERO = 0;
 
     public static void main(String... args) throws Exception {
         TestHelpFile tester = new TestHelpFile();
diff --git a/test/langtools/jdk/javadoc/doclet/testMetadata/TestMetadata.java b/test/langtools/jdk/javadoc/doclet/testMetadata/TestMetadata.java
index 6cc04d7..46e48f6 100644
--- a/test/langtools/jdk/javadoc/doclet/testMetadata/TestMetadata.java
+++ b/test/langtools/jdk/javadoc/doclet/testMetadata/TestMetadata.java
@@ -392,7 +392,7 @@
             case PACKAGES:
                 tb.writeJavaFiles(src,
                     "/** Package pA. {@systemProperty exampleProperty} */ package pA;",
-                    "/** Class pA.CA. */ package pA; public class CA { }",
+                    "/** Class pA.CA. */ package pA; public class CA { @Deprecated public static final int ZERO = 0; }",
                     "/** Anno pA.Anno, */ package pA; public @interface Anno { }",
                     "/** Serializable pA.Ser, */ package pA; public class Ser implements java.io.Serializable { }",
                     "/** Package pB. */ package pB;",
@@ -407,7 +407,7 @@
                 new ModuleBuilder(tb, "mA")
                         .exports("pA")
                         .classes("/** Package mA/pA. */ package pA;")
-                        .classes("/** Class mA/pA.CA. */ package pA; public class CA { }")
+                        .classes("/** Class mA/pA.CA. */ package pA; public class CA { @Deprecated public static int ZERO = 0; }")
                         .write(src);
                 new ModuleBuilder(tb, "mB")
                         .exports("pB")
diff --git a/test/langtools/jdk/javadoc/doclet/testModuleDirs/TestModuleDirs.java b/test/langtools/jdk/javadoc/doclet/testModuleDirs/TestModuleDirs.java
index 48b8d9a..48f7bd2 100644
--- a/test/langtools/jdk/javadoc/doclet/testModuleDirs/TestModuleDirs.java
+++ b/test/langtools/jdk/javadoc/doclet/testModuleDirs/TestModuleDirs.java
@@ -88,7 +88,7 @@
     public void testModuleDirs(Path base) throws IOException {
         Path src = base.resolve("src");
         new ModuleBuilder(tb, "ma")
-                .classes("package pa; public class A {}")
+                .classes("package pa; @Deprecated public class A {}")
                 .exports("pa")
                 .write(src);
         new ModuleBuilder(tb, "mb")
diff --git a/test/langtools/jdk/javadoc/doclet/testNavigation/TestModuleNavigation.java b/test/langtools/jdk/javadoc/doclet/testNavigation/TestModuleNavigation.java
index 2b4a367..f51c89d 100644
--- a/test/langtools/jdk/javadoc/doclet/testNavigation/TestModuleNavigation.java
+++ b/test/langtools/jdk/javadoc/doclet/testNavigation/TestModuleNavigation.java
@@ -62,7 +62,7 @@
                 .uses("p1.A")
                 .uses("p1.B")
                 .exports("p1")
-                .classes("package p1; public class A {}")
+                .classes("package p1; @Deprecated public class A {}")
                 .classes("package p1; public class B {}");
         mb.write(src);
         ModuleBuilder mb1 = new ModuleBuilder(tb, "m2")
diff --git a/test/langtools/jdk/javadoc/doclet/testPackagePage/com/pkg/C.java b/test/langtools/jdk/javadoc/doclet/testPackagePage/com/pkg/C.java
index 27c7478..ad28813 100644
--- a/test/langtools/jdk/javadoc/doclet/testPackagePage/com/pkg/C.java
+++ b/test/langtools/jdk/javadoc/doclet/testPackagePage/com/pkg/C.java
@@ -23,4 +23,5 @@
 
 package com.pkg;
 
+@Deprecated
 public class C {}
diff --git a/test/langtools/jdk/javadoc/doclet/testTopOption/pkg/Cl.java b/test/langtools/jdk/javadoc/doclet/testTopOption/pkg/Cl.java
index 4fe9e43..b2a307e 100644
--- a/test/langtools/jdk/javadoc/doclet/testTopOption/pkg/Cl.java
+++ b/test/langtools/jdk/javadoc/doclet/testTopOption/pkg/Cl.java
@@ -25,4 +25,5 @@
 
 
 public class Cl {
+    public static final int ZERO = 0;
 }
diff --git a/test/langtools/jdk/javadoc/tool/api/basic/APITest.java b/test/langtools/jdk/javadoc/tool/api/basic/APITest.java
index accba26..8c7c945 100644
--- a/test/langtools/jdk/javadoc/tool/api/basic/APITest.java
+++ b/test/langtools/jdk/javadoc/tool/api/basic/APITest.java
@@ -110,7 +110,8 @@
     }
 
     protected JavaFileObject createSimpleJavaFileObject() {
-        return createSimpleJavaFileObject("pkg/C", "package pkg; public class C { }");
+        return createSimpleJavaFileObject("pkg/C",
+                "package pkg; public class C { @Deprecated public static final int ZERO = 0; }");
     }
 
     protected JavaFileObject createSimpleJavaFileObject(final String binaryName, final String content) {
diff --git a/test/langtools/jdk/javadoc/tool/api/basic/pkg/C.java b/test/langtools/jdk/javadoc/tool/api/basic/pkg/C.java
index 74383c0..6ea7262 100644
--- a/test/langtools/jdk/javadoc/tool/api/basic/pkg/C.java
+++ b/test/langtools/jdk/javadoc/tool/api/basic/pkg/C.java
@@ -23,5 +23,8 @@
 
 package pkg;
 
-public class C { }
+public class C {
+    @Deprecated
+    public static final int ZERO = 0;
+}