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