Improve JDeprScanConsumer
authorRobert Scholte <rfscholte@apache.org>
Sun, 22 Oct 2017 11:41:02 +0000 (11:41 +0000)
committerRobert Scholte <rfscholte@apache.org>
Sun, 22 Oct 2017 11:41:02 +0000 (11:41 +0000)
git-svn-id: https://svn.apache.org/repos/asf/maven/plugins/trunk@1812898 13f79535-47bb-0310-9956-ffa450edef68

src/it/projects/jdeprscan-release8/invoker.properties
src/it/projects/jdeprscan-release9/invoker.properties
src/main/java/org/apache/maven/plugins/jdeprscan/AbstractJDeprScanMojo.java
src/main/java/org/apache/maven/plugins/jdeprscan/BaseJDeprScanMojo.java
src/main/java/org/apache/maven/plugins/jdeprscan/consumers/JDeprScanConsumer.java
src/test/java/org/apache/maven/plugins/jdeprscan/consumers/JDeprScanConsumerTest.java [new file with mode: 0644]

index cb52a4c..c99dc4e 100644 (file)
@@ -14,4 +14,5 @@
 # KIND, either express or implied.  See the License for the\r
 # specific language governing permissions and limitations\r
 # under the License.\r
+invoker.buildResult = failure\r
 invoker.goals = verify
\ No newline at end of file
index cb52a4c..c99dc4e 100644 (file)
@@ -14,4 +14,5 @@
 # KIND, either express or implied.  See the License for the\r
 # specific language governing permissions and limitations\r
 # under the License.\r
+invoker.buildResult = failure\r
 invoker.goals = verify
\ No newline at end of file
index d712345..a40977c 100644 (file)
@@ -35,7 +35,6 @@ import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;\r
 import org.apache.maven.plugins.annotations.Component;\r
 import org.apache.maven.plugins.annotations.Parameter;\r
-import org.apache.maven.plugins.jdeprscan.consumers.JDeprScanConsumer;\r
 import org.apache.maven.toolchain.Toolchain;\r
 import org.apache.maven.toolchain.ToolchainManager;\r
 import org.codehaus.plexus.util.StringUtils;\r
@@ -55,9 +54,6 @@ public abstract class AbstractJDeprScanMojo
     @Parameter( defaultValue = "${session}", readonly = true, required = true )\r
     private MavenSession session;\r
     \r
-    \r
-    @Parameter()\r
-\r
     @Component\r
     private ToolchainManager toolchainManager;\r
 \r
@@ -82,7 +78,18 @@ public abstract class AbstractJDeprScanMojo
 \r
         addJDeprScanOptions( cmd );\r
 \r
-        executeJDeprScanCommandLine( cmd, new JDeprScanConsumer() );\r
+        executeJDeprScanCommandLine( cmd, getConsumer() );\r
+        \r
+        verify();\r
+    }\r
+    \r
+    protected CommandLineUtils.StringStreamConsumer getConsumer()\r
+    {\r
+      return null;    \r
+    }\r
+    \r
+    protected void verify() throws MojoExecutionException\r
+    {\r
     }\r
     \r
     protected abstract boolean isForRemoval();\r
@@ -192,13 +199,13 @@ public abstract class AbstractJDeprScanMojo
 \r
             String output = ( StringUtils.isEmpty( out.getOutput() ) ? null : '\n' + out.getOutput().trim() );\r
 \r
-            if ( exitCode != 0 )\r
+            if ( StringUtils.isNotEmpty( output ) )\r
             {\r
-                if ( StringUtils.isNotEmpty( output ) )\r
-                {\r
-                    getLog().info( output );\r
-                }\r
+                getLog().info( output );\r
+            }\r
 \r
+            if ( exitCode != 0 )\r
+            {\r
                 StringBuilder msg = new StringBuilder( "\nExit code: " );\r
                 msg.append( exitCode );\r
                 if ( StringUtils.isNotEmpty( err.getOutput() ) )\r
@@ -211,10 +218,6 @@ public abstract class AbstractJDeprScanMojo
                 throw new MojoExecutionException( msg.toString() );\r
             }\r
 \r
-            if ( StringUtils.isNotEmpty( output ) )\r
-            {\r
-                getLog().info( output );\r
-            }\r
         }\r
         catch ( CommandLineException e )\r
         {\r
index 97cb8f8..763d90e 100644 (file)
@@ -23,15 +23,19 @@ import java.io.File;
 import java.nio.file.Files;\r
 import java.nio.file.Path;\r
 import java.util.Collection;\r
+import java.util.Map;\r
+import java.util.Set;\r
 \r
 import org.apache.maven.artifact.DependencyResolutionRequiredException;\r
 import org.apache.maven.plugin.MojoExecutionException;\r
 import org.apache.maven.plugin.MojoFailureException;\r
 \r
 import org.apache.maven.plugins.annotations.Parameter;\r
+import org.apache.maven.plugins.jdeprscan.consumers.JDeprScanConsumer;\r
 import org.apache.maven.project.MavenProject;\r
 import org.codehaus.plexus.util.StringUtils;\r
 import org.codehaus.plexus.util.cli.Commandline;\r
+import org.codehaus.plexus.util.cli.CommandLineUtils.StringStreamConsumer;\r
 \r
 /**\r
  * Base class for all explicit jdeprscan mojos\r
@@ -63,13 +67,15 @@ public abstract class BaseJDeprScanMojo extends AbstractJDeprScanMojo
     @Parameter\r
     private String release;\r
     \r
+    private JDeprScanConsumer consumer = new JDeprScanConsumer();\r
+    \r
     @Override\r
     public void execute()\r
         throws MojoExecutionException, MojoFailureException\r
     {\r
         if ( !Files.exists( getClassesDirectory() ) )\r
         {\r
-            getLog().debug( "No classes to analyze" );\r
+            getLog().debug( "No classes to scan" );\r
             return;\r
         }\r
         super.execute();\r
@@ -87,6 +93,12 @@ public abstract class BaseJDeprScanMojo extends AbstractJDeprScanMojo
     }\r
     \r
     @Override\r
+    protected StringStreamConsumer getConsumer()\r
+    {\r
+        return consumer;\r
+    }\r
+    \r
+    @Override\r
     protected final void addJDeprScanOptions( Commandline cmd ) throws MojoFailureException\r
     {\r
         super.addJDeprScanOptions( cmd );\r
@@ -117,7 +129,46 @@ public abstract class BaseJDeprScanMojo extends AbstractJDeprScanMojo
         \r
         cmd.createArg().setFile( getClassesDirectory().toFile() );\r
     }\r
-    \r
+\r
+    @Override\r
+    protected void verify() throws MojoExecutionException\r
+    {\r
+        if ( !( consumer.getDeprecatedClasses().isEmpty() && consumer.getDeprecatedMethods().isEmpty() ) )\r
+        {\r
+            if ( !consumer.getDeprecatedClasses().isEmpty() )\r
+            {\r
+                getLog().warn( "Found usage of deprecated classes:" );\r
+                \r
+                for ( Map.Entry<String, Set<String>> classes : consumer.getDeprecatedClasses().entrySet() )\r
+                {\r
+                    getLog().warn( "class " + classes.getKey() + " uses deprecated class(es)" );\r
+                    for ( String deprClass : classes.getValue() )\r
+                    {\r
+                        getLog().warn( "  * " + deprClass );\r
+                    }\r
+                }\r
+            }\r
+            \r
+            if ( !consumer.getDeprecatedMethods().isEmpty() )\r
+            {\r
+                getLog().warn( "Found usage of deprecated methods:" );\r
+                \r
+                for ( Map.Entry<String, Set<String>> classes : consumer.getDeprecatedMethods().entrySet() )\r
+                {\r
+                    getLog().warn( "class " + classes.getKey() + " uses deprecated method(s)" );\r
+                    for ( String deprMethod : classes.getValue() )\r
+                    {\r
+                        getLog().warn( "  * " + deprMethod );\r
+                    }\r
+                }\r
+            }\r
+            \r
+            if ( failOnWarning )\r
+            {\r
+                throw new MojoExecutionException( "JDeprScan detected usage of deprecated classes/methods" );\r
+            }\r
+        }\r
+    }\r
 \r
     protected abstract Path getClassesDirectory();\r
     \r
index 3983efd..1a5d51c 100644 (file)
@@ -19,6 +19,13 @@ package org.apache.maven.plugins.jdeprscan.consumers;
  * under the License.\r
  */\r
 \r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.Map;\r
+import java.util.Set;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
 import org.codehaus.plexus.util.cli.CommandLineUtils;\r
 import org.codehaus.plexus.util.cli.StreamConsumer;\r
 \r
@@ -33,4 +40,55 @@ public class JDeprScanConsumer
     implements StreamConsumer\r
 {\r
 \r
+    private Map<String, Set<String>> deprecatedClasses = new HashMap<>();\r
+\r
+    private Map<String, Set<String>> deprecatedMethods = new HashMap<>();\r
+\r
+    public static final Pattern DEPRECATED_CLASS = Pattern.compile( "^class (\\S+) uses deprecated class (\\S+)" );\r
+\r
+    public static final Pattern DEPRECATED_METHOD = Pattern.compile( "^class (\\S+) uses deprecated method (\\S+)" );\r
+\r
+    public Map<String, Set<String>> getDeprecatedClasses()\r
+    {\r
+        return deprecatedClasses;\r
+    }\r
+    \r
+    public Map<String, Set<String>> getDeprecatedMethods()\r
+    {\r
+        return deprecatedMethods;\r
+    }\r
+    \r
+    @Override\r
+    public void consumeLine( String line )\r
+    {\r
+        super.consumeLine( line );\r
+\r
+        Matcher matcher;\r
+        \r
+        matcher = DEPRECATED_CLASS.matcher( line );\r
+        if ( matcher.find() )\r
+        {\r
+            Set<String> dc = deprecatedClasses.get( matcher.group( 1 ) );\r
+            if ( dc == null )\r
+            {\r
+                dc = new HashSet<>();\r
+                deprecatedClasses.put( matcher.group( 1 ), dc );\r
+            }\r
+            dc.add( matcher.group( 2 ) );\r
+            return;\r
+        }\r
+        \r
+        matcher = DEPRECATED_METHOD.matcher( line );\r
+        if ( matcher.find() )\r
+        {\r
+            Set<String> dm = deprecatedMethods.get( matcher.group( 1 ) );\r
+            if ( dm == null )\r
+            {\r
+                dm = new HashSet<>();\r
+                deprecatedMethods.put( matcher.group( 1 ), dm );\r
+            }\r
+            dm.add( matcher.group( 2 ) );\r
+            return;\r
+        }\r
+    }\r
 }\r
diff --git a/src/test/java/org/apache/maven/plugins/jdeprscan/consumers/JDeprScanConsumerTest.java b/src/test/java/org/apache/maven/plugins/jdeprscan/consumers/JDeprScanConsumerTest.java
new file mode 100644 (file)
index 0000000..0126ddb
--- /dev/null
@@ -0,0 +1,63 @@
+package org.apache.maven.plugins.jdeprscan.consumers;\r
+\r
+/*\r
+ * Licensed to the Apache Software Foundation (ASF) under one\r
+ * or more contributor license agreements.  See the NOTICE file\r
+ * distributed with this work for additional information\r
+ * regarding copyright ownership.  The ASF licenses this file\r
+ * to you under the Apache License, Version 2.0 (the\r
+ * "License"); you may not use this file except in compliance\r
+ * with the License.  You may obtain a copy of the License at\r
+ *\r
+ *   http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing,\r
+ * software distributed under the License is distributed on an\r
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r
+ * KIND, either express or implied.  See the License for the\r
+ * specific language governing permissions and limitations\r
+ * under the License.\r
+ */\r
+\r
+import static org.junit.Assert.assertEquals;\r
+\r
+import java.util.Collections;\r
+import java.util.Set;\r
+\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+\r
+public class JDeprScanConsumerTest\r
+{\r
+    private JDeprScanConsumer consumer;\r
+    \r
+    @Before\r
+    public void setUp()\r
+    {\r
+        consumer = new JDeprScanConsumer();\r
+    }\r
+\r
+    @Test\r
+    public void testDeprecatedClass()\r
+    {\r
+        consumer.consumeLine( "class o/a/m/p/j/its/Deprecations uses deprecated class java/rmi/RMISecurityManager " );\r
+        \r
+        assertEquals( consumer.getDeprecatedClasses().size(), 1 );\r
+        assertEquals( consumer.getDeprecatedMethods().size(), 0 );\r
+        \r
+        Set<String> classes = consumer.getDeprecatedClasses().get( "o/a/m/p/j/its/Deprecations" );\r
+        assertEquals( Collections.singleton( "java/rmi/RMISecurityManager" ), classes );\r
+    }\r
+\r
+    @Test\r
+    public void testDeprecatedMethod()\r
+    {\r
+        consumer.consumeLine( "class o/a/m/p/j/its/Deprecations uses deprecated method java/lang/Boolean::<init>(Z)V" );\r
+        \r
+        assertEquals( consumer.getDeprecatedClasses().size(), 0 );\r
+        assertEquals( consumer.getDeprecatedMethods().size(), 1 );\r
+        \r
+        Set<String> methods = consumer.getDeprecatedMethods().get( "o/a/m/p/j/its/Deprecations" );\r
+        assertEquals( Collections.singleton( "java/lang/Boolean::<init>(Z)V" ), methods );\r
+    }\r
+}\r