8178043: Support grouping modules in unified javadoc

Reviewed-by: jjg, ksrini
This commit is contained in:
Bhavesh Patel 2017-05-12 18:05:40 -07:00
parent f417779f87
commit d1a9610d05
10 changed files with 313 additions and 82 deletions

View File

@ -25,6 +25,7 @@
package jdk.javadoc.internal.doclets.formats.html;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
@ -101,7 +102,7 @@ public abstract class AbstractModuleIndexWriter extends HtmlDocletWriter {
* @param tableSummary summary for the table
* @param body the document tree to which the modules list will be added
*/
protected abstract void addModulesList(Map<ModuleElement, Set<PackageElement>> modules, String text,
protected abstract void addModulesList(Collection<ModuleElement> modules, String text,
String tableSummary, Content body);
/**
@ -173,7 +174,7 @@ public abstract class AbstractModuleIndexWriter extends HtmlDocletWriter {
* @param body the document tree to which the index will be added
*/
protected void addIndex(Content body) {
addIndexContents(modules, "doclet.Module_Summary",
addIndexContents(configuration.modules, "doclet.Module_Summary",
configuration.getText("doclet.Member_Table_Summary",
configuration.getText("doclet.Module_Summary"),
configuration.getText("doclet.modules")), body);
@ -201,7 +202,7 @@ public abstract class AbstractModuleIndexWriter extends HtmlDocletWriter {
* @param tableSummary summary for the table
* @param body the document tree to which the index contents will be added
*/
protected void addIndexContents(Map<ModuleElement, Set<PackageElement>> modules, String text,
protected void addIndexContents(Collection<ModuleElement> modules, String text,
String tableSummary, Content body) {
HtmlTree htmlTree = (configuration.allowTag(HtmlTag.NAV))
? HtmlTree.NAV()

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 2017, 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
@ -25,6 +25,7 @@
package jdk.javadoc.internal.doclets.formats.html;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
@ -81,7 +82,7 @@ public class ModuleIndexFrameWriter extends AbstractModuleIndexWriter {
/**
* {@inheritDoc}
*/
protected void addModulesList(Map<ModuleElement, Set<PackageElement>> modules, String text,
protected void addModulesList(Collection<ModuleElement> modules, String text,
String tableSummary, Content body) {
Content heading = HtmlTree.HEADING(HtmlConstants.MODULE_HEADING, true,
contents.modulesLabel);
@ -90,7 +91,7 @@ public class ModuleIndexFrameWriter extends AbstractModuleIndexWriter {
: HtmlTree.DIV(HtmlStyle.indexContainer, heading);
HtmlTree ul = new HtmlTree(HtmlTag.UL);
ul.setTitle(contents.modulesLabel);
for (ModuleElement mdle: modules.keySet()) {
for (ModuleElement mdle: modules) {
ul.addContent(getModuleLink(mdle));
}
htmlTree.addContent(ul);

View File

@ -30,7 +30,7 @@ import java.util.*;
import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
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;
@ -56,11 +56,16 @@ import jdk.javadoc.internal.doclets.toolkit.util.Group;
public class ModuleIndexWriter extends AbstractModuleIndexWriter {
/**
* Set representing the modules.
* Map representing the group of modules as specified on the command line.
*
* @see Group
*/
private final SortedSet<ModuleElement> modules;
private final Map<String, SortedSet<ModuleElement>> groupModuleMap;
/**
* List to store the order groups as specified on the command line.
*/
private final List<String> groupList;
/**
* HTML tree for main tag.
@ -74,7 +79,8 @@ public class ModuleIndexWriter extends AbstractModuleIndexWriter {
*/
public ModuleIndexWriter(ConfigurationImpl configuration, DocPath filename) {
super(configuration, filename);
modules = configuration.modules;
groupModuleMap = configuration.group.groupModules(configuration.modules);
groupList = configuration.group.getGroupList();
}
/**
@ -96,11 +102,13 @@ public class ModuleIndexWriter extends AbstractModuleIndexWriter {
*/
@Override
protected void addIndex(Content body) {
if (modules != null && !modules.isEmpty()) {
addIndexContents(configuration.getText("doclet.Modules"),
configuration.getText("doclet.Member_Table_Summary",
configuration.getText("doclet.Module_Summary"),
configuration.getText("doclet.modules")), body);
for (String groupname : groupList) {
SortedSet<ModuleElement> list = groupModuleMap.get(groupname);
if (list != null && !list.isEmpty()) {
addIndexContents(list,
groupname, configuration.getText("doclet.Member_Table_Summary",
groupname, configuration.getText("doclet.modules")), body);
}
}
}
@ -111,7 +119,7 @@ public class ModuleIndexWriter extends AbstractModuleIndexWriter {
* @param tableSummary summary for the table
* @param body the document tree to which the index contents will be added
*/
protected void addIndexContents(String title, String tableSummary, Content body) {
protected void addIndexContents(Collection<ModuleElement> modules, String title, String tableSummary, Content body) {
HtmlTree htmltree = (configuration.allowTag(HtmlTag.NAV))
? HtmlTree.NAV()
: new HtmlTree(HtmlTag.DIV);
@ -123,7 +131,7 @@ public class ModuleIndexWriter extends AbstractModuleIndexWriter {
}
htmltree.addContent(ul);
body.addContent(htmltree);
addModulesList(title, tableSummary, body);
addModulesList(modules, title, tableSummary, body);
}
/**
@ -133,15 +141,17 @@ public class ModuleIndexWriter extends AbstractModuleIndexWriter {
* @param tableSummary the summary of the table tag
* @param body the content tree to which the module list will be added
*/
protected void addModulesList(String text, String tableSummary, Content body) {
protected void addModulesList(Collection<ModuleElement> modules, String text, String tableSummary, Content body) {
Content table = (configuration.isOutputHtml5())
? HtmlTree.TABLE(HtmlStyle.overviewSummary, getTableCaption(new RawHtml(text)))
: HtmlTree.TABLE(HtmlStyle.overviewSummary, tableSummary, getTableCaption(new RawHtml(text)));
table.addContent(getSummaryTableHeader(moduleTableHeader, "col"));
Content tbody = new HtmlTree(HtmlTag.TBODY);
addModulesList(tbody);
addModulesList(modules, tbody);
table.addContent(tbody);
Content div = HtmlTree.DIV(HtmlStyle.contentContainer, table);
Content anchor = getMarkerAnchor(text);
Content div = HtmlTree.DIV(HtmlStyle.contentContainer, anchor);
div.addContent(table);
if (configuration.allowTag(HtmlTag.MAIN)) {
htmlTree.addContent(div);
} else {
@ -154,7 +164,7 @@ public class ModuleIndexWriter extends AbstractModuleIndexWriter {
*
* @param tbody the documentation tree to which the list will be added
*/
protected void addModulesList(Content tbody) {
protected void addModulesList(Collection<ModuleElement> modules, Content tbody) {
boolean altColor = true;
for (ModuleElement mdle : modules) {
if (!mdle.isUnnamed()) {
@ -260,9 +270,4 @@ public class ModuleIndexWriter extends AbstractModuleIndexWriter {
protected void addModulePackagesList(Map<ModuleElement, Set<PackageElement>> modules, String text,
String tableSummary, Content body, ModuleElement mdle) {
}
@Override
protected void addModulesList(Map<ModuleElement, Set<PackageElement>> modules, String text,
String tableSummary, Content body) {
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 2017, 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
@ -26,6 +26,7 @@
package jdk.javadoc.internal.doclets.formats.html;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ -175,7 +176,7 @@ public class ModulePackageIndexFrameWriter extends AbstractModuleIndexWriter {
protected void addOverviewHeader(Content body) {
}
protected void addModulesList(Map<ModuleElement, Set<PackageElement>> modules, String text,
protected void addModulesList(Collection<ModuleElement> modules, String text,
String tableSummary, Content body) {
}

View File

@ -29,11 +29,12 @@ import java.util.*;
import javax.lang.model.element.PackageElement;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
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.RawHtml;
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;
@ -112,8 +113,8 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter {
SortedSet<PackageElement> list = groupPackageMap.get(groupname);
if (list != null && !list.isEmpty()) {
addIndexContents(list,
groupname, configuration.getText("doclet.Member_Table_Summary",
groupname, configuration.getText("doclet.packages")), body);
groupname, configuration.getText("doclet.Member_Table_Summary",
groupname, configuration.getText("doclet.packages")), body);
}
}
}
@ -131,7 +132,9 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter {
Content tbody = new HtmlTree(HtmlTag.TBODY);
addPackagesList(packages, tbody);
table.addContent(tbody);
Content div = HtmlTree.DIV(HtmlStyle.contentContainer, table);
Content anchor = getMarkerAnchor(text);
Content div = HtmlTree.DIV(HtmlStyle.contentContainer, anchor);
div.addContent(table);
if (configuration.allowTag(HtmlTag.MAIN)) {
htmlTree.addContent(div);
} else {

View File

@ -192,9 +192,9 @@ doclet.ClassUse_No.usage.of.0=No usage of {0}
doclet.Window_ClassUse_Header=Uses of {0} {1}
doclet.ClassUse_Title=Uses of {0}
doclet.navClassUse=Use
doclet.Error_in_packagelist=Error in using -group option: {0} {1}
doclet.Groupname_already_used=In -group option, groupname already used: {0}
doclet.Same_package_name_used=Package name format used twice: {0}
doclet.Error_in_grouplist=Bad -group option: {0} {1}
doclet.Groupname_already_used=In -group option, group name already used: {0}
doclet.Same_element_name_used=Element name or pattern used twice: {0}
# option specifiers
doclet.usage.d.parameters=\
@ -274,9 +274,9 @@ doclet.usage.excludedocfilessubdir.description=\
Exclude any doc-files subdirectories with given name
doclet.usage.group.parameters=\
<name> <p1>:<p2>..
<name> <g1>:<g2>...
doclet.usage.group.description=\
Group specified packages together in overview page
Group specified elements together in overview page
doclet.usage.nocomment.description=\
Suppress description and tags, generate only declarations

View File

@ -699,7 +699,11 @@ public abstract class Configuration {
typeElementCatalog = new TypeElementCatalog(includedTypeElements, this);
initTagletManager(customTagStrs);
groups.stream().forEach((grp) -> {
group.checkPackageGroups(grp.value1, grp.value2);
if (showModules) {
group.checkModuleGroups(grp.value1, grp.value2);
} else {
group.checkPackageGroups(grp.value1, grp.value2);
}
});
}

View File

@ -49,6 +49,7 @@ Use --allow-script-in-comments to allow use of JavaScript.
doclet.Packages=Packages
doclet.Modules=Modules
doclet.Other_Packages=Other Packages
doclet.Other_Modules=Other Modules
doclet.Notice_taglet_registered=Registered Taglet {0} ...
doclet.Notice_taglet_unseen=Note: Custom tags that were not seen: {0}
doclet.Notice_taglet_overriden=Note: Custom tags that override standard tags: {0}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2017, 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
@ -27,7 +27,7 @@ package jdk.javadoc.internal.doclets.toolkit.util;
import java.util.*;
import javax.lang.model.element.Element;
import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
import jdk.javadoc.internal.doclets.toolkit.Configuration;
@ -35,7 +35,7 @@ import jdk.javadoc.internal.doclets.toolkit.Messages;
/**
* Process and manage grouping of packages, as specified by "-group" option on
* Process and manage grouping of elements, as specified by "-group" option on
* the command line.
* <p>
* For example, if user has used -group option as
@ -79,10 +79,10 @@ public class Group {
private List<String> groupList = new ArrayList<>();
/**
* Map of non-regular expressions(possible package names) with the
* Map of non-regular expressions(possible package or module names) with the
* corresponding group name.
*/
private Map<String,String> pkgNameGroupMap = new HashMap<>();
private Map<String,String> elementNameGroupMap = new HashMap<>();
/**
* The global configuration information for this run.
@ -106,12 +106,58 @@ public class Group {
messages = configuration.getMessages();
}
/**
* Depending upon the format of the module name provided in the "-group"
* option, generate two separate maps. There will be a map for mapping
* regular expression(only meta character allowed is '*' and that is at the
* end of the regular expression) on to the group name. And another map
* for mapping (possible) module names(if the name format doesn't contain
* meta character '*', then it is assumed to be a module name) on to the
* group name. This will also sort all the regular expressions found in the
* reverse order of their lengths, i.e. longest regular expression will be
* first in the sorted list.
*
* @param groupname The name of the group from -group option.
* @param moduleNameFormList List of the module name formats.
*/
public boolean checkModuleGroups(String groupname, String moduleNameFormList) {
String[] mdlPatterns = moduleNameFormList.split(":");
if (groupList.contains(groupname)) {
initMessages();
messages.warning("doclet.Groupname_already_used", groupname);
return false;
}
groupList.add(groupname);
for (String mdlPattern : mdlPatterns) {
if (mdlPattern.length() == 0) {
initMessages();
messages.warning("doclet.Error_in_grouplist", groupname, moduleNameFormList);
return false;
}
if (mdlPattern.endsWith("*")) {
mdlPattern = mdlPattern.substring(0, mdlPattern.length() - 1);
if (foundGroupFormat(regExpGroupMap, mdlPattern)) {
return false;
}
regExpGroupMap.put(mdlPattern, groupname);
sortedRegExpList.add(mdlPattern);
} else {
if (foundGroupFormat(elementNameGroupMap, mdlPattern)) {
return false;
}
elementNameGroupMap.put(mdlPattern, groupname);
}
}
Collections.sort(sortedRegExpList, new MapKeyComparator());
return true;
}
/**
* Depending upon the format of the package name provided in the "-group"
* option, generate two separate maps. There will be a map for mapping
* regular expression(only meta character allowed is '*' and that is at the
* end of the regular expression) on to the group name. And another map
* for mapping (possible) package names(if the name format doesen't contain
* for mapping (possible) package names(if the name format doesn't contain
* meta character '*', then it is assumed to be a package name) on to the
* group name. This will also sort all the regular expressions found in the
* reverse order of their lengths, i.e. longest regular expression will be
@ -121,32 +167,31 @@ public class Group {
* @param pkgNameFormList List of the package name formats.
*/
public boolean checkPackageGroups(String groupname, String pkgNameFormList) {
StringTokenizer strtok = new StringTokenizer(pkgNameFormList, ":");
String[] pkgPatterns = pkgNameFormList.split(":");
if (groupList.contains(groupname)) {
initMessages();
messages.warning("doclet.Groupname_already_used", groupname);
return false;
}
groupList.add(groupname);
while (strtok.hasMoreTokens()) {
String id = strtok.nextToken();
if (id.length() == 0) {
for (String pkgPattern : pkgPatterns) {
if (pkgPattern.length() == 0) {
initMessages();
messages.warning("doclet.Error_in_packagelist", groupname, pkgNameFormList);
messages.warning("doclet.Error_in_grouplist", groupname, pkgNameFormList);
return false;
}
if (id.endsWith("*")) {
id = id.substring(0, id.length() - 1);
if (foundGroupFormat(regExpGroupMap, id)) {
if (pkgPattern.endsWith("*")) {
pkgPattern = pkgPattern.substring(0, pkgPattern.length() - 1);
if (foundGroupFormat(regExpGroupMap, pkgPattern)) {
return false;
}
regExpGroupMap.put(id, groupname);
sortedRegExpList.add(id);
regExpGroupMap.put(pkgPattern, groupname);
sortedRegExpList.add(pkgPattern);
} else {
if (foundGroupFormat(pkgNameGroupMap, id)) {
if (foundGroupFormat(elementNameGroupMap, pkgPattern)) {
return false;
}
pkgNameGroupMap.put(id, groupname);
elementNameGroupMap.put(pkgPattern, groupname);
}
}
Collections.sort(sortedRegExpList, new MapKeyComparator());
@ -162,39 +207,82 @@ public class Group {
}
/**
* Search if the given map has given the package format.
* Search if the given map has the given element format.
*
* @param map Map to be searched.
* @param pkgFormat The pacakge format to search.
* @param elementFormat The format to search.
*
* @return true if package name format found in the map, else false.
* @return true if element name format found in the map, else false.
*/
boolean foundGroupFormat(Map<String,?> map, String pkgFormat) {
if (map.containsKey(pkgFormat)) {
boolean foundGroupFormat(Map<String,?> map, String elementFormat) {
if (map.containsKey(elementFormat)) {
initMessages();
messages.error("doclet.Same_package_name_used", pkgFormat);
messages.error("doclet.Same_element_name_used", elementFormat);
return true;
}
return false;
}
/**
* Group the modules according the grouping information provided on the
* command line. Given a list of modules, search each module name in
* regular expression map as well as module name map to get the
* corresponding group name. Create another map with mapping of group name
* to the module list, which will fall under the specified group. If any
* module doesn't belong to any specified group on the command line, then
* a new group named "Other Modules" will be created for it. If there are
* no groups found, in other words if "-group" option is not at all used,
* then all the modules will be grouped under group "Modules".
*
* @param modules Specified modules.
* @return map of group names and set of module elements.
*/
public Map<String, SortedSet<ModuleElement>> groupModules(Set<ModuleElement> modules) {
Map<String, SortedSet<ModuleElement>> groupModuleMap = new HashMap<>();
String defaultGroupName =
(elementNameGroupMap.isEmpty() && regExpGroupMap.isEmpty())?
configuration.getResources().getText("doclet.Modules") :
configuration.getResources().getText("doclet.Other_Modules");
// if the user has not used the default group name, add it
if (!groupList.contains(defaultGroupName)) {
groupList.add(defaultGroupName);
}
for (ModuleElement mdl : modules) {
String moduleName = mdl.isUnnamed() ? null : mdl.getQualifiedName().toString();
String groupName = mdl.isUnnamed() ? null : elementNameGroupMap.get(moduleName);
// if this module is not explicitly assigned to a group,
// try matching it to group specified by regular expression
if (groupName == null) {
groupName = regExpGroupName(moduleName);
}
// if it is in neither group map, put it in the default
// group
if (groupName == null) {
groupName = defaultGroupName;
}
getModuleList(groupModuleMap, groupName).add(mdl);
}
return groupModuleMap;
}
/**
* Group the packages according the grouping information provided on the
* command line. Given a list of packages, search each package name in
* regular expression map as well as package name map to get the
* corresponding group name. Create another map with mapping of group name
* to the package list, which will fall under the specified group. If any
* package doesen't belong to any specified group on the comamnd line, then
* package doesn't belong to any specified group on the command line, then
* a new group named "Other Packages" will be created for it. If there are
* no groups found, in other words if "-group" option is not at all used,
* then all the packages will be grouped under group "Packages".
*
* @param packages Packages specified on the command line.
* @return map of group names and set of package elements
*/
public Map<String, SortedSet<PackageElement>> groupPackages(Set<PackageElement> packages) {
Map<String, SortedSet<PackageElement>> groupPackageMap = new HashMap<>();
String defaultGroupName =
(pkgNameGroupMap.isEmpty() && regExpGroupMap.isEmpty())?
(elementNameGroupMap.isEmpty() && regExpGroupMap.isEmpty())?
configuration.getResources().getText("doclet.Packages") :
configuration.getResources().getText("doclet.Other_Packages");
// if the user has not used the default group name, add it
@ -203,7 +291,7 @@ public class Group {
}
for (PackageElement pkg : packages) {
String pkgName = pkg.isUnnamed() ? null : configuration.utils.getPackageName(pkg);
String groupName = pkg.isUnnamed() ? null : pkgNameGroupMap.get(pkgName);
String groupName = pkg.isUnnamed() ? null : elementNameGroupMap.get(pkgName);
// if this package is not explicitly assigned to a group,
// try matching it to group specified by regular expression
if (groupName == null) {
@ -220,15 +308,15 @@ public class Group {
}
/**
* Search for package name in the sorted regular expression
* Search for element name in the sorted regular expression
* list, if found return the group name. If not, return null.
*
* @param pkgName Name of package to be found in the regular
* @param elementName Name of element to be found in the regular
* expression list.
*/
String regExpGroupName(String pkgName) {
String regExpGroupName(String elementName) {
for (String regexp : sortedRegExpList) {
if (pkgName.startsWith(regexp)) {
if (elementName.startsWith(regexp)) {
return regExpGroupMap.get(regexp);
}
}
@ -239,7 +327,7 @@ public class Group {
* For the given group name, return the package list, on which it is mapped.
* Create a new list, if not found.
*
* @param map Map to be searched for gorup name.
* @param map Map to be searched for group name.
* @param groupname Group name to search.
*/
SortedSet<PackageElement> getPkgList(Map<String, SortedSet<PackageElement>> map,
@ -247,6 +335,18 @@ public class Group {
return map.computeIfAbsent(groupname, g -> new TreeSet<>(configuration.utils.makePackageComparator()));
}
/**
* For the given group name, return the module list, on which it is mapped.
* Create a new list, if not found.
*
* @param map Map to be searched for group name.
* @param groupname Group name to search.
*/
SortedSet<ModuleElement> getModuleList(Map<String, SortedSet<ModuleElement>> map,
String groupname) {
return map.computeIfAbsent(groupname, g -> new TreeSet<>(configuration.utils.makeModuleComparator()));
}
/**
* Return the list of groups, in the same order as specified
* on the command line.

View File

@ -25,6 +25,7 @@
* @test
* @bug 8154119 8154262 8156077 8157987 8154261 8154817 8135291 8155995 8162363
* 8168766 8168688 8162674 8160196 8175799 8174974 8176778 8177562 8175218 8175823 8166306
* 8178043
* @summary Test modules support in javadoc.
* @author bpatel
* @library ../lib
@ -326,6 +327,54 @@ public class TestModules extends JavadocTester {
checkAllModulesLink(false);
}
/**
* Test -group option for modules. The overview-summary.html page should group the modules accordingly.
*/
@Test
void testGroupOption() {
javadoc("-d", "out-group", "--show-module-contents=all",
"-tag", "regular:a:Regular Tag:",
"-tag", "moduletag:s:Module Tag:",
"--module-source-path", testSrc,
"-group", "Module Group A", "moduleA*",
"-group", "Module Group B & C", "moduleB*:moduleC*",
"-group", "Java SE Modules", "java*",
"--module", "moduleA,moduleB,moduleC,moduletags",
"moduleA/concealedpkgmdlA", "testpkgmdlA", "testpkg2mdlB", "testpkgmdlB", "testpkgmdlC",
"testpkgmdltags");
checkExit(Exit.OK);
checkGroupOption();
}
/**
* Test -group option for unnamed modules. The overview-summary.html page should group the packages accordingly.
*/
@Test
void testUnnamedModuleGroupOption() {
javadoc("-d", "out-groupnomodule", "-use",
"-overview", testSrc("overview.html"),
"-sourcepath", testSrc,
"-group", "Package Group 0", "testpkgnomodule",
"-group", "Package Group 1", "testpkgnomodule1",
"testpkgnomodule", "testpkgnomodule1");
checkExit(Exit.OK);
checkUnnamedModuleGroupOption();
}
/**
* Test -group option for a single module.
*/
@Test
void testGroupOptionSingleModule() {
javadoc("-d", "out-groupsinglemodule", "-use",
"--module-source-path", testSrc,
"-group", "Module Group B", "moduleB*",
"--module", "moduleB",
"testpkg2mdlB", "testpkgmdlB");
checkExit(Exit.OK);
//checkOverviewSummaryPackages();
}
void checkDescription(boolean found) {
checkOutput("moduleA-summary.html", found,
"<!-- ============ MODULE DESCRIPTION =========== -->\n"
@ -346,8 +395,10 @@ public class TestModules extends JavadocTester {
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"block\">The overview summary page header.</div>\n"
+ "</div>\n"
+ "<div class=\"contentContainer\">\n"
+ "<table class=\"overviewSummary\" summary=\"Module Summary table, listing modules, and an explanation\">\n"
+ "<div class=\"contentContainer\"><a name=\"Modules\">\n"
+ "<!-- -->\n"
+ "</a>\n"
+ "<table class=\"overviewSummary\" summary=\"Modules table, listing modules, and an explanation\">\n"
+ "<caption><span>Modules</span><span class=\"tabEnd\">&nbsp;</span></caption>");
checkOutput("overview-summary.html", false,
"</table>\n"
@ -355,8 +406,10 @@ public class TestModules extends JavadocTester {
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"block\">The overview summary page header.</div>\n"
+ "</div>\n"
+ "<div class=\"contentContainer\">\n"
+ "<table class=\"overviewSummary\" summary=\"Module Summary table, listing modules, and an explanation\">\n"
+ "<div class=\"contentContainer\"><a name=\"Modules\">\n"
+ "<!-- -->\n"
+ "</a>\n"
+ "<table class=\"overviewSummary\" summary=\"Modules table, listing modules, and an explanation\">\n"
+ "<caption><span>Modules</span><span class=\"tabEnd\">&nbsp;</span></caption>");
}
@ -405,7 +458,9 @@ public class TestModules extends JavadocTester {
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"block\">The overview summary page header.</div>\n"
+ "</div>\n"
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"contentContainer\"><a id=\"Modules\">\n"
+ "<!-- -->\n"
+ "</a>\n"
+ "<table class=\"overviewSummary\">\n"
+ "<caption><span>Modules</span><span class=\"tabEnd\">&nbsp;</span></caption>");
checkOutput("overview-summary.html", false,
@ -416,7 +471,9 @@ public class TestModules extends JavadocTester {
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"block\">The overview summary page header.</div>\n"
+ "</div>\n"
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"contentContainer\"><a id=\"Modules\">\n"
+ "<!-- -->\n"
+ "</a>\n"
+ "<table class=\"overviewSummary\">\n"
+ "<caption><span>Modules</span><span class=\"tabEnd\">&nbsp;</span></caption>");
}
@ -495,7 +552,7 @@ public class TestModules extends JavadocTester {
void checkOverviewSummaryModules() {
checkOutput("overview-summary.html", true,
"<table class=\"overviewSummary\" summary=\"Module Summary table, listing modules, and an explanation\">\n"
"<table class=\"overviewSummary\" summary=\"Modules table, listing modules, and an explanation\">\n"
+ "<caption><span>Modules</span><span class=\"tabEnd\">&nbsp;</span></caption>\n"
+ "<tr>\n"
+ "<th class=\"colFirst\" scope=\"col\">Module</th>\n"
@ -512,7 +569,7 @@ public class TestModules extends JavadocTester {
void checkOverviewSummaryPackages() {
checkOutput("overview-summary.html", false,
"<table class=\"overviewSummary\" summary=\"Module Summary table, listing modules, and an explanation\">\n"
"<table class=\"overviewSummary\" summary=\"Modules table, listing modules, and an explanation\">\n"
+ "<caption><span>Modules</span><span class=\"tabEnd\">&nbsp;</span></caption>\n"
+ "<tr>\n"
+ "<th class=\"colFirst\" scope=\"col\">Module</th>\n"
@ -523,7 +580,9 @@ public class TestModules extends JavadocTester {
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"block\">The overview summary page header.</div>\n"
+ "</div>\n"
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"contentContainer\"><a name=\"Packages\">\n"
+ "<!-- -->\n"
+ "</a>\n"
+ "<table class=\"overviewSummary\" summary=\"Packages table, listing packages, and an explanation\">\n"
+ "<caption><span>Packages</span><span class=\"tabEnd\">&nbsp;</span></caption>");
checkOutput("overview-summary.html", true,
@ -537,7 +596,9 @@ public class TestModules extends JavadocTester {
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"block\">The overview summary page header.</div>\n"
+ "</div>\n"
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"contentContainer\"><a name=\"Packages\">\n"
+ "<!-- -->\n"
+ "</a>\n"
+ "<table class=\"overviewSummary\" summary=\"Packages table, listing packages, and an explanation\">\n"
+ "<caption><span>Packages</span><span class=\"tabEnd\">&nbsp;</span></caption>");
}
@ -574,7 +635,9 @@ public class TestModules extends JavadocTester {
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"block\">The overview summary page header.</div>\n"
+ "</div>\n"
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"contentContainer\"><a id=\"Packages\">\n"
+ "<!-- -->\n"
+ "</a>\n"
+ "<table class=\"overviewSummary\">\n"
+ "<caption><span>Packages</span><span class=\"tabEnd\">&nbsp;</span></caption>");
checkOutput("overview-summary.html", true,
@ -591,7 +654,9 @@ public class TestModules extends JavadocTester {
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"block\">The overview summary page header.</div>\n"
+ "</div>\n"
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"contentContainer\"><a id=\"Packages\">\n"
+ "<!-- -->\n"
+ "</a>\n"
+ "<table class=\"overviewSummary\">\n"
+ "<caption><span>Packages</span><span class=\"tabEnd\">&nbsp;</span></caption>");
}
@ -974,4 +1039,54 @@ public class TestModules extends JavadocTester {
+ "</a>",
"<caption><span>Concealed</span><span class=\"tabEnd\">&nbsp;</span></caption>");
}
void checkGroupOption() {
checkOutput("overview-summary.html", true,
"<div class=\"contentContainer\"><a name=\"ModuleGroupA\">\n"
+ "<!-- -->\n"
+ "</a>\n"
+ "<table class=\"overviewSummary\" summary=\"Module Group A table, listing modules, and an explanation\">\n"
+ "<caption><span>Module Group A</span><span class=\"tabEnd\">&nbsp;</span></caption>",
"<div class=\"contentContainer\"><a name=\"ModuleGroupB&amp;C\">\n"
+ "<!-- -->\n"
+ "</a>\n"
+ "<table class=\"overviewSummary\" summary=\"Module Group B &amp; C table, listing modules, and an explanation\">\n"
+ "<caption><span>Module Group B & C</span><span class=\"tabEnd\">&nbsp;</span></caption>",
"<div class=\"contentContainer\"><a name=\"OtherModules\">\n"
+ "<!-- -->\n"
+ "</a>\n"
+ "<table class=\"overviewSummary\" summary=\"Other Modules table, listing modules, and an explanation\">\n"
+ "<caption><span>Other Modules</span><span class=\"tabEnd\">&nbsp;</span></caption>");
checkOutput("overview-summary.html", false,
"<table class=\"overviewSummary\" summary=\"Modules table, listing modules, and an explanation\">\n"
+ "<caption><span>Modules</span><span class=\"tabEnd\">&nbsp;</span></caption>",
"Java SE Modules");
}
void checkUnnamedModuleGroupOption() {
checkOutput("overview-summary.html", true,
"<div class=\"contentContainer\"><a name=\"PackageGroup0\">\n"
+ "<!-- -->\n"
+ "</a>\n"
+ "<table class=\"overviewSummary\" summary=\"Package Group 0 table, listing packages, and an explanation\">\n"
+ "<caption><span>Package Group 0</span><span class=\"tabEnd\">&nbsp;</span></caption>\n"
+ "<tr>",
"<div class=\"contentContainer\"><a name=\"PackageGroup1\">\n"
+ "<!-- -->\n"
+ "</a>\n"
+ "<table class=\"overviewSummary\" summary=\"Package Group 1 table, listing packages, and an explanation\">\n"
+ "<caption><span>Package Group 1</span><span class=\"tabEnd\">&nbsp;</span></caption>");
}
void checkGroupOptionSingleModule() {
checkOutput("overview-summary.html", true,
"<div class=\"contentContainer\"><a name=\"ModuleGroupB\">\n"
+ "<!-- -->\n"
+ "</a>\n"
+ "<table class=\"overviewSummary\" summary=\"Module Group B table, listing modules, and an explanation\">\n"
+ "<caption><span>Module Group B</span><span class=\"tabEnd\">&nbsp;</span></caption>");
checkOutput("overview-summary.html", false,
"<table class=\"overviewSummary\" summary=\"Modules table, listing modules, and an explanation\">\n"
+ "<caption><span>Modules</span><span class=\"tabEnd\">&nbsp;</span></caption>");
}
}