1 package org.apache.continuum.release.config;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
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
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
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
264 if ( config.getExecutable() != null )
265 {
266 properties.setProperty( "build.executable", config.getExecutable() );
267 }
268
269
270 if ( config.getReleaseBy() != null )
271 {
272 properties.setProperty( "release.by", config.getReleaseBy() );
273 }
274
275 OutputStream outStream = null;
276
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 }