You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by rf...@apache.org on 2018/12/09 14:45:46 UTC

[maven-javadoc-plugin] 05/05: Use regular expression to match excludePackageNames

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

rfscholte pushed a commit to branch MJAVADOC-548
in repository https://gitbox.apache.org/repos/asf/maven-javadoc-plugin.git

commit 56733178c0241deb114e014609b16c9d9d7a9588
Author: rfscholte <rf...@apache.org>
AuthorDate: Sun Dec 9 15:45:32 2018 +0100

    Use regular expression to match excludePackageNames
---
 src/it/projects/MJAVADOC-497/pom.xml               |  2 +-
 .../maven/plugins/javadoc/AbstractJavadocMojo.java | 10 ++++++++-
 .../apache/maven/plugins/javadoc/JavadocUtil.java  | 24 +++++++++++++---------
 3 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/src/it/projects/MJAVADOC-497/pom.xml b/src/it/projects/MJAVADOC-497/pom.xml
index 9b89c69..c664cd7 100644
--- a/src/it/projects/MJAVADOC-497/pom.xml
+++ b/src/it/projects/MJAVADOC-497/pom.xml
@@ -46,7 +46,7 @@
           <version>@pom.version@</version>
           <configuration>
             <subpackages>com.example.foo</subpackages>
-            <excludePackageNames>*.impl.*</excludePackageNames>
+            <excludePackageNames>**.impl</excludePackageNames>
           </configuration>
         </plugin>
       </plugins>
diff --git a/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java b/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java
index c0eaaca..4ff10ec 100644
--- a/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java
+++ b/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java
@@ -766,7 +766,14 @@ public abstract class AbstractJavadocMojo
      * Unconditionally excludes the specified packages and their subpackages from the list formed by
      * <code>-subpackages</code>. Multiple packages can be separated by commas (<code>,</code>), colons (<code>:</code>)
      * or semicolons (<code>;</code>).
-     * <br/>
+     * <p>
+     * Wildcards work as followed:
+     * <ul>
+     *   <li>a wildcard at the beginning should match 1 or more folders</li>
+     *   <li>any other wildcard must match exactly one folder</li>
+     * </ul>
+     * </p>
+     * <p>
      * Example:
      * <pre>
      * &lt;excludePackageNames&gt;*.internal:org.acme.exclude1.*:org.acme.exclude2&lt;/excludePackageNames&gt;
@@ -776,6 +783,7 @@ public abstract class AbstractJavadocMojo
      * <br/>
      * Since <a href="http://docs.oracle.com/javase/7/docs/technotes/guides/javadoc/whatsnew-1.4.html#summary">Java
      * 1.4</a>.
+     * </p>
      */
     @Parameter( property = "excludePackageNames" )
     private String excludePackageNames;
diff --git a/src/main/java/org/apache/maven/plugins/javadoc/JavadocUtil.java b/src/main/java/org/apache/maven/plugins/javadoc/JavadocUtil.java
index a6b0b9b..2e24e06 100644
--- a/src/main/java/org/apache/maven/plugins/javadoc/JavadocUtil.java
+++ b/src/main/java/org/apache/maven/plugins/javadoc/JavadocUtil.java
@@ -389,6 +389,8 @@ public class JavadocUtil
     protected static Collection<String> getExcludedPackages( final Path sourceDirectory,
                                                              Collection<String> excludePackagenames )
     {
+        final String regexFileSeparator = File.separator.replace( "\\", "\\\\" );
+        
         final Collection<String> fileList = new ArrayList<>();
         
         try
@@ -401,7 +403,7 @@ public class JavadocUtil
                 {
                     if ( file.getFileName().toString().endsWith( ".java" ) )
                     {
-                        fileList.add( sourceDirectory.relativize( file ).toString() );
+                        fileList.add( sourceDirectory.relativize( file.getParent() ).toString() );
                     }
                     return FileVisitResult.CONTINUE;
                 }
@@ -415,18 +417,20 @@ public class JavadocUtil
         List<String> files = new ArrayList<>();
         for ( String excludePackagename : excludePackagenames )
         {
-            String[] excludeName = excludePackagename.replace( '.', File.separatorChar ).split( "[*]" );
-
+            // Usage of wildcard was bad specified and bad implemented, i.e. using String.contains() 
+            //   without respecting surrounding context
+            // Following implementation should match requirements as defined in the examples:  
+            // - A wildcard at the beginning should match 1 or more folders
+            // - Any other wildcard must match exactly one folder
+            Pattern p = Pattern.compile( excludePackagename.replace( ".", regexFileSeparator )
+                                                           .replaceFirst( "^\\*", ".+" )
+                                                           .replace( "*", "[^" + regexFileSeparator + "]+" ) );
+            
             for ( String aFileList : fileList )
             {
-                for ( String excludePart : excludeName )
+                if ( p.matcher( aFileList ).matches() )
                 {
-                    if ( !"".equals( excludePart.trim() ) && aFileList.contains( excludePart ) )
-                    {
-                        int idx = aFileList.lastIndexOf( File.separatorChar );
-
-                        files.add( aFileList.substring( 0, idx ).replace( File.separatorChar, '.' ) );
-                    }
+                    files.add( aFileList.replace( File.separatorChar, '.' ) );
                 }
             }
         }