View Javadoc

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 }