1 package org.apache.continuum.web.action.admin;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import com.opensymphony.xwork2.Preparable;
23 import org.apache.commons.lang.StringEscapeUtils;
24 import org.apache.continuum.configuration.BuildAgentConfiguration;
25 import org.apache.continuum.model.repository.AbstractPurgeConfiguration;
26 import org.apache.continuum.model.repository.DirectoryPurgeConfiguration;
27 import org.apache.continuum.model.repository.DistributedDirectoryPurgeConfiguration;
28 import org.apache.continuum.purge.ContinuumPurgeManager;
29 import org.apache.continuum.purge.PurgeConfigurationService;
30 import org.apache.maven.continuum.model.project.Schedule;
31 import org.apache.maven.continuum.security.ContinuumRoleConstants;
32 import org.apache.maven.continuum.web.action.ContinuumConfirmAction;
33 import org.codehaus.plexus.redback.rbac.Resource;
34 import org.codehaus.redback.integration.interceptor.SecureAction;
35 import org.codehaus.redback.integration.interceptor.SecureActionBundle;
36 import org.codehaus.redback.integration.interceptor.SecureActionException;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
39
40 import java.util.ArrayList;
41 import java.util.Collection;
42 import java.util.Collections;
43 import java.util.HashMap;
44 import java.util.List;
45 import java.util.Map;
46
47
48
49
50
51
52 public class DistributedPurgeConfigurationAction
53 extends ContinuumConfirmAction
54 implements Preparable, SecureAction
55 {
56 private static final Logger logger = LoggerFactory.getLogger( DistributedPurgeConfigurationAction.class );
57
58 private static final String PURGE_TYPE_DIRECTORY = "directory";
59
60 private static final String PURGE_DIRECTORY_RELEASES = "releases";
61
62 private static final String PURGE_DIRECTORY_WORKING = "working";
63
64 private static final int DEFAULT_RETENTION_COUNT = 2;
65
66 private static final int DEFAULT_DAYS_OLDER = 100;
67
68 private String purgeType;
69
70 private String directoryType;
71
72 private String description;
73
74 private String message;
75
76 private boolean deleteAll;
77
78 private boolean deleteReleasedSnapshots;
79
80 private boolean enabled;
81
82 private boolean confirmed;
83
84 private boolean defaultPurgeConfiguration;
85
86 private int retentionCount;
87
88 private int daysOlder;
89
90 private int scheduleId;
91
92 private int purgeConfigId;
93
94 private String buildAgentUrl;
95
96 private AbstractPurgeConfiguration purgeConfig;
97
98 private Map<Integer, String> schedules;
99
100 private List<String> directoryTypes;
101
102 private List<String> buildAgentUrls;
103
104
105
106
107 private PurgeConfigurationService purgeConfigService;
108
109 @Override
110 public void prepare()
111 throws Exception
112 {
113 super.prepare();
114
115
116 if ( schedules == null )
117 {
118 schedules = new HashMap<Integer, String>();
119
120 Collection<Schedule> allSchedules = getContinuum().getSchedules();
121
122 for ( Schedule schedule : allSchedules )
123 {
124 schedules.put( schedule.getId(), schedule.getName() );
125 }
126 }
127
128
129 if ( buildAgentUrls == null )
130 {
131 List<BuildAgentConfiguration> buildAgents = getContinuum().getConfiguration().getBuildAgents();
132 buildAgentUrls = new ArrayList<String>( buildAgents.size() );
133 for ( BuildAgentConfiguration buildAgent : buildAgents )
134 {
135 buildAgentUrls.add( buildAgent.getUrl() );
136 }
137 Collections.sort( buildAgentUrls );
138 }
139
140 directoryTypes = new ArrayList<String>();
141 directoryTypes.add( PURGE_DIRECTORY_RELEASES );
142 directoryTypes.add( PURGE_DIRECTORY_WORKING );
143 }
144
145 @Override
146 public String input()
147 throws Exception
148 {
149 if ( purgeConfigId != 0 )
150 {
151 purgeConfig = purgeConfigService.getPurgeConfiguration( purgeConfigId );
152
153 if ( purgeConfig instanceof DistributedDirectoryPurgeConfiguration )
154 {
155 DistributedDirectoryPurgeConfiguration dirPurge = (DistributedDirectoryPurgeConfiguration) purgeConfig;
156
157 this.purgeType = PURGE_TYPE_DIRECTORY;
158 this.daysOlder = dirPurge.getDaysOlder();
159 this.retentionCount = dirPurge.getRetentionCount();
160 this.directoryType = dirPurge.getDirectoryType();
161 this.deleteAll = dirPurge.isDeleteAll();
162 this.enabled = dirPurge.isEnabled();
163 this.defaultPurgeConfiguration = dirPurge.isDefaultPurge();
164 this.description = dirPurge.getDescription();
165 this.buildAgentUrl = dirPurge.getBuildAgentUrl();
166 if ( dirPurge.getSchedule() != null )
167 {
168 this.scheduleId = dirPurge.getSchedule().getId();
169 }
170 }
171 }
172 else
173 {
174 this.retentionCount = DEFAULT_RETENTION_COUNT;
175 this.daysOlder = DEFAULT_DAYS_OLDER;
176 }
177
178 return INPUT;
179 }
180
181 public String save()
182 throws Exception
183 {
184 if ( purgeConfigId == 0 )
185 {
186 purgeConfig = new DistributedDirectoryPurgeConfiguration();
187
188 purgeConfig = setupPurgeConfiguration( purgeConfig );
189
190 purgeConfig = purgeConfigService.addPurgeConfiguration( purgeConfig );
191 }
192 else
193 {
194 purgeConfig = purgeConfigService.getPurgeConfiguration( purgeConfigId );
195 purgeConfig = setupPurgeConfiguration( purgeConfig );
196
197 purgeConfigService.updatePurgeConfiguration( purgeConfig );
198 }
199
200
201
202
203
204
205 if ( purgeConfig.isEnabled() && purgeConfig.getSchedule() != null )
206 {
207 getContinuum().activePurgeSchedule( purgeConfig.getSchedule() );
208 }
209
210 return SUCCESS;
211 }
212
213 public String remove()
214 throws Exception
215 {
216
217 if ( confirmed )
218 {
219 purgeConfigService.removePurgeConfiguration( purgeConfigId );
220 }
221 else
222 {
223 return CONFIRM;
224 }
225
226 return SUCCESS;
227 }
228
229 public String purge()
230 throws Exception
231 {
232
233 ContinuumPurgeManager purgeManager = getContinuum().getPurgeManager();
234
235 if ( purgeConfigId > 0 )
236 {
237 purgeConfig = purgeConfigService.getPurgeConfiguration( purgeConfigId );
238
239 DistributedDirectoryPurgeConfiguration dirPurge = (DistributedDirectoryPurgeConfiguration) purgeConfig;
240 purgeManager.purgeDistributedDirectory( dirPurge );
241 }
242
243 return SUCCESS;
244 }
245
246 public String getPurgeType()
247 {
248 return this.purgeType;
249 }
250
251 public void setPurgeType( String purgeType )
252 {
253 this.purgeType = purgeType;
254 }
255
256 public String getDirectoryType()
257 {
258 return this.directoryType;
259 }
260
261 public void setDirectoryType( String directoryType )
262 {
263 this.directoryType = directoryType;
264 }
265
266 public String getDescription()
267 {
268 return this.description;
269 }
270
271 public void setDescription( String description )
272 {
273 this.description = description;
274 }
275
276 public String getMessage()
277 {
278 return this.message;
279 }
280
281 public void setMessage( String message )
282 {
283 this.message = message;
284 }
285
286 public boolean isDeleteAll()
287 {
288 return this.deleteAll;
289 }
290
291 public void setDeleteAll( boolean deleteAll )
292 {
293 this.deleteAll = deleteAll;
294 }
295
296 public boolean isDeleteReleasedSnapshots()
297 {
298 return this.deleteReleasedSnapshots;
299 }
300
301 public void setDeleteReleasedSnapshots( boolean deleteReleasedSnapshots )
302 {
303 this.deleteReleasedSnapshots = deleteReleasedSnapshots;
304 }
305
306 public boolean isEnabled()
307 {
308 return this.enabled;
309 }
310
311 public void setEnabled( boolean enabled )
312 {
313 this.enabled = enabled;
314 }
315
316 @Override
317 public boolean isConfirmed()
318 {
319 return this.confirmed;
320 }
321
322 @Override
323 public void setConfirmed( boolean confirmed )
324 {
325 this.confirmed = confirmed;
326 }
327
328 public boolean isDefaultPurgeConfiguration()
329 {
330 return this.defaultPurgeConfiguration;
331 }
332
333 public void setDefaultPurgeConfiguration( boolean defaultPurgeConfiguration )
334 {
335 this.defaultPurgeConfiguration = defaultPurgeConfiguration;
336 }
337
338 public int getRetentionCount()
339 {
340 return this.retentionCount;
341 }
342
343 public void setRetentionCount( int retentionCount )
344 {
345 this.retentionCount = retentionCount;
346 }
347
348 public int getDaysOlder()
349 {
350 return this.daysOlder;
351 }
352
353 public void setDaysOlder( int daysOlder )
354 {
355 this.daysOlder = daysOlder;
356 }
357
358 public int getScheduleId()
359 {
360 return this.scheduleId;
361 }
362
363 public void setScheduleId( int scheduleId )
364 {
365 this.scheduleId = scheduleId;
366 }
367
368 public int getPurgeConfigId()
369 {
370 return purgeConfigId;
371 }
372
373 public void setPurgeConfigId( int purgeConfigId )
374 {
375 this.purgeConfigId = purgeConfigId;
376 }
377
378 public AbstractPurgeConfiguration getPurgeConfig()
379 {
380 return this.purgeConfig;
381 }
382
383 public void setPurgeConfig( AbstractPurgeConfiguration purgeConfig )
384 {
385 this.purgeConfig = purgeConfig;
386 }
387
388 public Map<Integer, String> getSchedules()
389 {
390 return this.schedules;
391 }
392
393 public void setSchedules( Map<Integer, String> schedules )
394 {
395 this.schedules = schedules;
396 }
397
398 public List<String> getDirectoryTypes()
399 {
400 return this.directoryTypes;
401 }
402
403 public void setDirectoryTypes( List<String> directoryTypes )
404 {
405 this.directoryTypes = directoryTypes;
406 }
407
408 private AbstractPurgeConfiguration setupPurgeConfiguration( AbstractPurgeConfiguration purgeConfiguration )
409 throws Exception
410 {
411 return buildDirPurgeConfiguration();
412 }
413
414 public String getBuildAgentUrl()
415 {
416 return buildAgentUrl;
417 }
418
419 public void setBuildAgentUrl( String buildAgentUrl )
420 {
421 this.buildAgentUrl = buildAgentUrl;
422 }
423
424 public List<String> getBuildAgentUrls()
425 {
426 return buildAgentUrls;
427 }
428
429 public void setBuildAgentUrls( List<String> buildAgentUrls )
430 {
431 this.buildAgentUrls = buildAgentUrls;
432 }
433
434 private DistributedDirectoryPurgeConfiguration buildDirPurgeConfiguration()
435 throws Exception
436 {
437 DistributedDirectoryPurgeConfiguration dirPurge = (DistributedDirectoryPurgeConfiguration) purgeConfig;
438 dirPurge.setDeleteAll( this.deleteAll );
439 dirPurge.setEnabled( this.enabled );
440 dirPurge.setDaysOlder( this.daysOlder );
441 dirPurge.setRetentionCount( this.retentionCount );
442 dirPurge.setDirectoryType( this.directoryType );
443 dirPurge.setDefaultPurge( this.defaultPurgeConfiguration );
444 dirPurge.setBuildAgentUrl( buildAgentUrl );
445
446
447 dirPurge.setDescription( StringEscapeUtils.escapeXml( StringEscapeUtils.unescapeXml( this.description ) ) );
448
449 if ( scheduleId > 0 )
450 {
451 Schedule schedule = getContinuum().getSchedule( scheduleId );
452 dirPurge.setSchedule( schedule );
453 }
454
455 return dirPurge;
456 }
457
458 private void updateDefaultPurgeConfiguration()
459 throws Exception
460 {
461 DirectoryPurgeConfiguration dirPurge = purgeConfigService.getDefaultPurgeConfigurationForDirectoryType(
462 directoryType );
463
464 if ( dirPurge != null && dirPurge.getId() != purgeConfig.getId() )
465 {
466 dirPurge.setDefaultPurge( false );
467 purgeConfigService.updateDirectoryPurgeConfiguration( dirPurge );
468 }
469 }
470
471 public SecureActionBundle getSecureActionBundle()
472 throws SecureActionException
473 {
474 SecureActionBundle bundle = new SecureActionBundle();
475 bundle.setRequiresAuthentication( true );
476 bundle.addRequiredAuthorization( ContinuumRoleConstants.CONTINUUM_MANAGE_PURGING, Resource.GLOBAL );
477
478 return bundle;
479 }
480 }