View Javadoc

1   package org.apache.continuum.web.action.admin;
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 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   * @author
49   * @version $Id: DistributedPurgeConfigurationAction.java 1372260 2012-08-13 04:29:09Z brett $
50   * @plexus.component role="com.opensymphony.xwork2.Action" role-hint="distributedPurgeConfiguration"
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      * @plexus.requirement
106      */
107     private PurgeConfigurationService purgeConfigService;
108 
109     @Override
110     public void prepare()
111         throws Exception
112     {
113         super.prepare();
114 
115         // build schedules
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         // build repositories
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         /*if ( purgeConfig.isDefaultPurge() )
201         {
202             updateDefaultPurgeConfiguration();
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         // escape xml to prevent xss attacks
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 }