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