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 2016/07/10 09:58:59 UTC

svn commit: r1752069 - in /maven/plugins/trunk/maven-javadoc-plugin/src: main/java/org/apache/maven/plugin/javadoc/AbstractFixJavadocMojo.java test/java/org/apache/maven/plugin/javadoc/FixJavadocMojoTest.java

Author: rfscholte
Date: Sun Jul 10 09:58:59 2016
New Revision: 1752069

URL: http://svn.apache.org/viewvc?rev=1752069&view=rev
Log:
[MJAVADOC-452] Several fixes for comment corruption in fix goal
Add parameter removeUnknownThrows
Patch contributed by Richard Sand; reviewed and applied with adjustments by Robert Scholte

Modified:
    maven/plugins/trunk/maven-javadoc-plugin/src/main/java/org/apache/maven/plugin/javadoc/AbstractFixJavadocMojo.java
    maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugin/javadoc/FixJavadocMojoTest.java

Modified: maven/plugins/trunk/maven-javadoc-plugin/src/main/java/org/apache/maven/plugin/javadoc/AbstractFixJavadocMojo.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-javadoc-plugin/src/main/java/org/apache/maven/plugin/javadoc/AbstractFixJavadocMojo.java?rev=1752069&r1=1752068&r2=1752069&view=diff
==============================================================================
--- maven/plugins/trunk/maven-javadoc-plugin/src/main/java/org/apache/maven/plugin/javadoc/AbstractFixJavadocMojo.java (original)
+++ maven/plugins/trunk/maven-javadoc-plugin/src/main/java/org/apache/maven/plugin/javadoc/AbstractFixJavadocMojo.java Sun Jul 10 09:58:59 2016
@@ -305,6 +305,12 @@ public abstract class AbstractFixJavadoc
     private boolean fixMethodComment;
 
     /**
+     * Flag to remove throws tags from unknown classes.
+     */
+    @Parameter ( property = "removeUnknownThrows", defaultValue = "false" )
+    private boolean removeUnknownThrows;
+
+    /**
      * Forcing the goal execution i.e. skip warranty messages (not recommended).
      */
     @Parameter ( property = "force" )
@@ -1881,7 +1887,7 @@ public abstract class AbstractFixJavadoc
      * @return an instance of {@link JavaEntityTags}
      * @throws IOException if any
      */
-    private JavaEntityTags parseJavadocTags( final String originalContent, final AbstractInheritableJavaEntity entity,
+    JavaEntityTags parseJavadocTags( final String originalContent, final AbstractInheritableJavaEntity entity,
                                              final String indent, final boolean isJavaMethod )
         throws IOException
     {
@@ -2105,7 +2111,7 @@ public abstract class AbstractFixJavadoc
         }
     }
 
-    private void writeThrowsTag( final StringBuilder sb, final JavaMethod javaMethod,
+    void writeThrowsTag( final StringBuilder sb, final JavaMethod javaMethod,
                                  final JavaEntityTags javaEntityTags, final String[] params )
     {
         String exceptionClassName = params[0];
@@ -2149,28 +2155,45 @@ public abstract class AbstractFixJavadoc
             }
         }
 
-        // Maybe a RuntimeException
-        Class<?> clazz = getRuntimeExceptionClass( javaMethod.getParentClass(), exceptionClassName );
+        Class<?> clazz = getClass( javaMethod.getParentClass(), exceptionClassName );
+        
         if ( clazz != null )
         {
-            sb.append( StringUtils.replace( originalJavadocTag, exceptionClassName, clazz.getName() ) );
-
-            // added qualified name
-            javaEntityTags.putJavadocThrowsTag( clazz.getName(), originalJavadocTag );
+            if ( ClassUtils.isAssignable( clazz, RuntimeException.class ) )
+            {
+                sb.append( StringUtils.replace( originalJavadocTag, exceptionClassName, clazz.getName() ) );
 
-            return;
+                // added qualified name
+                javaEntityTags.putJavadocThrowsTag( clazz.getName(), originalJavadocTag );
+            }
+            else if ( ClassUtils.isAssignable( clazz, Throwable.class ) )
+            {
+                getLog().debug( "Removing '" + originalJavadocTag + "'; Throwable not specified by "
+                    + getJavaMethodAsString( javaMethod ) + " and it is not a RuntimeException." );
+            }
+            else
+            {
+                getLog().debug( "Removing '" + originalJavadocTag + "'; It is not a Throwable" );
+            }
         }
-
-        if ( getLog().isWarnEnabled() )
+        else if ( removeUnknownThrows )
         {
-            getLog().warn( "Unknown throws exception '" + exceptionClassName + "' defined in " + getJavaMethodAsString(
-                javaMethod ) );
+            getLog().warn( "Ignoring unknown throws '" + exceptionClassName + "' defined on "
+                    + getJavaMethodAsString( javaMethod ) );
         }
-
-        sb.append( originalJavadocTag );
-        if ( params.length == 1 )
+        else
         {
-            sb.append( " if any." );
+            getLog().warn( "Found unknown throws '" + exceptionClassName + "' defined on "
+                    + getJavaMethodAsString( javaMethod ) );
+            
+            sb.append( originalJavadocTag );
+            
+            if ( params.length == 1 )
+            {
+                sb.append( " if any." );
+            }
+            
+            javaEntityTags.putJavadocThrowsTag( exceptionClassName, originalJavadocTag );
         }
     }
 
@@ -2906,10 +2929,10 @@ public abstract class AbstractFixJavadoc
      *                           <li>exception inner class</li>
      *                           <li>exception class in java.lang package</li>
      *                           </ul>
-     * @return a RuntimeException assignable class.
+     * @return the class if found, otherwise {@code null}.
      * @see #getClass(String)
      */
-    private Class<?> getRuntimeExceptionClass( JavaClass currentClass, String exceptionClassName )
+    private Class<?> getClass( JavaClass currentClass, String exceptionClassName )
     {
         String[] potentialClassNames =
             new String[]{ exceptionClassName, currentClass.getPackage().getName() + "." + exceptionClassName,
@@ -2927,7 +2950,7 @@ public abstract class AbstractFixJavadoc
             {
                 // nop
             }
-            if ( clazz != null && ClassUtils.isAssignable( clazz, RuntimeException.class ) )
+            if ( clazz != null )
             {
                 return clazz;
             }
@@ -3615,7 +3638,7 @@ public abstract class AbstractFixJavadoc
     /**
      * Wrapper class for the entity's tags.
      */
-    private class JavaEntityTags
+    class JavaEntityTags
     {
         private final AbstractInheritableJavaEntity entity;
 

Modified: maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugin/javadoc/FixJavadocMojoTest.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugin/javadoc/FixJavadocMojoTest.java?rev=1752069&r1=1752068&r2=1752069&view=diff
==============================================================================
--- maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugin/javadoc/FixJavadocMojoTest.java (original)
+++ maven/plugins/trunk/maven-javadoc-plugin/src/test/java/org/apache/maven/plugin/javadoc/FixJavadocMojoTest.java Sun Jul 10 09:58:59 2016
@@ -28,8 +28,10 @@ import java.util.List;
 
 import junitx.util.PrivateAccessor;
 
+import org.apache.maven.plugin.javadoc.AbstractFixJavadocMojo.JavaEntityTags;
 import org.apache.maven.plugin.logging.Log;
 import org.apache.maven.plugin.testing.AbstractMojoTestCase;
+import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
 import org.apache.maven.shared.invoker.MavenInvocationException;
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.IOUtil;
@@ -578,6 +580,51 @@ public class FixJavadocMojoTest
         assertEquals("return", fixTags[0]);
         assertEquals(1, fixTags.length);
     }
+    
+    public void testRemoveUnknownExceptions() throws Exception
+    {
+        AbstractFixJavadocMojo mojoInstance = new FixJavadocMojo();
+        setVariableValueToObject( mojoInstance, "fixTagsSplitted", new String[] { "all" } );
+        setVariableValueToObject( mojoInstance, "project", new MavenProjectStub() );
+
+        String source = "package a.b.c;" + EOL
+                        + "public class Clazz {" + EOL
+                        + " /**" + EOL
+                        + " * @throws java.lang.RuntimeException" + EOL
+                        + " * @throws NumberFormatException" + EOL
+                        + " * @throws java.lang.Exception" + EOL // not thrown and no RTE -> remove
+                        + " * @throws com.foo.FatalException" + EOL // not on classpath (?!) -> see removeUnknownThrows
+                        + " */" + EOL
+                        + " public void method() {}" + EOL                        
+                        + "}";
+
+        JavaDocBuilder builder = new JavaDocBuilder();
+        JavaMethod javaMethod = builder.addSource( new StringReader( source ) ).getClasses()[0].getMethods()[0];
+        
+        JavaEntityTags javaEntityTags = mojoInstance.parseJavadocTags( source, javaMethod, "", true );
+        
+        StringBuilder sb = new StringBuilder();
+        mojoInstance.writeThrowsTag( sb, javaMethod, javaEntityTags, new String[] { "java.lang.RuntimeException" } );
+        assertEquals( " * @throws java.lang.RuntimeException", sb.toString() );
+
+        sb = new StringBuilder();
+        mojoInstance.writeThrowsTag( sb, javaMethod, javaEntityTags, new String[] { "NumberFormatException" } );
+        assertEquals( " * @throws java.lang.NumberFormatException", sb.toString() );
+
+        sb = new StringBuilder();
+        mojoInstance.writeThrowsTag( sb, javaMethod, javaEntityTags, new String[] { "java.lang.Exception" } );
+        assertEquals( "", sb.toString() );
+        
+        setVariableValueToObject( mojoInstance, "removeUnknownThrows", true );
+        sb = new StringBuilder();
+        mojoInstance.writeThrowsTag( sb, javaMethod, javaEntityTags, new String[] { "com.foo.FatalException" } );
+        assertEquals( "", sb.toString() );
+
+        setVariableValueToObject( mojoInstance, "removeUnknownThrows", false );
+        sb = new StringBuilder();
+        mojoInstance.writeThrowsTag( sb, javaMethod, javaEntityTags, new String[] { "com.foo.FatalException" } );
+        assertEquals( " * @throws com.foo.FatalException if any.", sb.toString() );
+    }
 
     // ----------------------------------------------------------------------
     // private methods