# HG changeset patch # User pmuthuswamy # Date 1550728599 -19800 # Node ID 880baf6db17bd7b29588a78d2db53aee28c95d32 # Parent c925e36a8e6d8f7b9efa0423591a05dc378d6040 8213354: Support package-specific stylesheets Reviewed-by: jjg diff -r c925e36a8e6d -r 880baf6db17b src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeWriterImpl.java Wed Feb 20 18:46:30 2019 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AnnotationTypeWriterImpl.java Thu Feb 21 11:26:39 2019 +0530 @@ -153,10 +153,10 @@ @Override public void printDocument(Content contentTree) throws DocFileIOException { String description = getDescription("declaration", annotationType); + PackageElement pkg = utils.containingPackage(this.annotationType); + Content stylesheetContent = getLocalStylesheetContent(pkg); printHtmlDocument(configuration.metakeywords.getMetaKeywords(annotationType), - description, - true, - contentTree); + description, true, stylesheetContent, contentTree); } /** diff -r c925e36a8e6d -r 880baf6db17b src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java Wed Feb 20 18:46:30 2019 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassWriterImpl.java Thu Feb 21 11:26:39 2019 +0530 @@ -178,10 +178,10 @@ @Override public void printDocument(Content contentTree) throws DocFileIOException { String description = getDescription("declaration", typeElement); + PackageElement pkg = utils.containingPackage(typeElement); + Content stylesheetContent = getLocalStylesheetContent(pkg); printHtmlDocument(configuration.metakeywords.getMetaKeywords(typeElement), - description, - true, - contentTree); + description, true, stylesheetContent, contentTree); } /** diff -r c925e36a8e6d -r 880baf6db17b src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DocFilesHandlerImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DocFilesHandlerImpl.java Wed Feb 20 18:46:30 2019 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DocFilesHandlerImpl.java Thu Feb 21 11:26:39 2019 +0530 @@ -31,7 +31,6 @@ import com.sun.source.doctree.TextTree; import com.sun.source.util.DocTreeFactory; import com.sun.tools.doclint.HtmlTag; -import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; import jdk.javadoc.internal.doclets.formats.html.markup.Navigation; import jdk.javadoc.internal.doclets.toolkit.Content; @@ -125,6 +124,16 @@ } } + public List getStylesheets() throws DocFileIOException { + List stylesheets = new ArrayList(); + for (DocFile srcdir : DocFile.list(configuration, location, source)) { + for (DocFile srcFile : srcdir.list()) { + if (srcFile.getName().endsWith(".css")) + stylesheets.add(DocPaths.DOC_FILES.resolve(srcFile.getName())); + } + } + return stylesheets; + } private void copyDirectory(DocFile srcdir, final DocPath dstDocPath, boolean first) throws DocFileIOException { diff -r c925e36a8e6d -r 880baf6db17b src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java Wed Feb 20 18:46:30 2019 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java Thu Feb 21 11:26:39 2019 +0530 @@ -240,6 +240,8 @@ public DocPaths docPaths; + public Map> localStylesheetMap = new HashMap<>(); + /** * Creates an object to hold the configuration for a doclet. * diff -r c925e36a8e6d -r 880baf6db17b src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java Wed Feb 20 18:46:30 2019 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java Thu Feb 21 11:26:39 2019 +0530 @@ -2219,4 +2219,21 @@ Script getMainBodyScript() { return mainBodyScript; } + + Content getLocalStylesheetContent(Element element) throws DocFileIOException { + Content stylesheetContent = new ContentBuilder(); + List localStylesheets = configuration.localStylesheetMap.get(element); + if (localStylesheets == null) { + DocFilesHandlerImpl docFilesHandler = (DocFilesHandlerImpl)configuration + .getWriterFactory().getDocFilesHandler(element); + localStylesheets = docFilesHandler.getStylesheets(); + configuration.localStylesheetMap.put(element, localStylesheets); + } + for (DocPath stylesheet : localStylesheets) { + stylesheetContent.addContent(HtmlTree.LINK("stylesheet", + "text/css", stylesheet.getPath(), "Style")); + } + return stylesheetContent; + } + } diff -r c925e36a8e6d -r 880baf6db17b src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java Wed Feb 20 18:46:30 2019 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageWriterImpl.java Thu Feb 21 11:26:39 2019 +0530 @@ -317,9 +317,8 @@ @Override public void printDocument(Content contentTree) throws DocFileIOException { String description = getDescription("declaration", packageElement); + Content stylesheetContent = getLocalStylesheetContent(packageElement); printHtmlDocument(configuration.metakeywords.getMetaKeywords(packageElement), - description, - true, - contentTree); + description, true, stylesheetContent, contentTree); } } diff -r c925e36a8e6d -r 880baf6db17b src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/DocFilesHandler.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/DocFilesHandler.java Wed Feb 20 18:46:30 2019 -0800 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/DocFilesHandler.java Thu Feb 21 11:26:39 2019 +0530 @@ -26,6 +26,9 @@ package jdk.javadoc.internal.doclets.toolkit; +import java.util.List; + +import jdk.javadoc.internal.doclets.toolkit.util.DocPath; /** * The interface for copying doc-files to the output. * @@ -37,4 +40,5 @@ public interface DocFilesHandler { void copyDocFiles() throws DocletException; + List getStylesheets() throws DocletException; } diff -r c925e36a8e6d -r 880baf6db17b test/langtools/jdk/javadoc/doclet/testPackageSpecificStylesheet/TestPackageSpecificStylesheet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/jdk/javadoc/doclet/testPackageSpecificStylesheet/TestPackageSpecificStylesheet.java Thu Feb 21 11:26:39 2019 +0530 @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2019, 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 8213354 + * @summary Support package-specific stylesheets + * @library /tools/lib ../../lib + * @modules jdk.javadoc/jdk.javadoc.internal.tool + * @build javadoc.tester.* toolbox.ToolBox builder.ClassBuilder + * @run main TestPackageSpecificStylesheet + */ + + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; + +import builder.ClassBuilder; +import toolbox.ToolBox; + +import javadoc.tester.JavadocTester; + +public class TestPackageSpecificStylesheet extends JavadocTester { + + final ToolBox tb; + + public static void main(String... args) throws Exception { + TestPackageSpecificStylesheet tester = new TestPackageSpecificStylesheet(); + tester.runTests(m -> new Object[]{Paths.get(m.getName())}); + } + + TestPackageSpecificStylesheet() { + tb = new ToolBox(); + } + + @Test + public void test(Path base) throws Exception { + Path srcDir = base.resolve("src"); + Path outDir = base.resolve("out"); + + new ClassBuilder(tb, "pkg.A") + .setComments("test span style") + .setModifiers("public", "class") + .write(srcDir); + + Path docFilesDir = Files.createDirectories(srcDir.resolve("pkg").resolve("doc-files")); + Path stylesheet = docFilesDir.resolve("spanstyle.css"); + Files.createFile(stylesheet); + Files.write(stylesheet, List.of("span{ color:blue; }")); + + new ClassBuilder(tb, "pkg2.B") + .setModifiers("public", "class") + .write(srcDir); + + javadoc("-d", outDir.toString(), + "-sourcepath", srcDir.toString(), + "pkg", "pkg2"); + + checkExit(Exit.OK); + + checkOutput("pkg/A.html", true, + ""); + + checkOutput("pkg/package-summary.html", true, + ""); + + checkOutput("pkg2/B.html", false, + ""); + + } +}