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