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 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
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
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
252 if ( config.getExecutable() != null )
253 {
254 properties.setProperty( "build.executable", config.getExecutable() );
255 }
256
257 OutputStream outStream = null;
258
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 }