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 2020/12/20 15:40:55 UTC

[maven] 01/01: [MNG-5563] Ensuring only the available parameters are allowed

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

rfscholte pushed a commit to branch MNG-5563
in repository https://gitbox.apache.org/repos/asf/maven.git

commit 19f1b2c0bc48f2a35c2a5104665c01a27a81730a
Author: rfscholte <rf...@apache.org>
AuthorDate: Sun Dec 20 16:40:44 2020 +0100

    [MNG-5563] Ensuring only the available parameters are allowed
---
 .../lifecycle/internal/builder/BuilderCommon.java  | 83 +++++++++++++++++++++-
 1 file changed, 81 insertions(+), 2 deletions(-)

diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/BuilderCommon.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/BuilderCommon.java
index 8ad2650..2b591bb 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/BuilderCommon.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/BuilderCommon.java
@@ -19,7 +19,12 @@ package org.apache.maven.lifecycle.internal.builder;
  * under the License.
  */
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -42,7 +47,9 @@ import org.apache.maven.lifecycle.internal.LifecycleDebugLogger;
 import org.apache.maven.lifecycle.internal.LifecycleExecutionPlanCalculator;
 import org.apache.maven.lifecycle.internal.ReactorContext;
 import org.apache.maven.lifecycle.internal.TaskSegment;
+import org.apache.maven.model.InputLocation;
 import org.apache.maven.model.Plugin;
+import org.apache.maven.model.PluginExecution;
 import org.apache.maven.plugin.InvalidPluginDescriptorException;
 import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.plugin.MojoNotFoundException;
@@ -50,11 +57,13 @@ import org.apache.maven.plugin.PluginDescriptorParsingException;
 import org.apache.maven.plugin.PluginNotFoundException;
 import org.apache.maven.plugin.PluginResolutionException;
 import org.apache.maven.plugin.descriptor.MojoDescriptor;
+import org.apache.maven.plugin.descriptor.Parameter;
 import org.apache.maven.plugin.prefix.NoPluginFoundForPrefixException;
 import org.apache.maven.plugin.version.PluginVersionResolutionException;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.classworlds.realm.ClassRealm;
 import org.codehaus.plexus.logging.Logger;
+import org.codehaus.plexus.util.xml.Xpp3Dom;
 
 /**
  * Common code that is shared by the LifecycleModuleBuilder and the LifeCycleWeaveBuilder
@@ -105,6 +114,18 @@ public class BuilderCommon
 
         lifecycleDebugLogger.debugProjectPlan( project, executionPlan );
 
+        findNonThreadSafePlugins( project, executionPlan, session );
+
+        findUnversionedPlugins( project, executionPlan );
+
+        findUnknownParameterNames( project, executionPlan );
+
+        return executionPlan;
+    }
+
+    private void findNonThreadSafePlugins( MavenProject project, MavenExecutionPlan executionPlan,
+                                               MavenSession session )
+    {
         if ( session.getRequest().getDegreeOfConcurrency() > 1 )
         {
             final Set<Plugin> unsafePlugins = executionPlan.getNonThreadSafePlugins();
@@ -140,7 +161,10 @@ public class BuilderCommon
                 logger.warn( "*****************************************************************" );
             }
         }
-        
+    }
+
+    private void findUnversionedPlugins( MavenProject project, MavenExecutionPlan executionPlan )
+    {
         final String defaulModelId = DefaultLifecyclePluginAnalyzer.DEFAULTLIFECYCLEBINDINGS_MODELID;
         
         List<String> unversionedPlugins = executionPlan.getMojoExecutions().stream()
@@ -157,8 +181,63 @@ public class BuilderCommon
             logger.warn( "Version not locked for default bindings plugins " + unversionedPlugins
                 + ", you should define versions in pluginManagement section of your " + "pom.xml or parent" );
         }
+    }
 
-        return executionPlan;
+    private void findUnknownParameterNames( MavenProject project, MavenExecutionPlan executionPlan )
+    {
+        // Verify that all configured parameters in the pom match a parameter of the mojo
+        Map<Plugin, List<MojoExecution>> sharedExecutions = executionPlan.getMojoExecutions().stream()
+            .collect( Collectors.groupingBy( MojoExecution::getPlugin ) );
+        
+        for ( Map.Entry<Plugin, List<MojoExecution>> entry : sharedExecutions.entrySet() )
+        {
+            Map<String, Set<String>> validParametersPerExecutionId = new HashMap<>();
+            
+            entry.getValue().stream()
+                .filter( e -> e.getMojoDescriptor().getParameters() != null )
+                .forEach( e -> validParametersPerExecutionId.computeIfAbsent( e.getExecutionId(), 
+                      k -> new HashSet<>() ).addAll( parameterNames( e.getMojoDescriptor().getParameters() ) ) );
+
+            for ( Map.Entry<String, PluginExecution> pc : entry.getKey().getExecutionsAsMap().entrySet() )
+            {
+                Set<String> validParams =
+                    validParametersPerExecutionId.getOrDefault( pc.getKey(), Collections.emptySet() );
+                Xpp3Dom pluginConfiguration = (Xpp3Dom) pc.getValue().getConfiguration();
+                
+                if ( pluginConfiguration != null )
+                {
+                    List<Xpp3Dom> unknownParameters = Arrays.stream( pluginConfiguration.getChildren() )
+                                    .filter( e -> !validParams.contains( e.getName() ) )
+                                    .collect( Collectors.toList() );
+
+                    if ( !unknownParameters.isEmpty() )
+                    {
+                        logger.warn( String.format( "Unknown parameters for %s (%s):", 
+                                                   entry.getKey().getId(), pc.getKey(), unknownParameters ) );
+                        
+                        for ( Xpp3Dom param : unknownParameters )
+                        {
+                            InputLocation loc = (InputLocation) param.getInputLocation();
+                            
+                            // in case the parameter is defined in 'project', we could break the build
+                            logger.warn( String.format( "  <%s> @ %s, line %s", 
+                                        param.getName(), loc.getSource().getModelId(), loc.getLineNumber() ) );
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private Set<String> parameterNames( List<Parameter> parameters )
+    {
+        Set<String> names = new HashSet<>( parameters.size() * 2 );
+        for ( Parameter p : parameters )
+        {
+            names.add( p.getName() );
+            names.add( p.getAlias() );
+        }
+        return names;
     }
 
     public void handleBuildError( final ReactorContext buildContext, final MavenSession rootSession,