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 2018/09/22 15:40:42 UTC

[maven] branch MNG-5667 created (now baf5036)

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

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


      at baf5036  [MNG-5667] Either install or deploy

This branch includes the following new commits:

     new baf5036  [MNG-5667] Either install or deploy

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[maven] 01/01: [MNG-5667] Either install or deploy

Posted by rf...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit baf5036e5a01a70eab3cbd28778ae21358d9c179
Author: rfscholte <rf...@apache.org>
AuthorDate: Sat Sep 22 17:40:35 2018 +0200

    [MNG-5667] Either install or deploy
---
 .../java/org/apache/maven/lifecycle/Choice.java    | 52 +++++++++++++++
 .../java/org/apache/maven/lifecycle/Lifecycle.java | 51 ++++++++++++---
 .../org/apache/maven/lifecycle/LifecyclePhase.java | 30 +++++++++
 .../apache/maven/lifecycle/LifecycleResolver.java  | 57 ++++++++++++++++
 .../java/org/apache/maven/lifecycle/Phase.java     | 76 ++++++++++++++++++++++
 .../org/apache/maven/lifecycle/PhasesWrapper.java  | 49 ++++++++++++++
 .../internal/DefaultLifecycleMappingDelegate.java  | 17 +++--
 .../main/resources/META-INF/plexus/components.xml  |  8 ++-
 .../maven/lifecycle/LifecycleResolverTest.java     | 59 +++++++++++++++++
 .../internal/stub/DefaultLifecyclesStub.java       | 31 ++++++---
 10 files changed, 400 insertions(+), 30 deletions(-)

diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/Choice.java b/maven-core/src/main/java/org/apache/maven/lifecycle/Choice.java
new file mode 100644
index 0000000..d4c1470
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/Choice.java
@@ -0,0 +1,52 @@
+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 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 java.util.List;
+
+/**
+ * Selectable LifecyclePhase implementation. Pick one of the phases
+ * 
+ * @author Robert Scholte
+ * @since 3.6.0
+ */
+public class Choice implements LifecyclePhase
+{
+    private List<Phase> phases;
+    
+    @Override
+    public Phase resolve( String phase )
+    {
+        for ( LifecyclePhase lifecyclePhase : phases )
+        {
+            Phase resolvedPhase = lifecyclePhase.resolve( phase ); 
+            if ( phase.equals( resolvedPhase.getValue() ) )
+            {
+                return resolvedPhase;
+            }
+        }
+        return null; // or throw exception??
+    }
+
+    public List<Phase> getPhases()
+    {
+        return phases;
+    }
+}
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 5fc99d5..1c1193b 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
@@ -19,11 +19,10 @@ package org.apache.maven.lifecycle;
  * under the License.
  */
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.maven.lifecycle.mapping.LifecyclePhase;
-
 /**
  * Class Lifecycle.
  */
@@ -33,10 +32,11 @@ public class Lifecycle
     {
     }
 
-    public Lifecycle( String id, List<String> phases, Map<String, LifecyclePhase> defaultPhases )
+    public Lifecycle( String id, List<LifecyclePhase> phases,
+                      Map<String, org.apache.maven.lifecycle.mapping.LifecyclePhase> defaultPhases )
     {
         this.id = id;
-        this.phases = phases;
+        this.phases.getPhases().addAll( phases );
         this.defaultPhases = defaultPhases;
     }
 
@@ -54,21 +54,53 @@ public class Lifecycle
 
     private String id;
 
-    private List<String> phases;
+    // Must be called phases for backward compatibility; use to be List<String>
+    private PhasesWrapper phases = new PhasesWrapper();
 
-    private Map<String, LifecyclePhase> defaultPhases;
+    private Map<String, org.apache.maven.lifecycle.mapping.LifecyclePhase> defaultPhases;
 
     public String getId()
     {
         return this.id;
     }
 
+    /**
+     * Flattened (original) lifecycle
+     * 
+     * @return
+     */
     public List<String> getPhases()
     {
-        return this.phases;
+        List<String> names = new ArrayList<>();
+        for ( LifecyclePhase phase : this.phases.getPhases() )
+        {
+            if ( phase instanceof Phase )
+            {
+                names.add( ( (Phase) phase ).getValue() );
+            }
+            else if ( phase instanceof Choice )
+            {
+                Choice choice = (Choice) phase;
+                for ( Phase choicePhase : choice.getPhases() )
+                {
+                    names.add( choicePhase.getValue() );
+                }
+            }
+        }
+        return names;
+    }
+    
+    /**
+     * Structured lifecycle
+     * 
+     * @return
+     */
+    public List<LifecyclePhase> phases()
+    {
+        return phases.getPhases();
     }
 
-    public Map<String, LifecyclePhase> getDefaultLifecyclePhases()
+    public Map<String, org.apache.maven.lifecycle.mapping.LifecyclePhase> getDefaultLifecyclePhases()
     {
         return defaultPhases;
     }
@@ -76,7 +108,7 @@ public class Lifecycle
     @Deprecated
     public Map<String, String> getDefaultPhases()
     {
-        return LifecyclePhase.toLegacyMap( getDefaultLifecyclePhases() );
+        return org.apache.maven.lifecycle.mapping.LifecyclePhase.toLegacyMap( getDefaultLifecyclePhases() );
     }
 
     @Override
@@ -84,5 +116,4 @@ public class Lifecycle
     {
         return id + " -> " + phases;
     }
-
 }
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/LifecyclePhase.java b/maven-core/src/main/java/org/apache/maven/lifecycle/LifecyclePhase.java
new file mode 100644
index 0000000..50e56dd
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/LifecyclePhase.java
@@ -0,0 +1,30 @@
+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 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.
+ */
+
+/**
+ * 
+ * @author Robert Scholte
+ * @since 3.6.0
+ */
+public interface LifecyclePhase
+{
+    Phase resolve( String phase );
+}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleResolver.java b/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleResolver.java
new file mode 100644
index 0000000..abcfdb1
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleResolver.java
@@ -0,0 +1,57 @@
+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 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 java.util.ArrayList;
+import java.util.List;
+
+import org.codehaus.plexus.component.annotations.Component;
+
+/**
+ * @author Robert Scholte
+ * @since 3.6.0
+ */
+@Component( role = LifecycleResolver.class )
+public class LifecycleResolver
+{
+
+    /**
+     * @param lifecycle the lifecycle
+     * @param phase the target phase
+     * @return all phases up until the target phase
+     */
+    public List<Phase> resolve( Lifecycle lifecycle, String phase )
+    {
+        List<Phase> phases = new ArrayList<>( lifecycle.getPhases().size() );
+        
+        for ( LifecyclePhase lp : lifecycle.phases() )
+        {
+            Phase resolvedPhase = lp.resolve( phase );
+            phases.add( resolvedPhase );
+            
+            if ( phase.equals( resolvedPhase.getValue() ) )
+            {
+                break;
+            }
+        }
+        
+        return phases;
+    }
+}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/Phase.java b/maven-core/src/main/java/org/apache/maven/lifecycle/Phase.java
new file mode 100644
index 0000000..b725690
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/Phase.java
@@ -0,0 +1,76 @@
+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 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 java.util.Objects;
+
+/**
+ * Standard LifecyclePhase implementation
+ * 
+ * @author Robert Scholte
+ * @since 3.6.0
+ */
+public class Phase implements LifecyclePhase
+{
+    private final String value;
+    
+    public Phase( String value )
+    {
+        this.value = value;
+    }
+
+    @Override
+    public Phase resolve( String phase )
+    {
+        return this;
+    }
+    
+    public String getValue()
+    {
+        return value;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hashCode( value );
+    }
+
+    @Override
+    public boolean equals( Object obj )
+    {
+        if ( this == obj )
+        {
+            return true;
+        }
+        if ( obj == null )
+        {
+            return false;
+
+        }
+        if ( getClass() != obj.getClass() )
+        {
+            return false;
+        }
+        Phase other = (Phase) obj;
+
+        return Objects.equals( this.value, other.value );
+    }
+}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/PhasesWrapper.java b/maven-core/src/main/java/org/apache/maven/lifecycle/PhasesWrapper.java
new file mode 100644
index 0000000..e506a05
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/PhasesWrapper.java
@@ -0,0 +1,49 @@
+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 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 java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Wraps a list of LifecyclePhases
+ * 
+ * @author Robert Scholte
+ * @since 3.6.0
+ */
+public class PhasesWrapper
+{
+    private List<LifecyclePhase> phases = new ArrayList<>();
+    
+    void setPhase( String phase )
+    {
+        phases.add( new Phase( phase ) );
+    }
+    
+    void setChoice( Choice choice )
+    {
+        phases.add( choice );
+    }
+    
+    List<LifecyclePhase> getPhases()
+    {
+        return phases;
+    }
+}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecycleMappingDelegate.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecycleMappingDelegate.java
index 1ddee05..bec182a 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecycleMappingDelegate.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecycleMappingDelegate.java
@@ -28,6 +28,8 @@ import java.util.TreeMap;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.lifecycle.Lifecycle;
 import org.apache.maven.lifecycle.LifecycleMappingDelegate;
+import org.apache.maven.lifecycle.LifecycleResolver;
+import org.apache.maven.lifecycle.Phase;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.model.PluginExecution;
 import org.apache.maven.plugin.BuildPluginManager;
@@ -55,6 +57,9 @@ public class DefaultLifecycleMappingDelegate
 
     @Requirement
     private BuildPluginManager pluginManager;
+    
+    @Requirement
+    private LifecycleResolver lifecycleResolver;
 
     public Map<String, List<MojoExecution>> calculateLifecycleMappings( MavenSession session, MavenProject project,
                                                                         Lifecycle lifecycle, String lifecyclePhase )
@@ -66,19 +71,13 @@ public class DefaultLifecycleMappingDelegate
          * is interested in, i.e. all phases up to and including the specified phase.
          */
 
-        Map<String, Map<Integer, List<MojoExecution>>> mappings =
-            new LinkedHashMap<>();
+        Map<String, Map<Integer, List<MojoExecution>>> mappings = new LinkedHashMap<>();
 
-        for ( String phase : lifecycle.getPhases() )
+        for ( Phase phase : lifecycleResolver.resolve( lifecycle, lifecyclePhase ) )
         {
             Map<Integer, List<MojoExecution>> phaseBindings = new TreeMap<>();
 
-            mappings.put( phase, phaseBindings );
-
-            if ( phase.equals( lifecyclePhase ) )
-            {
-                break;
-            }
+            mappings.put( phase.getValue(), phaseBindings );
         }
 
         /*
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..006edac 100644
--- a/maven-core/src/main/resources/META-INF/plexus/components.xml
+++ b/maven-core/src/main/resources/META-INF/plexus/components.xml
@@ -56,8 +56,12 @@ under the License.
           <phase>integration-test</phase>
           <phase>post-integration-test</phase>
           <phase>verify</phase>
-          <phase>install</phase>
-          <phase>deploy</phase>
+          <choice>
+            <phases>
+              <phase>install</phase>
+              <phase>deploy</phase>
+            </phases>
+          </choice>
         </phases>
         <!-- END SNIPPET: lifecycle -->
       </configuration>
diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleResolverTest.java b/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleResolverTest.java
new file mode 100644
index 0000000..e34a12f
--- /dev/null
+++ b/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleResolverTest.java
@@ -0,0 +1,59 @@
+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 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 java.util.List;
+
+import org.codehaus.plexus.PlexusTestCase;
+
+public class LifecycleResolverTest extends PlexusTestCase
+{
+    private LifecycleResolver resolver;
+    
+    private DefaultLifecycles lifecycles;
+
+    @Override
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+        this.resolver = lookup( LifecycleResolver.class );
+        this.lifecycles = lookup( DefaultLifecycles.class );
+    }
+    
+    public void testResolveChoiceInstall()
+    {
+        Lifecycle lifecycle = lifecycles.get( "install" );
+        List<Phase> phases = resolver.resolve( lifecycle, "install" );
+        
+        assertTrue( phases.contains( new Phase( "install" ) ) );
+        assertFalse( phases.contains( new Phase( "deploy" ) ) );
+    }
+
+    public void testResolveChoiceDeploy()
+    {
+        Lifecycle lifecycle = lifecycles.get( "deploy" );
+        List<Phase> phases = resolver.resolve( lifecycle, "deploy" );
+        
+        assertFalse( phases.contains( new Phase( "install" ) ) );
+        assertTrue( phases.contains( new Phase( "deploy" ) ) );
+    }
+
+}
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 1dc2b6b..15ee889 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
@@ -17,6 +17,8 @@ package org.apache.maven.lifecycle.internal.stub;
 
 import org.apache.maven.lifecycle.DefaultLifecycles;
 import org.apache.maven.lifecycle.Lifecycle;
+import org.apache.maven.lifecycle.LifecyclePhase;
+import org.apache.maven.lifecycle.Phase;
 
 import java.util.Arrays;
 import java.util.HashMap;
@@ -35,20 +37,31 @@ public class DefaultLifecyclesStub
     public static DefaultLifecycles createDefaultLifecycles()
     {
 
-        List<String> stubDefaultCycle =
-            Arrays.asList( VALIDATE.getPhase(), INITIALIZE.getPhase(), PROCESS_RESOURCES.getPhase(), COMPILE.getPhase(),
-                           TEST.getPhase(), PROCESS_TEST_RESOURCES.getPhase(), PACKAGE.getPhase(), "BEER",
-                           INSTALL.getPhase() );
+        List<LifecyclePhase> stubDefaultCycle =
+            Arrays.<LifecyclePhase>asList( new Phase( VALIDATE.getPhase() ),
+                                           new Phase( INITIALIZE.getPhase() ),
+                                           new Phase( PROCESS_RESOURCES.getPhase() ),
+                                           new Phase( COMPILE.getPhase() ),
+                                           new Phase( TEST.getPhase() ),
+                                           new Phase( PROCESS_TEST_RESOURCES.getPhase() ),
+                                           new Phase( PACKAGE.getPhase() ),
+                                           new Phase( "BEER" ),
+                                           new Phase( INSTALL.getPhase() ) );
 
         // The two phases below are really for future expansion, some would say they lack a drink
         // The point being that they do not really have to match the "real" stuff,
-        List<String> stubCleanCycle = Arrays.asList( PRE_CLEAN.getPhase(), CLEAN.getPhase(), POST_CLEAN.getPhase() );
+        List<LifecyclePhase> stubCleanCycle =
+            Arrays.<LifecyclePhase>asList( new Phase( PRE_CLEAN.getPhase() ),
+                                           new Phase( CLEAN.getPhase() ), 
+                                           new Phase( POST_CLEAN.getPhase() ) );
 
-        List<String> stubSiteCycle =
-            Arrays.asList( PRE_SITE.getPhase(), SITE.getPhase(), POST_SITE.getPhase(), SITE_DEPLOY.getPhase() );
+        List<LifecyclePhase> stubSiteCycle =
+            Arrays.<LifecyclePhase>asList( new Phase( PRE_SITE.getPhase() ),
+                                           new Phase( SITE.getPhase() ),
+                                           new Phase( POST_SITE.getPhase() ),
+                                           new Phase( SITE_DEPLOY.getPhase() ) );
 
-        @SuppressWarnings( "unchecked" )
-        Iterator<List<String>> lcs = Arrays.asList( stubDefaultCycle, stubCleanCycle, stubSiteCycle ).iterator();
+        Iterator<List<LifecyclePhase>> lcs = Arrays.asList( stubDefaultCycle, stubCleanCycle, stubSiteCycle ).iterator();
 
         Map<String, Lifecycle> lifeCycles = new HashMap<>();
         for ( String s : DefaultLifecycles.STANDARD_LIFECYCLES )