1 | package org.apache.continuum.purge; |
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 org.apache.continuum.buildmanager.BuildsManager; |
23 | import org.apache.continuum.dao.ProjectDao; |
24 | import org.apache.continuum.model.repository.DirectoryPurgeConfiguration; |
25 | import org.apache.continuum.model.repository.LocalRepository; |
26 | import org.apache.continuum.model.repository.RepositoryPurgeConfiguration; |
27 | import org.apache.continuum.purge.task.PurgeTask; |
28 | import org.apache.continuum.taskqueue.manager.TaskQueueManager; |
29 | import org.apache.continuum.taskqueue.manager.TaskQueueManagerException; |
30 | import org.apache.maven.continuum.build.settings.DefaultSchedulesActivator; |
31 | import org.apache.maven.continuum.build.settings.SchedulesActivationException; |
32 | import org.apache.maven.continuum.build.settings.SchedulesActivator; |
33 | import org.apache.maven.continuum.model.project.Schedule; |
34 | import org.codehaus.plexus.taskqueue.TaskQueueException; |
35 | import org.slf4j.Logger; |
36 | import org.slf4j.LoggerFactory; |
37 | |
38 | import java.util.List; |
39 | |
40 | /** |
41 | * DefaultContinuumPurgeManager |
42 | * |
43 | * @author Maria Catherine Tan |
44 | * @version $Id: DefaultContinuumPurgeManager.java 780708 2009-06-01 16:29:31Z jmorales $ |
45 | * @plexus.component role="org.apache.continuum.purge.ContinuumPurgeManager" role-hint="default" |
46 | * @since 25 jul 07 |
47 | */ |
48 | public class DefaultContinuumPurgeManager |
49 | implements ContinuumPurgeManager |
50 | { |
51 | private static final Logger log = LoggerFactory.getLogger( DefaultContinuumPurgeManager.class ); |
52 | |
53 | /** |
54 | * @plexus.requirement |
55 | */ |
56 | private SchedulesActivator schedulesActivator; |
57 | |
58 | /** |
59 | * @plexus.requirement |
60 | */ |
61 | private PurgeConfigurationService purgeConfigurationService; |
62 | |
63 | /** |
64 | * @plexus.requirement |
65 | */ |
66 | private TaskQueueManager taskQueueManager; |
67 | |
68 | /** |
69 | * @plexus.requirement role-hint="parallel" |
70 | */ |
71 | private BuildsManager parallelBuildsManager; |
72 | |
73 | public void purge( Schedule schedule ) |
74 | throws ContinuumPurgeManagerException |
75 | { |
76 | List<RepositoryPurgeConfiguration> repoPurgeList = null; |
77 | List<DirectoryPurgeConfiguration> dirPurgeList = null; |
78 | |
79 | repoPurgeList = purgeConfigurationService.getEnableRepositoryPurgeConfigurationsBySchedule( schedule.getId() ); |
80 | dirPurgeList = purgeConfigurationService.getEnableDirectoryPurgeConfigurationsBySchedule( schedule.getId() ); |
81 | |
82 | if ( repoPurgeList != null && repoPurgeList.size() > 0 ) |
83 | { |
84 | for ( RepositoryPurgeConfiguration repoPurge : repoPurgeList ) |
85 | { |
86 | purgeRepository( repoPurge ); |
87 | } |
88 | } |
89 | |
90 | if ( dirPurgeList != null && dirPurgeList.size() > 0 ) |
91 | { |
92 | for ( DirectoryPurgeConfiguration dirPurge : dirPurgeList ) |
93 | { |
94 | purgeDirectory( dirPurge ); |
95 | } |
96 | } |
97 | |
98 | if ( ( repoPurgeList == null || repoPurgeList.isEmpty() ) && ( dirPurgeList == null || dirPurgeList.isEmpty() ) ) |
99 | { |
100 | // This purge is not enable for a purge process. |
101 | try |
102 | { |
103 | schedulesActivator.unactivateOrphanPurgeSchedule( schedule ); |
104 | } |
105 | catch ( SchedulesActivationException e ) |
106 | { |
107 | log.debug( String.format( "Can't unactivate orphan schedule '%s' for purgeConfiguration", |
108 | schedule.getName() ) ); |
109 | } |
110 | } |
111 | } |
112 | |
113 | public void purgeRepository( RepositoryPurgeConfiguration repoPurge ) |
114 | throws ContinuumPurgeManagerException |
115 | { |
116 | try |
117 | { |
118 | LocalRepository repository = repoPurge.getRepository(); |
119 | |
120 | // do not purge if repository is in use and if repository is already in purge queue |
121 | if ( !taskQueueManager.isRepositoryInUse( repository.getId() ) && |
122 | !taskQueueManager.isInPurgeQueue( repoPurge.getId() ) ) |
123 | { |
124 | taskQueueManager.getPurgeQueue().put( new PurgeTask( repoPurge.getId() ) ); |
125 | } |
126 | } |
127 | catch ( TaskQueueException e ) |
128 | { |
129 | throw new ContinuumPurgeManagerException( "Error while enqueuing repository", e ); |
130 | } |
131 | catch ( TaskQueueManagerException e ) |
132 | { |
133 | throw new ContinuumPurgeManagerException( e.getMessage(), e ); |
134 | } |
135 | } |
136 | |
137 | public void purgeDirectory( DirectoryPurgeConfiguration dirPurge ) |
138 | throws ContinuumPurgeManagerException |
139 | { |
140 | try |
141 | { |
142 | if ( "releases".equals( dirPurge.getDirectoryType() ) ) |
143 | { |
144 | // do not purge if release in progress |
145 | if ( !taskQueueManager.releaseInProgress() && |
146 | !taskQueueManager.isInPurgeQueue( dirPurge.getId() ) ) |
147 | { |
148 | taskQueueManager.getPurgeQueue().put( new PurgeTask( dirPurge.getId() ) ); |
149 | } |
150 | } |
151 | else if ( "buildOutput".equals( dirPurge.getDirectoryType() ) ) |
152 | { |
153 | // do not purge if build in progress |
154 | if ( !parallelBuildsManager.isBuildInProgress() && |
155 | !taskQueueManager.isInPurgeQueue( dirPurge.getId() ) ) |
156 | { |
157 | taskQueueManager.getPurgeQueue().put( new PurgeTask( dirPurge.getId() ) ); |
158 | } |
159 | } |
160 | |
161 | } |
162 | catch ( TaskQueueException e ) |
163 | { |
164 | throw new ContinuumPurgeManagerException( "Error while enqueuing repository", e ); |
165 | } |
166 | catch ( TaskQueueManagerException e ) |
167 | { |
168 | throw new ContinuumPurgeManagerException( e.getMessage(), e ); |
169 | } |
170 | } |
171 | |
172 | } |