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

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


The following commit(s) were added to refs/heads/master by this push:
     new 2942aadcc3 [MNG-8123] Fix Lifecycle in v3 (#1524)
2942aadcc3 is described below

commit 2942aadcc3c56e8cfe040c45dfdfcfc25fbb38e5
Author: Guillaume Nodet <[email protected]>
AuthorDate: Wed May 22 15:45:13 2024 +0200

    [MNG-8123] Fix Lifecycle in v3 (#1524)
---
 .../maven/api/services/LifecycleRegistry.java      |   4 +-
 .../maven/internal/impl/standalone/ApiRunner.java  |   4 -
 .../project/EmptyLifecycleBindingsInjector.java    |   9 --
 .../internal/impl/DefaultLifecycleRegistry.java    | 150 ++++++++++++++++-----
 .../internal/impl/DefaultPackagingRegistry.java    |   2 +-
 .../apache/maven/lifecycle/DefaultLifecycles.java  |   8 +-
 .../java/org/apache/maven/lifecycle/Lifecycle.java |   7 +-
 .../lifecycle/internal/ExecutionPlanItem.java      |   2 +-
 .../maven/lifecycle/DefaultLifecyclesTest.java     |   3 +-
 .../maven/lifecycle/MavenExecutionPlanTest.java    |   2 -
 .../project/EmptyLifecycleBindingsInjector.java    |   9 --
 11 files changed, 132 insertions(+), 68 deletions(-)

diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/LifecycleRegistry.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/LifecycleRegistry.java
index 2718582a24..05970e76fc 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/LifecycleRegistry.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/LifecycleRegistry.java
@@ -18,16 +18,14 @@
  */
 package org.apache.maven.api.services;
 
-import java.util.List;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 
 import org.apache.maven.api.Lifecycle;
 
 public interface LifecycleRegistry extends ExtensibleEnumRegistry<Lifecycle>, 
Iterable<Lifecycle> {
+
     default Stream<Lifecycle> stream() {
         return StreamSupport.stream(spliterator(), false);
     }
-
-    List<String> computePhases(Lifecycle lifecycle);
 }
diff --git 
a/maven-api-impl/src/test/java/org/apache/maven/internal/impl/standalone/ApiRunner.java
 
b/maven-api-impl/src/test/java/org/apache/maven/internal/impl/standalone/ApiRunner.java
index 2106a03467..b6e2bbc815 100644
--- 
a/maven-api-impl/src/test/java/org/apache/maven/internal/impl/standalone/ApiRunner.java
+++ 
b/maven-api-impl/src/test/java/org/apache/maven/internal/impl/standalone/ApiRunner.java
@@ -311,10 +311,6 @@ public class ApiRunner {
     @Provides
     static LifecycleRegistry newLifecycleRegistry() {
         return new LifecycleRegistry() {
-            @Override
-            public List<String> computePhases(Lifecycle lifecycle) {
-                return List.of();
-            }
 
             @Override
             public Iterator<Lifecycle> iterator() {
diff --git 
a/maven-compat/src/test/java/org/apache/maven/project/EmptyLifecycleBindingsInjector.java
 
b/maven-compat/src/test/java/org/apache/maven/project/EmptyLifecycleBindingsInjector.java
index 1029f58690..513bb0236b 100644
--- 
a/maven-compat/src/test/java/org/apache/maven/project/EmptyLifecycleBindingsInjector.java
+++ 
b/maven-compat/src/test/java/org/apache/maven/project/EmptyLifecycleBindingsInjector.java
@@ -52,10 +52,6 @@ public class EmptyLifecycleBindingsInjector extends 
DefaultLifecycleBindingsInje
     private static PackagingRegistry packagingRegistry;
 
     private static final LifecycleRegistry emptyLifecycleRegistry = new 
LifecycleRegistry() {
-        @Override
-        public List<String> computePhases(Lifecycle lifecycle) {
-            return List.of();
-        }
 
         @Override
         public Iterator<Lifecycle> iterator() {
@@ -136,11 +132,6 @@ public class EmptyLifecycleBindingsInjector extends 
DefaultLifecycleBindingsInje
             return getDelegate().lookup(id);
         }
 
-        @Override
-        public List<String> computePhases(Lifecycle lifecycle) {
-            return getDelegate().computePhases(lifecycle);
-        }
-
         @Override
         public Iterator<Lifecycle> iterator() {
             return getDelegate().iterator();
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLifecycleRegistry.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLifecycleRegistry.java
index 4370d449e3..acd8fd74c2 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLifecycleRegistry.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLifecycleRegistry.java
@@ -20,6 +20,7 @@ package org.apache.maven.internal.impl;
 
 import javax.inject.Inject;
 import javax.inject.Named;
+import javax.inject.Provider;
 import javax.inject.Singleton;
 
 import java.util.ArrayList;
@@ -27,15 +28,24 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.apache.maven.api.Lifecycle;
+import org.apache.maven.api.model.Plugin;
 import org.apache.maven.api.services.LifecycleRegistry;
+import org.apache.maven.api.services.LookupException;
+import org.apache.maven.api.spi.ExtensibleEnumProvider;
 import org.apache.maven.api.spi.LifecycleProvider;
+import org.apache.maven.lifecycle.mapping.LifecyclePhase;
+import org.codehaus.plexus.PlexusContainer;
+import 
org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 
 import static java.util.Arrays.asList;
 import static java.util.Collections.singleton;
@@ -47,23 +57,19 @@ import static 
org.apache.maven.internal.impl.Lifecycles.plugin;
  */
 @Named
 @Singleton
-public class DefaultLifecycleRegistry
-        extends 
ExtensibleEnumRegistries.DefaultExtensibleEnumRegistry<Lifecycle, 
LifecycleProvider>
-        implements LifecycleRegistry {
+public class DefaultLifecycleRegistry implements LifecycleRegistry {
+
+    private final List<LifecycleProvider> providers;
 
     public DefaultLifecycleRegistry() {
-        super(Collections.emptyList());
+        this(Collections.emptyList());
     }
 
     @Inject
-    public DefaultLifecycleRegistry(
-            List<LifecycleProvider> providers, Map<String, 
org.apache.maven.lifecycle.Lifecycle> lifecycles) {
-        super(
-                concat(providers, new LifecycleWrapperProvider(lifecycles)),
-                new CleanLifecycle(),
-                new DefaultLifecycle(),
-                new SiteLifecycle(),
-                new WrapperLifecycle());
+    public DefaultLifecycleRegistry(List<LifecycleProvider> providers) {
+        List<LifecycleProvider> p = new ArrayList<>(providers);
+        p.add(() -> List.of(new CleanLifecycle(), new DefaultLifecycle(), new 
SiteLifecycle(), new WrapperLifecycle()));
+        this.providers = p;
         // validate lifecycle
         for (Lifecycle lifecycle : this) {
             Set<String> set = new HashSet<>();
@@ -78,37 +84,44 @@ public class DefaultLifecycleRegistry
 
     @Override
     public Iterator<Lifecycle> iterator() {
-        return values.values().iterator();
+        return stream().toList().iterator();
     }
 
     @Override
     public Stream<Lifecycle> stream() {
-        return values.values().stream();
-    }
-
-    static <T> List<T> concat(List<T> l, T t) {
-        List<T> nl = new ArrayList<>(l.size() + 1);
-        nl.addAll(l);
-        nl.add(t);
-        return nl;
+        return 
providers.stream().map(ExtensibleEnumProvider::provides).flatMap(Collection::stream);
     }
 
     @Override
-    public List<String> computePhases(Lifecycle lifecycle) {
-        return lifecycle.phases().stream().map(Lifecycle.Phase::name).toList();
+    public Optional<Lifecycle> lookup(String id) {
+        return stream().filter(lf -> Objects.equals(id, lf.id())).findAny();
     }
 
-    static class LifecycleWrapperProvider implements LifecycleProvider {
-        private final Map<String, org.apache.maven.lifecycle.Lifecycle> 
lifecycles;
+    @Named
+    @Singleton
+    public static class LifecycleWrapperProvider implements LifecycleProvider {
+        private final PlexusContainer container;
 
         @Inject
-        LifecycleWrapperProvider(Map<String, 
org.apache.maven.lifecycle.Lifecycle> lifecycles) {
-            this.lifecycles = lifecycles;
+        public LifecycleWrapperProvider(PlexusContainer container) {
+            this.container = container;
         }
 
         @Override
         public Collection<Lifecycle> provides() {
-            return 
lifecycles.values().stream().map(this::wrap).collect(Collectors.toList());
+            try {
+                Map<String, org.apache.maven.lifecycle.Lifecycle> all =
+                        
container.lookupMap(org.apache.maven.lifecycle.Lifecycle.class);
+                return all.keySet().stream()
+                        .filter(id -> !Lifecycle.CLEAN.equals(id)
+                                && !Lifecycle.DEFAULT.equals(id)
+                                && !Lifecycle.SITE.equals(id)
+                                && !Lifecycle.WRAPPER.equals(id))
+                        .map(id -> wrap(all.get(id)))
+                        .collect(Collectors.toList());
+            } catch (ComponentLookupException e) {
+                throw new LookupException(e);
+            }
         }
 
         private Lifecycle wrap(org.apache.maven.lifecycle.Lifecycle lifecycle) 
{
@@ -120,13 +133,90 @@ public class DefaultLifecycleRegistry
 
                 @Override
                 public Collection<Phase> phases() {
-                    // TODO: implement
-                    throw new UnsupportedOperationException();
+                    return lifecycle.getPhases().stream()
+                            .map(name -> (Phase) new Phase() {
+                                @Override
+                                public String name() {
+                                    return name;
+                                }
+
+                                @Override
+                                public List<Plugin> plugins() {
+                                    Map<String, LifecyclePhase> lfPhases = 
lifecycle.getDefaultLifecyclePhases();
+                                    LifecyclePhase phase = lfPhases != null ? 
lfPhases.get(name) : null;
+                                    if (phase != null) {
+                                        Map<String, Plugin> plugins = new 
LinkedHashMap<>();
+                                        
DefaultPackagingRegistry.parseLifecyclePhaseDefinitions(plugins, name, phase);
+                                        return 
plugins.values().stream().toList();
+                                    }
+                                    return List.of();
+                                }
+                            })
+                            .toList();
                 }
             };
         }
     }
 
+    static class WrappedLifecycle extends org.apache.maven.lifecycle.Lifecycle 
{
+        WrappedLifecycle(Lifecycle lifecycle) {
+            super(lifecycle);
+        }
+    }
+
+    abstract static class BaseLifecycleProvider implements 
Provider<org.apache.maven.lifecycle.Lifecycle> {
+        @Inject
+        private PlexusContainer lookup;
+
+        private final String name;
+
+        BaseLifecycleProvider(String name) {
+            this.name = name;
+        }
+
+        @Override
+        public org.apache.maven.lifecycle.Lifecycle get() {
+            try {
+                LifecycleRegistry registry = 
lookup.lookup(LifecycleRegistry.class);
+                return new WrappedLifecycle(registry.require(name));
+            } catch (ComponentLookupException e) {
+                throw new LookupException(e);
+            }
+        }
+    }
+
+    @Singleton
+    @Named(Lifecycle.CLEAN)
+    static class CleanLifecycleProvider extends BaseLifecycleProvider {
+        CleanLifecycleProvider() {
+            super(Lifecycle.CLEAN);
+        }
+    }
+
+    @Singleton
+    @Named(Lifecycle.DEFAULT)
+    static class DefaultLifecycleProvider extends BaseLifecycleProvider {
+        DefaultLifecycleProvider() {
+            super(Lifecycle.DEFAULT);
+        }
+    }
+
+    @Singleton
+    @Named(Lifecycle.SITE)
+    static class SiteLifecycleProvider extends BaseLifecycleProvider {
+        SiteLifecycleProvider() {
+            super(Lifecycle.SITE);
+        }
+    }
+
+    @Singleton
+    @Named(Lifecycle.WRAPPER)
+    static class WrapperLifecycleProvider extends BaseLifecycleProvider {
+        WrapperLifecycleProvider() {
+            super(Lifecycle.WRAPPER);
+        }
+    }
+
     static class CleanLifecycle implements Lifecycle {
 
         private static final String MAVEN_CLEAN_PLUGIN_VERSION = "3.2.0";
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultPackagingRegistry.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultPackagingRegistry.java
index 6039991438..afe42e73a9 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultPackagingRegistry.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultPackagingRegistry.java
@@ -104,7 +104,7 @@ public class DefaultPackagingRegistry
         return lfs;
     }
 
-    private void parseLifecyclePhaseDefinitions(Map<String, Plugin> plugins, 
String phase, LifecyclePhase goals) {
+    static void parseLifecyclePhaseDefinitions(Map<String, Plugin> plugins, 
String phase, LifecyclePhase goals) {
         InputSource inputSource =
                 new 
InputSource(DefaultLifecyclePluginAnalyzer.DEFAULTLIFECYCLEBINDINGS_MODELID, 
null);
         InputLocation location = new InputLocation(-1, -1, inputSource, 0);
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 3987985cbe..91e1adbc64 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
@@ -155,11 +155,9 @@ public class DefaultLifecycles {
 
         // Lifecycles cannot be cached as extensions might add custom 
lifecycles later in the execution.
         try {
-            Map<String, Lifecycle> lifecycles = new 
HashMap<>(lookup.lookupMap(Lifecycle.class));
-            for (org.apache.maven.api.Lifecycle lf : registry) {
-                lifecycles.put(lf.id(), new Lifecycle(registry, lf));
-            }
-            return lifecycles;
+            return registry != null
+                    ? registry.stream().collect(Collectors.toMap(lf -> 
lf.id(), lf -> new Lifecycle(lf)))
+                    : Map.of();
         } catch (LookupException e) {
             throw new IllegalStateException("Unable to lookup lifecycles from 
the plexus container", e);
         }
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/Lifecycle.java 
b/maven-core/src/main/java/org/apache/maven/lifecycle/Lifecycle.java
index 089e412ad5..a88307459c 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/Lifecycle.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/Lifecycle.java
@@ -35,11 +35,12 @@ public class Lifecycle {
         this.defaultPhases = defaultPhases;
     }
 
-    public Lifecycle(
-            org.apache.maven.api.services.LifecycleRegistry registry, 
org.apache.maven.api.Lifecycle lifecycle) {
+    public Lifecycle(org.apache.maven.api.Lifecycle lifecycle) {
         this.lifecycle = lifecycle;
         this.id = lifecycle.id();
-        this.phases = registry.computePhases(lifecycle);
+        this.phases = lifecycle.phases().stream()
+                .map(org.apache.maven.api.Lifecycle.Phase::name)
+                .toList();
         this.defaultPhases = getDefaultPhases(lifecycle);
     }
 
diff --git 
a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ExecutionPlanItem.java
 
b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ExecutionPlanItem.java
index 9f25fc1143..fc64733e6e 100644
--- 
a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ExecutionPlanItem.java
+++ 
b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ExecutionPlanItem.java
@@ -68,6 +68,6 @@ public class ExecutionPlanItem {
 
     @Override
     public String toString() {
-        return "ExecutionPlanItem{" + ", mojoExecution=" + mojoExecution + '}' 
+ super.toString();
+        return "ExecutionPlanItem{" + mojoExecution.toString() + "}@" + 
Integer.toHexString(hashCode());
     }
 }
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 99b8793eae..ba12bcade0 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
@@ -96,7 +96,8 @@ class DefaultLifecyclesTest {
         
when(mockedPlexusContainer.lookupMap(Lifecycle.class)).thenReturn(lifeCycles);
 
         DefaultLifecycles dl = new DefaultLifecycles(
-                new DefaultLifecycleRegistry(Collections.emptyList(), 
Collections.emptyMap()),
+                new DefaultLifecycleRegistry(
+                        List.of(new 
DefaultLifecycleRegistry.LifecycleWrapperProvider(mockedPlexusContainer))),
                 new DefaultLookup(mockedPlexusContainer));
 
         assertThat(dl.getLifeCycles().get(0).getId(), is("clean"));
diff --git 
a/maven-core/src/test/java/org/apache/maven/lifecycle/MavenExecutionPlanTest.java
 
b/maven-core/src/test/java/org/apache/maven/lifecycle/MavenExecutionPlanTest.java
index c24ec44f01..2ca490772e 100644
--- 
a/maven-core/src/test/java/org/apache/maven/lifecycle/MavenExecutionPlanTest.java
+++ 
b/maven-core/src/test/java/org/apache/maven/lifecycle/MavenExecutionPlanTest.java
@@ -38,8 +38,6 @@ class MavenExecutionPlanTest {
         MavenExecutionPlan plan = 
LifecycleExecutionPlanCalculatorStub.getProjectAExecutionPlan();
 
         ExecutionPlanItem expected = plan.findLastInPhase("package");
-        ExecutionPlanItem beerPhase = plan.findLastInPhase("BEER"); // Beer 
comes straight after package in stub
-        assertEquals(expected, beerPhase);
         assertNotNull(expected);
     }
 
diff --git 
a/maven-core/src/test/java/org/apache/maven/project/EmptyLifecycleBindingsInjector.java
 
b/maven-core/src/test/java/org/apache/maven/project/EmptyLifecycleBindingsInjector.java
index 4976d22a17..747f2b8c3f 100644
--- 
a/maven-core/src/test/java/org/apache/maven/project/EmptyLifecycleBindingsInjector.java
+++ 
b/maven-core/src/test/java/org/apache/maven/project/EmptyLifecycleBindingsInjector.java
@@ -51,10 +51,6 @@ public class EmptyLifecycleBindingsInjector extends 
DefaultLifecycleBindingsInje
     private static PackagingRegistry packagingRegistry;
 
     private static final LifecycleRegistry emptyLifecycleRegistry = new 
LifecycleRegistry() {
-        @Override
-        public List<String> computePhases(Lifecycle lifecycle) {
-            return List.of();
-        }
 
         @Override
         public Iterator<Lifecycle> iterator() {
@@ -135,11 +131,6 @@ public class EmptyLifecycleBindingsInjector extends 
DefaultLifecycleBindingsInje
             return getDelegate().lookup(id);
         }
 
-        @Override
-        public List<String> computePhases(Lifecycle lifecycle) {
-            return getDelegate().computePhases(lifecycle);
-        }
-
         @Override
         public Iterator<Lifecycle> iterator() {
             return getDelegate().iterator();

Reply via email to