View Javadoc

1   package org.apache.continuum.taskqueue;
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 java.util.ArrayList;
23  import java.util.List;
24  
25  import javax.annotation.Resource;
26  
27  import org.apache.commons.lang.ArrayUtils;
28  import org.apache.continuum.dao.BuildDefinitionDao;
29  import org.apache.continuum.taskqueueexecutor.ParallelBuildsThreadedTaskQueueExecutor;
30  import org.apache.maven.continuum.model.project.BuildDefinition;
31  import org.apache.maven.continuum.store.ContinuumStoreException;
32  import org.codehaus.plexus.taskqueue.Task;
33  import org.codehaus.plexus.taskqueue.TaskQueue;
34  import org.codehaus.plexus.taskqueue.TaskQueueException;
35  import org.codehaus.plexus.taskqueue.execution.TaskQueueExecutor;
36  import org.codehaus.plexus.util.StringUtils;
37  import org.slf4j.Logger;
38  import org.slf4j.LoggerFactory;
39  
40  /**
41   * "Overall" build queue which has a checkout queue and a build queue.
42   *
43   * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
44   * @version $Id$
45   */
46  public class DefaultOverallBuildQueue
47      implements OverallBuildQueue
48  {
49      private static final Logger log = LoggerFactory.getLogger( DefaultOverallBuildQueue.class );
50  
51      @Resource
52      private BuildDefinitionDao buildDefinitionDao;
53  
54      private TaskQueueExecutor buildTaskQueueExecutor;
55  
56      private TaskQueueExecutor checkoutTaskQueueExecutor;
57  
58      private int id;
59  
60      private String name;
61  
62      public int getId()
63      {
64          return id;
65      }
66  
67      public void setId( int id )
68      {
69          this.id = id;
70      }
71  
72      public String getName()
73      {
74          return name;
75      }
76  
77      public void setName( String name )
78      {
79          this.name = name;
80      }
81  
82      /**
83       * @see OverallBuildQueue#addToCheckoutQueue(CheckOutTask)
84       */
85      public void addToCheckoutQueue( CheckOutTask checkoutTask )
86          throws TaskQueueException
87      {
88          getCheckoutQueue().put( checkoutTask );
89      }
90  
91      /**
92       * @see OverallBuildQueue#addToCheckoutQueue(List)
93       */
94      public void addToCheckoutQueue( List<CheckOutTask> checkoutTasks )
95          throws TaskQueueException
96      {
97          for ( CheckOutTask checkoutTask : checkoutTasks )
98          {
99              getCheckoutQueue().put( checkoutTask );
100         }
101     }
102 
103     /**
104      * @see OverallBuildQueue#getProjectsInCheckoutQueue()
105      */
106     public List<CheckOutTask> getProjectsInCheckoutQueue()
107         throws TaskQueueException
108     {
109         return getCheckoutQueue().getQueueSnapshot();
110     }
111 
112     /**
113      * @see OverallBuildQueue#isInCheckoutQueue(int)
114      */
115     public boolean isInCheckoutQueue( int projectId )
116         throws TaskQueueException
117     {
118         List<CheckOutTask> queue = getProjectsInCheckoutQueue();
119 
120         for ( CheckOutTask task : queue )
121         {
122             if ( task != null && task.getProjectId() == projectId )
123             {
124                 return true;
125             }
126         }
127         return false;
128     }
129 
130     /**
131      * @see OverallBuildQueue#removeProjectFromCheckoutQueue(int)
132      */
133     public boolean removeProjectFromCheckoutQueue( int projectId )
134         throws TaskQueueException
135     {
136         List<CheckOutTask> queue = getProjectsInCheckoutQueue();
137 
138         for ( CheckOutTask task : queue )
139         {
140             if ( task != null && task.getProjectId() == projectId )
141             {
142                 return getCheckoutQueue().remove( task );
143             }
144         }
145         return false;
146     }
147 
148     /**
149      * @see OverallBuildQueue#removeProjectsFromCheckoutQueue(int[])
150      */
151     public boolean removeProjectsFromCheckoutQueue( int[] projectsId )
152         throws TaskQueueException
153     {
154         if ( projectsId == null )
155         {
156             return false;
157         }
158         if ( projectsId.length < 1 )
159         {
160             return false;
161         }
162         List<CheckOutTask> queue = getProjectsInCheckoutQueue();
163 
164         List<CheckOutTask> tasks = new ArrayList<CheckOutTask>();
165 
166         for ( CheckOutTask task : queue )
167         {
168             if ( task != null )
169             {
170                 if ( ArrayUtils.contains( projectsId, task.getProjectId() ) )
171                 {
172                     tasks.add( task );
173                 }
174             }
175         }
176         return !tasks.isEmpty() && getCheckoutQueue().removeAll( tasks );
177     }
178 
179     /**
180      * @see OverallBuildQueue#removeTasksFromCheckoutQueueWithHashCodes(int[])
181      */
182     public void removeTasksFromCheckoutQueueWithHashCodes( int[] hashCodes )
183         throws TaskQueueException
184     {
185         List<CheckOutTask> queue = getProjectsInCheckoutQueue();
186 
187         for ( CheckOutTask task : queue )
188         {
189             if ( ArrayUtils.contains( hashCodes, task.hashCode() ) )
190             {
191                 getCheckoutQueue().remove( task );
192             }
193         }
194     }
195 
196     /**
197      * @see OverallBuildQueue#addToBuildQueue(BuildProjectTask)
198      */
199     public void addToBuildQueue( BuildProjectTask buildTask )
200         throws TaskQueueException
201     {
202         getBuildQueue().put( buildTask );
203     }
204 
205     /**
206      * @see OverallBuildQueue#addToBuildQueue(List)
207      */
208     public void addToBuildQueue( List<BuildProjectTask> buildTasks )
209         throws TaskQueueException
210     {
211         for ( BuildProjectTask buildTask : buildTasks )
212         {
213             getBuildQueue().put( buildTask );
214         }
215     }
216 
217     /**
218      * @see OverallBuildQueue#getProjectsInBuildQueue()
219      */
220     public List<BuildProjectTask> getProjectsInBuildQueue()
221         throws TaskQueueException
222     {
223         return getBuildQueue().getQueueSnapshot();
224     }
225 
226     /**
227      * @see OverallBuildQueue#isInBuildQueue(int)
228      */
229     public boolean isInBuildQueue( int projectId )
230         throws TaskQueueException
231     {
232         return isInBuildQueue( projectId, -1 );
233     }
234 
235     /**
236      * @see OverallBuildQueue#isInBuildQueue(int, int)
237      */
238     public boolean isInBuildQueue( int projectId, int buildDefinitionId )
239         throws TaskQueueException
240     {
241         List<BuildProjectTask> queue = getProjectsInBuildQueue();
242         for ( BuildProjectTask buildTask : queue )
243         {
244             if ( buildTask != null )
245             {
246                 if ( buildDefinitionId < 0 )
247                 {
248                     if ( buildTask.getProjectId() == projectId )
249                     {
250                         return true;
251                     }
252                 }
253                 else
254                 {
255                     if ( buildTask.getProjectId() == projectId &&
256                         buildTask.getBuildDefinitionId() == buildDefinitionId )
257                     {
258                         return true;
259                     }
260                 }
261             }
262         }
263         return false;
264     }
265 
266     /**
267      * @see OverallBuildQueue#cancelBuildTask(int)
268      */
269     public void cancelBuildTask( int projectId )
270     {
271         BuildProjectTask task = (BuildProjectTask) buildTaskQueueExecutor.getCurrentTask();
272         if ( task != null && task.getProjectId() == projectId )
273         {
274             log.info(
275                 "Cancelling build task for project '" + projectId + "' in task executor '" + buildTaskQueueExecutor );
276             buildTaskQueueExecutor.cancelTask( task );
277         }
278     }
279 
280     /**
281      * @see OverallBuildQueue#cancelCheckoutTask(int)
282      */
283     public void cancelCheckoutTask( int projectId )
284         throws TaskQueueException
285     {
286         CheckOutTask task = (CheckOutTask) checkoutTaskQueueExecutor.getCurrentTask();
287         if ( task != null && task.getProjectId() == projectId )
288         {
289             log.info( "Cancelling checkout task for project '" + projectId + "' in task executor '" +
290                 checkoutTaskQueueExecutor );
291             checkoutTaskQueueExecutor.cancelTask( task );
292         }
293     }
294 
295     /**
296      * @see OverallBuildQueue#cancelCurrentBuild()
297      */
298     public boolean cancelCurrentBuild()
299     {
300         Task task = buildTaskQueueExecutor.getCurrentTask();
301         if ( task != null )
302         {
303             return buildTaskQueueExecutor.cancelTask( task );
304         }
305 
306         log.info( "No build task currently executing on build executor: " + buildTaskQueueExecutor );
307         return false;
308     }
309 
310     /**
311      * @see OverallBuildQueue#cancelCurrentCheckout()
312      */
313     public boolean cancelCurrentCheckout()
314     {
315         Task task = checkoutTaskQueueExecutor.getCurrentTask();
316         if ( task != null )
317         {
318             return checkoutTaskQueueExecutor.cancelTask( task );
319         }
320 
321         log.info( "No checkout task currently executing on checkout task executor: " + checkoutTaskQueueExecutor );
322         return false;
323     }
324 
325     /**
326      * @see OverallBuildQueue#removeProjectFromBuildQueue(int, int, int, String, int)
327      */
328     public boolean removeProjectFromBuildQueue( int projectId, int buildDefinitionId, int trigger, String projectName,
329                                                 int projectGroupId )
330         throws TaskQueueException
331     {
332         BuildDefinition buildDefinition;
333 
334         // maybe we could just pass the label as a parameter to eliminate dependency to BuildDefinitionDAO?
335         try
336         {
337             buildDefinition = buildDefinitionDao.getBuildDefinition( buildDefinitionId );
338         }
339         catch ( ContinuumStoreException e )
340         {
341             throw new TaskQueueException( "Error while removing project from build queue: " + projectName, e );
342         }
343 
344         String buildDefinitionLabel = buildDefinition.getDescription();
345         if ( StringUtils.isEmpty( buildDefinitionLabel ) )
346         {
347             buildDefinitionLabel = buildDefinition.getGoals();
348         }
349 
350         BuildProjectTask buildProjectTask =
351             new BuildProjectTask( projectId, buildDefinitionId, trigger, projectName, 
352                                   buildDefinitionLabel, null, projectGroupId );
353 
354         return getBuildQueue().remove( buildProjectTask );
355     }
356 
357     /**
358      * @see OverallBuildQueue#removeProjectsFromBuildQueue(int[])
359      */
360     public boolean removeProjectsFromBuildQueue( int[] projectIds )
361         throws TaskQueueException
362     {
363         if ( projectIds == null )
364         {
365             return false;
366         }
367         if ( projectIds.length < 1 )
368         {
369             return false;
370         }
371         List<BuildProjectTask> queue = getProjectsInBuildQueue();
372 
373         List<BuildProjectTask> tasks = new ArrayList<BuildProjectTask>();
374 
375         for ( BuildProjectTask buildTask : queue )
376         {
377             if ( buildTask != null )
378             {
379                 if ( ArrayUtils.contains( projectIds, buildTask.getProjectId() ) )
380                 {
381                     tasks.add( buildTask );
382                 }
383             }
384         }
385 
386         for ( BuildProjectTask buildProjectTask : tasks )
387         {
388             log.info( "cancel build for project " + buildProjectTask.getProjectId() );
389         }
390 
391         return !tasks.isEmpty() && getBuildQueue().removeAll( tasks );
392     }
393 
394     /**
395      * @see OverallBuildQueue#removeProjectFromBuildQueue(int)
396      */
397     public boolean removeProjectFromBuildQueue( int projectId )
398         throws TaskQueueException
399     {
400         List<BuildProjectTask> queue = getProjectsInBuildQueue();
401 
402         for ( BuildProjectTask buildTask : queue )
403         {
404             if ( buildTask != null && buildTask.getProjectId() == projectId )
405             {
406                 return getBuildQueue().remove( buildTask );
407             }
408         }
409         return false;
410     }
411 
412     /**
413      * @see OverallBuildQueue#removeProjectsFromBuildQueueWithHashCodes(int[])
414      */
415     public void removeProjectsFromBuildQueueWithHashCodes( int[] hashCodes )
416         throws TaskQueueException
417     {
418         List<BuildProjectTask> queue = getProjectsInBuildQueue();
419         for ( BuildProjectTask task : queue )
420         {
421             if ( ArrayUtils.contains( hashCodes, task.hashCode() ) )
422             {
423                 getBuildQueue().remove( task );
424             }
425         }
426     }
427 
428     /**
429      * @see OverallBuildQueue#getCheckoutQueue()
430      */
431     public TaskQueue getCheckoutQueue()
432     {
433         return ( (ParallelBuildsThreadedTaskQueueExecutor) checkoutTaskQueueExecutor ).getQueue();
434     }
435 
436     /**
437      * @see OverallBuildQueue#getBuildQueue()
438      */
439     public TaskQueue getBuildQueue()
440     {
441         return ( (ParallelBuildsThreadedTaskQueueExecutor) buildTaskQueueExecutor ).getQueue();
442     }
443 
444     /**
445      * @see OverallBuildQueue#getBuildTaskQueueExecutor()
446      */
447     public TaskQueueExecutor getBuildTaskQueueExecutor()
448     {
449         return buildTaskQueueExecutor;
450     }
451 
452     /**
453      * @see OverallBuildQueue#getCheckoutTaskQueueExecutor()
454      */
455     public TaskQueueExecutor getCheckoutTaskQueueExecutor()
456     {
457         return checkoutTaskQueueExecutor;
458     }
459 
460     public void setBuildDefinitionDao( BuildDefinitionDao buildDefinitionDao )
461     {
462         this.buildDefinitionDao = buildDefinitionDao;
463     }
464 
465     public void setBuildTaskQueueExecutor( TaskQueueExecutor buildTaskQueueExecutor )
466     {
467         this.buildTaskQueueExecutor = buildTaskQueueExecutor;
468     }
469 
470     public void setCheckoutTaskQueueExecutor( TaskQueueExecutor checkoutTaskQueueExecutor )
471     {
472         this.checkoutTaskQueueExecutor = checkoutTaskQueueExecutor;
473     }
474 }