View Javadoc
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  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          this.prompter = prompter;
73      }
74  
75      protected ScmProvider getScmProvider( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment )
76          throws ReleaseScmRepositoryException, ReleaseExecutionException
77      {
78          try
79          {
80              ScmRepository repository =
81                  scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor, releaseEnvironment.getSettings() );
82  
83              return scmRepositoryConfigurator.getRepositoryProvider( repository );
84          }
85          catch ( ScmRepositoryException e )
86          {
87              throw new ReleaseScmRepositoryException(
88                  e.getMessage() + " for URL: " + releaseDescriptor.getScmSourceUrl(), e.getValidationMessages() );
89          }
90          catch ( NoSuchScmProviderException e )
91          {
92              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         ReleaseResult result = new ReleaseResult();
101 
102         // get the root project
103         MavenProject project = ReleaseUtil.getRootProject( reactorProjects );
104 
105         String tag = releaseDescriptor.getScmReleaseLabel();
106 
107         if ( tag == null )
108         {
109             // Must get default version from mapped versions, as the project will be the incorrect snapshot
110             String key = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() );
111             String releaseVersion = (String) releaseDescriptor.getReleaseVersions().get( key );
112             if ( releaseVersion == null )
113             {
114                 throw new ReleaseExecutionException( "Project tag cannot be selected if version is not yet mapped" );
115             }
116 
117             String defaultTag;
118             String scmTagNameFormat = releaseDescriptor.getScmTagNameFormat();
119             if ( scmTagNameFormat != null )
120             {
121                 Interpolator interpolator = new StringSearchInterpolator( "@{", "}" );
122                 List<String> possiblePrefixes = java.util.Arrays.asList( "project", "pom" );
123                 Properties values = new Properties();
124                 values.setProperty( "artifactId", project.getArtifactId() );
125                 values.setProperty( "groupId", project.getGroupId() );
126                 values.setProperty( "version", releaseVersion );
127                 interpolator.addValueSource( new PrefixedPropertiesValueSource( possiblePrefixes, values, true ) );
128                 RecursionInterceptor recursionInterceptor = new PrefixAwareRecursionInterceptor( possiblePrefixes );
129                 try
130                 {
131                     defaultTag = interpolator.interpolate( scmTagNameFormat, recursionInterceptor );
132                 }
133                 catch ( InterpolationException e )
134                 {
135                     throw new ReleaseExecutionException(
136                         "Could not interpolate specified tag name format: " + scmTagNameFormat, e );
137                 }
138             }
139             else
140             {
141                 defaultTag = project.getArtifactId() + "-" + releaseVersion;
142             }
143 
144             ScmProvider provider = null;
145             try
146             {
147                 provider = getScmProvider( releaseDescriptor, releaseEnvironment );
148             }
149             catch ( ReleaseScmRepositoryException e )
150             {
151                 throw new ReleaseExecutionException(
152                     "No scm provider can be found for url: " + releaseDescriptor.getScmSourceUrl(), e );
153             }
154 
155             defaultTag = provider.sanitizeTagName( defaultTag );
156 
157             if ( releaseDescriptor.isInteractive() )
158             {
159                 try
160                 {
161                     tag =
162                         prompter.prompt( "What is SCM release tag or label for \"" + project.getName() + "\"? ("
163                             + project.getGroupId() + ":" + project.getArtifactId() + ")", defaultTag );
164                 }
165                 catch ( PrompterException e )
166                 {
167                     throw new ReleaseExecutionException( "Error reading version from input handler: " + e.getMessage(),
168                                                          e );
169                 }
170             }
171             else
172             {
173                 tag = defaultTag;
174             }
175             releaseDescriptor.setScmReleaseLabel( tag );
176         }
177 
178         result.setResultCode( ReleaseResult.SUCCESS );
179 
180         return result;
181     }
182 
183     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
184                                    List<MavenProject> reactorProjects )
185         throws ReleaseExecutionException
186     {
187         ReleaseResult result = new ReleaseResult();
188 
189         // It makes no modifications, so simulate is the same as execute
190         execute( releaseDescriptor, releaseEnvironment, reactorProjects );
191 
192         result.setResultCode( ReleaseResult.SUCCESS );
193 
194         return result;
195     }
196 
197 }