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 java.util.List;
23  
24  import org.apache.maven.artifact.ArtifactUtils;
25  import org.apache.maven.project.MavenProject;
26  import org.apache.maven.shared.release.ReleaseExecutionException;
27  import org.apache.maven.shared.release.ReleaseResult;
28  import org.apache.maven.shared.release.config.ReleaseDescriptor;
29  import org.apache.maven.shared.release.env.ReleaseEnvironment;
30  import org.apache.maven.shared.release.util.ReleaseUtil;
31  import org.apache.maven.shared.release.versions.DefaultVersionInfo;
32  import org.apache.maven.shared.release.versions.VersionInfo;
33  import org.apache.maven.shared.release.versions.VersionParseException;
34  import org.codehaus.plexus.components.interactivity.Prompter;
35  import org.codehaus.plexus.components.interactivity.PrompterException;
36  
37  /**
38   * Map projects to their new versions after release / into the next development cycle.
39   *
40   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
41   */
42  public class MapVersionsPhase
43      extends AbstractReleasePhase
44  {
45      /**
46       * Whether to convert to a snapshot or a release.
47       */
48      private boolean convertToSnapshot;
49  
50      /**
51       * Whether to convert to a snapshot or a release.
52       */
53      private boolean convertToBranch;
54  
55      /**
56       * Component used to prompt for input.
57       */
58      private Prompter prompter;
59  
60      void setPrompter( Prompter prompter )
61      {
62          this.prompter = prompter;
63      }
64  
65      public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
66                                    List<MavenProject> reactorProjects )
67          throws ReleaseExecutionException
68      {
69          ReleaseResult result = new ReleaseResult();
70  
71          MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
72  
73          if ( releaseDescriptor.isAutoVersionSubmodules() && ArtifactUtils.isSnapshot( rootProject.getVersion() ) )
74          {
75              // get the root project
76              MavenProject project = rootProject;
77  
78              String projectId = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() );
79  
80              String nextVersion = getNextVersion( project, projectId, releaseDescriptor, result );
81  
82              if ( convertToSnapshot )
83              {
84                  if ( releaseDescriptor.isBranchCreation() && convertToBranch )
85                  {
86                      releaseDescriptor.mapReleaseVersion( projectId, nextVersion );
87                  }
88                  else
89                  {
90                      releaseDescriptor.mapDevelopmentVersion( projectId, nextVersion );
91                  }
92              }
93              else
94              {
95                  releaseDescriptor.mapReleaseVersion( projectId, nextVersion );
96              }
97  
98              for ( MavenProject subProject : reactorProjects )
99              {
100                 String subProjectId =
101                     ArtifactUtils.versionlessKey( subProject.getGroupId(), subProject.getArtifactId() );
102 
103                 if ( convertToSnapshot )
104                 {
105                     String v;
106                     if ( ArtifactUtils.isSnapshot( subProject.getVersion() ) )
107                     {
108                         v = nextVersion;
109                     }
110                     else
111                     {
112                         v = subProject.getVersion();
113                     }
114 
115                     if ( releaseDescriptor.isBranchCreation() && convertToBranch )
116                     {
117                         releaseDescriptor.mapReleaseVersion( subProjectId, v );
118                     }
119                     else
120                     {
121                         releaseDescriptor.mapDevelopmentVersion( subProjectId, v );
122                     }
123                 }
124                 else
125                 {
126                     releaseDescriptor.mapReleaseVersion( subProjectId, nextVersion );
127                 }
128             }
129         }
130         else
131         {
132             for ( MavenProject project : reactorProjects )
133             {
134                 String projectId = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() );
135 
136                 String nextVersion = getNextVersion( project, projectId, releaseDescriptor, result );
137 
138                 if ( convertToSnapshot )
139                 {
140                     if ( releaseDescriptor.isBranchCreation() && convertToBranch )
141                     {
142                         releaseDescriptor.mapReleaseVersion( projectId, nextVersion );
143                     }
144                     else
145                     {
146                         releaseDescriptor.mapDevelopmentVersion( projectId, nextVersion );
147                     }
148                 }
149                 else
150                 {
151                     releaseDescriptor.mapReleaseVersion( projectId, nextVersion );
152                 }
153             }
154         }
155 
156         result.setResultCode( ReleaseResult.SUCCESS );
157 
158         return result;
159     }
160 
161     private String getNextVersion( MavenProject project, 
162                                    String projectId, 
163                                    ReleaseDescriptor releaseDescriptor,
164                                    ReleaseResult result )
165         throws ReleaseExecutionException
166     {
167         String nextVersion = null;
168 
169         VersionInfo currentVersionInfo = null;
170         VersionInfo releaseVersionInfo = null;
171         boolean releaseVersionIsExplicit = false;
172 
173         VersionInfo nextSnapshotVersionInfo = null;
174         boolean nextSnapshotVersionIsExplicit = false;
175 
176         try
177         {
178             currentVersionInfo = new DefaultVersionInfo( project.getVersion() );
179 
180             // The release/branch version defaults to currentVersionInfo (snapshot for branch, and release for tag)
181             releaseVersionInfo = currentVersionInfo;
182 
183             // Check if the user specified a release version
184             if ( releaseDescriptor.getDefaultReleaseVersion() != null )
185             {
186                 releaseVersionInfo = new DefaultVersionInfo( releaseDescriptor.getDefaultReleaseVersion() );
187                 releaseVersionIsExplicit = true;
188             }
189             if ( releaseDescriptor.getReleaseVersions() != null )
190             {
191                 String releaseVersion = ( String ) releaseDescriptor.getReleaseVersions().get( projectId );
192                 if ( releaseVersion != null )
193                 {
194                     releaseVersionInfo = new DefaultVersionInfo( releaseVersion );
195                     releaseVersionIsExplicit = true;
196                 }
197             }
198 
199             // The next snapshot version defaults to the next version after the release version
200             nextSnapshotVersionInfo = releaseVersionInfo.getNextVersion();
201 
202             // Check if the user specified a new snapshot version
203             if ( releaseDescriptor.getDefaultDevelopmentVersion() != null )
204             {
205                 nextSnapshotVersionInfo = new DefaultVersionInfo( releaseDescriptor.getDefaultDevelopmentVersion() );
206                 nextSnapshotVersionIsExplicit = true;
207             }
208             if ( releaseDescriptor.getDevelopmentVersions() != null )
209             {
210                 String nextDevVersion = ( String ) releaseDescriptor.getDevelopmentVersions().get( projectId );
211                 if ( nextDevVersion != null )
212                 {
213                     nextSnapshotVersionInfo = new DefaultVersionInfo( nextDevVersion );
214                     nextSnapshotVersionIsExplicit = true;
215                 }
216             }
217 
218         }
219         catch ( VersionParseException e )
220         {
221             String msg = "Error parsing version, cannot determine next version: " + e.getMessage();
222             if ( releaseDescriptor.isInteractive() )
223             {
224                 logWarn( result, msg );
225                 logDebug( result, e.getMessage(), e );
226 
227                 // set defaults for resume in interactive mode
228                 if ( releaseVersionInfo == null )
229                 {
230                     try
231                     {
232                         releaseVersionInfo = new DefaultVersionInfo( "1.0" );
233                     }
234                     catch ( VersionParseException e1 )
235                     {
236                         // if that happens we are in serious trouble!
237                         throw new ReleaseExecutionException( "Version 1.0 could not be parsed!", e1 );
238                     }
239                 }
240 
241                 if ( nextSnapshotVersionInfo == null )
242                 {
243                     nextSnapshotVersionInfo = releaseVersionInfo.getNextVersion();
244                 }
245             }
246             else
247             {
248                 // cannot proceed without a next value in batch mode
249                 throw new ReleaseExecutionException( msg, e );
250             }
251         }
252 
253         try
254         {
255             if ( convertToSnapshot )
256             {
257                 if ( releaseDescriptor.isBranchCreation() )
258                 {
259                     if ( convertToBranch )
260                     {
261                         // branch modification
262                         if ( releaseDescriptor.isUpdateBranchVersions()
263                             && ( ArtifactUtils.isSnapshot( project.getVersion() ) || releaseDescriptor.isUpdateVersionsToSnapshot() ) )
264                         {
265                             nextVersion = releaseVersionInfo.getSnapshotVersionString();
266                             if ( !releaseVersionIsExplicit && releaseDescriptor.isInteractive() )
267                             {
268                                 nextVersion = prompter.prompt(
269                                     "What is the branch version for \"" + project.getName() + "\"? (" + projectId + ")",
270                                     nextVersion );
271                             }
272                         }
273                         else
274                         {
275                             nextVersion = project.getVersion();
276                         }
277 
278                     }
279                     else
280                     {
281                         // working copy modification
282                         if ( ArtifactUtils.isSnapshot( project.getVersion() )
283                             && releaseDescriptor.isUpdateWorkingCopyVersions() )
284                         {
285                             nextVersion = nextSnapshotVersionInfo.getSnapshotVersionString();
286                             if ( releaseDescriptor.isInteractive() && !nextSnapshotVersionIsExplicit )
287                             {
288                                 nextVersion =
289                                     prompter.prompt( "What is the new working copy version for \"" + project.getName()
290                                         + "\"? (" + projectId + ")", nextVersion );
291                             }
292                         }
293                         else
294                         {
295                             nextVersion = project.getVersion();
296                         }
297                     }
298                 }
299                 else
300                 {
301                     if( releaseDescriptor.isUpdateWorkingCopyVersions() )
302                     {
303                         nextVersion = nextSnapshotVersionInfo.getSnapshotVersionString();
304                         if ( releaseDescriptor.isInteractive()  && !nextSnapshotVersionIsExplicit )
305                         {
306                             nextVersion =
307                                 prompter.prompt( "What is the new development version for \"" + project.getName() + "\"? ("
308                                     + projectId + ")", nextVersion );
309                         }
310                     }
311                     else
312                     {
313                         nextVersion = project.getVersion();
314                     }
315                 }
316             }
317             else
318             {
319                 if ( ArtifactUtils.isSnapshot( project.getVersion() ) )
320                 {
321                     nextVersion = releaseVersionInfo.getReleaseVersionString();
322 
323                     if ( releaseDescriptor.isInteractive() && !releaseVersionIsExplicit )
324                     {
325                         nextVersion = prompter.prompt(
326                             "What is the release version for \"" + project.getName() + "\"? (" + projectId + ")",
327                             nextVersion );
328                     }
329                 }
330                 else
331                 {
332                     nextVersion = project.getVersion();
333                 }
334             }
335         }
336         catch ( PrompterException e )
337         {
338             throw new ReleaseExecutionException( "Error reading version from input handler: " + e.getMessage(), e );
339         }
340 
341         return nextVersion;
342     }
343 
344     public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
345                                    List<MavenProject> reactorProjects )
346         throws ReleaseExecutionException
347     {
348         ReleaseResult result = new ReleaseResult();
349 
350         // It makes no modifications, so simulate is the same as execute
351         execute( releaseDescriptor, releaseEnvironment, reactorProjects );
352 
353         result.setResultCode( ReleaseResult.SUCCESS );
354 
355         return result;
356     }
357 }