src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DocFilesHandlerImpl.java
changeset 53164 f2140eebd91b
parent 52685 6d243dcde190
child 53270 f3a42c440fcb
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DocFilesHandlerImpl.java	Mon Jan 07 18:48:39 2019 -0800
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DocFilesHandlerImpl.java	Tue Jan 08 11:16:32 2019 +0530
@@ -31,6 +31,7 @@
 import com.sun.source.doctree.EndElementTree;
 import com.sun.source.doctree.StartElementTree;
 import com.sun.source.doctree.TextTree;
+import com.sun.source.util.DocTreeFactory;
 import com.sun.source.util.SimpleDocTreeVisitor;
 import com.sun.tools.doclint.HtmlTag;
 import com.sun.tools.doclint.HtmlTag.Attr;
@@ -43,6 +44,7 @@
 import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
 import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
 import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
+import jdk.javadoc.internal.doclets.toolkit.util.DocletConstants;
 import jdk.javadoc.internal.doclets.toolkit.util.Utils;
 
 import javax.lang.model.element.Element;
@@ -51,6 +53,7 @@
 import javax.tools.FileObject;
 import javax.tools.JavaFileManager.Location;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -140,13 +143,12 @@
                             srcfile.getPath(), dstdir.getPath());
                 } else {
                     if (Utils.toLowerCase(srcfile.getPath()).endsWith(".html")) {
-                        if (handleHtmlFile(srcfile, dstDocPath)) {
-                            continue;
-                        }
+                        handleHtmlFile(srcfile, dstDocPath);
+                    } else {
+                        configuration.messages.notice("doclet.Copying_File_0_To_Dir_1",
+                                srcfile.getPath(), dstdir.getPath());
+                        destfile.copyFile(srcfile);
                     }
-                    configuration.messages.notice("doclet.Copying_File_0_To_Dir_1",
-                            srcfile.getPath(), dstdir.getPath());
-                    destfile.copyFile(srcfile);
                 }
             } else if (srcfile.isDirectory()) {
                 if (configuration.copydocfilesubdirs
@@ -158,19 +160,18 @@
         }
     }
 
-    private boolean handleHtmlFile(DocFile srcfile, DocPath dstPath) throws DocFileIOException {
+    private void handleHtmlFile(DocFile srcfile, DocPath dstPath) throws DocFileIOException {
         Utils utils = configuration.utils;
         FileObject fileObject = srcfile.getFileObject();
         DocFileElement dfElement = new DocFileElement(element, fileObject);
 
-        if (shouldPassThrough(utils.getPreamble(dfElement))) {
-            return false;
-        }
-
         DocPath dfilePath = dstPath.resolve(srcfile.getName());
         HtmlDocletWriter docletWriter = new DocFileWriter(configuration, dfilePath, element);
         configuration.messages.notice("doclet.Generating_0", docletWriter.filename.getPath());
 
+        List<? extends DocTree> localTags = getLocalHeaderTags(utils.getPreamble(dfElement));
+        Content localTagsContent = docletWriter.commentTagsToContent(null, dfElement, localTags, false);
+
         String title = getWindowTitle(docletWriter, dfElement).trim();
         HtmlTree htmlContent = docletWriter.getBody(true, title);
         docletWriter.addTop(htmlContent);
@@ -193,70 +194,61 @@
         navBar.setUserFooter(docletWriter.getUserHeaderFooter(false));
         htmlContent.addContent(navBar.getContent(false));
         docletWriter.addBottom(htmlContent);
-        docletWriter.printHtmlDocument(Collections.emptyList(), false, htmlContent);
-        return true;
+        docletWriter.printHtmlDocument(Collections.emptyList(), false, localTagsContent, htmlContent);
     }
 
 
-    private boolean shouldPassThrough(List<? extends DocTree> dtrees) {
-        SimpleDocTreeVisitor<Boolean, Boolean> check = new SimpleDocTreeVisitor<Boolean, Boolean>() {
-            @Override
-            public Boolean visitStartElement(StartElementTree node, Boolean p) {
-                if (Utils.toLowerCase(node.getName().toString()).equals((Attr.STYLE.getText()))) {
-                    return true;
-                }
-                if (Utils.toLowerCase(node.getName().toString()).equals(HtmlTag.LINK.getText())) {
-                    for (DocTree dt : node.getAttributes()) {
-                        if (this.visit(dt, true))
-                            return true;
+    private List<? extends DocTree> getLocalHeaderTags(List<? extends DocTree> dtrees) {
+        List<DocTree> localTags = new ArrayList<>();
+        DocTreeFactory docTreeFactory = configuration.docEnv.getDocTrees().getDocTreeFactory();
+        boolean inHead = false;
+        boolean inTitle = false;
+        loop:
+        for (DocTree dt : dtrees) {
+            switch (dt.getKind()) {
+                case START_ELEMENT:
+                    StartElementTree startElem = (StartElementTree)dt;
+                    switch (HtmlTag.get(startElem.getName())) {
+                        case HEAD:
+                            inHead = true;
+                            break;
+                        case META:
+                            break;
+                        case TITLE:
+                            inTitle = true;
+                            break;
+                        default:
+                            if (inHead) {
+                                localTags.add(startElem);
+                                localTags.add(docTreeFactory.newTextTree(DocletConstants.NL));
+                            }
                     }
-                }
-                return false;
+                    break;
+                case END_ELEMENT:
+                    EndElementTree endElem = (EndElementTree)dt;
+                    switch (HtmlTag.get(endElem.getName())) {
+                        case HEAD:
+                            inHead = false;
+                            break loop;
+                        case TITLE:
+                            inTitle = false;
+                            break;
+                        default:
+                            if (inHead) {
+                                localTags.add(endElem);
+                                localTags.add(docTreeFactory.newTextTree(DocletConstants.NL));
+                            }
+                    }
+                    break;
+                case ENTITY:
+                case TEXT:
+                    if (inHead && !inTitle) {
+                        localTags.add(dt);
+                    }
+                    break;
             }
-
-            @Override
-            public Boolean visitAttribute(AttributeTree node, Boolean p) {
-                if (p == null || p == false) {
-                    return false;
-                }
-                if (Utils.toLowerCase(node.getName().toString()).equals("rel")) {
-                    for (DocTree dt :  node.getValue()) {
-                        Boolean found = new SimpleDocTreeVisitor<Boolean, ValueKind>() {
-
-                            @Override
-                            public Boolean visitText(TextTree node, ValueKind valueKind) {
-                                switch (valueKind) {
-                                    case EMPTY:
-                                        return false;
-                                    default:
-                                        return Utils.toLowerCase(node.getBody()).equals("stylesheet");
-                                }
-                            }
-
-                            @Override
-                            protected Boolean defaultAction(DocTree node, ValueKind valueKind) {
-                                return false;
-                            }
-
-                        }.visit(dt, node.getValueKind());
-
-                        if (found)
-                            return true;
-                    }
-                }
-                return false;
-            }
-
-            @Override
-            protected Boolean defaultAction(DocTree node, Boolean p) {
-                return false;
-            }
-        };
-        for (DocTree dt : dtrees) {
-            if (check.visit(dt, false))
-                return true;
         }
-        return false;
+        return localTags;
     }
 
     private String getWindowTitle(HtmlDocletWriter docletWriter, Element element) {