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/06/22 18:27:11 UTC

[maven] 01/01: [MNG-6917] Introduce wrapper lifecycle

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

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

commit 881274914a80946f8af6e435eff064d3c89974fa
Author: rfscholte <rf...@apache.org>
AuthorDate: Mon Jun 22 20:26:56 2020 +0200

    [MNG-6917] Introduce wrapper lifecycle
---
 .../apache/maven/lifecycle/DefaultLifecycles.java  | 83 ++++++++++----------
 .../main/resources/META-INF/plexus/components.xml  | 20 +++++
 .../maven/lifecycle/DefaultLifecyclesTest.java     | 90 ++++++++++++++++++----
 .../maven/lifecycle/LifecycleExecutorTest.java     | 14 ++--
 .../internal/stub/DefaultLifecyclesStub.java       |  4 +-
 .../stub/LifecycleExecutionPlanCalculatorStub.java |  4 +
 6 files changed, 153 insertions(+), 62 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 601523f..2a1deb8 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
@@ -20,16 +20,14 @@ package org.apache.maven.lifecycle;
  */
 
 import org.codehaus.plexus.logging.Logger;
-import org.codehaus.plexus.util.StringUtils;
 
-import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Comparator;
 import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -46,30 +44,39 @@ import javax.inject.Singleton;
 @Singleton
 public class DefaultLifecycles
 {
-    public static final String[] STANDARD_LIFECYCLES = { "default", "clean", "site" };
+    public static final String[] STANDARD_LIFECYCLES = { "default", "clean", "site", "wrapper" };
 
     // @Configuration(source="org/apache/maven/lifecycle/lifecycles.xml")
 
-    @Inject
-    private Map<String, Lifecycle> lifecycles;
+    private final Map<String, Lifecycle> lifecyclesMap;
 
-    @Inject
-    private Logger logger;
+    private final Logger logger;
 
     public DefaultLifecycles()
     {
+        this.lifecyclesMap = null;
+        this.logger = null;
     }
 
-    public DefaultLifecycles( Map<String, Lifecycle> lifecycles, Logger logger )
+    @Inject
+    public DefaultLifecycles( Map<String, Lifecycle> lifecyclesMap, Logger logger )
     {
-        this.lifecycles = new LinkedHashMap<>();
+        // Must keep the lifecyclesMap as is.
+        // During initialization it only contains the default lifecycles.
+        // However, extensions might add custom lifecycles later on.
+        this.lifecyclesMap = lifecyclesMap;
         this.logger = logger;
-        this.lifecycles = lifecycles;
     }
 
-    public Lifecycle get( String key )
+    /**
+     * Get lifecycle based on phase
+     * 
+     * @param phase
+     * @return
+     */
+    public Lifecycle get( String phase )
     {
-        return getPhaseToLifecycleMap().get( key );
+        return getPhaseToLifecycleMap().get( phase );
     }
 
     /**
@@ -83,7 +90,7 @@ public class DefaultLifecycles
         // If people are going to make their own lifecycles then we need to tell people how to namespace them correctly
         // so that they don't interfere with internally defined lifecycles.
 
-        HashMap<String, Lifecycle> phaseToLifecycleMap = new HashMap<>();
+        Map<String, Lifecycle> phaseToLifecycleMap = new HashMap<>();
 
         for ( Lifecycle lifecycle : getLifeCycles() )
         {
@@ -113,36 +120,32 @@ public class DefaultLifecycles
 
     public List<Lifecycle> getLifeCycles()
     {
-        // ensure canonical order of standard lifecycles
-        Map<String, Lifecycle> lifecycles = new LinkedHashMap<>( this.lifecycles );
-
-        LinkedHashSet<String> lifecycleNames = new LinkedHashSet<>( Arrays.asList( STANDARD_LIFECYCLES ) );
-        lifecycleNames.addAll( lifecycles.keySet() );
-
-        ArrayList<Lifecycle> result = new ArrayList<>();
-        for ( String name : lifecycleNames )
+        List<String> lifecycleIds = Arrays.asList( STANDARD_LIFECYCLES );
+        
+        Comparator<String> comparator = ( l, r ) -> 
         {
-            Lifecycle lifecycle = lifecycles.get( name );
-            if ( lifecycle.getId() == null )
+            if ( lifecycleIds.contains( l ) ) 
             {
-                throw new NullPointerException( "A lifecycle must have an id." );
+                return lifecycleIds.indexOf( l ) - lifecycleIds.indexOf( r );      
             }
-            result.add( lifecycle );
-        }
-
-        return result;
+            else
+            {
+                return Integer.MAX_VALUE;
+            }
+        }; 
+        
+        // ensure canonical order of standard lifecycles
+        return lifecyclesMap.values().stream()
+                                .peek( l -> Objects.requireNonNull( l.getId(), "A lifecycle must have an id." ) )
+                                .sorted( Comparator.comparing( Lifecycle::getId, comparator ) )
+                                .collect( Collectors.toList() );
     }
 
     public String getLifecyclePhaseList()
     {
-        Set<String> phases = new LinkedHashSet<>();
-
-        for ( Lifecycle lifecycle : getLifeCycles() )
-        {
-            phases.addAll( lifecycle.getPhases() );
-        }
-
-        return StringUtils.join( phases.iterator(), ", " );
+        return getLifeCycles().stream()
+                        .flatMap( l -> l.getPhases().stream() )
+                        .collect( Collectors.joining( ", " ) );
     }
-
+    
 }
diff --git a/maven-core/src/main/resources/META-INF/plexus/components.xml b/maven-core/src/main/resources/META-INF/plexus/components.xml
index 3f099cb..03d28ef 100644
--- a/maven-core/src/main/resources/META-INF/plexus/components.xml
+++ b/maven-core/src/main/resources/META-INF/plexus/components.xml
@@ -111,6 +111,26 @@ under the License.
       </configuration>
     </component>
 
+    <!-- 'wrapper' lifecycle, with default bindings -->
+    <component>
+      <role>org.apache.maven.lifecycle.Lifecycle</role>
+      <implementation>org.apache.maven.lifecycle.Lifecycle</implementation>
+      <role-hint>wrapper</role-hint>
+      <configuration>
+        <id>wrapper</id>
+        <!-- START SNIPPET: wrapper -->
+        <phases>
+          <phase>wrapper</phase>
+        </phases>
+        <default-phases>
+          <wrapper>
+            org.apache.maven.plugins:maven-wrapper-plugin:3.0.1:wrapper
+          </wrapper>
+        </default-phases>
+        <!-- END SNIPPET: wrapper -->
+      </configuration>
+    </component>
+
     <component>
       <role>org.sonatype.plexus.components.sec.dispatcher.SecDispatcher</role>
       <role-hint>maven</role-hint>
diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/DefaultLifecyclesTest.java b/maven-core/src/test/java/org/apache/maven/lifecycle/DefaultLifecyclesTest.java
index d025cdd..e911bf1 100644
--- a/maven-core/src/test/java/org/apache/maven/lifecycle/DefaultLifecyclesTest.java
+++ b/maven-core/src/test/java/org/apache/maven/lifecycle/DefaultLifecyclesTest.java
@@ -1,3 +1,5 @@
+package org.apache.maven.lifecycle;
+
 /*
  * 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
@@ -12,15 +14,23 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package org.apache.maven.lifecycle;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.arrayWithSize;
+import static org.hamcrest.Matchers.hasSize;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import org.codehaus.plexus.ContainerConfiguration;
 import org.codehaus.plexus.PlexusConstants;
 import org.codehaus.plexus.PlexusTestCase;
 import org.codehaus.plexus.component.annotations.Requirement;
 
-import java.util.List;
-
 /**
  * @author Kristian Rosenvold
  */
@@ -32,12 +42,11 @@ public class DefaultLifecyclesTest
     private DefaultLifecycles defaultLifeCycles;
 
     @Override
-    protected void customizeContainerConfiguration(
-            ContainerConfiguration configuration)
+    protected void customizeContainerConfiguration( ContainerConfiguration configuration )
     {
-        super.customizeContainerConfiguration(configuration);
-        configuration.setAutoWiring(true);
-        configuration.setClassPathScanning(PlexusConstants.SCANNING_INDEX);
+        super.customizeContainerConfiguration( configuration );
+        configuration.setAutoWiring( true );
+        configuration.setClassPathScanning( PlexusConstants.SCANNING_INDEX );
     }
 
     protected void setUp()
@@ -55,15 +64,66 @@ public class DefaultLifecyclesTest
         super.tearDown();
     }
 
-    public void testLifecycle()
-        throws Exception
+    public void testDefaultLifecycles()
     {
-        final List<Lifecycle> cycles = defaultLifeCycles.getLifeCycles();
-        assertNotNull( cycles );
-        final Lifecycle lifecycle = cycles.get( 0 );
-        assertEquals( "default", lifecycle.getId() );
-        assertEquals( 23, lifecycle.getPhases().size() );
+        final List<Lifecycle> lifecycles = defaultLifeCycles.getLifeCycles();
+        assertThat( lifecycles, hasSize( 4 ) );
+        assertThat( DefaultLifecycles.STANDARD_LIFECYCLES,  arrayWithSize( 4 ) );
+    }
 
+    public void testDefaultLifecycle()
+    {
+        final Lifecycle lifecycle = getLifeCycleById( "default" );
+        assertThat( lifecycle.getId(), is( "default" )  );
+        assertThat( lifecycle.getPhases(), hasSize( 23 ) );
     }
 
+    public void testCleanLifecycle()
+    {
+        final Lifecycle lifecycle = getLifeCycleById( "clean" );
+        assertThat( lifecycle.getId(), is( "clean" )  );
+        assertThat( lifecycle.getPhases(), hasSize( 3 ) );
+    }
+
+    public void testSiteLifecycle()
+    {
+        final Lifecycle lifecycle = getLifeCycleById( "site" );
+        assertThat( lifecycle.getId(), is( "site" )  );
+        assertThat( lifecycle.getPhases(), hasSize( 4 ) );
+    }
+
+    public void testWrapperLifecycle()
+    {
+        final Lifecycle lifecycle = getLifeCycleById( "wrapper" );
+        assertThat( lifecycle.getId(), is( "wrapper" )  );
+        assertThat( lifecycle.getPhases(), hasSize( 1 ) );
+    }
+    
+    public void testCustomLifecycle()
+    {
+        List<Lifecycle> myLifecycles = new ArrayList<>();
+        Lifecycle myLifecycle = new Lifecycle( "etl", 
+                                               Arrays.asList( "extract", "transform", "load" ),
+                                               Collections.emptyMap() );
+        myLifecycles.add( myLifecycle );
+        myLifecycles.addAll( defaultLifeCycles.getLifeCycles() );
+        
+        DefaultLifecycles dl = new DefaultLifecycles( myLifecycles.stream()
+                                                            .collect( Collectors.toMap( l -> l.getId(), l -> l ) ), 
+                                                      null );
+        
+        assertThat( dl.getLifeCycles().get( 0 ).getId(), is( "default" ) );
+        assertThat( dl.getLifeCycles().get( 1 ).getId(), is( "clean" ) );
+        assertThat( dl.getLifeCycles().get( 2 ).getId(), is( "site" ) );
+        assertThat( dl.getLifeCycles().get( 3 ).getId(), is( "wrapper" ) );
+        assertThat( dl.getLifeCycles().get( 4 ).getId(), is( "etl" ) );
+    }
+    
+    private Lifecycle getLifeCycleById( String id )
+    {
+        return defaultLifeCycles.getLifeCycles().stream()
+                        .filter( l -> id.equals( l.getId() ) )
+                        .findFirst()
+                        .orElseThrow( IllegalArgumentException::new );
+    }
 }
\ No newline at end of file
diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java b/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java
index 5252a21..b1b2adb 100644
--- a/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java
+++ b/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java
@@ -15,6 +15,9 @@ package org.apache.maven.lifecycle;
  * the License.
  */
 
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.hasSize;
+
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -287,7 +290,7 @@ public class LifecycleExecutorTest
         List<Plugin> plugins =
             new ArrayList<>( lifecycleExecutor.getPluginsBoundByDefaultToAllLifecycles( "jar" ) );
 
-        assertEquals( 8, plugins.size() );
+        assertThat( plugins.toString(), plugins, hasSize( 9 ) );
     }
 
     public void testPluginConfigurationCreation()
@@ -395,30 +398,29 @@ public class LifecycleExecutorTest
         final MavenSession session = createMavenSession( pom );
         session.setProjectDependencyGraph( new ProjectDependencyGraph()
         {
+            @Override
             public List<MavenProject> getUpstreamProjects( MavenProject project, boolean transitive )
             {
                 return Collections.emptyList();
             }
 
+            @Override
             public List<MavenProject> getAllProjects()
             {
                 return session.getAllProjects();
             }
 
+            @Override
             public List<MavenProject> getSortedProjects()
             {
                 return Collections.singletonList( session.getCurrentProject() );
             }
 
+            @Override
             public List<MavenProject> getDownstreamProjects( MavenProject project, boolean transitive )
             {
                 return Collections.emptyList();
             }
-            
-            public java.util.List<MavenProject> getAllSortedProjects()
-            {
-                return Collections.emptyList();
-            }
         } );
 
         final List<String> log = new ArrayList<>();
diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/DefaultLifecyclesStub.java b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/DefaultLifecyclesStub.java
index a1a9532..14c6743 100644
--- a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/DefaultLifecyclesStub.java
+++ b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/DefaultLifecyclesStub.java
@@ -47,7 +47,9 @@ public class DefaultLifecyclesStub
         List<String> stubSiteCycle =
             Arrays.asList( PRE_SITE.getPhase(), SITE.getPhase(), POST_SITE.getPhase(), SITE_DEPLOY.getPhase() );
 
-        Iterator<List<String>> lcs = Arrays.asList( stubDefaultCycle, stubCleanCycle, stubSiteCycle ).iterator();
+        List<String> stubWrapperCycle = Arrays.asList( WRAPPER.getPhase() );
+
+        Iterator<List<String>> lcs = Arrays.asList( stubDefaultCycle, stubCleanCycle, stubSiteCycle, stubWrapperCycle ).iterator();
 
         Map<String, Lifecycle> lifeCycles = new HashMap<>();
         for ( String s : DefaultLifecycles.STANDARD_LIFECYCLES )
diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleExecutionPlanCalculatorStub.java b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleExecutionPlanCalculatorStub.java
index 13873be..0d82ee0 100644
--- a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleExecutionPlanCalculatorStub.java
+++ b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleExecutionPlanCalculatorStub.java
@@ -90,6 +90,10 @@ public class LifecycleExecutionPlanCalculatorStub
 
     public final static MojoDescriptor SITE_DEPLOY = createMojoDescriptor( "site-deploy" );
 
+    // wrapper
+
+    public final static MojoDescriptor WRAPPER = createMojoDescriptor( "wrapper" );
+
     /**
      * @deprecated instead use {@link #getNumberOfExecutions(ProjectBuildList)}
      */