View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.shared.release.config;
20  
21  import java.util.Arrays;
22  import java.util.Iterator;
23  import java.util.Map.Entry;
24  import java.util.Properties;
25  import java.util.Set;
26  
27  import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder.BuilderReleaseDescriptor;
28  import org.apache.maven.shared.release.scm.IdentifiedScm;
29  
30  /**
31   * Class providing utility methods used during the release process
32   *
33   * @author <a href="mailto:jwhitlock@apache.org">Jeremy Whitlock</a>
34   */
35  public class ReleaseUtils {
36      private static final String DEVELOPMENT_KEY = "dev";
37  
38      private static final String RELEASE_KEY = "rel";
39  
40      private ReleaseUtils() {
41          // nothing to see here
42      }
43  
44      /**
45       * <p>buildReleaseDescriptor.</p>
46       *
47       * @param builder a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder} object
48       * @return a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder.BuilderReleaseDescriptor} object
49       */
50      public static BuilderReleaseDescriptor buildReleaseDescriptor(ReleaseDescriptorBuilder builder) {
51          return builder.build();
52      }
53  
54      /**
55       * <p>copyPropertiesToReleaseDescriptor.</p>
56       *
57       * @param properties a {@link java.util.Properties} object
58       * @param builder    a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder} object
59       */
60      public static void copyPropertiesToReleaseDescriptor(Properties properties, ReleaseDescriptorBuilder builder) {
61          if (properties.containsKey("completedPhase")) {
62              builder.setCompletedPhase(properties.getProperty("completedPhase"));
63          }
64          if (properties.containsKey("commitByProject")) {
65              builder.setCommitByProject(Boolean.parseBoolean(properties.getProperty("commitByProject")));
66          }
67          if (properties.containsKey("scm.id")) {
68              builder.setScmId(properties.getProperty("scm.id"));
69          }
70          if (properties.containsKey("scm.url")) {
71              builder.setScmSourceUrl(properties.getProperty("scm.url"));
72          }
73          if (properties.containsKey("scm.username")) {
74              builder.setScmUsername(properties.getProperty("scm.username"));
75          }
76          if (properties.containsKey("scm.password")) {
77              builder.setScmPassword(properties.getProperty("scm.password"));
78          }
79          if (properties.containsKey("scm.privateKey")) {
80              builder.setScmPrivateKey(properties.getProperty("scm.privateKey"));
81          }
82          if (properties.containsKey("scm.passphrase")) {
83              builder.setScmPrivateKeyPassPhrase(properties.getProperty("scm.passphrase"));
84          }
85          if (properties.containsKey("scm.tagBase")) {
86              builder.setScmTagBase(properties.getProperty("scm.tagBase"));
87          }
88          if (properties.containsKey("scm.tagNameFormat")) {
89              builder.setScmTagNameFormat(properties.getProperty("scm.tagNameFormat"));
90          }
91          if (properties.containsKey("scm.branchBase")) {
92              builder.setScmBranchBase(properties.getProperty("scm.branchBase"));
93          }
94          if (properties.containsKey("scm.tag")) {
95              builder.setScmReleaseLabel(properties.getProperty("scm.tag"));
96          }
97          if (properties.containsKey("scm.commentPrefix")) {
98              builder.setScmCommentPrefix(properties.getProperty("scm.commentPrefix"));
99          }
100         if (properties.containsKey("scm.developmentCommitComment")) {
101             builder.setScmDevelopmentCommitComment(properties.getProperty("scm.developmentCommitComment"));
102         }
103         if (properties.containsKey("scm.releaseCommitComment")) {
104             builder.setScmReleaseCommitComment(properties.getProperty("scm.releaseCommitComment"));
105         }
106         if (properties.containsKey("scm.branchCommitComment")) {
107             builder.setScmBranchCommitComment(properties.getProperty("scm.branchCommitComment"));
108         }
109         if (properties.containsKey("scm.rollbackCommitComment")) {
110             builder.setScmRollbackCommitComment(properties.getProperty("scm.rollbackCommitComment"));
111         }
112         if (properties.containsKey("exec.additionalArguments")) {
113             builder.setAdditionalArguments(properties.getProperty("exec.additionalArguments"));
114         }
115         if (properties.containsKey("exec.pomFileName")) {
116             builder.setPomFileName(properties.getProperty("exec.pomFileName"));
117         }
118         if (properties.containsKey("exec.activateProfiles")) {
119             builder.setActivateProfiles(Arrays.asList(
120                     properties.getProperty("exec.activateProfiles").split(",")));
121         }
122         if (properties.containsKey("preparationGoals")) {
123             builder.setPreparationGoals(properties.getProperty("preparationGoals"));
124         }
125         if (properties.containsKey("completionGoals")) {
126             builder.setCompletionGoals(properties.getProperty("completionGoals"));
127         }
128         if (properties.containsKey("projectVersionPolicyId")) {
129             builder.setProjectVersionPolicyId(properties.getProperty("projectVersionPolicyId"));
130         }
131         if (properties.containsKey("projectVersionPolicyConfig")) {
132             builder.setProjectVersionPolicyConfig(properties.getProperty("projectVersionPolicyConfig"));
133         }
134         if (properties.containsKey("projectNamingPolicyId")) {
135             builder.setProjectNamingPolicyId(properties.getProperty("projectNamingPolicyId"));
136         }
137         if (properties.containsKey("releaseStrategyId")) {
138             builder.setReleaseStrategyId(properties.getProperty("releaseStrategyId"));
139         }
140         if (properties.containsKey("exec.snapshotReleasePluginAllowed")) {
141             String snapshotReleasePluginAllowedStr = properties.getProperty("exec.snapshotReleasePluginAllowed");
142             builder.setSnapshotReleasePluginAllowed(Boolean.parseBoolean(snapshotReleasePluginAllowedStr));
143         }
144         if (properties.containsKey("remoteTagging")) {
145             String remoteTaggingStr = properties.getProperty("remoteTagging");
146             builder.setRemoteTagging(Boolean.parseBoolean(remoteTaggingStr));
147         }
148         if (properties.containsKey("pinExternals")) {
149             String pinExternals = properties.getProperty("pinExternals");
150             builder.setPinExternals(Boolean.parseBoolean(pinExternals));
151         }
152         if (properties.containsKey("pushChanges")) {
153             String pushChanges = properties.getProperty("pushChanges");
154             builder.setPushChanges(Boolean.parseBoolean(pushChanges));
155         }
156         if (properties.containsKey("workItem")) {
157             builder.setWorkItem(properties.getProperty("workItem"));
158         }
159         if (properties.containsKey("autoResolveSnapshots")) {
160             String resolve = properties.getProperty("autoResolveSnapshots");
161             builder.setAutoResolveSnapshots(resolve);
162         }
163 
164         loadResolvedDependencies(properties, builder);
165 
166         // boolean properties are not written to the properties file because the value from the caller is always used
167 
168         for (Object o : properties.keySet()) {
169             String property = (String) o;
170             if (property.startsWith("project.rel.")) {
171                 builder.addReleaseVersion(
172                         property.substring("project.rel.".length()), properties.getProperty(property));
173             } else if (property.startsWith("project.dev.")) {
174                 builder.addDevelopmentVersion(
175                         property.substring("project.dev.".length()), properties.getProperty(property));
176             } else if (property.startsWith("dependency.rel.")) {
177                 builder.addDependencyReleaseVersion(
178                         property.substring("dependency.rel.".length()), properties.getProperty(property));
179             } else if (property.startsWith("dependency.dev.")) {
180                 builder.addDependencyDevelopmentVersion(
181                         property.substring("dependency.dev.".length()), properties.getProperty(property));
182             } else if (property.startsWith("project.scm.")) {
183                 int index = property.lastIndexOf('.');
184                 if (index > "project.scm.".length()) {
185                     String key = property.substring("project.scm.".length(), index);
186 
187                     if (builder.build().getOriginalScmInfo(key) == null) {
188                         if (properties.getProperty("project.scm." + key + ".empty") != null) {
189                             builder.addOriginalScmInfo(key, null);
190                         } else {
191                             IdentifiedScm scm = new IdentifiedScm();
192                             scm.setConnection(properties.getProperty("project.scm." + key + ".connection"));
193                             scm.setDeveloperConnection(
194                                     properties.getProperty("project.scm." + key + ".developerConnection"));
195                             scm.setUrl(properties.getProperty("project.scm." + key + ".url"));
196                             scm.setTag(properties.getProperty("project.scm." + key + ".tag"));
197                             scm.setId(properties.getProperty("project.scm." + key + ".id"));
198 
199                             builder.addOriginalScmInfo(key, scm);
200                         }
201                     }
202                 }
203             }
204         }
205     }
206 
207     private static void loadResolvedDependencies(Properties prop, ReleaseDescriptorBuilder builder) {
208         Set entries = prop.entrySet();
209         Iterator<Entry<String, String>> iterator = entries.iterator();
210         String propertyName;
211         Entry<String, String> currentEntry;
212 
213         while (iterator.hasNext()) {
214             currentEntry = iterator.next();
215             propertyName = currentEntry.getKey();
216 
217             if (propertyName.startsWith("dependency.")) {
218                 String artifactVersionlessKey;
219                 int startIndex = "dependency.".length();
220                 int endIndex;
221                 String versionType;
222 
223                 if (propertyName.contains(".development")) {
224                     endIndex = propertyName.lastIndexOf(".development");
225                     versionType = DEVELOPMENT_KEY;
226                 } else if (propertyName.contains(".release")) {
227                     endIndex = propertyName.lastIndexOf(".release");
228                     versionType = RELEASE_KEY;
229                 } else {
230                     // MRELEASE-834, probably a maven-dependency-plugin property
231                     continue;
232                 }
233 
234                 artifactVersionlessKey = propertyName.substring(startIndex, endIndex);
235 
236                 if (RELEASE_KEY.equals(versionType)) {
237                     builder.addDependencyReleaseVersion(artifactVersionlessKey, currentEntry.getValue());
238                 } else if (DEVELOPMENT_KEY.equals(versionType)) {
239                     builder.addDependencyDevelopmentVersion(artifactVersionlessKey, currentEntry.getValue());
240                 }
241             }
242         }
243     }
244 }