1 package org.apache.maven.shared.release.policy.oddeven;
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.shared.release.policy.PolicyException;
25 import org.apache.maven.shared.release.policy.version.VersionPolicy;
26 import org.apache.maven.shared.release.policy.version.VersionPolicyRequest;
27 import org.apache.maven.shared.release.policy.version.VersionPolicyResult;
28 import org.apache.maven.shared.release.versions.DefaultVersionInfo;
29 import org.apache.maven.shared.release.versions.VersionInfo;
30 import org.apache.maven.shared.release.versions.VersionParseException;
31 import org.codehaus.plexus.component.annotations.Component;
32 import org.codehaus.plexus.util.StringUtils;
33
34
35
36
37 @Component(
38 role = VersionPolicy.class,
39 hint = "OddEvenVersionPolicy",
40 description = "A VersionPolicy implementation that allows release even version numbers"
41 )
42 public final class OddEvenVersionPolicy
43 implements VersionPolicy
44 {
45
46 public VersionPolicyResult getReleaseVersion( VersionPolicyRequest request )
47 throws PolicyException
48 {
49 return calculateNextVersion( request, false );
50 }
51
52 public VersionPolicyResult getDevelopmentVersion( VersionPolicyRequest request )
53 throws PolicyException
54 {
55 return calculateNextVersion( request, true );
56 }
57
58 private VersionPolicyResult calculateNextVersion( VersionPolicyRequest request, boolean development )
59 {
60 DefaultVersionInfo defaultVersionInfo = null;
61
62 try
63 {
64 defaultVersionInfo = new DefaultVersionInfo( request.getVersion() );
65 }
66 catch ( VersionParseException e )
67 {
68 throw new IllegalArgumentException( "Can't tell if version with no digits is even: " + e.getMessage(), e );
69 }
70
71
72 int versionNumbersToSkip = 1;
73
74
75 if ( development && !isEven( defaultVersionInfo ) )
76 {
77 versionNumbersToSkip = 2;
78 }
79
80
81 if ( !development && isEven( defaultVersionInfo ) )
82 {
83 versionNumbersToSkip = 0;
84 }
85
86 VersionInfo suggestedVersionInfo = defaultVersionInfo;
87 while ( versionNumbersToSkip != 0 )
88 {
89 suggestedVersionInfo = suggestedVersionInfo.getNextVersion();
90 versionNumbersToSkip--;
91 }
92
93 String nextVersion = development ? suggestedVersionInfo.getSnapshotVersionString()
94 : suggestedVersionInfo.getReleaseVersionString();
95
96 return new VersionPolicyResult().setVersion( nextVersion );
97 }
98
99 private boolean isEven( DefaultVersionInfo defaultVersionInfo )
100 {
101 int mostSignificantSegment;
102
103 if ( StringUtils.isNumeric( defaultVersionInfo.getAnnotationRevision() ) )
104 {
105 mostSignificantSegment = Integer.parseInt( defaultVersionInfo.getAnnotationRevision() );
106 }
107 else
108 {
109 List<String> digits = defaultVersionInfo.getDigits();
110
111 if ( digits == null )
112 {
113 throw new IllegalArgumentException( "Can't tell if version with no digits is even." );
114 }
115
116 mostSignificantSegment = Integer.parseInt( digits.get( digits.size() - 1 ) );
117 }
118
119 return mostSignificantSegment % 2 == 0;
120 }
121
122 }