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

gnodet pushed a commit to branch mvn4
in repository https://gitbox.apache.org/repos/asf/maven.git

commit 44b8c1851393f7d38a119d4f24da8407cd45d35f
Author: Guillaume Nodet <gno...@gmail.com>
AuthorDate: Fri Nov 26 13:41:27 2021 +0100

    [MNG-7391] add execution strategy+runner required by Maven Build Cache
---
 .../apache/maven/lifecycle/DefaultLifecycles.java  |  3 ++
 .../internal/DefaultLifecyclePluginAnalyzer.java   |  2 +-
 .../maven/lifecycle/internal/MojoExecutor.java     | 28 +++++++++----
 .../plugin/DefaultMojosExecutionStrategy.java      | 46 ++++++++++++++++++++++
 .../apache/maven/plugin/MojoExecutionRunner.java   | 36 +++++++++++++++++
 .../maven/plugin/MojosExecutionStrategy.java       | 45 +++++++++++++++++++++
 .../plugin/internal/DefaultMavenPluginManager.java | 15 +++++++
 .../lifecycle/internal/stub/MojoExecutorStub.java  | 18 ++++-----
 8 files changed, 175 insertions(+), 18 deletions(-)

diff --git 
a/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycles.java 
b/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycles.java
index 1160e88..b8f0c39 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycles.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycles.java
@@ -117,6 +117,9 @@ public class DefaultLifecycles
         return phaseToLifecycleMap;
     }
 
+    /**
+     * Returns an ordered list of lifecycles
+     */
     public List<Lifecycle> getLifeCycles()
     {
         List<String> lifecycleIds = Arrays.asList( STANDARD_LIFECYCLES );
diff --git 
a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecyclePluginAnalyzer.java
 
b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecyclePluginAnalyzer.java
index 65843f8..0a936ad 100644
--- 
a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecyclePluginAnalyzer.java
+++ 
b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecyclePluginAnalyzer.java
@@ -110,7 +110,7 @@ public class DefaultLifecyclePluginAnalyzer
 
         Map<Plugin, Plugin> plugins = new LinkedHashMap<>();
 
-        for ( Lifecycle lifecycle : getOrderedLifecycles() )
+        for ( Lifecycle lifecycle : defaultLifeCycles.getLifeCycles() )
         {
             org.apache.maven.lifecycle.mapping.Lifecycle 
lifecycleConfiguration =
                 lifecycleMappingForPackaging.getLifecycles().get( 
lifecycle.getId() );
diff --git 
a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java
 
b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java
index a06cd9f..28847ca 100644
--- 
a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java
+++ 
b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java
@@ -48,6 +48,8 @@ import org.apache.maven.plugin.BuildPluginManager;
 import org.apache.maven.plugin.MavenPluginManager;
 import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoExecutionRunner;
+import org.apache.maven.plugin.MojosExecutionStrategy;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugin.PluginConfigurationException;
 import org.apache.maven.plugin.PluginIncompatibleException;
@@ -80,17 +82,21 @@ public class MojoExecutor
 
     private final ReadWriteLock aggregatorLock = new ReentrantReadWriteLock();
 
+    private final MojosExecutionStrategy mojosExecutionStrategy;
+
     @Inject
     public MojoExecutor(
             BuildPluginManager pluginManager,
             MavenPluginManager mavenPluginManager,
             LifecycleDependencyResolver lifeCycleDependencyResolver,
-            ExecutionEventCatapult eventCatapult )
+            ExecutionEventCatapult eventCatapult,
+            MojosExecutionStrategy mojosExecutionStrategy )
     {
         this.pluginManager = pluginManager;
         this.mavenPluginManager = mavenPluginManager;
         this.lifeCycleDependencyResolver = lifeCycleDependencyResolver;
         this.eventCatapult = eventCatapult;
+        this.mojosExecutionStrategy = mojosExecutionStrategy;
     }
 
     public DependencyContext newDependencyContext( MavenSession session, 
List<MojoExecution> mojoExecutions )
@@ -148,21 +154,27 @@ public class MojoExecutor
         return Collections.unmodifiableCollection( scopes );
     }
 
-    public void execute( MavenSession session, List<MojoExecution> 
mojoExecutions, ProjectIndex projectIndex )
+    public void execute( final MavenSession session,
+                         final List<MojoExecution> mojoExecutions,
+                         final ProjectIndex projectIndex )
         throws LifecycleExecutionException
 
     {
-        DependencyContext dependencyContext = newDependencyContext( session, 
mojoExecutions );
+        final DependencyContext dependencyContext = newDependencyContext( 
session, mojoExecutions );
 
-        PhaseRecorder phaseRecorder = new PhaseRecorder( 
session.getCurrentProject() );
+        final PhaseRecorder phaseRecorder = new PhaseRecorder( 
session.getCurrentProject() );
 
-        for ( MojoExecution mojoExecution : mojoExecutions )
+        mojosExecutionStrategy.execute( mojoExecutions, session, new 
MojoExecutionRunner()
         {
-            execute( session, mojoExecution, projectIndex, dependencyContext, 
phaseRecorder );
-        }
+            @Override
+            public void run( MojoExecution mojoExecution ) throws 
LifecycleExecutionException
+            {
+                MojoExecutor.this.execute( session, mojoExecution, 
projectIndex, dependencyContext, phaseRecorder );
+            }
+        } );
     }
 
-    public void execute( MavenSession session, MojoExecution mojoExecution, 
ProjectIndex projectIndex,
+    private void execute( MavenSession session, MojoExecution mojoExecution, 
ProjectIndex projectIndex,
                          DependencyContext dependencyContext, PhaseRecorder 
phaseRecorder )
         throws LifecycleExecutionException
     {
diff --git 
a/maven-core/src/main/java/org/apache/maven/plugin/DefaultMojosExecutionStrategy.java
 
b/maven-core/src/main/java/org/apache/maven/plugin/DefaultMojosExecutionStrategy.java
new file mode 100644
index 0000000..9507c7a
--- /dev/null
+++ 
b/maven-core/src/main/java/org/apache/maven/plugin/DefaultMojosExecutionStrategy.java
@@ -0,0 +1,46 @@
+package org.apache.maven.plugin;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.lifecycle.LifecycleExecutionException;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+import java.util.List;
+
+/**
+ * Default mojo execution strategy. It just iterates over mojo executions and 
runs one by one
+ */
+@Named
+@Singleton
+public class DefaultMojosExecutionStrategy implements MojosExecutionStrategy
+{
+    @Override
+    public void execute( List<MojoExecution> mojos, MavenSession session, 
MojoExecutionRunner mojoRunner )
+            throws LifecycleExecutionException
+    {
+        for ( MojoExecution mojoExecution : mojos )
+        {
+            mojoRunner.run( mojoExecution );
+        }
+
+    }
+}
diff --git 
a/maven-core/src/main/java/org/apache/maven/plugin/MojoExecutionRunner.java 
b/maven-core/src/main/java/org/apache/maven/plugin/MojoExecutionRunner.java
new file mode 100644
index 0000000..314e041
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/plugin/MojoExecutionRunner.java
@@ -0,0 +1,36 @@
+package org.apache.maven.plugin;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.lifecycle.LifecycleExecutionException;
+
+/**
+ * Provides context for mojo execution. Invocation of #run will result in 
actual execution
+ */
+public interface MojoExecutionRunner
+{
+    /**
+     * Runs mojo execution
+     *
+     * @param execution mojo execution
+     * @throws LifecycleExecutionException
+     */
+    void run( MojoExecution execution ) throws LifecycleExecutionException;
+}
diff --git 
a/maven-core/src/main/java/org/apache/maven/plugin/MojosExecutionStrategy.java 
b/maven-core/src/main/java/org/apache/maven/plugin/MojosExecutionStrategy.java
new file mode 100644
index 0000000..e4babf6
--- /dev/null
+++ 
b/maven-core/src/main/java/org/apache/maven/plugin/MojosExecutionStrategy.java
@@ -0,0 +1,45 @@
+package org.apache.maven.plugin;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.lifecycle.LifecycleExecutionException;
+
+import java.util.List;
+
+/**
+ * Interface allows overriding default mojo execution strategy For example it 
is possible wrap some mojo execution to
+ * decorate default functionality or skip some executions
+ */
+public interface MojosExecutionStrategy
+{
+
+    /**
+     * Entry point to the execution strategy
+     *
+     * @param mojos             list of mojos representing a project build
+     * @param session           current session
+     * @param mojoExecutionRunner mojo execution task which must be invoked by 
a strategy to actually run it
+     * @throws LifecycleExecutionException
+     */
+    void execute( List<MojoExecution> mojos, MavenSession session, 
MojoExecutionRunner mojoExecutionRunner )
+            throws LifecycleExecutionException;
+
+}
diff --git 
a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
 
b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
index 6d55988..8b3e176 100644
--- 
a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
+++ 
b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
@@ -493,6 +493,21 @@ public class DefaultMavenPluginManager
 
         ClassRealm pluginRealm = pluginDescriptor.getClassRealm();
 
+        if ( pluginRealm == null )
+        {
+            try
+            {
+                setupPluginRealm( pluginDescriptor, session, null, null, null 
);
+            }
+            catch ( PluginResolutionException e )
+            {
+                String msg = "Cannot setup plugin realm [mojoDescriptor=" + 
mojoDescriptor.getId()
+                        + ", pluginDescriptor=" + pluginDescriptor.getId() + 
"]";
+                throw new PluginConfigurationException( pluginDescriptor, msg, 
e );
+            }
+            pluginRealm = pluginDescriptor.getClassRealm();
+        }
+
         if ( logger.isDebugEnabled() )
         {
             logger.debug( "Configuring mojo " + mojoDescriptor.getId() + " 
from plugin realm " + pluginRealm );
diff --git 
a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/MojoExecutorStub.java
 
b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/MojoExecutorStub.java
index feedd1e..57eacb1 100644
--- 
a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/MojoExecutorStub.java
+++ 
b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/MojoExecutorStub.java
@@ -21,14 +21,15 @@ import 
org.apache.maven.lifecycle.internal.DependencyContext;
 import org.apache.maven.lifecycle.internal.ExecutionEventCatapult;
 import org.apache.maven.lifecycle.internal.LifecycleDependencyResolver;
 import org.apache.maven.lifecycle.internal.MojoExecutor;
-import org.apache.maven.lifecycle.internal.PhaseRecorder;
 import org.apache.maven.lifecycle.internal.ProjectIndex;
 import org.apache.maven.plugin.BuildPluginManager;
 import org.apache.maven.plugin.MavenPluginManager;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.plugin.MojoExecution;
+import org.apache.maven.plugin.MojosExecutionStrategy;
 import org.apache.maven.plugin.descriptor.MojoDescriptor;
 import org.apache.maven.plugin.descriptor.PluginDescriptor;
+import org.apache.maven.project.MavenProject;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -47,24 +48,23 @@ public class MojoExecutorStub
             BuildPluginManager pluginManager,
             MavenPluginManager mavenPluginManager,
             LifecycleDependencyResolver lifeCycleDependencyResolver,
-            ExecutionEventCatapult eventCatapult )
+            ExecutionEventCatapult eventCatapult,
+            MojosExecutionStrategy mojosExecutionStrategy )
     {
-        super( pluginManager, mavenPluginManager, lifeCycleDependencyResolver, 
eventCatapult );
+        super( pluginManager, mavenPluginManager, lifeCycleDependencyResolver, 
eventCatapult, mojosExecutionStrategy );
     }
 
     @Override
-    public void execute( MavenSession session, MojoExecution mojoExecution, 
ProjectIndex projectIndex,
-                         DependencyContext dependencyContext, PhaseRecorder 
phaseRecorder )
+    public void execute( MavenSession session, List<MojoExecution> 
mojoExecutions, ProjectIndex projectIndex )
         throws LifecycleExecutionException
     {
-        executions.add( mojoExecution );
+        executions.addAll( mojoExecutions );
     }
 
     @Override
-    public void execute( MavenSession session, List<MojoExecution> 
mojoExecutions, ProjectIndex projectIndex )
-        throws LifecycleExecutionException
+    public List<MavenProject> executeForkedExecutions( MojoExecution 
mojoExecution, MavenSession session, ProjectIndex projectIndex ) throws 
LifecycleExecutionException
     {
-        executions.addAll(mojoExecutions);
+        return null;
     }
 
 

Reply via email to