Coverage Report - org.apache.maven.shared.release.phase.InputVariablesPhase
 
Classes in this File Line Coverage Branch Coverage Complexity
InputVariablesPhase
84%
44/52
100%
8/8
5
 
 1  
 package org.apache.maven.shared.release.phase;
 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 org.apache.maven.artifact.ArtifactUtils;
 23  
 import org.apache.maven.project.MavenProject;
 24  
 import org.apache.maven.scm.manager.NoSuchScmProviderException;
 25  
 import org.apache.maven.scm.provider.ScmProvider;
 26  
 import org.apache.maven.scm.repository.ScmRepository;
 27  
 import org.apache.maven.scm.repository.ScmRepositoryException;
 28  
 import org.apache.maven.shared.release.ReleaseExecutionException;
 29  
 import org.apache.maven.shared.release.ReleaseResult;
 30  
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
 31  
 import org.apache.maven.shared.release.env.ReleaseEnvironment;
 32  
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 33  
 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 34  
 import org.apache.maven.shared.release.util.ReleaseUtil;
 35  
 import org.codehaus.plexus.components.interactivity.Prompter;
 36  
 import org.codehaus.plexus.components.interactivity.PrompterException;
 37  
 import org.codehaus.plexus.interpolation.InterpolationException;
 38  
 import org.codehaus.plexus.interpolation.Interpolator;
 39  
 import org.codehaus.plexus.interpolation.PrefixAwareRecursionInterceptor;
 40  
 import org.codehaus.plexus.interpolation.PrefixedPropertiesValueSource;
 41  
 import org.codehaus.plexus.interpolation.RecursionInterceptor;
 42  
 import org.codehaus.plexus.interpolation.StringSearchInterpolator;
 43  
 
 44  
 import java.util.List;
 45  
 import java.util.Properties;
 46  
 
 47  
 /**
 48  
  * Input any variables that were not yet configured.
 49  
  *
 50  
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
 51  
  * @plexus.component role="org.apache.maven.shared.release.phase.ReleasePhase" role-hint="input-variables"
 52  
  */
 53  74
 public class InputVariablesPhase
 54  
     extends AbstractReleasePhase
 55  
 {
 56  
     /**
 57  
      * Component used to prompt for input.
 58  
      *
 59  
      * @plexus.requirement
 60  
      */
 61  
     private Prompter prompter;
 62  
 
 63  
     /**
 64  
      * Tool that gets a configured SCM repository from release configuration.
 65  
      *
 66  
      * @plexus.requirement
 67  
      */
 68  
     private ScmRepositoryConfigurator scmRepositoryConfigurator;
 69  
 
 70  
     void setPrompter( Prompter prompter )
 71  
     {
 72  14
         this.prompter = prompter;
 73  14
     }
 74  
 
 75  
     protected ScmProvider getScmProvider( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment )
 76  
         throws ReleaseScmRepositoryException, ReleaseExecutionException
 77  
     {
 78  
         try
 79  
         {
 80  20
             ScmRepository repository =
 81  
                 scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor, releaseEnvironment.getSettings() );
 82  
 
 83  20
             return scmRepositoryConfigurator.getRepositoryProvider( repository );
 84  
         }
 85  0
         catch ( ScmRepositoryException e )
 86  
         {
 87  0
             throw new ReleaseScmRepositoryException(
 88  
                 e.getMessage() + " for URL: " + releaseDescriptor.getScmSourceUrl(), e.getValidationMessages() );
 89  
         }
 90  0
         catch ( NoSuchScmProviderException e )
 91  
         {
 92  0
             throw new ReleaseExecutionException( "Unable to configure SCM repository: " + e.getMessage(), e );
 93  
         }
 94  
     }
 95  
 
 96  
     public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
 97  
                                   List<MavenProject> reactorProjects )
 98  
         throws ReleaseExecutionException
 99  
     {
 100  32
         ReleaseResult result = new ReleaseResult();
 101  
 
 102  
         // get the root project
 103  32
         MavenProject project = ReleaseUtil.getRootProject( reactorProjects );
 104  
 
 105  32
         String tag = releaseDescriptor.getScmReleaseLabel();
 106  
 
 107  32
         if ( tag == null )
 108  
         {
 109  
             // Must get default version from mapped versions, as the project will be the incorrect snapshot
 110  24
             String key = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() );
 111  24
             String releaseVersion = (String) releaseDescriptor.getReleaseVersions().get( key );
 112  24
             if ( releaseVersion == null )
 113  
             {
 114  4
                 throw new ReleaseExecutionException( "Project tag cannot be selected if version is not yet mapped" );
 115  
             }
 116  
 
 117  
             String defaultTag;
 118  20
             String scmTagNameFormat = releaseDescriptor.getScmTagNameFormat();
 119  20
             if ( scmTagNameFormat != null )
 120  
             {
 121  2
                 Interpolator interpolator = new StringSearchInterpolator( "@{", "}" );
 122  2
                 List<String> possiblePrefixes = java.util.Arrays.asList( "project", "pom" );
 123  2
                 Properties values = new Properties();
 124  2
                 values.setProperty( "artifactId", project.getArtifactId() );
 125  2
                 values.setProperty( "groupId", project.getGroupId() );
 126  2
                 values.setProperty( "version", releaseVersion );
 127  2
                 interpolator.addValueSource( new PrefixedPropertiesValueSource( possiblePrefixes, values, true ) );
 128  2
                 RecursionInterceptor recursionInterceptor = new PrefixAwareRecursionInterceptor( possiblePrefixes );
 129  
                 try
 130  
                 {
 131  2
                     defaultTag = interpolator.interpolate( scmTagNameFormat, recursionInterceptor );
 132  
                 }
 133  0
                 catch ( InterpolationException e )
 134  
                 {
 135  0
                     throw new ReleaseExecutionException(
 136  
                         "Could not interpolate specified tag name format: " + scmTagNameFormat, e );
 137  2
                 }
 138  2
             }
 139  
             else
 140  
             {
 141  18
                 defaultTag = project.getArtifactId() + "-" + releaseVersion;
 142  
             }
 143  
 
 144  20
             ScmProvider provider = null;
 145  
             try
 146  
             {
 147  20
                 provider = getScmProvider( releaseDescriptor, releaseEnvironment );
 148  
             }
 149  0
             catch ( ReleaseScmRepositoryException e )
 150  
             {
 151  0
                 throw new ReleaseExecutionException(
 152  
                     "No scm provider can be found for url: " + releaseDescriptor.getScmSourceUrl(), e );
 153  20
             }
 154  
 
 155  20
             defaultTag = provider.sanitizeTagName( defaultTag );
 156  
 
 157  20
             if ( releaseDescriptor.isInteractive() )
 158  
             {
 159  
                 try
 160  
                 {
 161  8
                     tag =
 162  
                         prompter.prompt( "What is SCM release tag or label for \"" + project.getName() + "\"? ("
 163  
                             + project.getGroupId() + ":" + project.getArtifactId() + ")", defaultTag );
 164  
                 }
 165  4
                 catch ( PrompterException e )
 166  
                 {
 167  4
                     throw new ReleaseExecutionException( "Error reading version from input handler: " + e.getMessage(),
 168  
                                                          e );
 169  4
                 }
 170  
             }
 171  
             else
 172  
             {
 173  12
                 tag = defaultTag;
 174  
             }
 175  16
             releaseDescriptor.setScmReleaseLabel( tag );
 176  
         }
 177  
 
 178  24
         result.setResultCode( ReleaseResult.SUCCESS );
 179  
 
 180  24
         return result;
 181  
     }
 182  
 
 183  
     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
 184  
                                    List<MavenProject> reactorProjects )
 185  
         throws ReleaseExecutionException
 186  
     {
 187  16
         ReleaseResult result = new ReleaseResult();
 188  
 
 189  
         // It makes no modifications, so simulate is the same as execute
 190  16
         execute( releaseDescriptor, releaseEnvironment, reactorProjects );
 191  
 
 192  12
         result.setResultCode( ReleaseResult.SUCCESS );
 193  
 
 194  12
         return result;
 195  
     }
 196  
 
 197  
 }