This is an automated email from the ASF dual-hosted git repository. kwin pushed a commit to branch bugfix/javadoc-module-names-for-binary-names-3.x in repository https://gitbox.apache.org/repos/asf/maven-plugin-tools.git
commit 6330c56b74e52c51d8bc7e8d956af42cc6b78fc8 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 | 29 +++++++++++++++++++--- .../tools/plugin/javadoc/JavadocNonLtsSiteIT.java | 7 ++++++ .../maven/tools/plugin/javadoc/JavadocSiteIT.java | 16 +++++++++--- .../tools/plugin/javadoc/JavadocSiteTest.java | 14 ++++++++++- 5 files changed, 60 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..d40fff74 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,31 @@ 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 +251,13 @@ 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/JavadocNonLtsSiteIT.java b/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocNonLtsSiteIT.java index 424bea5c..e1fc2579 100644 --- a/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocNonLtsSiteIT.java +++ b/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocNonLtsSiteIT.java @@ -72,4 +72,11 @@ class JavadocNonLtsSiteIT extends JavadocSiteIT { void nestedClass(URI javadocBaseUrl) throws Exception { super.nestedClass(javadocBaseUrl); } + + @Override + @ParameterizedTest + @MethodSource("javadocBaseUrls") + void clazz(URI javadocBaseUrl) throws Exception { + super.clazz(javadocBaseUrl); + } } 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 dd603115..4d9ba32b 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 @@ -21,6 +21,7 @@ package org.apache.maven.tools.plugin.javadoc; 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; @@ -39,7 +40,7 @@ class JavadocSiteIT { @ParameterizedTest @MethodSource("javadocBaseUrls") void constructors(URI javadocBaseUrl) throws Exception { - 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))); } @@ -47,7 +48,7 @@ class JavadocSiteIT { @ParameterizedTest @MethodSource("javadocBaseUrls") void methods(URI javadocBaseUrl) throws Exception { - 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))); } @@ -55,7 +56,7 @@ class JavadocSiteIT { @ParameterizedTest @MethodSource("javadocBaseUrls") void fields(URI javadocBaseUrl) throws Exception { - 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))); } @@ -63,8 +64,15 @@ class JavadocSiteIT { @ParameterizedTest @MethodSource("javadocBaseUrls") void nestedClass(URI javadocBaseUrl) throws Exception { - 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 clazz(URI javadocBaseUrl) throws Exception { + 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 df37c599..05c5cd9e 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; @@ -110,6 +111,17 @@ class JavadocSiteTest { "org.apache.maven.tools.plugin.extractor.annotations.converter.test", "CurrentClass", false))); } + @Test + void classLinkFromPackageAndClassNameWithExternalJavadocRequiringModules() 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 getPackageAndClassName() { assertEquals( @@ -137,7 +149,7 @@ class JavadocSiteTest { throws 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) {
