[ 
https://issues.apache.org/jira/browse/MNG-8052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17835864#comment-17835864
 ] 

ASF GitHub Bot commented on MNG-8052:
-------------------------------------

michael-o commented on code in PR #1411:
URL: https://github.com/apache/maven/pull/1411#discussion_r1559972665


##########
maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLifecycleRegistry.java:
##########
@@ -0,0 +1,321 @@
+/*
+ * 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.
+ */
+package org.apache.maven.internal.impl;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.maven.api.Lifecycle;
+import org.apache.maven.api.services.LifecycleRegistry;
+import org.apache.maven.api.spi.LifecycleProvider;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.*;
+import static java.util.Collections.emptyList;
+import static org.apache.maven.internal.impl.Lifecycles.*;
+
+/**
+ * TODO: this is session scoped as SPI can contribute.
+ */
+@Named
+@Singleton
+public class DefaultLifecycleRegistry
+        extends 
ExtensibleEnumRegistries.DefaultExtensibleEnumRegistry<Lifecycle, 
LifecycleProvider>
+        implements LifecycleRegistry {
+
+    public DefaultLifecycleRegistry() {
+        super(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());
+        // validate lifecycle
+        for (Lifecycle lifecycle : this) {
+            Set<String> set = new HashSet<>();
+            lifecycle.allPhases().forEach(phase -> {
+                if (!set.add(phase.name())) {
+                    throw new IllegalArgumentException(
+                            "Found duplicated phase '" + phase.name() + "' in 
'" + lifecycle.id() + "' lifecycle");
+                }
+            });
+        }
+    }
+
+    @Override
+    public Iterator<Lifecycle> iterator() {
+        return values.values().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<>();
+        nl.addAll(l);
+        nl.add(t);
+        return nl;
+    }
+
+    @Override
+    public List<String> computePhases(Lifecycle lifecycle) {
+        Graph graph = new Graph();
+        lifecycle.phases().forEach(phase -> addPhase(graph, null, null, 
phase));
+        lifecycle.aliases().forEach(alias -> {
+            String n = alias.v3Phase();
+            String a = alias.v4Phase();
+            String[] u = a.split(":");
+            Graph.Vertex v = graph.addVertex(n);
+            if (u.length > 1) {
+                if ("pre".equals(u[0])) {
+                    graph.addEdge(graph.addVertex("$" + u[1]), v);
+                    graph.addEdge(v, graph.addVertex("$$" + u[1]));
+                } else if ("post".equals(u[0])) {
+                    graph.addEdge(graph.addVertex(u[1]), v);
+                    graph.addEdge(v, graph.addVertex("$$$" + u[1]));
+                }
+            } else {
+                graph.addEdge(graph.addVertex("$$" + u[0]), v);
+                graph.addEdge(v, graph.addVertex(u[0]));
+            }
+        });
+        List<String> allPhases = graph.visitAll();
+        Collections.reverse(allPhases);
+        List<String> computed =
+                allPhases.stream().filter(s -> 
!s.startsWith("$")).collect(Collectors.toList());
+        List<String> given = lifecycle.orderedPhases().orElse(null);
+        if (given != null) {
+            if (given.size() != computed.size()) {
+                Set<String> s1 =
+                        given.stream().filter(s -> 
!computed.contains(s)).collect(Collectors.toSet());
+                Set<String> s2 =
+                        computed.stream().filter(s -> 
!given.contains(s)).collect(Collectors.toSet());
+                throw new IllegalArgumentException(

Review Comment:
   Why is it IAE instead of ISE?



##########
maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLifecycleRegistry.java:
##########
@@ -0,0 +1,321 @@
+/*
+ * 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.
+ */
+package org.apache.maven.internal.impl;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.maven.api.Lifecycle;
+import org.apache.maven.api.services.LifecycleRegistry;
+import org.apache.maven.api.spi.LifecycleProvider;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.*;
+import static java.util.Collections.emptyList;
+import static org.apache.maven.internal.impl.Lifecycles.*;
+
+/**
+ * TODO: this is session scoped as SPI can contribute.
+ */
+@Named
+@Singleton
+public class DefaultLifecycleRegistry
+        extends 
ExtensibleEnumRegistries.DefaultExtensibleEnumRegistry<Lifecycle, 
LifecycleProvider>
+        implements LifecycleRegistry {
+
+    public DefaultLifecycleRegistry() {
+        super(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());
+        // validate lifecycle
+        for (Lifecycle lifecycle : this) {
+            Set<String> set = new HashSet<>();
+            lifecycle.allPhases().forEach(phase -> {
+                if (!set.add(phase.name())) {
+                    throw new IllegalArgumentException(
+                            "Found duplicated phase '" + phase.name() + "' in 
'" + lifecycle.id() + "' lifecycle");
+                }
+            });
+        }
+    }
+
+    @Override
+    public Iterator<Lifecycle> iterator() {
+        return values.values().iterator();

Review Comment:
   Is this remove-safe?



##########
maven-core/src/main/java/org/apache/maven/lifecycle/Lifecycle.java:
##########
@@ -18,8 +18,8 @@
  */
 package org.apache.maven.lifecycle;
 
-import java.util.List;
-import java.util.Map;
+import java.util.*;

Review Comment:
   Shouldn't we avoid this?



##########
maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLifecycleRegistry.java:
##########
@@ -0,0 +1,321 @@
+/*
+ * 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.
+ */
+package org.apache.maven.internal.impl;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.maven.api.Lifecycle;
+import org.apache.maven.api.services.LifecycleRegistry;
+import org.apache.maven.api.spi.LifecycleProvider;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.*;
+import static java.util.Collections.emptyList;
+import static org.apache.maven.internal.impl.Lifecycles.*;
+
+/**
+ * TODO: this is session scoped as SPI can contribute.
+ */
+@Named
+@Singleton
+public class DefaultLifecycleRegistry
+        extends 
ExtensibleEnumRegistries.DefaultExtensibleEnumRegistry<Lifecycle, 
LifecycleProvider>
+        implements LifecycleRegistry {
+
+    public DefaultLifecycleRegistry() {
+        super(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());
+        // validate lifecycle
+        for (Lifecycle lifecycle : this) {
+            Set<String> set = new HashSet<>();
+            lifecycle.allPhases().forEach(phase -> {
+                if (!set.add(phase.name())) {
+                    throw new IllegalArgumentException(
+                            "Found duplicated phase '" + phase.name() + "' in 
'" + lifecycle.id() + "' lifecycle");
+                }
+            });
+        }
+    }
+
+    @Override
+    public Iterator<Lifecycle> iterator() {
+        return values.values().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<>();
+        nl.addAll(l);
+        nl.add(t);
+        return nl;
+    }
+
+    @Override
+    public List<String> computePhases(Lifecycle lifecycle) {
+        Graph graph = new Graph();
+        lifecycle.phases().forEach(phase -> addPhase(graph, null, null, 
phase));
+        lifecycle.aliases().forEach(alias -> {
+            String n = alias.v3Phase();
+            String a = alias.v4Phase();
+            String[] u = a.split(":");
+            Graph.Vertex v = graph.addVertex(n);
+            if (u.length > 1) {
+                if ("pre".equals(u[0])) {
+                    graph.addEdge(graph.addVertex("$" + u[1]), v);
+                    graph.addEdge(v, graph.addVertex("$$" + u[1]));
+                } else if ("post".equals(u[0])) {
+                    graph.addEdge(graph.addVertex(u[1]), v);
+                    graph.addEdge(v, graph.addVertex("$$$" + u[1]));
+                }
+            } else {
+                graph.addEdge(graph.addVertex("$$" + u[0]), v);
+                graph.addEdge(v, graph.addVertex(u[0]));
+            }
+        });
+        List<String> allPhases = graph.visitAll();
+        Collections.reverse(allPhases);
+        List<String> computed =
+                allPhases.stream().filter(s -> 
!s.startsWith("$")).collect(Collectors.toList());
+        List<String> given = lifecycle.orderedPhases().orElse(null);
+        if (given != null) {
+            if (given.size() != computed.size()) {
+                Set<String> s1 =
+                        given.stream().filter(s -> 
!computed.contains(s)).collect(Collectors.toSet());
+                Set<String> s2 =
+                        computed.stream().filter(s -> 
!given.contains(s)).collect(Collectors.toSet());
+                throw new IllegalArgumentException(
+                        "List of phases differ in size: expected " + 
computed.size() + " but received " + given.size()

Review Comment:
   , but





> Define a new lifecycle for Maven 4
> ----------------------------------
>
>                 Key: MNG-8052
>                 URL: https://issues.apache.org/jira/browse/MNG-8052
>             Project: Maven
>          Issue Type: Improvement
>            Reporter: Guillaume Nodet
>            Priority: Major
>             Fix For: 4.0.x-candidate
>
>
> The idea would be to redefine a maven lifecycle as being defined by:
> {{Lifecycle}}:
>  * id: unique identifier
>  * set of Phase
> {{Step}}:
>  * optional name
>  * optional mojo execution
>  * list of predecessors and successors for the current project
>  * list of predecessors and successors for dependencies
>  * list of predecessors and successors for child modules
> Default lifecycle could be defined by a set of empty steps:
>  * {{initialize}}
>  * {{{}resources{}}}: requires {{initialize}}
>  * {{{}sources{}}}: requires {{initialize}}
>  * {{{}compile{}}}: requires {{sources}}
>  * {{{}ready{}}}: requires {{resources, compile}}
>  * {{{}build{}}}: requires {{ready}}
>  * {{{}test{}}}: requires {{compile}} 
>  * {{{}package{}}}: requires {{build, test}}
>  * {{{}integration-test{}}}: requires {{package}}
>  * {{{}verify{}}}: requires {{test, integration-test}}
> and a set of steps bound to plugin executions
>  * {{m-resources-p}} required by {{resources}}
>  * {{m-compiler-p}} required by {{{}compile{}}}, requires {{sources}} and 
> dependencies at {{ready}}
>  * {{m-surefire-p}} required by {{test}}
>  * {{m-jar-p}} required by {{build}}
>  * {{m-failsafe-p}} required by {{integration-test}}
> The {{build}} phase would be introduced to have packaged artifacts without 
> running any tests. The {{ready}} phase would be introduced to allow (if 
> needed) a small difference between being {{{}compile{}}}'d and being 
> {{{}package{}}}'d: simple jars can be used as dependencies when they are only 
> compiled (using target/classes), but if you use a custom package (for example 
> {{{}m-shade-p{}}}), you cannot use the compiled classes directly, but you 
> need the processed classes. In such a case, the {{m-shade-p}} should be 
> required by {{ready}} and should require {{{}m-jar-p{}}}.
> This would allow:
>  * injecting a given plugin into an existing chain: a custom generation step 
> is modelled with: {{m-generator-plugin}} required by {{sources}}
>  * a post packaging phase would be defined with: {{my-plugin}}: requires 
> {{m-jar-p}}, required by {{packaging}}
>  * running {{mvn build}} to build all jars without running any tests
>  * running {{mvn -amd test}} (or something similar) would allow building the 
> given project with the full graph (i.e. with all dependencies at {{ready}} 
> phase
>  * this immediately gives a full graph that can be built concurrently down to 
> the mojo level
>  * the ability to add predecessors onto children' modules phases allow 
> defining aggregate goals more easily



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to