1 package org.apache.maven.shared.release.phase;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
39
40
41
42 public class MapVersionsPhase
43 extends AbstractReleasePhase
44 {
45
46
47
48 private boolean convertToSnapshot;
49
50
51
52
53 private boolean convertToBranch;
54
55
56
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
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
181 releaseVersionInfo = currentVersionInfo;
182
183
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
200 nextSnapshotVersionInfo = releaseVersionInfo.getNextVersion();
201
202
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
228 if ( releaseVersionInfo == null )
229 {
230 try
231 {
232 releaseVersionInfo = new DefaultVersionInfo( "1.0" );
233 }
234 catch ( VersionParseException e1 )
235 {
236
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
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
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
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
351 execute( releaseDescriptor, releaseEnvironment, reactorProjects );
352
353 result.setResultCode( ReleaseResult.SUCCESS );
354
355 return result;
356 }
357 }