You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kw...@apache.org on 2022/12/05 10:16:12 UTC

[maven-plugin-tools] branch master updated: [MPLUGIN-444] JavadocLinkGenerator.createLink: Support nested binary (#178)

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

kwin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-plugin-tools.git


The following commit(s) were added to refs/heads/master by this push:
     new fe699106 [MPLUGIN-444] JavadocLinkGenerator.createLink: Support nested binary (#178)
fe699106 is described below

commit fe699106870a285394de1faec4dde5c1c1a93987
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Mon Dec 5 11:16:07 2022 +0100

    [MPLUGIN-444] JavadocLinkGenerator.createLink: Support nested binary (#178)
---
 ...JavaAnnotationsMojoDescriptorExtractorTest.java |  6 -----
 .../converter/JavaClassConverterContextTest.java   |  5 +++-
 .../maven/tools/plugin/javadoc/JavadocSite.java    | 31 +++++++++++++++-------
 .../plugin/javadoc/JavadocLinkGeneratorTest.java   |  7 +++++
 .../maven/tools/plugin/javadoc/JavadocSiteIT.java  |  9 +++++++
 .../tools/plugin/javadoc/JavadocSiteTest.java      | 26 ++++++++++++++++++
 6 files changed, 68 insertions(+), 16 deletions(-)

diff --git a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/JavaAnnotationsMojoDescriptorExtractorTest.java b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/JavaAnnotationsMojoDescriptorExtractorTest.java
index 2545889a..6a27987d 100644
--- a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/JavaAnnotationsMojoDescriptorExtractorTest.java
+++ b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/JavaAnnotationsMojoDescriptorExtractorTest.java
@@ -19,24 +19,18 @@ package org.apache.maven.tools.plugin.extractor.annotations;
  * under the License.
  */
 
-import java.io.File;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.List;
-import java.util.Map;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.DefaultArtifact;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.descriptor.InvalidPluginDescriptorException;
 import org.apache.maven.plugin.descriptor.MojoDescriptor;
 import org.apache.maven.plugin.descriptor.PluginDescriptor;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.tools.plugin.DefaultPluginToolsRequest;
 import org.apache.maven.tools.plugin.extractor.ExtractionException;
diff --git a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/converter/JavaClassConverterContextTest.java b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/converter/JavaClassConverterContextTest.java
index c5db83fe..04c568e7 100644
--- a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/converter/JavaClassConverterContextTest.java
+++ b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/converter/JavaClassConverterContextTest.java
@@ -22,7 +22,6 @@ import java.io.File;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Collections;
-import java.util.Objects;
 
 import com.thoughtworks.qdox.JavaProjectBuilder;
 import com.thoughtworks.qdox.model.JavaClass;
@@ -101,6 +100,10 @@ class JavaClassConverterContextTest
         assertEquals( new FullyQualifiedJavadocReference( "org.apache.maven.tools.plugin.extractor.annotations.converter.test.other",
                                                           "OtherClassOtherPackage.EmbeddedEnum", false ),
                       context.resolveReference( ( JavadocReference.parse( "OtherClassOtherPackage.EmbeddedEnum" ) ) ) );
+        
+        // nested class from JDK
+        assertEquals( new FullyQualifiedJavadocReference( "java.util", "Map.Entry", true ),
+                context.resolveReference( JavadocReference.parse( "java.util.Map.Entry" ) ) );
     }
 
     @Test
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 93fddaa8..7983ef97 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
@@ -278,7 +278,7 @@ class JavadocSite
     }
 
     /**
-     * Splits up a given binary name into package name and class name part.
+     * Splits up a given binary class name into package name and simple class name part.
      * @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 a key value pair where the key is the package name and the value the class name
@@ -286,25 +286,38 @@ class JavadocSite
      */
     static Map.Entry<String, String> getPackageAndClassName( String binaryName )
     {
-     // assume binary name according to https://docs.oracle.com/javase/specs/jls/se8/html/jls-13.html#jls-13.1
+        // assume binary name according to https://docs.oracle.com/javase/specs/jls/se8/html/jls-13.html#jls-13.1
         int indexOfDollar = binaryName.indexOf( '$' );
+        int indexOfDotBetweenPackageAndClass;
         if ( indexOfDollar >= 0 ) 
         {
-            // emit some warning, as non resolvable: unclear which type of member follows if it is non digit
-            throw new IllegalArgumentException( "Can only resolve binary names of top level classes" );
+            // check following character
+            if ( Character.isDigit( binaryName.charAt( indexOfDollar + 1 ) ) )
+            {
+                // emit some warning, as non resolvable: unclear which type of member follows if it is non digit
+                throw new IllegalArgumentException( "Can only resolve binary names of member classes, "
+                        + "but not local or anonymous classes" );
+            }
+            // member is class, field or method....
+            indexOfDotBetweenPackageAndClass = binaryName.lastIndexOf( '.', indexOfDollar );
+            // replace dollar by dot
+            binaryName = binaryName.replace( '$', '.' );
+        } 
+        else
+        {
+            indexOfDotBetweenPackageAndClass = binaryName.lastIndexOf( '.' );
         }
-        int indexOfLastDot = binaryName.lastIndexOf( '.' );
-        if ( indexOfLastDot < 0 )
+        if ( indexOfDotBetweenPackageAndClass < 0 )
         {
             throw new IllegalArgumentException( "Resolving primitives is not supported. "
                 + "Binary name must contain at least one dot: " + binaryName );
         }
-        if ( indexOfLastDot == binaryName.length() - 1 )
+        if ( indexOfDotBetweenPackageAndClass == binaryName.length() - 1 )
         {
             throw new IllegalArgumentException( "Invalid binary name ending with a dot: " + binaryName );
         }
-        String packageName = binaryName.substring( 0, indexOfLastDot );
-        String className = binaryName.substring( indexOfLastDot + 1, binaryName.length() );
+        String packageName = binaryName.substring( 0, indexOfDotBetweenPackageAndClass );
+        String className = binaryName.substring( indexOfDotBetweenPackageAndClass + 1, binaryName.length() );
         return new AbstractMap.SimpleEntry<>( packageName, className );
     }
 
diff --git a/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocLinkGeneratorTest.java b/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocLinkGeneratorTest.java
index 620128bf..01a33419 100644
--- a/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocLinkGeneratorTest.java
+++ b/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocLinkGeneratorTest.java
@@ -22,6 +22,7 @@ package org.apache.maven.tools.plugin.javadoc;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Collections;
+import java.util.Map;
 
 import org.apache.maven.tools.plugin.javadoc.FullyQualifiedJavadocReference.MemberType;
 import org.codehaus.plexus.languages.java.version.JavaVersion;
@@ -91,6 +92,7 @@ class JavadocLinkGeneratorTest
         throws URISyntaxException
     {
         URI javadocBaseUri = getClass().getResource( "/javadoc/" + jdkName + "/" ).toURI();
+        
         JavadocLinkGenerator linkGenerator = new JavadocLinkGenerator( javadocBaseUri, version );
         // invalid link for primitives
         assertThrows( IllegalArgumentException.class, () -> linkGenerator.createLink( "boolean" ) );
@@ -99,6 +101,11 @@ class JavadocLinkGeneratorTest
                                                        "java/lang/String.html",
                                                        null ) ),
                       linkGenerator.createLink( "java.lang.String[]" ) );
+        // link for nested class
+        assertEquals( javadocBaseUri.resolve( new URI( null,
+                                                       "java/util/Map.Entry.html",
+                                                       null ) ),
+                      linkGenerator.createLink( Map.Entry.class.getName() ) );
 
     }
 
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 24fda84b..f331265f 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
@@ -82,4 +82,13 @@ class JavadocSiteIT
                                                                                              "CASE_INSENSITIVE_ORDER",
                                                                                              MemberType.FIELD, true ) ) );
     }
+    
+    @ParameterizedTest
+    @MethodSource( "javadocBaseUrls" )
+    void testNestedClass( URI javadocBaseUrl )
+            throws IOException
+    {
+        JavadocSite site = new JavadocSite( javadocBaseUrl, null );
+        JavadocSiteTest.assertUrlValid( site.createLink( new FullyQualifiedJavadocReference( "java.util", "Map.Entry", true ) ) );
+    }
 }
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 d276507b..ec0f963e 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
@@ -22,15 +22,21 @@ import java.io.BufferedReader;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.AbstractMap;
+import java.util.Map;
 import java.util.regex.Pattern;
 import java.util.stream.Stream;
 
 import org.apache.maven.tools.plugin.javadoc.FullyQualifiedJavadocReference.MemberType;
+import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 import org.opentest4j.AssertionFailedError;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
 /**
  * Tests against the locally available javadoc sites. Doesn't require internet connectivity.
  */
@@ -96,6 +102,26 @@ class JavadocSiteTest
         assertUrlValid( site.createLink( new FullyQualifiedJavadocReference( "org.apache.maven.tools.plugin.extractor.annotations.converter.test", "CurrentClass", false ) ) );
     }
 
+    @Test
+    void testGetPackageAndClassName()
+    {
+        assertEquals( new AbstractMap.SimpleEntry<>( "java.util", "Map" ), JavadocSite.getPackageAndClassName( Map.class.getName() ) );
+        assertEquals( new AbstractMap.SimpleEntry<>( "java.util", "Map.Entry" ), JavadocSite.getPackageAndClassName( Map.Entry.class.getName() ) );
+        assertEquals( new AbstractMap.SimpleEntry<>( "org.apache.maven.tools.plugin.javadoc", "JavadocSiteTest.NestedClass.DeeplyNestedClass" ),
+                JavadocSite.getPackageAndClassName( NestedClass.DeeplyNestedClass.class.getName() ) );
+        assertThrows( IllegalArgumentException.class, () -> JavadocSite.getPackageAndClassName( "java.util.Map$0001Entry" ) ); // some local class
+        assertThrows( IllegalArgumentException.class, () -> JavadocSite.getPackageAndClassName( "java.util." ) );
+        assertThrows( IllegalArgumentException.class, () -> JavadocSite.getPackageAndClassName( "int" ) );
+    }
+
+    public static final class NestedClass
+    {
+        public static final class DeeplyNestedClass
+        {
+            
+        }
+    }
+
     static JavadocSite getLocalJavadocSite( String name, JavadocLinkGenerator.JavadocToolVersionRange version )
         throws IOException, URISyntaxException
     {