changeset 59867:4c92e352da37

8198705: Javadoc search needs a fix to handle duplicate package names in different modules Reviewed-by: jjg
author hannesw
date Fri, 19 Jun 2020 17:17:40 +0200
parents 7ea2b63984c0
children 6c80d676b3fd
files src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractIndexWriter.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SearchIndexItem.java src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/search.js src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/IndexItem.java test/langtools/jdk/javadoc/doclet/testModules/TestModulePackages.java test/langtools/jdk/javadoc/doclet/testSearch/TestSearch.java
diffstat 6 files changed, 79 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractIndexWriter.java	Fri Jun 19 14:26:09 2020 +0200
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractIndexWriter.java	Fri Jun 19 17:17:40 2020 +0200
@@ -27,6 +27,7 @@
 
 import java.io.IOException;
 import java.io.Writer;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -105,8 +106,12 @@
         addHeading(uc, contentTree);
 
         HtmlTree dl = HtmlTree.DL(HtmlStyle.index);
+        Map<String,Integer> duplicateLabelCheck = new HashMap<>();
+        memberlist.forEach(e -> duplicateLabelCheck.compute(e.getFullyQualifiedLabel(utils),
+                (k, v) -> v == null ? 1 : v + 1));
         for (IndexItem indexItem : memberlist) {
-            addDescription(indexItem, dl);
+            addDescription(indexItem, dl,
+                    duplicateLabelCheck.get(indexItem.getFullyQualifiedLabel(utils)) > 1);
         }
         contentTree.add(dl);
     }
@@ -120,14 +125,14 @@
         contentTree.add(heading);
     }
 
-    protected void addDescription(IndexItem indexItem, Content dl) {
+    protected void addDescription(IndexItem indexItem, Content dl, boolean addModuleInfo) {
         SearchIndexItem si = indexItem.getSearchTag();
         if (si != null) {
             addDescription(si, dl);
         } else {
             si = new SearchIndexItem();
             si.setLabel(indexItem.getLabel());
-            addElementDescription(indexItem, dl, si);
+            addElementDescription(indexItem, dl, si, addModuleInfo);
             searchItems.add(si);
         }
     }
@@ -138,8 +143,10 @@
      * @param indexItem the element to be documented
      * @param dlTree the content tree to which the description will be added
      * @param si the search index item
+     * @param addModuleInfo whether to include module information
      */
-    protected void addElementDescription(IndexItem indexItem, Content dlTree, SearchIndexItem si) {
+    protected void addElementDescription(IndexItem indexItem, Content dlTree, SearchIndexItem si,
+                                         boolean addModuleInfo) {
         Content dt;
         Element element = indexItem.getElement();
         String label = indexItem.getLabel();
@@ -165,6 +172,9 @@
                 dt = HtmlTree.DT(getLink(new LinkInfoImpl(configuration,
                         LinkInfoImpl.Kind.INDEX, (TypeElement)element).strong(true)));
                 si.setContainingPackage(utils.getPackageName(utils.containingPackage(element)));
+                if (configuration.showModules && addModuleInfo) {
+                    si.setContainingModule(utils.getFullyQualifiedName(utils.containingModule(element)));
+                }
                 si.setCategory(Category.TYPES);
                 dt.add(" - ");
                 addClassInfo((TypeElement)element, dt);
@@ -175,6 +185,9 @@
                         getDocLink(LinkInfoImpl.Kind.INDEX, containingType, element, new StringContent(label))));
                 si.setContainingPackage(utils.getPackageName(utils.containingPackage(element)));
                 si.setContainingClass(utils.getSimpleName(containingType));
+                if (configuration.showModules && addModuleInfo) {
+                    si.setContainingModule(utils.getFullyQualifiedName(utils.containingModule(element)));
+                }
                 if (utils.isExecutableElement(element)) {
                     String url = HtmlTree.encodeURL(links.getName(getAnchor((ExecutableElement)element)));
                     if (!label.equals(url)) {
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SearchIndexItem.java	Fri Jun 19 14:26:09 2020 +0200
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SearchIndexItem.java	Fri Jun 19 17:17:40 2020 +0200
@@ -148,6 +148,9 @@
                 if (!containingPackage.isEmpty()) {
                     item.append("\"p\":\"").append(containingPackage).append("\",");
                 }
+                if (!containingModule.isEmpty()) {
+                    item.append("\"m\":\"").append(containingModule).append("\",");
+                }
                 item.append("\"l\":\"").append(label).append("\"");
                 if (!url.isEmpty()) {
                     item.append(",\"u\":\"").append(url).append("\"");
@@ -155,8 +158,11 @@
                 item.append("}");
                 break;
             case MEMBERS:
-                item.append("{")
-                        .append("\"p\":\"").append(containingPackage).append("\",")
+                item.append("{");
+                if (!containingModule.isEmpty()) {
+                    item.append("\"m\":\"").append(containingModule).append("\",");
+                }
+                item.append("\"p\":\"").append(containingPackage).append("\",")
                         .append("\"c\":\"").append(containingClass).append("\",")
                         .append("\"l\":\"").append(label).append("\"");
                 if (!url.isEmpty()) {
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/search.js	Fri Jun 19 14:26:09 2020 +0200
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/search.js	Fri Jun 19 17:17:40 2020 +0200
@@ -34,6 +34,7 @@
 var RANKING_THRESHOLD = 2;
 var NO_MATCH = 0xffff;
 var MAX_RESULTS_PER_CATEGORY = 500;
+var UNNAMED = "<Unnamed>";
 function escapeHtml(str) {
     return str.replace(/</g, "&lt;").replace(/>/g, "&gt;");
 }
@@ -48,14 +49,16 @@
         return ui.item.l + slash;
     } else if (ui.item.category === catPackages && ui.item.m) {
         return ui.item.m + slash;
-    } else if ((ui.item.category === catTypes && ui.item.p) || ui.item.category === catMembers) {
-        $.each(packageSearchIndex, function(index, item) {
-            if (item.m && ui.item.p == item.l) {
-                urlPrefix = item.m + slash;
-            }
-        });
-        return urlPrefix;
-    } else {
+    } else if (ui.item.category === catTypes || ui.item.category === catMembers) {
+        if (ui.item.m) {
+            urlPrefix = ui.item.m + slash;
+        } else {
+            $.each(packageSearchIndex, function(index, item) {
+                if (item.m && ui.item.p === item.l) {
+                    urlPrefix = item.m + slash;
+                }
+            });
+        }
         return urlPrefix;
     }
     return urlPrefix;
@@ -121,7 +124,7 @@
         rMenu.menu.bindings = $();
         $.each(items, function(index, item) {
             var li;
-            if (item.l !== noResult.l && item.category !== currentCategory) {
+            if (item.category && item.category !== currentCategory) {
                 ul.append("<li class=\"ui-autocomplete-category\">" + item.category + "</li>");
                 currentCategory = item.category;
             }
@@ -141,15 +144,15 @@
         if (item.category === catModules) {
             label = getHighlightedText(item.l, matcher);
         } else if (item.category === catPackages) {
-            label = (item.m)
-                    ? getHighlightedText(item.m + "/" + item.l, matcher)
-                    : getHighlightedText(item.l, matcher);
+            label = getHighlightedText(item.l, matcher);
         } else if (item.category === catTypes) {
-            label = (item.p)
+            label = (item.p && item.p !== UNNAMED)
                     ? getHighlightedText(item.p + "." + item.l, matcher)
                     : getHighlightedText(item.l, matcher);
         } else if (item.category === catMembers) {
-            label = getHighlightedText(item.p + "." + (item.c + "." + item.l), matcher);
+            label = (item.p && item.p !== UNNAMED)
+                    ? getHighlightedText(item.p + "." + item.c + "." + item.l, matcher)
+                    : getHighlightedText(item.c + "." + item.l, matcher);
         } else if (item.category === catSearchTags) {
             label = getHighlightedText(item.l, matcher);
         } else {
@@ -165,7 +168,11 @@
                 div.html(label + "<span class=\"search-tag-holder-result\"> (" + item.h + ")</span>");
             }
         } else {
-            div.html(label);
+            if (item.m) {
+                div.html(item.m + "/" + label);
+            } else {
+                div.html(label);
+            }
         }
         return li;
     }
@@ -317,7 +324,7 @@
             collision: "flip"
         },
         select: function(event, ui) {
-            if (ui.item.l !== noResult.l) {
+            if (ui.item.category) {
                 var url = getURLPrefix(ui);
                 if (ui.item.category === catModules) {
                     url += "module-summary.html";
@@ -330,13 +337,13 @@
                 } else if (ui.item.category === catTypes) {
                     if (ui.item.u) {
                         url = ui.item.u;
-                    } else if (ui.item.p === "<Unnamed>") {
+                    } else if (ui.item.p === UNNAMED) {
                         url += ui.item.l + ".html";
                     } else {
                         url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.l + ".html";
                     }
                 } else if (ui.item.category === catMembers) {
-                    if (ui.item.p === "<Unnamed>") {
+                    if (ui.item.p === UNNAMED) {
                         url += ui.item.c + ".html" + "#";
                     } else {
                         url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.c + ".html" + "#";
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/IndexItem.java	Fri Jun 19 14:26:09 2020 +0200
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/IndexItem.java	Fri Jun 19 17:17:40 2020 +0200
@@ -26,7 +26,6 @@
 package jdk.javadoc.internal.doclets.toolkit.util;
 
 import jdk.javadoc.internal.doclets.formats.html.SearchIndexItem;
-import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration;
 
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ExecutableElement;
@@ -90,6 +89,16 @@
         return label;
     }
 
+    public String getFullyQualifiedLabel(Utils utils) {
+        if (typeElement != null) {
+            return utils.getFullyQualifiedName(typeElement) + "." + label;
+        } else if (element != null) {
+            return utils.getFullyQualifiedName(element);
+        } else {
+            return label;
+        }
+    }
+
     public Element getElement() {
         return element;
     }
--- a/test/langtools/jdk/javadoc/doclet/testModules/TestModulePackages.java	Fri Jun 19 14:26:09 2020 +0200
+++ b/test/langtools/jdk/javadoc/doclet/testModules/TestModulePackages.java	Fri Jun 19 17:17:40 2020 +0200
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 8178070 8196201 8184205 8246429
+ * @bug 8178070 8196201 8184205 8246429 8198705
  * @summary Test packages table in module summary pages
  * @library /tools/lib ../../lib
  * @modules jdk.compiler/com.sun.tools.javac.api
@@ -167,6 +167,14 @@
                     <div class="sub-title"><span class="module-label-in-type">Module</span>&nbsp;<a href="../module-summary.html">o</a></div>
                     <div class="sub-title"><span class="package-label-in-type">Package</span>&nbsp;<a href="package-summary.html">p</a></div>
                     """);
+        checkOutput("type-search-index.js", true,
+                """
+                     {"p":"p","m":"m","l":"C"},{"p":"p","m":"o","l":"C"}""");
+        checkOutput("member-search-index.js", true,
+                """
+                     {"m":"m","p":"p","c":"C","l":"C()","u":"%3Cinit%3E()"}""",
+                """
+                     {"m":"o","p":"p","c":"C","l":"C()","u":"%3Cinit%3E()"}""");
     }
 
     @Test
--- a/test/langtools/jdk/javadoc/doclet/testSearch/TestSearch.java	Fri Jun 19 14:26:09 2020 +0200
+++ b/test/langtools/jdk/javadoc/doclet/testSearch/TestSearch.java	Fri Jun 19 17:17:40 2020 +0200
@@ -726,14 +726,16 @@
                             return ui.item.l + slash;
                         } else if (ui.item.category === catPackages && ui.item.m) {
                             return ui.item.m + slash;
-                        } else if ((ui.item.category === catTypes && ui.item.p) || ui.item.category === catMembers) {
-                            $.each(packageSearchIndex, function(index, item) {
-                                if (item.m && ui.item.p == item.l) {
-                                    urlPrefix = item.m + slash;
-                                }
-                            });
-                            return urlPrefix;
-                        } else {
+                        } else if (ui.item.category === catTypes || ui.item.category === catMembers) {
+                            if (ui.item.m) {
+                                urlPrefix = ui.item.m + slash;
+                            } else {
+                                $.each(packageSearchIndex, function(index, item) {
+                                    if (item.m && ui.item.p === item.l) {
+                                        urlPrefix = item.m + slash;
+                                    }
+                                });
+                            }
                             return urlPrefix;
                         }
                         return urlPrefix;