8201396: fix broken links generated by javadoc doclet

Reviewed-by: ksrini
This commit is contained in:
Jonathan Gibbons 2018-04-10 15:05:10 -07:00
parent 6d2a538736
commit e371d95422
6 changed files with 75 additions and 27 deletions
src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets
test/langtools/jdk/javadoc/doclet/testModuleDirs

@ -40,6 +40,7 @@ import jdk.javadoc.internal.doclets.formats.html.markup.Links;
import jdk.javadoc.internal.doclets.formats.html.markup.StringContent;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
/**
@ -100,8 +101,11 @@ public class ModuleFrameWriter extends HtmlDocletWriter {
HtmlTree htmlTree = (configuration.allowTag(HtmlTag.MAIN))
? HtmlTree.MAIN()
: body;
DocPath moduleSummary = configuration.useModuleDirectories
? DocPaths.DOT_DOT.resolve(configuration.docPaths.moduleSummary(moduleElement))
: configuration.docPaths.moduleSummary(moduleElement);
Content heading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, HtmlStyle.bar,
mdlgen.links.createLink(configuration.docPaths.moduleSummary(moduleElement), mdlLabel, "", "classFrame"));
mdlgen.links.createLink(moduleSummary, mdlLabel, "", "classFrame"));
htmlTree.addContent(heading);
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.setStyle(HtmlStyle.indexContainer);

@ -36,7 +36,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Links;
import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml;
import jdk.javadoc.internal.doclets.formats.html.markup.StringContent;
import jdk.javadoc.internal.doclets.toolkit.Content;

@ -37,7 +37,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.Links;
import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml;
import jdk.javadoc.internal.doclets.formats.html.markup.StringContent;
import jdk.javadoc.internal.doclets.toolkit.Content;
@ -189,7 +188,10 @@ public class ModulePackageIndexFrameWriter extends AbstractModuleIndexWriter {
* @param ul the Content object to which the all classes link should be added
*/
protected void addAllClassesLink(Content ul) {
Content linkContent = links.createLink(DocPaths.ALLCLASSES_FRAME,
DocPath allClassesFrame = configuration.useModuleDirectories
? DocPaths.DOT_DOT.resolve(DocPaths.ALLCLASSES_FRAME)
: DocPaths.ALLCLASSES_FRAME;
Content linkContent = links.createLink(allClassesFrame,
contents.allClassesLabel, "", "packageFrame");
Content li = HtmlTree.LI(linkContent);
ul.addContent(li);
@ -202,7 +204,10 @@ public class ModulePackageIndexFrameWriter extends AbstractModuleIndexWriter {
* @param ul the Content object to which the all packages link should be added
*/
protected void addAllPackagesLink(Content ul) {
Content linkContent = links.createLink(DocPaths.OVERVIEW_FRAME,
DocPath overviewFrame = configuration.useModuleDirectories
? DocPaths.DOT_DOT.resolve(DocPaths.OVERVIEW_FRAME)
: DocPaths.OVERVIEW_FRAME;
Content linkContent = links.createLink(overviewFrame,
contents.allPackagesLabel, "", "packageListFrame");
Content li = HtmlTree.LI(linkContent);
ul.addContent(li);
@ -215,7 +220,10 @@ public class ModulePackageIndexFrameWriter extends AbstractModuleIndexWriter {
* @param ul the Content object to which the all modules link should be added
*/
protected void addAllModulesLink(Content ul) {
Content linkContent = links.createLink(DocPaths.MODULE_OVERVIEW_FRAME,
DocPath moduleOverviewFrame = configuration.useModuleDirectories
? DocPaths.DOT_DOT.resolve(DocPaths.MODULE_OVERVIEW_FRAME)
: DocPaths.MODULE_OVERVIEW_FRAME;
Content linkContent = links.createLink(moduleOverviewFrame,
contents.allModulesLabel, "", "packageListFrame");
Content li = HtmlTree.LI(linkContent);
ul.addContent(li);

@ -30,10 +30,6 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
/**
* Abstraction for immutable relative paths.
* Paths always use '/' as a separator, and never begin or end with '/'.

@ -49,6 +49,8 @@ public class DocPaths {
moduleSeparator = useModuleDirectories ? "/module-" : "-";
}
public static final DocPath DOT_DOT = DocPath.create("..");
/** The name of the file for all classes, without using frames, when --no-frames is specified. */
public static final DocPath ALLCLASSES = DocPath.create("allclasses.html");

@ -23,7 +23,7 @@
/*
* @test
* @bug 8195795
* @bug 8195795 8201396
* @summary test the use of module directories in output,
* and the --no-module-directories option
* @modules jdk.javadoc/jdk.javadoc.internal.api
@ -71,46 +71,85 @@ public class TestModuleDirs extends JavadocTester {
@Test
public void testNoModuleDirs(Path base) throws IOException {
Path src = base.resolve("src");
new ModuleBuilder(tb, "m")
.classes("package p; public class A {}")
.exports("p")
new ModuleBuilder(tb, "ma")
.classes("package pa; public class A {}")
.exports("pa")
.write(src);
new ModuleBuilder(tb, "mb")
.classes("package pb; public class B {}")
.exports("pb")
.write(src);
javadoc("-d", base.resolve("api").toString(),
"-quiet",
"--module-source-path", src.toString(),
"--no-module-directories",
"--module", "m");
"--module", "ma,mb");
checkExit(Exit.OK);
checkFiles(true,
"m-summary.html",
"p/package-summary.html");
"ma-frame.html",
"ma-summary.html",
"pa/package-summary.html");
checkFiles(false,
"m/module-summary.html",
"m/p/package-summary.html");
"ma/module-frame.html",
"ma/module-summary.html",
"ma/pa/package-summary.html");
checkOutput("ma-frame.html", true,
"<ul>\n"
+ "<li><a href=\"allclasses-frame.html\" target=\"packageFrame\">All&nbsp;Classes</a></li>\n"
+ "<li><a href=\"overview-frame.html\" target=\"packageListFrame\">All&nbsp;Packages</a></li>\n"
+ "<li><a href=\"module-overview-frame.html\" target=\"packageListFrame\">All&nbsp;Modules</a></li>\n"
+ "</ul>\n");
checkOutput("ma-summary.html", true,
"<ul class=\"navList\" id=\"allclasses_navbar_top\">\n"
+ "<li><a href=\"allclasses-noframe.html\">All&nbsp;Classes</a></li>\n"
+ "</ul>\n");
checkOutput("pa/package-summary.html", true,
"<li><a href=\"../deprecated-list.html\">Deprecated</a></li>\n"
+ "<li><a href=\"../index-all.html\">Index</a></li>");
}
@Test
public void testModuleDirs(Path base) throws IOException {
Path src = base.resolve("src");
new ModuleBuilder(tb, "m")
.classes("package p; public class A {}")
.exports("p")
new ModuleBuilder(tb, "ma")
.classes("package pa; public class A {}")
.exports("pa")
.write(src);
new ModuleBuilder(tb, "mb")
.classes("package pb; public class B {}")
.exports("pb")
.write(src);
javadoc("-d", base.resolve("api").toString(),
"-quiet",
"--module-source-path", src.toString(),
"--module", "m");
"--module", "ma,mb");
checkExit(Exit.OK);
checkFiles(false,
"m-summary.html",
"p/package-summary.html");
"ma-frame.html",
"ma-summary.html",
"pa/package-summary.html");
checkFiles(true,
"m/module-summary.html",
"m/p/package-summary.html");
"ma/module-frame.html",
"ma/module-summary.html",
"ma/pa/package-summary.html");
checkOutput("ma/module-frame.html", true,
"<ul>\n"
+ "<li><a href=\"../allclasses-frame.html\" target=\"packageFrame\">All&nbsp;Classes</a></li>\n"
+ "<li><a href=\"../overview-frame.html\" target=\"packageListFrame\">All&nbsp;Packages</a></li>\n"
+ "<li><a href=\"../module-overview-frame.html\" target=\"packageListFrame\">All&nbsp;Modules</a></li>\n"
+ "</ul>\n");
checkOutput("ma/module-summary.html", true,
"<ul class=\"navList\" id=\"allclasses_navbar_top\">\n"
+ "<li><a href=\"../allclasses-noframe.html\">All&nbsp;Classes</a></li>\n"
+ "</ul>\n");
checkOutput("ma/pa/package-summary.html", true,
"<li><a href=\"../../deprecated-list.html\">Deprecated</a></li>\n"
+ "<li><a href=\"../../index-all.html\">Index</a></li>");
}
}