Coverage Report - org.apache.maven.plugins.release.AbstractReleaseMojo
 
Classes in this File Line Coverage Branch Coverage Complexity
AbstractReleaseMojo
83%
47/56
58%
14/24
2,091
 
 1  
 package org.apache.maven.plugins.release;
 2  
 
 3  
 /*
 4  
  * Licensed to the Apache Software Foundation (ASF) under one
 5  
  * or more contributor license agreements.  See the NOTICE file
 6  
  * distributed with this work for additional information
 7  
  * regarding copyright ownership.  The ASF licenses this file
 8  
  * to you under the Apache License, Version 2.0 (the
 9  
  * "License"); you may not use this file except in compliance
 10  
  * with the License.  You may obtain a copy of the License at
 11  
  *
 12  
  *  http://www.apache.org/licenses/LICENSE-2.0
 13  
  *
 14  
  * Unless required by applicable law or agreed to in writing,
 15  
  * software distributed under the License is distributed on an
 16  
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 17  
  * KIND, either express or implied.  See the License for the
 18  
  * specific language governing permissions and limitations
 19  
  * under the License.
 20  
  */
 21  
 
 22  
 import java.io.File;
 23  
 import java.util.Iterator;
 24  
 import java.util.List;
 25  
 import java.util.Map;
 26  
 
 27  
 import org.apache.maven.execution.MavenSession;
 28  
 import org.apache.maven.model.Profile;
 29  
 import org.apache.maven.plugin.AbstractMojo;
 30  
 import org.apache.maven.plugin.MojoExecutionException;
 31  
 import org.apache.maven.plugin.MojoFailureException;
 32  
 import org.apache.maven.project.MavenProject;
 33  
 import org.apache.maven.scm.manager.ScmManager;
 34  
 import org.apache.maven.settings.Settings;
 35  
 import org.apache.maven.shared.release.ReleaseManager;
 36  
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
 37  
 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
 38  
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
 39  
 import org.codehaus.plexus.util.StringUtils;
 40  
 
 41  
 /**
 42  
  * Base class with shared configuration.
 43  
  *
 44  
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
 45  
  * @version $Id: AbstractReleaseMojo.java 1333174 2012-05-02 19:52:18Z rfscholte $
 46  
  */
 47  14
 public abstract class AbstractReleaseMojo
 48  
     extends AbstractMojo
 49  
 {
 50  
     /**
 51  
      * The SCM username to use.
 52  
      *
 53  
      * @parameter expression="${username}"
 54  
      */
 55  
     private String username;
 56  
 
 57  
     /**
 58  
      * The SCM password to use.
 59  
      *
 60  
      * @parameter expression="${password}"
 61  
      */
 62  
     private String password;
 63  
 
 64  
     /**
 65  
      * The SCM tag to use.
 66  
      *
 67  
      * @parameter expression="${tag}" alias="releaseLabel"
 68  
      */
 69  
     private String tag;
 70  
 
 71  
     /**
 72  
      * Format to use when generating the tag name if none is specified. Property interpolation is performed on the
 73  
      * tag, but in order to ensure that the interpolation occurs during release, you must use <code>@{...}</code>
 74  
      * to reference the properties rather than <code>${...}</code>. The following properties are available:
 75  
      * <ul>
 76  
      *     <li><code>groupId</code> or <code>project.groupId</code> - The groupId of the root project.
 77  
      *     <li><code>artifactId</code> or <code>project.artifactId</code> - The artifactId of the root project.
 78  
      *     <li><code>version</code> or <code>project.version</code> - The release version of the root project.
 79  
      * </ul>
 80  
      *
 81  
      * @parameter expression="${tagNameFormat}" default-value="@{project.artifactId}-@{project.version}"
 82  
      * @since 2.2.0
 83  
      */
 84  
     private String tagNameFormat;
 85  
 
 86  
     /**
 87  
      * The tag base directory in SVN, you must define it if you don't use the standard svn layout (trunk/tags/branches).
 88  
      * For example, <code>http://svn.apache.org/repos/asf/maven/plugins/tags</code>. The URL is an SVN URL and does not
 89  
      * include the SCM provider and protocol.
 90  
      *
 91  
      * @parameter expression="${tagBase}"
 92  
      */
 93  
     private String tagBase;
 94  
 
 95  
     /**
 96  
      * @parameter default-value="${basedir}"
 97  
      * @required
 98  
      * @readonly
 99  
      */
 100  
     private File basedir;
 101  
 
 102  
     /**
 103  
      * @parameter default-value="${settings}"
 104  
      * @required
 105  
      * @readonly
 106  
      */
 107  
     private Settings settings;
 108  
 
 109  
     /**
 110  
      * @parameter default-value="${project}"
 111  
      * @required
 112  
      * @readonly
 113  
      */
 114  
     protected MavenProject project;
 115  
 
 116  
     /**
 117  
      * @component
 118  
      */
 119  
     protected ReleaseManager releaseManager;
 120  
 
 121  
     /**
 122  
      * Additional arguments to pass to the Maven executions, separated by spaces.
 123  
      *
 124  
      * @parameter expression="${arguments}" alias="prepareVerifyArgs"
 125  
      */
 126  
     private String arguments;
 127  
 
 128  
     /**
 129  
      * The file name of the POM to execute any goals against.
 130  
      *
 131  
      * @parameter expression="${pomFileName}"
 132  
      */
 133  
     private String pomFileName;
 134  
 
 135  
     /**
 136  
      * The message prefix to use for all SCM changes.
 137  
      *
 138  
      * @parameter expression="${scmCommentPrefix}" default-value="[maven-release-plugin] "
 139  
      * @since 2.0-beta-5
 140  
      */
 141  
     private String scmCommentPrefix;
 142  
 
 143  
     /**
 144  
      * @parameter default-value="${reactorProjects}"
 145  
      * @required
 146  
      * @readonly
 147  
      */
 148  
     private List<MavenProject> reactorProjects;
 149  
 
 150  
     /**
 151  
      * Add a new or overwrite the default implementation per provider. 
 152  
      * The key is the scm prefix and the value is the role hint of the {@link org.apache.maven.scm.provider.ScmProvider}.
 153  
      *
 154  
      * @parameter
 155  
      * @since 2.0-beta-6
 156  
      * @see ScmManager#setScmProviderImplementation(String, String)
 157  
      */
 158  
     private Map<String, String> providerImplementations;
 159  
 
 160  
     /**
 161  
      * The {@code M2_HOME} parameter to use for forked Maven invocations.
 162  
      *
 163  
      * @parameter default-value="${maven.home}"
 164  
      * @since 2.0-beta-8
 165  
      */
 166  
     protected File mavenHome;
 167  
 
 168  
     /**
 169  
      * The {@code JAVA_HOME} parameter to use for forked Maven invocations.
 170  
      *
 171  
      * @parameter default-value="${java.home}"
 172  
      * @since 2.0-beta-8
 173  
      */
 174  
     private File javaHome;
 175  
 
 176  
     /**
 177  
      * The command-line local repository directory in use for this build (if specified).
 178  
      *
 179  
      * @parameter default-value="${maven.repo.local}"
 180  
      * @since 2.0-beta-8
 181  
      */
 182  
     private File localRepoDirectory;
 183  
 
 184  
     /**
 185  
      * Role hint of the {@link org.apache.maven.shared.release.exec.MavenExecutor} implementation to use.
 186  
      *
 187  
      * @parameter expression="${mavenExecutorId}" default-value="invoker"
 188  
      * @since 2.0-beta-8
 189  
      */
 190  
     private String mavenExecutorId;
 191  
 
 192  
     /**
 193  
      * Use a local checkout instead of doing a checkout from the upstream repository.
 194  
      * ATTENTION: This will only work with distributed SCMs which support the file:// protocol
 195  
      * like e.g. git, jgit or hg!
 196  
      *
 197  
      * TODO: we should think about having the defaults for the various SCM providers provided via modello!
 198  
      *
 199  
      * @parameter expression="${localCheckout}" default-value="false"
 200  
      * @since 2.0
 201  
      */
 202  
     private boolean localCheckout;
 203  
     
 204  
     /**
 205  
      * Implemented with git will or not push changes to the upstream repository.
 206  
      * <code>true</code> by default to preserve backward compatibility.
 207  
      * @parameter expression="${pushChanges}" default-value="true"
 208  
      * @since 2.1
 209  
      */
 210  14
     private boolean pushChanges = true;
 211  
 
 212  
     /**
 213  
      * The SCM manager.
 214  
      *
 215  
      * @component
 216  
      */
 217  
     private ScmManager scmManager;
 218  
 
 219  
     /**
 220  
      * @parameter default-value="${session}"
 221  
      * @readonly
 222  
      * @required
 223  
      * @since 2.0
 224  
      */
 225  
     protected MavenSession session;
 226  
 
 227  
 
 228  
     /**
 229  
      * Gets the enviroment settings configured for this release.
 230  
      *
 231  
      * @return The release environment, never <code>null</code>.
 232  
      */
 233  
     protected ReleaseEnvironment getReleaseEnvironment()
 234  
     {
 235  13
         return new DefaultReleaseEnvironment().setSettings( settings )
 236  
                                               .setJavaHome( javaHome )
 237  
                                               .setMavenHome( mavenHome )
 238  
                                               .setLocalRepositoryDirectory( localRepoDirectory )
 239  
                                               .setMavenExecutorId( mavenExecutorId );
 240  
     }
 241  
 
 242  
     /**
 243  
      * {@inheritDoc}
 244  
      */
 245  
     public void execute()
 246  
         throws MojoExecutionException, MojoFailureException
 247  
     {
 248  14
         if ( providerImplementations != null )
 249  
         {
 250  0
             for ( Map.Entry<String, String> providerEntry : providerImplementations.entrySet() )
 251  
             {
 252  0
                 getLog().info( "Change the default '" + providerEntry.getKey() + "' provider implementation to '"
 253  
                     + providerEntry.getValue() + "'." );
 254  0
                 scmManager.setScmProviderImplementation( providerEntry.getKey(), providerEntry.getValue() );
 255  
             }
 256  
         }
 257  14
     }
 258  
 
 259  
     /**
 260  
      * Creates the release descriptor from the various goal parameters.
 261  
      *
 262  
      * @return The release descriptor, never <code>null</code>.
 263  
      */
 264  
     protected ReleaseDescriptor createReleaseDescriptor()
 265  
     {
 266  13
         ReleaseDescriptor descriptor = new ReleaseDescriptor();
 267  
 
 268  13
         descriptor.setInteractive( settings.isInteractiveMode() );
 269  
 
 270  13
         descriptor.setScmPassword( password );
 271  13
         descriptor.setScmReleaseLabel( tag );
 272  13
         descriptor.setScmTagNameFormat( tagNameFormat );
 273  13
         descriptor.setScmTagBase( tagBase );
 274  13
         descriptor.setScmUsername( username );
 275  13
         descriptor.setScmCommentPrefix( scmCommentPrefix );
 276  
 
 277  13
         descriptor.setWorkingDirectory( basedir.getAbsolutePath() );
 278  
 
 279  13
         descriptor.setPomFileName( pomFileName );
 280  
 
 281  13
         descriptor.setLocalCheckout( localCheckout );
 282  
         
 283  13
         descriptor.setPushChanges( pushChanges );
 284  
 
 285  
         @SuppressWarnings("unchecked")
 286  13
         List<Profile> profiles = project.getActiveProfiles();
 287  
 
 288  13
         String arguments = this.arguments;
 289  13
         if ( profiles != null && !profiles.isEmpty() )
 290  
         {
 291  2
             if ( !StringUtils.isEmpty( arguments ) )
 292  
             {
 293  1
                 arguments += " -P ";
 294  
             }
 295  
             else
 296  
             {
 297  1
                 arguments = "-P ";
 298  
             }
 299  
 
 300  2
             for ( Iterator<Profile> it = profiles.iterator(); it.hasNext(); )
 301  
             {
 302  4
                 Profile profile = it.next();
 303  
 
 304  4
                 arguments += profile.getId();
 305  4
                 if ( it.hasNext() )
 306  
                 {
 307  2
                     arguments += ",";
 308  
                 }
 309  4
             }
 310  
 
 311  2
             String additionalProfiles = getAdditionalProfiles();
 312  2
             if ( additionalProfiles != null )
 313  
             {
 314  0
                 if ( !profiles.isEmpty() )
 315  
                 {
 316  0
                     arguments += ",";
 317  
                 }
 318  0
                 arguments += additionalProfiles;
 319  
             }
 320  
         }
 321  13
         descriptor.setAdditionalArguments( arguments );
 322  
 
 323  13
         return descriptor;
 324  
     }
 325  
 
 326  
     /**
 327  
      * Gets the comma separated list of additional profiles for the release build.
 328  
      *
 329  
      * @return additional profiles to enable during release
 330  
      */
 331  
     protected String getAdditionalProfiles()
 332  
     {
 333  0
         return null;
 334  
     }
 335  
 
 336  
     /**
 337  
      * Sets the component used to perform release actions.
 338  
      *
 339  
      * @param releaseManager The release manager implementation to use, must not be <code>null</code>.
 340  
      */
 341  
     void setReleaseManager( ReleaseManager releaseManager )
 342  
     {
 343  14
         this.releaseManager = releaseManager;
 344  14
     }
 345  
 
 346  
     /**
 347  
      * Gets the effective settings for this build.
 348  
      *
 349  
      * @return The effective settings for this build, never <code>null</code>.
 350  
      */
 351  
     Settings getSettings()
 352  
     {
 353  0
         return settings;
 354  
     }
 355  
     
 356  
     protected final File getBasedir()
 357  
     {
 358  1
         return basedir;
 359  
     }
 360  
 
 361  
     /**
 362  
      * Sets the base directory of the build.
 363  
      *
 364  
      * @param basedir The build's base directory, must not be <code>null</code>.
 365  
      */
 366  
     public void setBasedir( File basedir )
 367  
     {
 368  14
         this.basedir = basedir;
 369  14
     }
 370  
 
 371  
     /**
 372  
      * Gets the list of projects in the build reactor.
 373  
      *
 374  
      * @return The list of reactor project, never <code>null</code>.
 375  
      */
 376  
     public List<MavenProject> getReactorProjects()
 377  
     {
 378  15
         return reactorProjects;
 379  
     }
 380  
 
 381  
     /**
 382  
      * Add additional arguments.
 383  
      *
 384  
      * @param argument The argument to add, must not be <code>null</code>.
 385  
      */
 386  
     protected void addArgument( String argument )
 387  
     {
 388  1
         if ( arguments != null )
 389  
         {
 390  0
             arguments += " " + argument;
 391  
         }
 392  
         else
 393  
         {
 394  1
             arguments = argument;
 395  
         }
 396  1
     }
 397  
 
 398  
     /**
 399  
      * This method takes some of the release configuration picked up from the command line system properties and copies
 400  
      * it into the release config object.
 401  
      *
 402  
      * @param config The release configuration to merge the system properties into, must not be <code>null</code>.
 403  
      * @param sysPropertiesConfig The configuration from the system properties to merge in, must not be
 404  
      *            <code>null</code>.
 405  
      */
 406  
     protected void mergeCommandLineConfig( ReleaseDescriptor config, ReleaseDescriptor sysPropertiesConfig )
 407  
     {
 408  
         // If the user specifies versions, these should override the existing versions
 409  3
         if ( sysPropertiesConfig.getReleaseVersions() != null )
 410  
         {
 411  3
             config.getReleaseVersions().putAll( sysPropertiesConfig.getReleaseVersions() );
 412  
         }
 413  3
         if ( sysPropertiesConfig.getDevelopmentVersions() != null )
 414  
         {
 415  3
             config.getDevelopmentVersions().putAll( sysPropertiesConfig.getDevelopmentVersions() );
 416  
         }
 417  3
     }
 418  
 }