View Javadoc

1   package org.apache.continuum.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 org.apache.maven.model.Scm;
23  import org.apache.maven.shared.release.config.PropertiesReleaseDescriptorStore;
24  import org.apache.maven.shared.release.config.ReleaseDescriptor;
25  import org.apache.maven.shared.release.config.ReleaseDescriptorStoreException;
26  import org.apache.maven.shared.release.config.ReleaseUtils;
27  import org.codehaus.plexus.util.IOUtil;
28  import org.eclipse.jetty.util.security.Password;
29  
30  import java.io.File;
31  import java.io.FileInputStream;
32  import java.io.FileNotFoundException;
33  import java.io.FileOutputStream;
34  import java.io.IOException;
35  import java.io.InputStream;
36  import java.io.OutputStream;
37  import java.util.HashMap;
38  import java.util.Iterator;
39  import java.util.Map;
40  import java.util.Map.Entry;
41  import java.util.Properties;
42  import java.util.Set;
43  
44  public class ContinuumPropertiesReleaseDescriptorStore
45      extends PropertiesReleaseDescriptorStore
46  {
47      public ReleaseDescriptor read( ReleaseDescriptor mergeDescriptor, File file )
48          throws ReleaseDescriptorStoreException
49      {
50          Properties properties = new Properties();
51  
52          InputStream inStream = null;
53          try
54          {
55              inStream = new FileInputStream( file );
56  
57              properties.load( inStream );
58          }
59          catch ( FileNotFoundException e )
60          {
61              getLogger().debug( file.getName() + " not found - using empty properties" );
62          }
63          catch ( IOException e )
64          {
65              throw new ReleaseDescriptorStoreException(
66                  "Error reading properties file '" + file.getName() + "': " + e.getMessage(), e );
67          }
68          finally
69          {
70              IOUtil.close( inStream );
71          }
72  
73          ContinuumReleaseDescriptor releaseDescriptor = new ContinuumReleaseDescriptor();
74          releaseDescriptor.setCompletedPhase( properties.getProperty( "completedPhase" ) );
75          releaseDescriptor.setScmSourceUrl( properties.getProperty( "scm.url" ) );
76          releaseDescriptor.setScmUsername( properties.getProperty( "scm.username" ) );
77  
78          String password = properties.getProperty( "scm.password" );
79          if ( password != null && password.startsWith( "OBF:" ) )
80          {
81              releaseDescriptor.setScmPassword( Password.deobfuscate( password ) );
82          }
83          else
84          {
85              releaseDescriptor.setScmPassword( password );
86          }
87          releaseDescriptor.setScmPrivateKey( properties.getProperty( "scm.privateKey" ) );
88          releaseDescriptor.setScmPrivateKeyPassPhrase( properties.getProperty( "scm.passphrase" ) );
89          releaseDescriptor.setScmTagBase( properties.getProperty( "scm.tagBase" ) );
90          releaseDescriptor.setScmReleaseLabel( properties.getProperty( "scm.tag" ) );
91          releaseDescriptor.setScmCommentPrefix( properties.getProperty( "scm.commentPrefix" ) );
92          releaseDescriptor.setAdditionalArguments( properties.getProperty( "exec.additionalArguments" ) );
93          releaseDescriptor.setPomFileName( properties.getProperty( "exec.pomFileName" ) );
94          releaseDescriptor.setPreparationGoals( properties.getProperty( "preparationGoals" ) );
95          releaseDescriptor.setExecutable( properties.getProperty( "build.executable" ) );
96          releaseDescriptor.setReleaseBy( properties.getProperty( "release.by" ) );
97  
98          loadResolvedDependencies( properties, releaseDescriptor );
99  
100         // boolean properties are not written to the properties file because the value from the caller is always used
101 
102         for ( Object o : properties.keySet() )
103         {
104             String property = (String) o;
105             if ( property.startsWith( "project.rel." ) )
106             {
107                 releaseDescriptor.mapReleaseVersion( property.substring( "project.rel.".length() ),
108                                                      properties.getProperty( property ) );
109             }
110             else if ( property.startsWith( "project.dev." ) )
111             {
112                 releaseDescriptor.mapDevelopmentVersion( property.substring( "project.dev.".length() ),
113                                                          properties.getProperty( property ) );
114             }
115             else if ( property.startsWith( "project.scm." ) )
116             {
117                 int index = property.lastIndexOf( '.' );
118                 if ( index > "project.scm.".length() )
119                 {
120                     String key = property.substring( "project.scm.".length(), index );
121 
122                     if ( !releaseDescriptor.getOriginalScmInfo().containsKey( key ) )
123                     {
124                         if ( properties.getProperty( "project.scm." + key + ".empty" ) != null )
125                         {
126                             releaseDescriptor.mapOriginalScmInfo( key, null );
127                         }
128                         else
129                         {
130                             Scm scm = new Scm();
131                             scm.setConnection( properties.getProperty( "project.scm." + key + ".connection" ) );
132                             scm.setDeveloperConnection( properties.getProperty(
133                                 "project.scm." + key + ".developerConnection" ) );
134                             scm.setUrl( properties.getProperty( "project.scm." + key + ".url" ) );
135                             scm.setTag( properties.getProperty( "project.scm." + key + ".tag" ) );
136 
137                             releaseDescriptor.mapOriginalScmInfo( key, scm );
138                         }
139                     }
140                 }
141             }
142             else if ( property.startsWith( "build.env." ) )
143             {
144                 releaseDescriptor.mapEnvironments( property.substring( "build.env.".length() ), properties.getProperty(
145                     property ) );
146             }
147         }
148 
149         if ( mergeDescriptor != null )
150         {
151             releaseDescriptor = (ContinuumReleaseDescriptor) ReleaseUtils.merge( releaseDescriptor, mergeDescriptor );
152             releaseDescriptor.setEnvironments( ( (ContinuumReleaseDescriptor) mergeDescriptor ).getEnvironments() );
153         }
154 
155         return releaseDescriptor;
156     }
157 
158     public void write( ReleaseDescriptor configFile, File file )
159         throws ReleaseDescriptorStoreException
160     {
161         ContinuumReleaseDescriptor config = (ContinuumReleaseDescriptor) configFile;
162         Properties properties = new Properties();
163         properties.setProperty( "completedPhase", config.getCompletedPhase() );
164         properties.setProperty( "scm.url", config.getScmSourceUrl() );
165         if ( config.getScmUsername() != null )
166         {
167             properties.setProperty( "scm.username", config.getScmUsername() );
168         }
169         if ( config.getScmPassword() != null )
170         {
171             // obfuscate password
172             properties.setProperty( "scm.password", Password.obfuscate( config.getScmPassword() ) );
173         }
174         if ( config.getScmPrivateKey() != null )
175         {
176             properties.setProperty( "scm.privateKey", config.getScmPrivateKey() );
177         }
178         if ( config.getScmPrivateKeyPassPhrase() != null )
179         {
180             properties.setProperty( "scm.passphrase", config.getScmPrivateKeyPassPhrase() );
181         }
182         if ( config.getScmTagBase() != null )
183         {
184             properties.setProperty( "scm.tagBase", config.getScmTagBase() );
185         }
186         if ( config.getScmReleaseLabel() != null )
187         {
188             properties.setProperty( "scm.tag", config.getScmReleaseLabel() );
189         }
190         if ( config.getScmCommentPrefix() != null )
191         {
192             properties.setProperty( "scm.commentPrefix", config.getScmCommentPrefix() );
193         }
194         if ( config.getAdditionalArguments() != null )
195         {
196             properties.setProperty( "exec.additionalArguments", config.getAdditionalArguments() );
197         }
198         if ( config.getPomFileName() != null )
199         {
200             properties.setProperty( "exec.pomFileName", config.getPomFileName() );
201         }
202         if ( config.getPreparationGoals() != null )
203         {
204             properties.setProperty( "preparationGoals", config.getPreparationGoals() );
205         }
206 
207         // boolean properties are not written to the properties file because the value from the caller is always used
208 
209         for ( Object o : config.getReleaseVersions().entrySet() )
210         {
211             Entry entry = (Entry) o;
212             properties.setProperty( "project.rel." + entry.getKey(), (String) entry.getValue() );
213         }
214 
215         for ( Object o : config.getDevelopmentVersions().entrySet() )
216         {
217             Entry entry = (Entry) o;
218             properties.setProperty( "project.dev." + entry.getKey(), (String) entry.getValue() );
219         }
220 
221         for ( Object o : config.getOriginalScmInfo().entrySet() )
222         {
223             Entry entry = (Entry) o;
224             Scm scm = (Scm) entry.getValue();
225             String prefix = "project.scm." + entry.getKey();
226             if ( scm != null )
227             {
228                 if ( scm.getConnection() != null )
229                 {
230                     properties.setProperty( prefix + ".connection", scm.getConnection() );
231                 }
232                 if ( scm.getDeveloperConnection() != null )
233                 {
234                     properties.setProperty( prefix + ".developerConnection", scm.getDeveloperConnection() );
235                 }
236                 if ( scm.getUrl() != null )
237                 {
238                     properties.setProperty( prefix + ".url", scm.getUrl() );
239                 }
240                 if ( scm.getTag() != null )
241                 {
242                     properties.setProperty( prefix + ".tag", scm.getTag() );
243                 }
244             }
245             else
246             {
247                 properties.setProperty( prefix + ".empty", "true" );
248             }
249         }
250 
251         for ( Object o : config.getEnvironments().entrySet() )
252         {
253             Entry entry = (Entry) o;
254             properties.setProperty( "build.env." + entry.getKey(), (String) entry.getValue() );
255         }
256 
257         if ( ( config.getResolvedSnapshotDependencies() != null ) &&
258             ( config.getResolvedSnapshotDependencies().size() > 0 ) )
259         {
260             processResolvedDependencies( properties, config.getResolvedSnapshotDependencies() );
261         }
262 
263         // executables
264         if ( config.getExecutable() != null )
265         {
266             properties.setProperty( "build.executable", config.getExecutable() );
267         }
268 
269         // release by
270         if ( config.getReleaseBy() != null )
271         {
272             properties.setProperty( "release.by", config.getReleaseBy() );
273         }
274 
275         OutputStream outStream = null;
276         //noinspection OverlyBroadCatchBlock
277         try
278         {
279             outStream = new FileOutputStream( file );
280 
281             properties.store( outStream, "release configuration" );
282         }
283         catch ( IOException e )
284         {
285             throw new ReleaseDescriptorStoreException(
286                 "Error writing properties file '" + file.getName() + "': " + e.getMessage(), e );
287         }
288         finally
289         {
290             IOUtil.close( outStream );
291         }
292 
293     }
294 
295     private void processResolvedDependencies( Properties prop, Map resolvedDependencies )
296     {
297         Set entries = resolvedDependencies.entrySet();
298         Iterator iterator = entries.iterator();
299         Entry currentEntry;
300 
301         while ( iterator.hasNext() )
302         {
303             currentEntry = (Entry) iterator.next();
304 
305             Map versionMap = (Map) currentEntry.getValue();
306 
307             prop.setProperty( "dependency." + currentEntry.getKey() + ".release", (String) versionMap.get(
308                 ReleaseDescriptor.RELEASE_KEY ) );
309             prop.setProperty( "dependency." + currentEntry.getKey() + ".development", (String) versionMap.get(
310                 ReleaseDescriptor.DEVELOPMENT_KEY ) );
311         }
312     }
313 
314     private void loadResolvedDependencies( Properties prop, ReleaseDescriptor descriptor )
315     {
316         Map<String, Map<String, Object>> resolvedDependencies = new HashMap<String, Map<String, Object>>();
317 
318         Set entries = prop.entrySet();
319         Iterator iterator = entries.iterator();
320         String propertyName;
321         Entry currentEntry;
322 
323         while ( iterator.hasNext() )
324         {
325             currentEntry = (Entry) iterator.next();
326             propertyName = (String) currentEntry.getKey();
327 
328             if ( propertyName.startsWith( "dependency." ) )
329             {
330                 Map<String, Object> versionMap;
331                 String artifactVersionlessKey;
332                 int startIndex;
333                 int endIndex;
334                 String versionType;
335 
336                 startIndex = propertyName.lastIndexOf( "dependency." );
337 
338                 if ( propertyName.indexOf( ".development" ) != -1 )
339                 {
340                     endIndex = propertyName.indexOf( ".development" );
341                     versionType = ReleaseDescriptor.DEVELOPMENT_KEY;
342                 }
343                 else
344                 {
345                     endIndex = propertyName.indexOf( ".release" );
346                     versionType = ReleaseDescriptor.RELEASE_KEY;
347                 }
348 
349                 artifactVersionlessKey = propertyName.substring( startIndex, endIndex );
350 
351                 if ( resolvedDependencies.containsKey( artifactVersionlessKey ) )
352                 {
353                     versionMap = resolvedDependencies.get( artifactVersionlessKey );
354                 }
355                 else
356                 {
357                     versionMap = new HashMap<String, Object>();
358                     resolvedDependencies.put( artifactVersionlessKey, versionMap );
359                 }
360 
361                 versionMap.put( versionType, currentEntry.getValue() );
362             }
363         }
364 
365         descriptor.setResolvedSnapshotDependencies( resolvedDependencies );
366     }
367 }