This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch 
bugfix/javadoc-url-for-package-and-classname-with-modules
in repository https://gitbox.apache.org/repos/asf/maven-plugin-tools.git

commit ea37e1c4210c8d80af6d8147a2b46250fd949df4
Author: Konrad Windszus <[email protected]>
AuthorDate: Mon Dec 15 20:47:38 2025 +0100

    JavadocLinkGenerator.createLink(String) must consider module names
    
    When link towards external javadoc with modules generated include the
    module name in the URL path
    
    This closes #1038
---
 .../tools/plugin/javadoc/JavadocLinkGenerator.java |  6 ++---
 .../maven/tools/plugin/javadoc/JavadocSite.java    | 28 ++++++++++++++++++----
 .../maven/tools/plugin/javadoc/JavadocSiteIT.java  | 17 +++++++++----
 .../tools/plugin/javadoc/JavadocSiteTest.java      | 12 +++++++++-
 4 files changed, 51 insertions(+), 12 deletions(-)

diff --git 
a/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/javadoc/JavadocLinkGenerator.java
 
b/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/javadoc/JavadocLinkGenerator.java
index dd0c2243..badaf5dc 100644
--- 
a/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/javadoc/JavadocLinkGenerator.java
+++ 
b/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/javadoc/JavadocLinkGenerator.java
@@ -112,7 +112,7 @@ public class JavadocLinkGenerator {
             // resolve version
             JavaVersion javadocVersion = 
JavaVersion.parse(internalJavadocVersion);
             internalJavadocSite =
-                    new JavadocSite(internalJavadocSiteUrl, 
JavadocToolVersionRange.findMatch(javadocVersion), false);
+                    new JavadocSite(internalJavadocSiteUrl, 
JavadocToolVersionRange.findMatch(javadocVersion));
         } else {
             internalJavadocSite = null;
         }
@@ -140,7 +140,7 @@ public class JavadocLinkGenerator {
      * Only uses the offline site for references returning {@code false} for
      * {@link FullyQualifiedJavadocReference#isExternal()}.
      * @param javadocReference
-     * @return the (deep-) link towards a javadoc page
+     * @return the (deep-)link to a javadoc page
      * @throws IllegalArgumentException in case no javadoc link could be 
generated for the given reference
      * @throws IllegalStateException in case no javadoc source sites have been 
configured
      */
@@ -163,7 +163,7 @@ public class JavadocLinkGenerator {
      * Preferably resolves from the online sites if they provide the given 
package.
      * @param binaryName a binary name according to
      * <a 
href="https://docs.oracle.com/javase/specs/jls/se8/html/jls-13.html#jls-13.1";>JLS
 13.1</a>
-     * @return the (deep-) link towards a javadoc page
+     * @return the (deep-)link to a javadoc page
      * @throws IllegalArgumentException in case no javadoc link could be 
generated for the given name
      */
     public URI createLink(String binaryName) {
diff --git 
a/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/javadoc/JavadocSite.java
 
b/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/javadoc/JavadocSite.java
index 36670126..4952e1ca 100644
--- 
a/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/javadoc/JavadocSite.java
+++ 
b/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/javadoc/JavadocSite.java
@@ -158,16 +158,29 @@ class JavadocSite {
         this.requireModuleNameInPath = requireModuleNameInPath;
     }
 
-    /** Constructor for offline sites. This throws {@link 
UnsupportedOperationException}
+    /** Constructor for offline sites without modules. This throws {@link 
UnsupportedOperationException}
      *  for {@link #hasEntryFor(Optional, Optional)}. */
-    JavadocSite(final URI url, JavadocLinkGenerator.JavadocToolVersionRange 
version, boolean requireModuleNameInPath) {
+    JavadocSite(final URI url, JavadocLinkGenerator.JavadocToolVersionRange 
version) {
         Objects.requireNonNull(url);
         this.baseUri = url;
         Objects.requireNonNull(version);
         this.version = version;
         this.settings = null;
         this.containedPackageNamesAndModules = Collections.emptyMap();
-        this.requireModuleNameInPath = requireModuleNameInPath;
+        this.requireModuleNameInPath = false;
+    }
+
+
+    /** Constructor for offline sites with modules. This throws {@link 
UnsupportedOperationException}
+     *  for {@link #hasEntryFor(Optional, Optional)}. */
+    JavadocSite(final URI url, JavadocLinkGenerator.JavadocToolVersionRange 
version, Map<String, String> containedPackageNamesAndModules) {
+        Objects.requireNonNull(url);
+        this.baseUri = url;
+        Objects.requireNonNull(version);
+        this.version = version;
+        this.settings = null;
+        this.containedPackageNamesAndModules = containedPackageNamesAndModules;
+        this.requireModuleNameInPath = true;
     }
 
     static Map<String, String> getPackageListWithModules(final URI url, final 
Settings settings) throws IOException {
@@ -236,7 +249,14 @@ class JavadocSite {
                 // url must point to simple class
                 className = className.substring(0, className.length() - 2);
             }
-            return createLink(baseUri, Optional.empty(), 
Optional.of(packageName), Optional.of(className));
+            Optional<String> moduleName;
+            if (!requireModuleNameInPath) {
+                moduleName = Optional.empty();
+            } else {
+                moduleName = 
Optional.ofNullable(containedPackageNamesAndModules.get(
+                                packageName));
+            }
+            return createLink(baseUri, moduleName, Optional.of(packageName), 
Optional.of(className));
         } catch (URISyntaxException e) {
             throw new IllegalArgumentException("Could not create link for " + 
packageName + "." + className, e);
         }
diff --git 
a/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocSiteIT.java
 
b/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocSiteIT.java
index 115bb982..d06794cc 100644
--- 
a/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocSiteIT.java
+++ 
b/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocSiteIT.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.net.URI;
 import java.util.stream.Stream;
 
+import org.apache.maven.settings.Settings;
 import 
org.apache.maven.tools.plugin.javadoc.FullyQualifiedJavadocReference.MemberType;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
@@ -40,7 +41,7 @@ class JavadocSiteIT {
     @ParameterizedTest
     @MethodSource("javadocBaseUrls")
     void testConstructors(URI javadocBaseUrl) throws IOException {
-        JavadocSite site = new JavadocSite(javadocBaseUrl, null);
+        JavadocSite site = new JavadocSite(javadocBaseUrl, (Settings)null);
         JavadocSiteTest.assertUrlValid(site.createLink(new 
FullyQualifiedJavadocReference(
                 "java.lang", "String", "String(byte[],int)", 
MemberType.CONSTRUCTOR, true)));
     }
@@ -48,7 +49,7 @@ class JavadocSiteIT {
     @ParameterizedTest
     @MethodSource("javadocBaseUrls")
     void testMethods(URI javadocBaseUrl) throws IOException {
-        JavadocSite site = new JavadocSite(javadocBaseUrl, null);
+        JavadocSite site = new JavadocSite(javadocBaseUrl, (Settings)null);
         JavadocSiteTest.assertUrlValid(site.createLink(new 
FullyQualifiedJavadocReference(
                 "java.lang", "String", "copyValueOf(char[],int,int)", 
MemberType.METHOD, true)));
     }
@@ -56,7 +57,7 @@ class JavadocSiteIT {
     @ParameterizedTest
     @MethodSource("javadocBaseUrls")
     void testFields(URI javadocBaseUrl) throws IOException {
-        JavadocSite site = new JavadocSite(javadocBaseUrl, null);
+        JavadocSite site = new JavadocSite(javadocBaseUrl, (Settings)null);
         JavadocSiteTest.assertUrlValid(site.createLink(new 
FullyQualifiedJavadocReference(
                 "java.lang", "String", "CASE_INSENSITIVE_ORDER", 
MemberType.FIELD, true)));
     }
@@ -64,8 +65,16 @@ class JavadocSiteIT {
     @ParameterizedTest
     @MethodSource("javadocBaseUrls")
     void testNestedClass(URI javadocBaseUrl) throws IOException {
-        JavadocSite site = new JavadocSite(javadocBaseUrl, null);
+        JavadocSite site = new JavadocSite(javadocBaseUrl, (Settings)null);
         JavadocSiteTest.assertUrlValid(
                 site.createLink(new 
FullyQualifiedJavadocReference("java.util", "Map.Entry", true)));
     }
+
+    @ParameterizedTest
+    @MethodSource("javadocBaseUrls")
+    void testClass(URI javadocBaseUrl) throws IOException {
+        JavadocSite site = new JavadocSite(javadocBaseUrl, (Settings)null);
+        JavadocSiteTest.assertUrlValid(
+                site.createLink("java.lang", "String"));
+    }
 }
diff --git 
a/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocSiteTest.java
 
b/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocSiteTest.java
index 4355fb82..96030754 100644
--- 
a/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocSiteTest.java
+++ 
b/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocSiteTest.java
@@ -23,6 +23,7 @@ import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.AbstractMap;
+import java.util.Collections;
 import java.util.Map;
 import java.util.regex.Pattern;
 import java.util.stream.Stream;
@@ -115,6 +116,15 @@ class JavadocSiteTest {
                 
"org.apache.maven.tools.plugin.extractor.annotations.converter.test", 
"CurrentClass", false)));
     }
 
+    @Test
+    void 
testClassLinkFromPackageAndClassNameWithExternalJavadocRequiringModules()
+            throws URISyntaxException, IOException {
+        URI baseUri = new 
URI("https://docs.oracle.com/en/java/javase/11/docs/api/";);
+        JavadocSite site = new JavadocSite(baseUri, 
JavadocLinkGenerator.JavadocToolVersionRange.JDK10_OR_HIGHER, 
Collections.singletonMap("java.lang", "java.base"));
+        // don't request URL to make test independent of network connectivity
+        assertEquals(baseUri.resolve("java.base/java/lang/String.html"), 
site.createLink("java.lang", "String"));
+    }
+
     @Test
     void testGetPackageAndClassName() {
         assertEquals(
@@ -142,7 +152,7 @@ class JavadocSiteTest {
             throws IOException, URISyntaxException {
         URI javadocBaseUri =
                 JavadocSiteTest.class.getResource("/javadoc/" + name + 
"/").toURI();
-        return new JavadocSite(javadocBaseUri, version, false);
+        return new JavadocSite(javadocBaseUri, version);
     }
 
     static void assertUrlValid(final URI url) {

Reply via email to