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)}
*/