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

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

commit bea23130c9cf66fbc21061822d185b331a2c93b3
Author: rfscholte <[email protected]>
AuthorDate: Sat Jan 13 16:43:25 2018 +0100

    [MRELEASE-956] Release Strategy Interface
---
 .../maven/shared/release/strategy/Strategy.java    |  68 +++++++++
 .../src/main/components-fragment.xml               |  15 +-
 .../shared/release/DefaultReleaseManager.java      | 160 +++++++++++++--------
 .../maven/shared/release/ReleaseManager.java       |   3 +-
 .../config/PropertiesReleaseDescriptorStore.java   |   8 ++
 .../maven/shared/release/config/ReleaseUtils.java  |   3 +
 .../shared/release/strategies/DefaultStrategy.java | 112 +++++++++++++++
 .../src/main/mdo/release-descriptor.mdo            |   9 ++
 .../shared/release/DefaultReleaseManagerTest.java  |   5 +-
 .../shared/release/DefaultReleaseManagerTest.xml   |  23 +++
 .../maven/plugins/release/AbstractReleaseMojo.java |  12 ++
 .../maven/plugins/release/CleanReleaseMojo.java    |  10 +-
 .../plugins/release/CleanReleaseMojoTest.java      |   5 +-
 .../plugins/release/PrepareReleaseMojoTest.java    |   3 -
 .../plugins/release/StageReleaseMojoTest.java      |   6 -
 15 files changed, 357 insertions(+), 85 deletions(-)

diff --git 
a/maven-release-api/src/main/java/org/apache/maven/shared/release/strategy/Strategy.java
 
b/maven-release-api/src/main/java/org/apache/maven/shared/release/strategy/Strategy.java
new file mode 100644
index 0000000..faca146
--- /dev/null
+++ 
b/maven-release-api/src/main/java/org/apache/maven/shared/release/strategy/Strategy.java
@@ -0,0 +1,68 @@
+package org.apache.maven.shared.release.strategy;
+
+/*
+ * 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;
+
+/**
+ * Interface to override default strategy.
+ * 
+ * If a method returns {@code null}, the default will be used, otherwise the 
provided collection of phaseIds  
+ * 
+ * @author Robert Scholte
+ * @since 3.0.0
+ */
+public interface Strategy
+{
+    /**
+     * The release phases to execute the calling the prepare goal 
+     * 
+     * @return
+     */
+    List<String> getPreparePhases();
+    
+    /**
+     * The release phases to execute the calling the perform goal 
+     * 
+     * @return
+     */
+    List<String> getPerformPhases();
+    
+    /**
+     * The release phases to execute the calling the branch goal 
+     * 
+     * @return
+     */
+    List<String> getBranchPhases();
+    
+    /**
+     * The release phases to execute the calling the rollback goal 
+     * 
+     * @return
+     */
+    List<String> getRollbackPhases();
+    
+    /**
+     * The release phases to execute the calling the update-versions goal 
+     * 
+     * @return
+     */
+    List<String> getUpdateVersionsPhases();
+}
diff --git a/maven-release-manager/src/main/components-fragment.xml 
b/maven-release-manager/src/main/components-fragment.xml
index 92ebfd3..6f156e9 100644
--- a/maven-release-manager/src/main/components-fragment.xml
+++ b/maven-release-manager/src/main/components-fragment.xml
@@ -21,20 +21,9 @@
 <component-set>
   <components>
     <component>
-      <role>org.apache.maven.shared.release.ReleaseManager</role>
+      <role>org.apache.maven.shared.release.strategy.Strategy</role>
       <role-hint>default</role-hint>
-      
<implementation>org.apache.maven.shared.release.DefaultReleaseManager</implementation>
-      <requirements>
-        <requirement>
-          <role>org.apache.maven.shared.release.phase.ReleasePhase</role>
-          <field-name>releasePhases</field-name>
-        </requirement>
-        <requirement>
-          
<role>org.apache.maven.shared.release.config.ReleaseDescriptorStore</role>
-          <role-hint>properties</role-hint>
-          <field-name>configStore</field-name>
-        </requirement>
-      </requirements>
+      
<implementation>org.apache.maven.shared.release.strategies.DefaultStrategy</implementation>
       <configuration>
         <preparePhases>
           <phase>check-poms</phase>
diff --git 
a/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java
 
b/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java
index c6e45f5..ad93daa 100644
--- 
a/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java
+++ 
b/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java
@@ -20,7 +20,6 @@ package org.apache.maven.shared.release;
  */
 
 import java.io.File;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -32,6 +31,9 @@ import 
org.apache.maven.shared.release.config.ReleaseDescriptor;
 import org.apache.maven.shared.release.config.ReleaseDescriptorStore;
 import org.apache.maven.shared.release.config.ReleaseDescriptorStoreException;
 import org.apache.maven.shared.release.phase.ReleasePhase;
+import org.apache.maven.shared.release.strategy.Strategy;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.annotations.Requirement;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.util.StringUtils;
 
@@ -40,46 +42,27 @@ import org.codehaus.plexus.util.StringUtils;
  *
  * @author <a href="mailto:[email protected]";>Brett Porter</a>
  */
+@Component( role = ReleaseManager.class )
 public class DefaultReleaseManager
     extends AbstractLogEnabled
     implements ReleaseManager
 {
-    /**
-     * The phases of release to run, and in what order.
-     */
-    private List<String> preparePhases;
-
-    /**
-     * The phases of release to run to perform.
-     */
-    private List<String> performPhases;
-
-    /**
-     * The phases of release to run to rollback changes
-     */
-    private List<String> rollbackPhases;
-
-    /**
-     * The phases to create a branch.
-     */
-    private List<String> branchPhases;
-
-    /**
-     * The phases to create update versions.
-     */
-    private List<String> updateVersionsPhases;
+    @Requirement
+    private Map<String, Strategy> strategies;
 
     /**
      * The available phases.
      */
+    @Requirement
     private Map<String, ReleasePhase> releasePhases;
 
     /**
      * The configuration storage.
      */
+    @Requirement( hint = "properties" )
     private ReleaseDescriptorStore configStore;
 
-    private static final int PHASE_SKIP = 0, PHASE_START = 1, PHASE_END = 2, 
GOAL_START = 11, GOAL_END = 12, ERROR = 99;
+    private static final int PHASE_SKIP = 0, PHASE_START = 1, PHASE_END = 2, 
GOAL_END = 12, ERROR = 99;
 
     @Override
     public ReleaseResult prepareWithResult( ReleasePrepareRequest 
prepareRequest )
@@ -116,8 +99,6 @@ public class DefaultReleaseManager
     private void prepare( ReleasePrepareRequest prepareRequest, ReleaseResult 
result )
         throws ReleaseExecutionException, ReleaseFailureException
     {
-        updateListener( prepareRequest.getReleaseManagerListener(), "prepare", 
GOAL_START );
-
         ReleaseDescriptor config;
         if ( BooleanUtils.isNotFalse( prepareRequest.getResume() ) )
         {
@@ -129,6 +110,12 @@ public class DefaultReleaseManager
             config = prepareRequest.getReleaseDescriptor();
         }
 
+        Strategy releaseStrategy = getStrategy( config.getReleaseStrategyId() 
);
+
+        List<String> preparePhases = getGoalPhases( releaseStrategy, "prepare" 
);
+
+        goalStart( prepareRequest.getReleaseManagerListener(), "prepare", 
preparePhases );
+
         // Later, it would be a good idea to introduce a proper workflow tool 
so that the release can be made up of a
         // more flexible set of steps.
 
@@ -209,10 +196,14 @@ public class DefaultReleaseManager
     public void rollback( ReleaseRollbackRequest rollbackRequest )
         throws ReleaseExecutionException, ReleaseFailureException
     {
-        updateListener( rollbackRequest.getReleaseManagerListener(), 
"rollback", GOAL_START );
-
         ReleaseDescriptor releaseDescriptor = loadReleaseDescriptor( 
rollbackRequest.getReleaseDescriptor(), null );
 
+        Strategy releaseStrategy = getStrategy( 
releaseDescriptor.getReleaseStrategyId() );
+
+        List<String> rollbackPhases = getGoalPhases( releaseStrategy, 
"rollback" );
+
+        goalStart( rollbackRequest.getReleaseManagerListener(), "rollback", 
rollbackPhases );
+
         for ( String name : rollbackPhases )
         {
             ReleasePhase phase = releasePhases.get( name );
@@ -269,11 +260,15 @@ public class DefaultReleaseManager
     private void perform( ReleasePerformRequest performRequest, ReleaseResult 
result )
         throws ReleaseExecutionException, ReleaseFailureException
     {
-        updateListener( performRequest.getReleaseManagerListener(), "perform", 
GOAL_START );
-
         ReleaseDescriptor releaseDescriptor = loadReleaseDescriptor( 
performRequest.getReleaseDescriptor(),
                                                                      
performRequest.getReleaseManagerListener() );
 
+        Strategy releaseStrategy = getStrategy( 
releaseDescriptor.getReleaseStrategyId() );
+
+        List<String> performPhases = getGoalPhases( releaseStrategy, "perform" 
);
+
+        goalStart( performRequest.getReleaseManagerListener(), "perform", 
performPhases );
+
         for ( String name : performPhases )
         {
             ReleasePhase phase = releasePhases.get( name );
@@ -328,10 +323,14 @@ public class DefaultReleaseManager
         ReleaseDescriptor releaseDescriptor = loadReleaseDescriptor( 
branchRequest.getReleaseDescriptor(),
                                                                      
branchRequest.getReleaseManagerListener() );
 
-        updateListener( branchRequest.getReleaseManagerListener(), "branch", 
GOAL_START );
-
         boolean dryRun = BooleanUtils.isTrue( branchRequest.getDryRun() );
 
+        Strategy releaseStrategy = getStrategy( 
releaseDescriptor.getReleaseStrategyId() );
+
+        List<String> branchPhases = getGoalPhases( releaseStrategy, "branch" );
+
+        goalStart( branchRequest.getReleaseManagerListener(), "branch", 
branchPhases );
+
         for ( String name : branchPhases )
         {
             ReleasePhase phase = releasePhases.get( name );
@@ -370,11 +369,15 @@ public class DefaultReleaseManager
     public void updateVersions( ReleaseUpdateVersionsRequest 
updateVersionsRequest )
         throws ReleaseExecutionException, ReleaseFailureException
     {
-        updateListener( updateVersionsRequest.getReleaseManagerListener(), 
"updateVersions", GOAL_START );
-
         ReleaseDescriptor releaseDescriptor = loadReleaseDescriptor( 
updateVersionsRequest.getReleaseDescriptor(),
                                                                    
updateVersionsRequest.getReleaseManagerListener() );
 
+        Strategy releaseStrategy = getStrategy( 
releaseDescriptor.getReleaseStrategyId() );
+
+        List<String> updateVersionsPhases = getGoalPhases( releaseStrategy, 
"updateVersions" );
+
+        goalStart( updateVersionsRequest.getReleaseManagerListener(), 
"updateVersions", updateVersionsPhases );
+
         for ( String name : updateVersionsPhases )
         {
             ReleasePhase phase = releasePhases.get( name );
@@ -438,7 +441,7 @@ public class DefaultReleaseManager
     }
 
     
-    protected void clean( AbstractReleaseRequest releaseRequest  )
+    protected void clean( AbstractReleaseRequest releaseRequest  ) throws 
ReleaseFailureException
     {
         ReleaseCleanRequest cleanRequest = new ReleaseCleanRequest();
         cleanRequest.setReleaseDescriptor( 
releaseRequest.getReleaseDescriptor() );
@@ -449,15 +452,21 @@ public class DefaultReleaseManager
     }
 
     @Override
-    public void clean( ReleaseCleanRequest cleanRequest )
+    public void clean( ReleaseCleanRequest cleanRequest ) throws 
ReleaseFailureException
     {
         updateListener( cleanRequest.getReleaseManagerListener(), "cleanup", 
PHASE_START );
 
         getLogger().info( "Cleaning up after release..." );
 
-        configStore.delete( cleanRequest.getReleaseDescriptor() );
-        Set<String> phases = new LinkedHashSet<>( preparePhases );
-        phases.addAll( branchPhases );
+        ReleaseDescriptor releaseDescriptor = 
cleanRequest.getReleaseDescriptor();
+
+        configStore.delete( releaseDescriptor );
+
+        Strategy releaseStrategy = getStrategy( 
releaseDescriptor.getReleaseStrategyId() );
+
+        Set<String> phases = new LinkedHashSet<>();
+        phases.addAll( getGoalPhases( releaseStrategy, "prepare" ) );
+        phases.addAll( getGoalPhases( releaseStrategy, "branch" ) );
 
         for ( String name : phases )
         {
@@ -474,15 +483,20 @@ public class DefaultReleaseManager
         this.configStore = configStore;
     }
 
+    void goalStart( ReleaseManagerListener listener, String goal, List<String> 
phases )
+    {
+        if ( listener != null )
+        {
+            listener.goalStart( goal, phases );
+        }
+    }
+
     void updateListener( ReleaseManagerListener listener, String name, int 
state )
     {
         if ( listener != null )
         {
             switch ( state )
             {
-                case GOAL_START:
-                    listener.goalStart( name, getGoalPhases( name ) );
-                    break;
                 case GOAL_END:
                     listener.goalEnd();
                     break;
@@ -501,29 +515,63 @@ public class DefaultReleaseManager
         }
     }
 
-    private List<String> getGoalPhases( String name )
+    private Strategy getStrategy( String strategyId ) throws 
ReleaseFailureException
     {
-        List<String> phases = new ArrayList<>();
+        Strategy strategy = strategies.get( strategyId );
+        if ( strategy == null )
+        {
+            throw new ReleaseFailureException( "Unknown strategy: " + 
strategyId );
+        }
+        return strategy;
+    }
 
-        if ( "prepare".equals( name ) )
+    private List<String> getGoalPhases( Strategy strategy, String goal )
+    {
+        List<String> phases;
+
+        if ( "prepare".equals( goal ) )
         {
-            phases.addAll( preparePhases );
+            phases = strategy.getPreparePhases();
+            if ( phases  == null )
+            {
+                phases = strategies.get( "default" ).getPreparePhases();
+            }
         }
-        else if ( "perform".equals( name ) )
+        else if ( "perform".equals( goal ) )
         {
-            phases.addAll( performPhases );
+            phases = strategy.getPerformPhases();
+            if ( phases  == null )
+            {
+                phases = strategies.get( "default" ).getPerformPhases();
+            }
         }
-        else if ( "rollback".equals( name ) )
+        else if ( "rollback".equals( goal ) )
         {
-            phases.addAll( rollbackPhases );
+            phases = strategy.getRollbackPhases();
+            if ( phases  == null )
+            {
+                phases = strategies.get( "default" ).getRollbackPhases();
+            }
         }
-        else if ( "branch".equals( name ) )
+        else if ( "branch".equals( goal ) )
         {
-            phases.addAll( branchPhases );
+            phases = strategy.getBranchPhases();
+            if ( phases  == null )
+            {
+                phases = strategies.get( "default" ).getBranchPhases();
+            }
         }
-        else if ( "updateVersions".equals( name ) )
+        else if ( "updateVersions".equals( goal ) )
+        {
+            phases = strategy.getUpdateVersionsPhases();
+            if ( phases  == null )
+            {
+                phases = strategies.get( "default" ).getUpdateVersionsPhases();
+            }
+        }
+        else
         {
-            phases.addAll( updateVersionsPhases );
+            phases = null;
         }
 
         return Collections.unmodifiableList( phases );
diff --git 
a/maven-release-manager/src/main/java/org/apache/maven/shared/release/ReleaseManager.java
 
b/maven-release-manager/src/main/java/org/apache/maven/shared/release/ReleaseManager.java
index d8ceb56..cab46b2 100644
--- 
a/maven-release-manager/src/main/java/org/apache/maven/shared/release/ReleaseManager.java
+++ 
b/maven-release-manager/src/main/java/org/apache/maven/shared/release/ReleaseManager.java
@@ -55,9 +55,10 @@ public interface ReleaseManager
      * Clean a release.
      *
      * @param cleanRequest all clean arguments
+     * @throws ReleaseFailureException 
      * @since 2.3
      */
-    void clean( ReleaseCleanRequest cleanRequest );
+    void clean( ReleaseCleanRequest cleanRequest ) throws 
ReleaseFailureException;
 
     /**
      * Rollback changes made by the previous release
diff --git 
a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java
 
b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java
index 8162b5f..673ca9b 100644
--- 
a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java
+++ 
b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java
@@ -223,6 +223,14 @@ public class PropertiesReleaseDescriptorStore
         {
             properties.setProperty( "projectVersionPolicyId", 
config.getProjectVersionPolicyId() );
         }
+        if ( config.getProjectNamingPolicyId() != null )
+        {
+            properties.setProperty( "projectNamingPolicyId", 
config.getProjectNamingPolicyId() );
+        }
+        if ( config.getReleaseStrategyId() != null )
+        {
+            properties.setProperty( "releaseStrategyId", 
config.getReleaseStrategyId() );
+        }
 
         properties.setProperty( "exec.snapshotReleasePluginAllowed",
                                 Boolean.toString( 
config.isSnapshotReleasePluginAllowed() ) );
diff --git 
a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java
 
b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java
index 54fc026..743b062 100644
--- 
a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java
+++ 
b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java
@@ -125,6 +125,8 @@ public class ReleaseUtils
                                                            
toBeMerged.getProjectVersionPolicyId() ) );
         mergeInto.setProjectNamingPolicyId( mergeDefault( 
mergeInto.getProjectNamingPolicyId(),
                                                           
toBeMerged.getProjectNamingPolicyId() ) );
+        mergeInto.setReleaseStrategyId( mergeOverride( 
mergeInto.getReleaseStrategyId(),
+                                                          
toBeMerged.getReleaseStrategyId() ) );
 
         return mergeInto;
     }
@@ -166,6 +168,7 @@ public class ReleaseUtils
         releaseDescriptor.setCompletionGoals( properties.getProperty( 
"completionGoals" ) );
         releaseDescriptor.setProjectVersionPolicyId( properties.getProperty( 
"projectVersionPolicyId" ) );
         releaseDescriptor.setProjectNamingPolicyId( properties.getProperty( 
"projectNamingPolicyId" ) );
+        releaseDescriptor.setReleaseStrategyId( properties.getProperty( 
"releaseStrategyId" ) );
         String snapshotReleasePluginAllowedStr = properties.getProperty( 
"exec.snapshotReleasePluginAllowed" );
         releaseDescriptor.setSnapshotReleasePluginAllowed( 
snapshotReleasePluginAllowedStr == null
                                                                ? false
diff --git 
a/maven-release-manager/src/main/java/org/apache/maven/shared/release/strategies/DefaultStrategy.java
 
b/maven-release-manager/src/main/java/org/apache/maven/shared/release/strategies/DefaultStrategy.java
new file mode 100644
index 0000000..ad5c1ee
--- /dev/null
+++ 
b/maven-release-manager/src/main/java/org/apache/maven/shared/release/strategies/DefaultStrategy.java
@@ -0,0 +1,112 @@
+package org.apache.maven.shared.release.strategies;
+
+/*
+ * 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.apache.maven.shared.release.strategy.Strategy;
+
+/**
+ * 
+ * @author Robert Scholte
+ * @since 3.0.0
+ */
+public class DefaultStrategy implements Strategy
+{
+    /**
+     * The phases of release to run, and in what order.
+     */
+    private List<String> preparePhases;
+
+    /**
+     * The phases of release to run to perform.
+     */
+    private List<String> performPhases;
+
+    /**
+     * The phases of release to run to rollback changes
+     */
+    private List<String> rollbackPhases;
+
+    /**
+     * The phases to create a branch.
+     */
+    private List<String> branchPhases;
+
+    /**
+     * The phases to create update versions.
+     */
+    private List<String> updateVersionsPhases;
+
+    @Override
+    public List<String> getPreparePhases()
+    {
+        return preparePhases;
+    }
+
+    public void setPreparePhases( List<String> preparePhases )
+    {
+        this.preparePhases = preparePhases;
+    }
+
+    @Override
+    public List<String> getPerformPhases()
+    {
+        return performPhases;
+    }
+
+    public void setPerformPhases( List<String> performPhases )
+    {
+        this.performPhases = performPhases;
+    }
+
+    @Override
+    public List<String> getRollbackPhases()
+    {
+        return rollbackPhases;
+    }
+
+    public void setRollbackPhases( List<String> rollbackPhases )
+    {
+        this.rollbackPhases = rollbackPhases;
+    }
+
+    @Override
+    public List<String> getBranchPhases()
+    {
+        return branchPhases;
+    }
+
+    public void setBranchPhases( List<String> branchPhases )
+    {
+        this.branchPhases = branchPhases;
+    }
+
+    @Override
+    public List<String> getUpdateVersionsPhases()
+    {
+        return updateVersionsPhases;
+    }
+
+    public void setUpdateVersionsPhases( List<String> updateVersionsPhases )
+    {
+        this.updateVersionsPhases = updateVersionsPhases;
+    }
+}
diff --git a/maven-release-manager/src/main/mdo/release-descriptor.mdo 
b/maven-release-manager/src/main/mdo/release-descriptor.mdo
index c430cb1..6191087 100644
--- a/maven-release-manager/src/main/mdo/release-descriptor.mdo
+++ b/maven-release-manager/src/main/mdo/release-descriptor.mdo
@@ -452,6 +452,15 @@
             The role-hint for the NamingPolicy implementation used to 
calculate the project branch and tag names.
           </description>
         </field>
+        <field>
+          <name>releaseStrategyId</name>
+          <version>3.0.0+</version>
+          <type>String</type>
+          <defaultValue>default</defaultValue>
+          <description>
+            The role-hint for the release Strategy implementation.
+          </description>
+        </field>
 
         <field>
           <name>remoteTagging</name>
diff --git 
a/maven-release-manager/src/test/java/org/apache/maven/shared/release/DefaultReleaseManagerTest.java
 
b/maven-release-manager/src/test/java/org/apache/maven/shared/release/DefaultReleaseManagerTest.java
index 43a935a..891934e 100644
--- 
a/maven-release-manager/src/test/java/org/apache/maven/shared/release/DefaultReleaseManagerTest.java
+++ 
b/maven-release-manager/src/test/java/org/apache/maven/shared/release/DefaultReleaseManagerTest.java
@@ -316,8 +316,11 @@ public class DefaultReleaseManagerTest
         ReleaseManager releaseManager = lookup( ReleaseManager.class, 
"bad-phase-configured" );
 
         ReleasePrepareRequest prepareRequest = new ReleasePrepareRequest();
-        prepareRequest.setReleaseDescriptor( new ReleaseDescriptor() );
+        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        releaseDescriptor.setReleaseStrategyId( "foo" );
+        prepareRequest.setReleaseDescriptor( releaseDescriptor );
         prepareRequest.setReleaseEnvironment( new DefaultReleaseEnvironment() 
);
+        
         try
         {
             releaseManager.prepare( prepareRequest );
diff --git 
a/maven-release-manager/src/test/resources/org/apache/maven/shared/release/DefaultReleaseManagerTest.xml
 
b/maven-release-manager/src/test/resources/org/apache/maven/shared/release/DefaultReleaseManagerTest.xml
index ff18c6a..01fbb8a 100644
--- 
a/maven-release-manager/src/test/resources/org/apache/maven/shared/release/DefaultReleaseManagerTest.xml
+++ 
b/maven-release-manager/src/test/resources/org/apache/maven/shared/release/DefaultReleaseManagerTest.xml
@@ -33,7 +33,16 @@
           <role-hint>stub</role-hint>
           <field-name>configStore</field-name>
         </requirement>
+        <requirement>
+          <role>org.apache.maven.shared.release.strategy.Strategy</role>
+          <field-name>strategies</field-name>
+        </requirement>
       </requirements>
+    </component>
+    <component>
+      <role>org.apache.maven.shared.release.strategy.Strategy</role>
+      <role-hint>default</role-hint>
+      
<implementation>org.apache.maven.shared.release.strategies.DefaultStrategy</implementation>
       <configuration>
         <preparePhases>
           <phase>step1</phase>
@@ -70,6 +79,10 @@
           <role-hint>stub</role-hint>
           <field-name>configStore</field-name>
         </requirement>
+        <requirement>
+          <role>org.apache.maven.shared.release.strategy.Strategy</role>
+          <field-name>strategies</field-name>
+        </requirement>
       </requirements>
       <configuration>
         <preparePhases>
@@ -78,6 +91,16 @@
       </configuration>
     </component>
     <component>
+      <role>org.apache.maven.shared.release.strategy.Strategy</role>
+      <role-hint>foo</role-hint>
+      
<implementation>org.apache.maven.shared.release.strategies.DefaultStrategy</implementation>
+      <configuration>
+        <preparePhases>
+          <phase>foo</phase>
+        </preparePhases>
+      </configuration>
+    </component>
+    <component>
       
<role>org.apache.maven.shared.release.config.ReleaseDescriptorStore</role>
       <role-hint>stub</role-hint>
       
<implementation>org.apache.maven.shared.release.config.ReleaseDescriptorStoreStub</implementation>
diff --git 
a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractReleaseMojo.java
 
b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractReleaseMojo.java
index faa9805..ed8b0d6 100644
--- 
a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractReleaseMojo.java
+++ 
b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractReleaseMojo.java
@@ -125,6 +125,16 @@ public abstract class AbstractReleaseMojo
     protected MavenSession session;
 
     /**
+     * The role-hint for the {@link 
org.apache.maven.shared.release.strategy.Strategy}
+     * implementation used to specify the phases per goal.
+     * 
+     * @since 3.0.0
+     * @see org.apache.maven.shared.release.strategies.DefaultStrategy
+     */
+    @Parameter( defaultValue = "default", property = "releaseStrategyId" )
+    private String releaseStrategyId;
+    
+    /**
      * Gets the enviroment settings configured for this release.
      *
      * @return The release environment, never <code>null</code>.
@@ -187,6 +197,8 @@ public abstract class AbstractReleaseMojo
             }
         }
         descriptor.setAdditionalArguments( args );
+        
+        descriptor.setReleaseStrategyId( releaseStrategyId );
 
         return descriptor;
     }
diff --git 
a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/CleanReleaseMojo.java
 
b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/CleanReleaseMojo.java
index 4ef5af8..186785b 100644
--- 
a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/CleanReleaseMojo.java
+++ 
b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/CleanReleaseMojo.java
@@ -23,6 +23,7 @@ import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.shared.release.ReleaseCleanRequest;
+import org.apache.maven.shared.release.ReleaseFailureException;
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
 
 /**
@@ -50,7 +51,14 @@ public class CleanReleaseMojo
         cleanRequest.setReleaseDescriptor( releaseDescriptor );
         cleanRequest.setReactorProjects( getReactorProjects() );
         
-        releaseManager.clean( cleanRequest );
+        try
+        {
+            releaseManager.clean( cleanRequest );
+        }
+        catch ( ReleaseFailureException e )
+        {
+            throw new MojoFailureException( e.getMessage() );
+        }
     }
 
 }
diff --git 
a/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/CleanReleaseMojoTest.java
 
b/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/CleanReleaseMojoTest.java
index 6cdd62d..2a972c3 100644
--- 
a/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/CleanReleaseMojoTest.java
+++ 
b/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/CleanReleaseMojoTest.java
@@ -25,12 +25,9 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
 
 import java.io.File;
 
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugin.testing.AbstractMojoTestCase;
 import org.apache.maven.shared.release.ReleaseCleanRequest;
 import org.apache.maven.shared.release.ReleaseManager;
-import org.apache.maven.shared.release.config.ReleaseDescriptor;
 import org.mockito.ArgumentCaptor;
 
 /**
@@ -57,7 +54,7 @@ public class CleanReleaseMojoTest
     }
 
     public void testClean()
-        throws MojoFailureException, MojoExecutionException
+        throws Exception
     {
         // prepare
         ArgumentCaptor<ReleaseCleanRequest> request = ArgumentCaptor.forClass( 
ReleaseCleanRequest.class );
diff --git 
a/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PrepareReleaseMojoTest.java
 
b/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PrepareReleaseMojoTest.java
index 76525d7..deca8a5 100644
--- 
a/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PrepareReleaseMojoTest.java
+++ 
b/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PrepareReleaseMojoTest.java
@@ -25,16 +25,13 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.nullValue;
 import static org.junit.Assert.assertThat;
 
-import static org.mockito.Matchers.eq;
 import static org.mockito.Matchers.isA;
-import static org.mockito.Matchers.isNull;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 
 import java.io.File;
-import java.util.List;
 import java.util.Properties;
 
 import org.apache.maven.execution.MavenSession;
diff --git 
a/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java
 
b/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java
index 882bffa..6ea0bb2 100644
--- 
a/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java
+++ 
b/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java
@@ -19,15 +19,11 @@ package org.apache.maven.plugins.release;
  * under the License.
  */
 
-import static org.mockito.Matchers.eq;
-import static org.mockito.Matchers.isA;
-import static org.mockito.Matchers.isNull;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 
 import java.io.File;
-import java.util.List;
 
 import org.apache.maven.model.DistributionManagement;
 import org.apache.maven.model.Site;
@@ -36,7 +32,6 @@ import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.release.ReleaseManager;
 import org.apache.maven.shared.release.ReleasePerformRequest;
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
-import org.apache.maven.shared.release.env.ReleaseEnvironment;
 import org.mockito.ArgumentCaptor;
 
 /**
@@ -49,7 +44,6 @@ public class StageReleaseMojoTest
 {
     private File workingDirectory;
 
-    @SuppressWarnings( "unchecked" )
     public void testStage()
         throws Exception
     {

-- 
To stop receiving notification emails like this one, please contact
"[email protected]" <[email protected]>.

Reply via email to