View Javadoc

1   package org.apache.maven.shared.release.config;
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.HashMap;
23  import java.util.Iterator;
24  import java.util.Map;
25  import java.util.Map.Entry;
26  import java.util.Properties;
27  import java.util.Set;
28  
29  import org.apache.maven.shared.release.scm.IdentifiedScm;
30  
31  /**
32   * Class providing utility methods used during the release process
33   *
34   * @author <a href="mailto:jwhitlock@apache.org">Jeremy Whitlock</a>
35   */
36  public class ReleaseUtils
37  {
38      private ReleaseUtils()
39      {
40          // nothing to see here
41      }
42  
43      /**
44       * Merge two descriptors together. All SCM settings are overridden by the merge descriptor, as is the
45       * <code>workingDirectory</code> field. The <code>completedPhase</code> field is used as
46       * a default from the merge descriptor, but not overridden if it exists.
47       *
48       * @param mergeInto  the descriptor to be merged into
49       * @param toBeMerged the descriptor to merge into mergeInto
50       * @return ReleaseDescriptor the merged descriptor
51       */
52      public static ReleaseDescriptor merge( ReleaseDescriptor mergeInto, ReleaseDescriptor toBeMerged )
53      {
54          // Overridden if configured from the caller
55          mergeInto.setScmId( mergeOverride( mergeInto.getScmId(), toBeMerged.getScmId() ) );
56          mergeInto.setScmSourceUrl( mergeOverride( mergeInto.getScmSourceUrl(), toBeMerged.getScmSourceUrl() ) );
57          mergeInto.setScmCommentPrefix(
58              mergeOverride( mergeInto.getScmCommentPrefix(), toBeMerged.getScmCommentPrefix() ) );
59          mergeInto.setScmReleaseLabel( mergeOverride( mergeInto.getScmReleaseLabel(), toBeMerged.getScmReleaseLabel() ) );
60          mergeInto.setScmTagBase( mergeOverride( mergeInto.getScmTagBase(), toBeMerged.getScmTagBase() ) );
61          mergeInto.setScmTagNameFormat(
62              mergeOverride( mergeInto.getScmTagNameFormat(), toBeMerged.getScmTagNameFormat() ) );
63          mergeInto.setScmBranchBase( mergeOverride( mergeInto.getScmBranchBase(), toBeMerged.getScmBranchBase() ) );
64          mergeInto.setScmUsername( mergeOverride( mergeInto.getScmUsername(), toBeMerged.getScmUsername() ) );
65          mergeInto.setScmPassword( mergeOverride( mergeInto.getScmPassword(), toBeMerged.getScmPassword() ) );
66          mergeInto.setScmPrivateKey( mergeOverride( mergeInto.getScmPrivateKey(), toBeMerged.getScmPrivateKey() ) );
67          mergeInto.setScmPrivateKeyPassPhrase(
68              mergeOverride( mergeInto.getScmPrivateKeyPassPhrase(), toBeMerged.getScmPrivateKeyPassPhrase() ) );
69          mergeInto.setScmCommentPrefix(
70              mergeOverride( mergeInto.getScmCommentPrefix(), toBeMerged.getScmCommentPrefix() ) );
71          mergeInto.setAdditionalArguments(
72              mergeOverride( mergeInto.getAdditionalArguments(), toBeMerged.getAdditionalArguments() ) );
73          mergeInto.setPreparationGoals(
74              mergeOverride( mergeInto.getPreparationGoals(), toBeMerged.getPreparationGoals() ) );
75          mergeInto.setCompletionGoals(
76              mergeOverride( mergeInto.getCompletionGoals(), toBeMerged.getCompletionGoals() ) );
77          mergeInto.setPerformGoals( mergeOverride( mergeInto.getPerformGoals(), toBeMerged.getPerformGoals() ) );
78          mergeInto.setPomFileName( mergeOverride( mergeInto.getPomFileName(), toBeMerged.getPomFileName() ) );
79          mergeInto.setCheckModificationExcludes( toBeMerged.getCheckModificationExcludes() );
80          mergeInto.setScmUseEditMode( toBeMerged.isScmUseEditMode() );
81          mergeInto.setAddSchema( toBeMerged.isAddSchema() );
82          mergeInto.setGenerateReleasePoms( toBeMerged.isGenerateReleasePoms() );
83          mergeInto.setInteractive( toBeMerged.isInteractive() );
84          mergeInto.setUpdateDependencies( toBeMerged.isUpdateDependencies() );
85          mergeInto.setCommitByProject( mergeOverride( mergeInto.isCommitByProject(), toBeMerged.isCommitByProject(),
86                                                       false ) );
87          mergeInto.setUseReleaseProfile( toBeMerged.isUseReleaseProfile() );
88          mergeInto.setBranchCreation( toBeMerged.isBranchCreation() );
89          mergeInto.setUpdateBranchVersions( toBeMerged.isUpdateBranchVersions() );
90          mergeInto.setUpdateWorkingCopyVersions( toBeMerged.isUpdateWorkingCopyVersions() );
91          mergeInto.setSuppressCommitBeforeTagOrBranch( toBeMerged.isSuppressCommitBeforeTagOrBranch() );
92          mergeInto.setUpdateVersionsToSnapshot( toBeMerged.isUpdateVersionsToSnapshot() );
93          mergeInto.setAllowTimestampedSnapshots( toBeMerged.isAllowTimestampedSnapshots() );
94          mergeInto.setSnapshotReleasePluginAllowed( toBeMerged.isSnapshotReleasePluginAllowed() );
95          mergeInto.setAutoVersionSubmodules( toBeMerged.isAutoVersionSubmodules() );
96          mergeInto.setDefaultReleaseVersion( mergeOverride( mergeInto.getDefaultReleaseVersion(),
97                                                             toBeMerged.getDefaultReleaseVersion() ) );
98          mergeInto.setDefaultDevelopmentVersion( mergeOverride( mergeInto.getDefaultDevelopmentVersion(),
99                                                                 toBeMerged.getDefaultDevelopmentVersion() ) );
100         mergeInto.setRemoteTagging( toBeMerged.isRemoteTagging() );
101         mergeInto.setLocalCheckout( toBeMerged.isLocalCheckout() );
102         mergeInto.setPushChanges( toBeMerged.isPushChanges() );
103         mergeInto.setWaitBeforeTagging( toBeMerged.getWaitBeforeTagging() );
104 
105         // If the user specifies versions, these should be override the existing versions
106         if ( toBeMerged.getReleaseVersions() != null )
107         {
108             mergeInto.getReleaseVersions().putAll( toBeMerged.getReleaseVersions() );
109         }
110         if ( toBeMerged.getDevelopmentVersions() != null )
111         {
112             mergeInto.getDevelopmentVersions().putAll( toBeMerged.getDevelopmentVersions() );
113         }
114         // These must be overridden, as they are not stored
115         mergeInto.setWorkingDirectory(
116             mergeOverride( mergeInto.getWorkingDirectory(), toBeMerged.getWorkingDirectory() ) );
117         mergeInto.setCheckoutDirectory(
118             mergeOverride( mergeInto.getCheckoutDirectory(), toBeMerged.getCheckoutDirectory() ) );
119 
120         // Not overridden - not configured from caller
121         mergeInto.setCompletedPhase( mergeDefault( mergeInto.getCompletedPhase(), toBeMerged.getCompletedPhase() ) );
122 
123         return mergeInto;
124     }
125 
126     private static String mergeOverride( String thisValue, String mergeValue )
127     {
128         return mergeValue != null ? mergeValue : thisValue;
129     }
130 
131     private static String mergeDefault( String thisValue, String mergeValue )
132     {
133         return thisValue != null ? thisValue : mergeValue;
134     }
135     
136     private static boolean mergeOverride( boolean thisValue, boolean mergeValue, boolean defaultValue )
137     {
138         return mergeValue != defaultValue ? mergeValue : thisValue;
139     }
140 
141     public static ReleaseDescriptor copyPropertiesToReleaseDescriptor( Properties properties )
142     {
143         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
144         releaseDescriptor.setCompletedPhase( properties.getProperty( "completedPhase" ) );
145         releaseDescriptor.setCommitByProject( Boolean.parseBoolean( properties.getProperty( "commitByProject" ) ) );
146         releaseDescriptor.setScmId( properties.getProperty( "scm.id" ) );
147         releaseDescriptor.setScmSourceUrl( properties.getProperty( "scm.url" ) );
148         releaseDescriptor.setScmUsername( properties.getProperty( "scm.username" ) );
149         releaseDescriptor.setScmPassword( properties.getProperty( "scm.password" ) );
150         releaseDescriptor.setScmPrivateKey( properties.getProperty( "scm.privateKey" ) );
151         releaseDescriptor.setScmPrivateKeyPassPhrase( properties.getProperty( "scm.passphrase" ) );
152         releaseDescriptor.setScmTagBase( properties.getProperty( "scm.tagBase" ) );
153         releaseDescriptor.setScmTagNameFormat( properties.getProperty( "scm.tagNameFormat" ) );
154         releaseDescriptor.setScmBranchBase( properties.getProperty( "scm.branchBase" ) );
155         releaseDescriptor.setScmReleaseLabel( properties.getProperty( "scm.tag" ) );
156         releaseDescriptor.setScmCommentPrefix( properties.getProperty( "scm.commentPrefix" ) );
157         releaseDescriptor.setAdditionalArguments( properties.getProperty( "exec.additionalArguments" ) );
158         releaseDescriptor.setPomFileName( properties.getProperty( "exec.pomFileName" ) );
159         releaseDescriptor.setPreparationGoals( properties.getProperty( "preparationGoals" ) );
160         releaseDescriptor.setCompletionGoals( properties.getProperty( "completionGoals" ) );
161         String snapshotReleasePluginAllowedStr = properties.getProperty( "exec.snapshotReleasePluginAllowed" );
162         releaseDescriptor.setSnapshotReleasePluginAllowed( snapshotReleasePluginAllowedStr == null
163                                                                ? false
164                                                                : Boolean.valueOf(
165                                                                    snapshotReleasePluginAllowedStr ).booleanValue() );
166         String remoteTaggingStr = properties.getProperty( "remoteTagging" );
167         releaseDescriptor.setRemoteTagging(
168             remoteTaggingStr == null ? false : Boolean.valueOf( remoteTaggingStr ).booleanValue() );
169         String pushChanges = properties.getProperty( "pushChanges" );
170         releaseDescriptor.setPushChanges( pushChanges == null ? true : Boolean.valueOf( pushChanges ).booleanValue() );
171 
172         loadResolvedDependencies( properties, releaseDescriptor );
173 
174         // boolean properties are not written to the properties file because the value from the caller is always used
175 
176         for ( Iterator<?> i = properties.keySet().iterator(); i.hasNext(); )
177         {
178             String property = (String) i.next();
179             if ( property.startsWith( "project.rel." ) )
180             {
181                 releaseDescriptor.mapReleaseVersion( property.substring( "project.rel.".length() ),
182                                                      properties.getProperty( property ) );
183             }
184             else if ( property.startsWith( "project.dev." ) )
185             {
186                 releaseDescriptor.mapDevelopmentVersion( property.substring( "project.dev.".length() ),
187                                                          properties.getProperty( property ) );
188             }
189             else if ( property.startsWith( "project.scm." ) )
190             {
191                 int index = property.lastIndexOf( '.' );
192                 if ( index > "project.scm.".length() )
193                 {
194                     String key = property.substring( "project.scm.".length(), index );
195 
196                     if ( !releaseDescriptor.getOriginalScmInfo().containsKey( key ) )
197                     {
198                         if ( properties.getProperty( "project.scm." + key + ".empty" ) != null )
199                         {
200                             releaseDescriptor.mapOriginalScmInfo( key, null );
201                         }
202                         else
203                         {
204                             IdentifiedScm scm = new IdentifiedScm();
205                             scm.setConnection( properties.getProperty( "project.scm." + key + ".connection" ) );
206                             scm.setDeveloperConnection(
207                                 properties.getProperty( "project.scm." + key + ".developerConnection" ) );
208                             scm.setUrl( properties.getProperty( "project.scm." + key + ".url" ) );
209                             scm.setTag( properties.getProperty( "project.scm." + key + ".tag" ) );
210                             scm.setId( properties.getProperty( "project.scm." + key + ".id" ) );
211 
212                             releaseDescriptor.mapOriginalScmInfo( key, scm );
213                         }
214                     }
215                 }
216             }
217         }
218         return releaseDescriptor;
219     }
220 
221     private static void loadResolvedDependencies( Properties prop, ReleaseDescriptor descriptor )
222     {
223         Map<String, Map<String, String>> resolvedDependencies = new HashMap<String, Map<String, String>>();
224 
225         Set entries = prop.entrySet();
226         Iterator<Entry<String, String>> iterator = entries.iterator();
227         String propertyName;
228         Entry<String, String> currentEntry;
229 
230         while ( iterator.hasNext() )
231         {
232             currentEntry = iterator.next();
233             propertyName = (String) currentEntry.getKey();
234 
235             if ( propertyName.startsWith( "dependency." ) )
236             {
237                 Map<String, String> versionMap;
238                 String artifactVersionlessKey;
239                 int startIndex;
240                 int endIndex;
241                 String versionType;
242 
243                 versionMap = new HashMap<String, String>();
244                 startIndex = propertyName.lastIndexOf( "dependency." );
245 
246                 if ( propertyName.indexOf( ".development" ) != -1 )
247                 {
248                     endIndex = propertyName.indexOf( ".development" );
249                     versionType = ReleaseDescriptor.DEVELOPMENT_KEY;
250                 }
251                 else
252                 {
253                     endIndex = propertyName.indexOf( ".release" );
254                     versionType = ReleaseDescriptor.RELEASE_KEY;
255                 }
256 
257                 artifactVersionlessKey = propertyName.substring( startIndex, endIndex );
258 
259                 if ( resolvedDependencies.containsKey( artifactVersionlessKey ) )
260                 {
261                     versionMap = resolvedDependencies.get( artifactVersionlessKey );
262                 }
263                 else
264                 {
265                     versionMap = new HashMap<String, String>();
266                     resolvedDependencies.put( artifactVersionlessKey, versionMap );
267                 }
268 
269                 versionMap.put( versionType, currentEntry.getValue() );
270             }
271         }
272 
273         descriptor.setResolvedSnapshotDependencies( resolvedDependencies );
274     }
275 
276 }