You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@continuum.apache.org by oc...@apache.org on 2010/05/06 11:23:34 UTC

svn commit: r941625 [7/24] - in /continuum/branches/continuum-flat-multi-module: ./ continuum-api/ continuum-api/src/main/java/org/apache/continuum/builder/distributed/ continuum-api/src/main/java/org/apache/continuum/builder/distributed/manager/ conti...

Modified: continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/buildmanager/ParallelBuildsManager.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/buildmanager/ParallelBuildsManager.java?rev=941625&r1=941624&r2=941625&view=diff
==============================================================================
--- continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/buildmanager/ParallelBuildsManager.java (original)
+++ continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/buildmanager/ParallelBuildsManager.java Thu May  6 09:23:13 2010
@@ -28,14 +28,17 @@ import java.util.Set;
 
 import javax.annotation.Resource;
 
+import org.apache.commons.lang.ArrayUtils;
 import org.apache.continuum.buildqueue.BuildQueueService;
 import org.apache.continuum.buildqueue.BuildQueueServiceException;
 import org.apache.continuum.dao.BuildDefinitionDao;
+import org.apache.continuum.dao.ProjectDao;
 import org.apache.continuum.taskqueue.BuildProjectTask;
 import org.apache.continuum.taskqueue.CheckOutTask;
 import org.apache.continuum.taskqueue.OverallBuildQueue;
 import org.apache.continuum.taskqueue.PrepareBuildProjectsTask;
 import org.apache.continuum.taskqueueexecutor.ParallelBuildsThreadedTaskQueueExecutor;
+import org.apache.continuum.utils.build.BuildTrigger;
 import org.apache.maven.continuum.configuration.ConfigurationService;
 import org.apache.maven.continuum.model.project.BuildDefinition;
 import org.apache.maven.continuum.model.project.BuildQueue;
@@ -80,6 +83,9 @@ public class ParallelBuildsManager
     @Resource
     private BuildDefinitionDao buildDefinitionDao;
 
+    @Resource
+    private ProjectDao projectDao;
+
     private TaskQueue prepareBuildQueue;
 
     @Resource
@@ -89,12 +95,12 @@ public class ParallelBuildsManager
     private BuildQueueService buildQueueService;
 
     private PlexusContainer container;
-        
+
     /**
-     * @see BuildsManager#buildProject(int, BuildDefinition, String, int, ScmResult)
+     * @see BuildsManager#buildProject(int, BuildDefinition, String, BuildTrigger, ScmResult, int)
      */
-    public void buildProject( int projectId, BuildDefinition buildDefinition, String projectName, int trigger,
-                              ScmResult scmResult )
+    public void buildProject( int projectId, BuildDefinition buildDefinition, String projectName, BuildTrigger buildTrigger,
+                              ScmResult scmResult, int projectGroupId )
         throws BuildManagerException
     {
         try
@@ -104,6 +110,11 @@ public class ParallelBuildsManager
                 log.warn( "Project already queued." );
                 return;
             }
+            else if ( isProjectInAnyCurrentBuild( projectId ) )
+            {
+                log.warn( "Project is already building." );
+                return;
+            }
         }
         catch ( TaskQueueException e )
         {
@@ -111,35 +122,47 @@ public class ParallelBuildsManager
                 "Error occurred while checking if the project is already in queue: " + e.getMessage() );
         }
 
-        OverallBuildQueue overallBuildQueue =
-            getOverallBuildQueue( BUILD_QUEUE, buildDefinition.getSchedule().getBuildQueues() );
+        OverallBuildQueue overallBuildQueue = getOverallBuildQueueWhereProjectsInGroupAreQueued( projectGroupId );
 
-        String buildDefinitionLabel = buildDefinition.getDescription();
-        if ( StringUtils.isEmpty( buildDefinitionLabel ) )
+        if ( overallBuildQueue == null )
         {
-            buildDefinitionLabel = buildDefinition.getGoals();
+            overallBuildQueue = getOverallBuildQueue( BUILD_QUEUE, buildDefinition.getSchedule().getBuildQueues() );
         }
 
-        BuildProjectTask buildTask =
-            new BuildProjectTask( projectId, buildDefinition.getId(), trigger, projectName, buildDefinitionLabel,
-                                  scmResult );
-        try
+        if ( overallBuildQueue != null )
         {
-            log.info(
-                "Project '" + projectName + "' added to overall build queue '" + overallBuildQueue.getName() + "'." );
-            overallBuildQueue.addToBuildQueue( buildTask );
+            String buildDefinitionLabel = buildDefinition.getDescription();
+
+            if ( StringUtils.isEmpty( buildDefinitionLabel ) )
+            {
+                buildDefinitionLabel = buildDefinition.getGoals();
+            }
+    
+            BuildProjectTask buildTask =
+            	new BuildProjectTask( projectId, buildDefinition.getId(), buildTrigger, projectName, buildDefinitionLabel,
+                                      scmResult, projectGroupId );
+            try
+            {
+                log.info(
+                    "Project '" + projectName + "' added to overall build queue '" + overallBuildQueue.getName() + "'." );
+                overallBuildQueue.addToBuildQueue( buildTask );
+            }
+            catch ( TaskQueueException e )
+            {
+                throw new BuildManagerException( "Error occurred while adding project to build queue: " + e.getMessage() );
+            }
         }
-        catch ( TaskQueueException e )
+        else
         {
-            throw new BuildManagerException( "Error occurred while adding project to build queue: " + e.getMessage() );
+            log.warn( "No build queue configured. Not building." );
         }
     }
 
     /**
-     * @see BuildsManager#buildProjects(List, Map, int, Map)
+     * @see BuildsManager#buildProjects(List, Map, BuildTrigger, Map, int)
      */
     public void buildProjects( List<Project> projects, Map<Integer, BuildDefinition> projectsBuildDefinitionsMap,
-                               int trigger, Map<Integer, ScmResult> scmResultMap )
+    		                   BuildTrigger buildTrigger, Map<Integer, ScmResult> scmResultMap, int projectGroupId )
         throws BuildManagerException
     {
         int firstProjectId = 0;
@@ -148,7 +171,7 @@ public class ParallelBuildsManager
         {
             try
             {
-                if ( !isInQueue( project.getId(), BUILD_QUEUE, -1 ) )
+                if ( !isInQueue( project.getId(), BUILD_QUEUE, -1 ) && !isProjectInAnyCurrentBuild( project.getId() ) )
                 {
                     firstProjectId = project.getId();
                     break;
@@ -163,8 +186,12 @@ public class ParallelBuildsManager
         if ( firstProjectId != 0 )
         {
             BuildDefinition buildDef = projectsBuildDefinitionsMap.get( firstProjectId );
-            OverallBuildQueue overallBuildQueue =
-                getOverallBuildQueue( BUILD_QUEUE, buildDef.getSchedule().getBuildQueues() );
+            OverallBuildQueue overallBuildQueue = getOverallBuildQueueWhereProjectsInGroupAreQueued( projectGroupId );
+
+            if ( overallBuildQueue == null )
+            {
+                overallBuildQueue = getOverallBuildQueue( BUILD_QUEUE, buildDef.getSchedule().getBuildQueues() );
+            }
 
             if ( overallBuildQueue != null )
             {
@@ -179,6 +206,12 @@ public class ParallelBuildsManager
                                 "' is already in build queue." );
                             continue;
                         }
+                        else if ( isProjectInAnyCurrentBuild( project.getId() ) )
+                        {
+                            log.warn( "Project '" + project.getId() + "' - '" + project.getName() +
+                                      "' is already building." );
+                            continue;
+                        }
                     }
                     catch ( TaskQueueException e )
                     {
@@ -195,8 +228,8 @@ public class ParallelBuildsManager
 
                     ScmResult scmResult = scmResultMap.get( project.getId() );
                     BuildProjectTask buildTask =
-                        new BuildProjectTask( project.getId(), buildDefinition.getId(), trigger, project.getName(),
-                                              buildDefinitionLabel, scmResult );
+                    	new BuildProjectTask( project.getId(), buildDefinition.getId(), buildTrigger, project.getName(),
+                                              buildDefinitionLabel, scmResult, projectGroupId );
                     buildTask.setMaxExecutionTime( buildDefinition.getSchedule().getMaxJobExecutionTime() * 1000 );
 
                     try
@@ -213,11 +246,14 @@ public class ParallelBuildsManager
                     }
                 }
             }
+            else
+            {
+                log.warn( "No build queue configured. Not building" );
+            }
         }
         else
         {
             log.error( "Projects are already in build queue." );
-            throw new BuildManagerException( "Projects are already in build queue." );
         }
     }
 
@@ -367,10 +403,10 @@ public class ParallelBuildsManager
     }
 
     /**
-     * @see BuildsManager#checkoutProject(int, String, File, String, String, String, BuildDefinition, List)
+     * @see BuildsManager#checkoutProject(int, String, File, String, String, BuildDefinition)
      */
-    public void checkoutProject( int projectId, String projectName, File workingDirectory, String scmRootUrl,
-                                 String scmUsername, String scmPassword, BuildDefinition defaultBuildDefinition, List<Project> subProjects )
+    public void checkoutProject( int projectId, String projectName, File workingDirectory, String scmUsername,
+                                 String scmPassword, BuildDefinition defaultBuildDefinition )
         throws BuildManagerException
     {
         try
@@ -390,7 +426,7 @@ public class ParallelBuildsManager
         OverallBuildQueue overallBuildQueue =
             getOverallBuildQueue( CHECKOUT_QUEUE, defaultBuildDefinition.getSchedule().getBuildQueues() );
         CheckOutTask checkoutTask =
-            new CheckOutTask( projectId, workingDirectory, projectName, scmUsername, scmPassword, scmRootUrl, subProjects );
+            new CheckOutTask( projectId, workingDirectory, projectName, scmUsername, scmPassword );
         try
         {
             if ( overallBuildQueue != null )
@@ -475,6 +511,7 @@ public class ParallelBuildsManager
                 CheckOutTask task = checkouts.get( key );
                 if ( task.getProjectId() == projectId )
                 {
+                    log.info( "Project " + projectId + " is currently being checked out" );
                     return true;
                 }
             }
@@ -503,6 +540,7 @@ public class ParallelBuildsManager
 
                         if ( projectIds.contains( new Integer( projectId ) ) )
                         {
+                            log.info( "Project " + projectId + " is in prepare build queue" );
                             return true;
                         }
                     }
@@ -533,6 +571,7 @@ public class ParallelBuildsManager
                     (BuildProjectTask) overallBuildQueue.getBuildTaskQueueExecutor().getCurrentTask();
                 if ( task != null && task.getProjectId() == projectId )
                 {
+                    log.info( "Project " + projectId + " is currently building in " + overallBuildQueue.getName() );
                     return true;
                 }
             }
@@ -541,9 +580,9 @@ public class ParallelBuildsManager
     }
 
     /**
-     * @see BuildsManager#prepareBuildProjects(Map, int, int, String, String, int)
+     * @see BuildsManager#prepareBuildProjects(Map, BuildTrigger, int, String, String, int)
      */
-    public void prepareBuildProjects( Map<Integer, Integer> projectsBuildDefinitionsMap, int trigger,
+    public void prepareBuildProjects( Map<Integer, Integer> projectsBuildDefinitionsMap, BuildTrigger buildTrigger,
                                       int projectGroupId, String projectGroupName, String scmRootAddress,
                                       int scmRootId )
         throws BuildManagerException
@@ -551,7 +590,7 @@ public class ParallelBuildsManager
         try
         {
             PrepareBuildProjectsTask task =
-                new PrepareBuildProjectsTask( projectsBuildDefinitionsMap, trigger, projectGroupId, projectGroupName,
+            	new PrepareBuildProjectsTask( projectsBuildDefinitionsMap, buildTrigger, projectGroupId, projectGroupName,
                                               scmRootAddress, scmRootId );
 
             log.info( "Queueing prepare-build-project task '" + task + "' to prepare-build queue." );
@@ -590,9 +629,10 @@ public class ParallelBuildsManager
     }
 
     /**
-     * @see BuildsManager#removeProjectFromBuildQueue(int, int, int, String)
+     * @see BuildsManager#removeProjectFromBuildQueue(int, int, BuildTrigger, String, int)
      */
-    public void removeProjectFromBuildQueue( int projectId, int buildDefinitionId, int trigger, String projectName )
+    public void removeProjectFromBuildQueue( int projectId, int buildDefinitionId, BuildTrigger buildTrigger,
+    		                                 String projectName, int projectGroupId )
         throws BuildManagerException
     {
         try
@@ -600,7 +640,8 @@ public class ParallelBuildsManager
             OverallBuildQueue overallBuildQueue = getOverallBuildQueueWhereProjectIsQueued( projectId, BUILD_QUEUE );
             if ( overallBuildQueue != null )
             {
-                overallBuildQueue.removeProjectFromBuildQueue( projectId, buildDefinitionId, trigger, projectName );
+            	overallBuildQueue.removeProjectFromBuildQueue( projectId, buildDefinitionId, buildTrigger, projectName,
+                                                               projectGroupId );
             }
             else
             {
@@ -859,7 +900,7 @@ public class ParallelBuildsManager
                     buildDefinitionDao.getBuildDefinition( buildTask.getBuildDefinitionId() );
 
                 buildProject( buildTask.getProjectId(), buildDefinition, buildTask.getProjectName(),
-                              buildTask.getTrigger(), buildTask.getScmResult() );
+                		      buildTask.getBuildTrigger(), buildTask.getScmResult(), buildTask.getProjectGroupId() );
             }
             catch ( ContinuumStoreException e )
             {
@@ -871,9 +912,9 @@ public class ParallelBuildsManager
         {
             try
             {
-                BuildDefinition buildDefinition = buildDefinitionDao.getDefaultBuildDefinition( task.getProjectId() );                
+                BuildDefinition buildDefinition = buildDefinitionDao.getDefaultBuildDefinition( task.getProjectId() );
                 checkoutProject( task.getProjectId(), task.getProjectName(), task.getWorkingDirectory(),
-                                 task.getScmRootUrl(), task.getScmUserName(), task.getScmPassword(), buildDefinition, task.getProjectsWithCommonScmRoot() );
+                                 task.getScmUserName(), task.getScmPassword(), buildDefinition );
             }
             catch ( ContinuumStoreException e )
             {
@@ -1034,6 +1075,94 @@ public class ParallelBuildsManager
         }
     }
 
+    public boolean isProjectCurrentlyPreparingBuild( int projectId )
+        throws BuildManagerException
+    {
+        PrepareBuildProjectsTask task = getCurrentProjectInPrepareBuild();
+
+        if ( task != null )
+        {
+            Map<Integer, Integer> map = task.getProjectsBuildDefinitionsMap();
+
+            if ( map.size() > 0 )
+            {
+                Set<Integer> projectIds = map.keySet();
+
+                if ( projectIds.contains( new Integer( projectId ) ) )
+                {
+                    log.info( "Project " + projectId + " is currently preparing build" );
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    public PrepareBuildProjectsTask getCurrentProjectInPrepareBuild()
+        throws BuildManagerException
+    {
+        Task task = getPrepareBuildTaskQueueExecutor().getCurrentTask();
+
+        if ( task != null )
+        {
+            return (PrepareBuildProjectsTask) task;
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+    public List<PrepareBuildProjectsTask> getProjectsInPrepareBuildQueue()
+        throws BuildManagerException
+    {
+        try
+        {
+            return getPrepareBuildQueue().getQueueSnapshot();
+        }
+        catch ( TaskQueueException e )
+        {
+            throw new BuildManagerException( "Error occurred while retrieving projects in prepare build queue", e );
+        }
+    }
+
+    public boolean removeProjectFromPrepareBuildQueue( int projectGroupId, int scmRootId )
+        throws BuildManagerException
+    {
+        List<PrepareBuildProjectsTask> tasks = getProjectsInPrepareBuildQueue();
+
+        if ( tasks != null )
+        {
+            for ( PrepareBuildProjectsTask task : tasks )
+            {
+                if ( task.getProjectGroupId() == projectGroupId && task.getProjectScmRootId() == scmRootId )
+                {
+                    return getPrepareBuildQueue().remove( task );
+                }
+            }
+        }
+
+        return false;
+    }
+
+    public void removeProjectsFromPrepareBuildQueueWithHashCodes( int[] hashCodes )
+        throws BuildManagerException
+    {
+        List<PrepareBuildProjectsTask> tasks = getProjectsInPrepareBuildQueue();
+
+        if ( tasks != null )
+        {
+            for ( PrepareBuildProjectsTask task : tasks )
+            {
+                if ( ArrayUtils.contains( hashCodes, task.getHashCode() ) )
+                {
+                    getPrepareBuildQueue().remove( task );
+                }
+            }
+        }
+    }
+
     private boolean isInQueue( int projectId, int typeOfQueue, int buildDefinitionId )
         throws TaskQueueException
     {
@@ -1049,6 +1178,7 @@ public class ParallelBuildsManager
                     {
                         if ( overallBuildQueue.isInBuildQueue( projectId ) )
                         {
+                            log.info( "Project " + projectId + " is in build queue " + overallBuildQueue.getName() );
                             return true;
                         }
                     }
@@ -1056,6 +1186,7 @@ public class ParallelBuildsManager
                     {
                         if ( overallBuildQueue.isInBuildQueue( projectId, buildDefinitionId ) )
                         {
+                            log.info( "Project " + projectId + " is in build queue " + overallBuildQueue.getName() );
                             return true;
                         }
                     }
@@ -1064,6 +1195,7 @@ public class ParallelBuildsManager
                 {
                     if ( overallBuildQueue.isInCheckoutQueue( projectId ) )
                     {
+                        log.info( "Project " + projectId + " is in checkout queue " + overallBuildQueue.getName() );
                         return true;
                     }
                 }
@@ -1118,14 +1250,14 @@ public class ParallelBuildsManager
             {
                 throw new BuildManagerException( "No build queues configured." );
             }
-            
+
+            int size = 0;
+            int idx = 0;
+            int allowedBuilds = configurationService.getNumberOfBuildsInParallel();
+
             try
-            {     
-                int size = 0;
-                int idx = 0;
-                int allowedBuilds = configurationService.getNumberOfBuildsInParallel();
+            {
                 int count = 1;
-               
                 for ( BuildQueue buildQueue : buildQueues )
                 {
                     if ( count <= allowedBuilds )
@@ -1134,27 +1266,37 @@ public class ParallelBuildsManager
                         if ( overallBuildQueue != null )
                         {
                             TaskQueue taskQueue = null;
+                            TaskQueueExecutor taskQueueExecutor = null;
+                            int tempSize = 0;
                             if ( typeOfQueue == BUILD_QUEUE )
                             {
                                 taskQueue = overallBuildQueue.getBuildQueue();
+                                taskQueueExecutor = overallBuildQueue.getBuildTaskQueueExecutor();
                             }
                             else if ( typeOfQueue == CHECKOUT_QUEUE )
                             {
                                 taskQueue = overallBuildQueue.getCheckoutQueue();
+                                taskQueueExecutor = overallBuildQueue.getCheckoutTaskQueueExecutor();
+                            }
+
+                            tempSize = taskQueue.getQueueSnapshot().size();
+                            if ( taskQueueExecutor.getCurrentTask() != null )
+                            {
+                                tempSize++;
                             }
-       
+
                             if ( idx == 0 )
                             {
-                                size = taskQueue.getQueueSnapshot().size();
                                 whereToBeQueued = overallBuildQueue;
+                                size = tempSize;
                             }
-       
-                            if ( taskQueue.getQueueSnapshot().size() < size )
+
+                            if ( tempSize < size )
                             {
                                 whereToBeQueued = overallBuildQueue;
-                                size = taskQueue.getQueueSnapshot().size();
+                                size = tempSize;
                             }
-       
+
                             idx++;
                         }
                         else
@@ -1172,7 +1314,7 @@ public class ParallelBuildsManager
             catch ( TaskQueueException e )
             {
                 throw new BuildManagerException( "Error occurred while retrieving task quueue: " + e.getMessage() );
-            }         
+            }
         }
 
         // use default overall build queue if none is configured
@@ -1191,7 +1333,107 @@ public class ParallelBuildsManager
 
         return whereToBeQueued;
     }
- 
+
+    public OverallBuildQueue getOverallBuildQueueWhereProjectsInGroupAreQueued( int projectGroupId )
+        throws BuildManagerException
+    {
+        OverallBuildQueue whereToBeQueued = null;
+
+        try
+        {
+            List<Project> projects = projectDao.getProjectsInGroup( projectGroupId );
+
+            if ( projects != null )
+            {
+                for ( Project project : projects )
+                {
+                    whereToBeQueued = getOverallBuildQueueWhereProjectIsQueued( project.getId(), BUILD_QUEUE );
+
+                    if ( whereToBeQueued == null )
+                    {
+                        whereToBeQueued = getOverallBuildQueueWhereProjectIsBuilding( project.getId() );
+                    }
+
+                    if ( whereToBeQueued != null )
+                    {
+                        break;
+                    }
+                }
+            }
+        }
+        catch ( ContinuumStoreException e )
+        {
+            throw new BuildManagerException( "Error while retrieving overall build queue for project: " + e.getMessage() );
+        }
+        catch ( TaskQueueException e )
+        {
+            throw new BuildManagerException( "Error while retrieving overall build queue for project: " + e.getMessage() );
+        }
+
+        return whereToBeQueued;
+    }
+
+    private OverallBuildQueue getOverallBuildQueueWhereProjectIsBuilding( int projectId )
+    {
+        synchronized ( overallBuildQueues )
+        {
+            for ( Integer key : overallBuildQueues.keySet() )
+            {
+                OverallBuildQueue overallBuildQueue = overallBuildQueues.get( key );
+                BuildProjectTask task =
+                    (BuildProjectTask) overallBuildQueue.getBuildTaskQueueExecutor().getCurrentTask();
+                if ( task != null && task.getProjectId() == projectId )
+                {
+                    return overallBuildQueue;
+                }
+            }
+            return null;
+        }
+    }
+
+    public TaskQueueExecutor getPrepareBuildTaskQueueExecutor()
+        throws BuildManagerException
+    {
+        try
+        {
+            return (TaskQueueExecutor) container.lookup( TaskQueueExecutor.class, "prepare-build-project" );
+        }
+        catch ( ComponentLookupException e )
+        {
+            throw new BuildManagerException( e.getMessage(), e );
+        }
+    }
+
+    public boolean isProjectCurrentlyBeingCheckedOut( int projectId )
+        throws BuildManagerException
+    {
+        Map<String, CheckOutTask> checkouts = getCurrentCheckouts();
+        for( String key : checkouts.keySet() )
+        {
+            CheckOutTask task = checkouts.get( key );
+            if( task.getProjectId() == projectId )
+            {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    public boolean isAnyProjectCurrentlyBuilding( int[] projectIds )
+        throws BuildManagerException
+    {
+        for ( int i = 0; i < projectIds.length; i++ )
+        {
+            if ( isProjectInAnyCurrentBuild( projectIds[i] ) ) 
+            {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
     public void contextualize( Context context )
         throws ContextException
     {
@@ -1272,4 +1514,9 @@ public class ParallelBuildsManager
     {
         this.buildDefinitionDao = buildDefinitionDao;
     }
+
+    public void setProjectDao( ProjectDao projectDao )
+    {
+        this.projectDao = projectDao;
+    }
 }

Modified: continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/purge/DefaultContinuumPurgeManager.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/purge/DefaultContinuumPurgeManager.java?rev=941625&r1=941624&r2=941625&view=diff
==============================================================================
--- continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/purge/DefaultContinuumPurgeManager.java (original)
+++ continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/purge/DefaultContinuumPurgeManager.java Thu May  6 09:23:13 2010
@@ -27,8 +27,13 @@ import org.apache.continuum.model.reposi
 import org.apache.continuum.purge.task.PurgeTask;
 import org.apache.continuum.taskqueue.manager.TaskQueueManager;
 import org.apache.continuum.taskqueue.manager.TaskQueueManagerException;
+import org.apache.maven.continuum.build.settings.DefaultSchedulesActivator;
+import org.apache.maven.continuum.build.settings.SchedulesActivationException;
+import org.apache.maven.continuum.build.settings.SchedulesActivator;
 import org.apache.maven.continuum.model.project.Schedule;
 import org.codehaus.plexus.taskqueue.TaskQueueException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.List;
 
@@ -43,10 +48,12 @@ import java.util.List;
 public class DefaultContinuumPurgeManager
     implements ContinuumPurgeManager
 {
+    private static final Logger log = LoggerFactory.getLogger( DefaultContinuumPurgeManager.class );
+    
     /**
      * @plexus.requirement
      */
-    private ProjectDao projectDao;
+    private SchedulesActivator schedulesActivator;
 
     /**
      * @plexus.requirement
@@ -69,8 +76,8 @@ public class DefaultContinuumPurgeManage
         List<RepositoryPurgeConfiguration> repoPurgeList = null;
         List<DirectoryPurgeConfiguration> dirPurgeList = null;
 
-        repoPurgeList = purgeConfigurationService.getRepositoryPurgeConfigurationsBySchedule( schedule.getId() );
-        dirPurgeList = purgeConfigurationService.getDirectoryPurgeConfigurationsBySchedule( schedule.getId() );
+        repoPurgeList = purgeConfigurationService.getEnableRepositoryPurgeConfigurationsBySchedule( schedule.getId() );
+        dirPurgeList = purgeConfigurationService.getEnableDirectoryPurgeConfigurationsBySchedule( schedule.getId() );
 
         if ( repoPurgeList != null && repoPurgeList.size() > 0 )
         {
@@ -87,6 +94,20 @@ public class DefaultContinuumPurgeManage
                 purgeDirectory( dirPurge );
             }
         }
+        
+        if ( ( repoPurgeList == null || repoPurgeList.isEmpty() ) && ( dirPurgeList == null || dirPurgeList.isEmpty() ) )
+        {
+            // This purge is not enable for a purge process.
+            try
+            {
+                schedulesActivator.unactivateOrphanPurgeSchedule( schedule );
+            }
+            catch ( SchedulesActivationException e )
+            {
+                log.debug( String.format( "Can't unactivate orphan schedule '%s' for purgeConfiguration",
+                                          schedule.getName() ) );
+            }
+        }
     }
 
     public void purgeRepository( RepositoryPurgeConfiguration repoPurge )

Modified: continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/release/distributed/DistributedReleaseUtil.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/release/distributed/DistributedReleaseUtil.java?rev=941625&r1=941624&r2=941625&view=diff
==============================================================================
--- continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/release/distributed/DistributedReleaseUtil.java (original)
+++ continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/release/distributed/DistributedReleaseUtil.java Thu May  6 09:23:13 2010
@@ -99,6 +99,8 @@ public class DistributedReleaseUtil
     public static final String KEY_RELEASE_GOAL = "release-goal";
 
     public static final String KEY_BUILD_AGENT_URL = "build-agent-url";
+    
+    public static final String KEY_USERNAME = "username";
 
     public static String getScmTag( Map<String, Object> context, String defaultValue )
     {
@@ -209,6 +211,11 @@ public class DistributedReleaseUtil
     {
         return getInteger( context, KEY_PROJECT_ID );
     }
+    
+    public static String getUsername( Map<String, Object> context )
+    {
+        return getString( context, KEY_USERNAME, "" );
+    }
 
     // ----------------------------------------------------------------------
     //

Modified: continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/release/distributed/manager/DefaultDistributedReleaseManager.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/release/distributed/manager/DefaultDistributedReleaseManager.java?rev=941625&r1=941624&r2=941625&view=diff
==============================================================================
--- continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/release/distributed/manager/DefaultDistributedReleaseManager.java (original)
+++ continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/release/distributed/manager/DefaultDistributedReleaseManager.java Thu May  6 09:23:13 2010
@@ -32,6 +32,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 
+import org.apache.continuum.builder.distributed.manager.DistributedBuildManager;
 import org.apache.continuum.configuration.BuildAgentConfiguration;
 import org.apache.continuum.configuration.BuildAgentConfigurationException;
 import org.apache.continuum.dao.BuildResultDao;
@@ -48,6 +49,7 @@ import org.apache.maven.continuum.model.
 import org.apache.maven.continuum.model.project.Project;
 import org.apache.maven.continuum.release.ContinuumReleaseException;
 import org.apache.maven.shared.release.ReleaseResult;
+import org.codehaus.plexus.util.IOUtil;
 import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 import org.slf4j.Logger;
@@ -78,14 +80,17 @@ public class DefaultDistributedReleaseMa
      */
     ConfigurationService configurationService;
 
+    /**
+     * @plexus.requirement
+     */
+    DistributedBuildManager distributedBuildManager;
+
     private Map<String, Map<String, Object>> releasesInProgress;
 
     public Map getReleasePluginParameters( int projectId, String pomFilename )
         throws ContinuumReleaseException, BuildAgentConfigurationException
     {
-        BuildResult buildResult = buildResultDao.getLatestBuildResultForProject( projectId );
-
-        String buildAgentUrl = buildResult.getBuildUrl();
+        String buildAgentUrl = getDefaultBuildagent( projectId );
 
         if ( !checkBuildAgent( buildAgentUrl ) )
         {
@@ -94,8 +99,16 @@ public class DefaultDistributedReleaseMa
 
         try
         {
-            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
-            return client.getReleasePluginParameters( projectId, pomFilename );
+            if ( distributedBuildManager.isAgentAvailable( buildAgentUrl ) )
+            {
+                SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                return client.getReleasePluginParameters( projectId, pomFilename );
+            }
+
+            // call reload in case we disable the build agent
+            distributedBuildManager.reload();
+
+            throw new ContinuumReleaseException( "Failed to retrieve release plugin parameters because build agent " + buildAgentUrl + " is not available" );
         }
         catch ( MalformedURLException e )
         {
@@ -123,8 +136,16 @@ public class DefaultDistributedReleaseMa
 
         try
         {
-            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
-            return client.processProject( projectId, pomFilename, autoVersionSubmodules );
+            if ( distributedBuildManager.isAgentAvailable( buildAgentUrl ) )
+            {
+                SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                return client.processProject( projectId, pomFilename, autoVersionSubmodules );
+            }
+
+            // call reload in case we disable the build agent
+            distributedBuildManager.reload();
+
+            throw new ContinuumReleaseException( "Failed to process project for releasing because build agent " + buildAgentUrl + " is unavailable" );
         }
         catch ( MalformedURLException e )
         {
@@ -139,12 +160,10 @@ public class DefaultDistributedReleaseMa
     }
 
     public String releasePrepare( Project project, Properties releaseProperties, Map<String, String> releaseVersion,
-                                  Map<String, String> developmentVersion, Map<String, String> environments )
+                                  Map<String, String> developmentVersion, Map<String, String> environments, String username )
         throws ContinuumReleaseException, BuildAgentConfigurationException
     {
-        BuildResult buildResult = buildResultDao.getLatestBuildResultForProject( project.getId() );
-
-        String buildAgentUrl = buildResult.getBuildUrl();
+        String buildAgentUrl = environments.get( DistributedReleaseUtil.KEY_BUILD_AGENT_URL );
 
         if ( !checkBuildAgent( buildAgentUrl ) )
         {
@@ -153,16 +172,25 @@ public class DefaultDistributedReleaseMa
 
         try
         {
-            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
-            String releaseId =
-                client.releasePrepare( createProjectMap( project ), createPropertiesMap( releaseProperties ),
-                                       releaseVersion, developmentVersion, environments );
-
-            addReleasePrepare( releaseId, buildAgentUrl, releaseVersion.get( releaseId ) );
+            if ( distributedBuildManager.isAgentAvailable( buildAgentUrl ) )
+            {
+                SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+    
+                String releaseId =
+                    client.releasePrepare( createProjectMap( project ), createPropertiesMap( releaseProperties ),
+                                           releaseVersion, developmentVersion, environments, username );
+    
+                addReleasePrepare( releaseId, buildAgentUrl, releaseVersion.get( releaseId ), "prepare" );
+    
+                addReleaseInProgress( releaseId, "prepare", project.getId(), username );
+    
+                return releaseId;
+            }
 
-            addReleaseInProgress( releaseId, "prepare", project.getId() );
+            // call reload in case we disable the build agent
+            distributedBuildManager.reload();
 
-            return releaseId;
+            throw new ContinuumReleaseException( "Failed to prepare release project because the build agent " + buildAgentUrl + " is not available" );
         }
         catch ( MalformedURLException e )
         {
@@ -188,16 +216,25 @@ public class DefaultDistributedReleaseMa
 
         try
         {
-            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
-            Map<String, Object> result = client.getReleaseResult( releaseId );
+            if ( distributedBuildManager.isAgentAvailable( buildAgentUrl ) )
+            {
+                SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                Map<String, Object> result = client.getReleaseResult( releaseId );
+    
+                ReleaseResult releaseResult = new ReleaseResult();
+                releaseResult.setStartTime( DistributedReleaseUtil.getStartTime( result ) );
+                releaseResult.setEndTime( DistributedReleaseUtil.getEndTime( result ) );
+                releaseResult.setResultCode( DistributedReleaseUtil.getReleaseResultCode( result ) );
+                releaseResult.getOutputBuffer().append( DistributedReleaseUtil.getReleaseOutput( result ) );
+    
+                return releaseResult;
+            }
 
-            ReleaseResult releaseResult = new ReleaseResult();
-            releaseResult.setStartTime( DistributedReleaseUtil.getStartTime( result ) );
-            releaseResult.setEndTime( DistributedReleaseUtil.getEndTime( result ) );
-            releaseResult.setResultCode( DistributedReleaseUtil.getReleaseResultCode( result ) );
-            releaseResult.getOutputBuffer().append( DistributedReleaseUtil.getReleaseOutput( result ) );
+            // call reload in case we disable a build agent
+            distributedBuildManager.reload();
 
-            return releaseResult;
+            throw new ContinuumReleaseException( "Failed to get release result of " + releaseId + 
+                                                 " because the build agent " + buildAgentUrl + " is not available" );
         }
         catch ( MalformedURLException e )
         {
@@ -223,8 +260,17 @@ public class DefaultDistributedReleaseMa
 
         try
         {
-            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
-            return client.getListener( releaseId );
+            if ( distributedBuildManager.isAgentAvailable( buildAgentUrl ) )
+            {
+                SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                return client.getListener( releaseId );
+            }
+
+            // call reload in case we disable the build agent
+            distributedBuildManager.reload();
+
+            throw new ContinuumReleaseException( "Failed to get listener for " + releaseId + 
+                                                 " because the build agent " + buildAgentUrl + " is not available" );
         }
         catch ( MalformedURLException e )
         {
@@ -250,8 +296,17 @@ public class DefaultDistributedReleaseMa
 
         try
         {
-            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
-            client.removeListener( releaseId );
+            if ( distributedBuildManager.isAgentAvailable( buildAgentUrl ) )
+            {
+                SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                client.removeListener( releaseId );
+            }
+
+            // call reload in case we disable the build agent
+            distributedBuildManager.reload();
+
+            throw new ContinuumReleaseException( "Failed to remove listener of " + releaseId + 
+                                                 " because the build agent " + buildAgentUrl + " is not available" );
         }
         catch ( MalformedURLException e )
         {
@@ -278,8 +333,17 @@ public class DefaultDistributedReleaseMa
 
         try
         {
-            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
-            return client.getPreparedReleaseName( releaseId );
+            if ( distributedBuildManager.isAgentAvailable( buildAgentUrl ) )
+            {
+                SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                return client.getPreparedReleaseName( releaseId );
+            }
+
+            // call reload in case we disable the build agent
+            distributedBuildManager.reload();
+
+            throw new ContinuumReleaseException( "Failed to get prepared release name of " + releaseId + 
+                                                 " because the build agent " + buildAgentUrl + " is not available" );
         }
         catch ( MalformedURLException e )
         {
@@ -294,9 +358,21 @@ public class DefaultDistributedReleaseMa
     }
 
     public void releasePerform( int projectId, String releaseId, String goals, String arguments,
-                                boolean useReleaseProfile, LocalRepository repository )
+                                boolean useReleaseProfile, LocalRepository repository, String username )
         throws ContinuumReleaseException, BuildAgentConfigurationException
     {
+        List<PreparedRelease> releases = getPreparedReleases();
+
+        for ( PreparedRelease release: releases )
+        {
+            if ( release.getReleaseId().equals( releaseId ) )
+            {
+                release.setReleaseType( "perform" );
+                savePreparedReleases( releases );
+                break;
+            }
+        }
+
         String buildAgentUrl = getBuildAgentUrl( releaseId );
 
         if ( !checkBuildAgent( buildAgentUrl ) )
@@ -315,20 +391,28 @@ public class DefaultDistributedReleaseMa
         }
 
         Map<String, String> map = new HashMap<String, String>();
+        map.put( DistributedReleaseUtil.KEY_USERNAME, username );
 
         if ( repository != null )
-        {
-            map.put( DistributedReleaseUtil.KEY_LOCAL_REPOSITORY, repository.getLocation() );
-            map.put( DistributedReleaseUtil.KEY_LOCAL_REPOSITORY_NAME, repository.getName() );
-            map.put( DistributedReleaseUtil.KEY_LOCAL_REPOSITORY_LAYOUT, repository.getLayout() );
+        {   
+            map.put( DistributedReleaseUtil.KEY_LOCAL_REPOSITORY_NAME, repository.getName() );         
         }
 
         try
         {
-            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
-            client.releasePerform( releaseId, goals, arguments, useReleaseProfile, map );
+            if ( distributedBuildManager.isAgentAvailable( buildAgentUrl ) )
+            {
+                SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                client.releasePerform( releaseId, goals, arguments, useReleaseProfile, map, username );
+    
+                addReleaseInProgress( releaseId, "perform", projectId, username );
+            }
+
+            // call reload in case we disable the build agent
+            distributedBuildManager.reload();
 
-            addReleaseInProgress( releaseId, "perform", projectId );
+            throw new ContinuumReleaseException( "Failed to perform release of " + releaseId + 
+                                                 " because the build agent " + buildAgentUrl + " is not available" );
         }
         catch ( MalformedURLException e )
         {
@@ -342,14 +426,12 @@ public class DefaultDistributedReleaseMa
         }
     }
 
-    public void releasePerformFromScm( int projectId, String goals, String arguments, boolean useReleaseProfile,
-                                       LocalRepository repository, String scmUrl, String scmUsername,
-                                       String scmPassword, String scmTag, String scmTagBase, Map environments )
+    public String releasePerformFromScm( int projectId, String goals, String arguments, boolean useReleaseProfile,
+                                         LocalRepository repository, String scmUrl, String scmUsername,
+                                         String scmPassword, String scmTag, String scmTagBase, Map environments, String username )
         throws ContinuumReleaseException, BuildAgentConfigurationException
     {
-        BuildResult buildResult = buildResultDao.getLatestBuildResultForProject( projectId );
-
-        String buildAgentUrl = buildResult.getBuildUrl();
+        String buildAgentUrl = (String) environments.get( DistributedReleaseUtil.KEY_BUILD_AGENT_URL );
 
         if ( !checkBuildAgent( buildAgentUrl ) )
         {
@@ -367,22 +449,32 @@ public class DefaultDistributedReleaseMa
         }
 
         Map<String, String> map = new HashMap<String, String>();
+        map.put( DistributedReleaseUtil.KEY_USERNAME, username );
 
         if ( repository != null )
-        {
-            map.put( DistributedReleaseUtil.KEY_LOCAL_REPOSITORY, repository.getLocation() );
-            map.put( DistributedReleaseUtil.KEY_LOCAL_REPOSITORY_NAME, repository.getName() );
-            map.put( DistributedReleaseUtil.KEY_LOCAL_REPOSITORY_LAYOUT, repository.getLayout() );
+        {            
+            map.put( DistributedReleaseUtil.KEY_LOCAL_REPOSITORY_NAME, repository.getName() );         
         }
 
         try
         {
-            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
-            String releaseId =
-                client.releasePerformFromScm( goals, arguments, useReleaseProfile, map, scmUrl, scmUsername,
-                                              scmPassword, scmTag, scmTagBase, environments );
+            if ( distributedBuildManager.isAgentAvailable( buildAgentUrl ) )
+            {
+                SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                String releaseId =
+                    client.releasePerformFromScm( goals, arguments, useReleaseProfile, map, scmUrl, scmUsername,
+                                                  scmPassword, scmTag, scmTagBase, environments, username );
+    
+                addReleasePrepare( releaseId, buildAgentUrl, scmTag, "perform" );
+                addReleaseInProgress( releaseId, "perform", projectId, username );
+    
+                return releaseId;
+            }
+
+            // call reload in case we disable the build agent
+            distributedBuildManager.reload();
 
-            addReleaseInProgress( releaseId, "perform", projectId );
+            throw new ContinuumReleaseException( "Failed to perform release because the build agent " + buildAgentUrl + " is not available" );
         }
         catch ( MalformedURLException e )
         {
@@ -408,8 +500,17 @@ public class DefaultDistributedReleaseMa
 
         try
         {
-            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
-            client.releaseRollback( releaseId, projectId );
+            if ( distributedBuildManager.isAgentAvailable( buildAgentUrl ) )
+            {
+                SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                client.releaseRollback( releaseId, projectId );
+            }
+
+            // call reload in case we disable the build agent
+            distributedBuildManager.reload();
+
+            throw new ContinuumReleaseException( "Unable to rollback release " + releaseId + 
+                                                 " because the build agent " + buildAgentUrl + " is not available" );
         }
         catch ( MalformedURLException e )
         {
@@ -435,11 +536,22 @@ public class DefaultDistributedReleaseMa
 
         try
         {
-            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
-            String result = client.releaseCleanup( releaseId );
+            if ( distributedBuildManager.isAgentAvailable( buildAgentUrl ) )
+            {
+                SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                String result = client.releaseCleanup( releaseId );
+    
+                removeFromReleaseInProgress( releaseId );
+                removeFromPreparedReleases( releaseId );
+    
+                return result;
+            }
+
+            // call reload in case we disable the build agent
+            distributedBuildManager.reload();
 
-            removeFromReleaseInProgress( releaseId );
-            return result;
+            throw new ContinuumReleaseException( "Failed to cleanup release of " + releaseId + 
+                                                 " because the build agent " + buildAgentUrl + " is not available" );
         }
         catch ( MalformedURLException e )
         {
@@ -448,8 +560,8 @@ public class DefaultDistributedReleaseMa
         }
         catch ( Exception e )
         {
-            log.error( "Failed to get prepared release name of " + releaseId, e );
-            throw new ContinuumReleaseException( "Failed to get prepared release name of " + releaseId, e );
+            log.error( "Failed to cleanup release of " + releaseId, e );
+            throw new ContinuumReleaseException( "Failed to cleanup release of " + releaseId, e );
         }
     }
 
@@ -474,19 +586,22 @@ public class DefaultDistributedReleaseMa
 
                     try
                     {
-                        SlaveBuildAgentTransportClient client =
-                            new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
-                        Map map = client.getListener( releaseId );
-
-                        if ( map != null && !map.isEmpty() )
+                        if ( distributedBuildManager.isAgentAvailable( buildAgentUrl ) )
                         {
-                            Map<String, Object> release = releasesInProgress.get( releaseId );
-                            release.put( DistributedReleaseUtil.KEY_RELEASE_ID, releaseId );
-                            release.put( DistributedReleaseUtil.KEY_BUILD_AGENT_URL, buildAgentUrl );
-
-                            releases.add( release );
-
-                            releasesMap.put( releaseId, releasesInProgress.get( releaseId ) );
+                            SlaveBuildAgentTransportClient client =
+                                new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                            Map map = client.getListener( releaseId );
+    
+                            if ( map != null && !map.isEmpty() )
+                            {
+                                Map<String, Object> release = releasesInProgress.get( releaseId );
+                                release.put( DistributedReleaseUtil.KEY_RELEASE_ID, releaseId );
+                                release.put( DistributedReleaseUtil.KEY_BUILD_AGENT_URL, buildAgentUrl );
+    
+                                releases.add( release );
+    
+                                releasesMap.put( releaseId, releasesInProgress.get( releaseId ) );
+                            }
                         }
                     }
                     catch ( MalformedURLException e )
@@ -505,8 +620,25 @@ public class DefaultDistributedReleaseMa
             releasesInProgress = releasesMap;
         }
 
+        try
+        {
+            // call reload in case we disable a build agent
+            distributedBuildManager.reload();
+        }
+        catch ( Exception e )
+        {
+            throw new ContinuumReleaseException( e.getMessage(), e );
+        }
+
         return releases;
     }
+    
+    public String getDefaultBuildagent( int projectId )
+    {
+        BuildResult buildResult = buildResultDao.getLatestBuildResultForProject( projectId );
+        
+        return buildResult != null ? buildResult.getBuildUrl() : null;
+    }
 
     private Map createProjectMap( Project project )
     {
@@ -518,8 +650,8 @@ public class DefaultDistributedReleaseMa
         map.put( DistributedReleaseUtil.KEY_SCM_URL, project.getScmUrl() );
         if ( project.getProjectGroup().getLocalRepository() != null )
         {
-            map.put( DistributedReleaseUtil.KEY_LOCAL_REPOSITORY,
-                     project.getProjectGroup().getLocalRepository().getLocation() );
+            map.put( DistributedReleaseUtil.KEY_LOCAL_REPOSITORY_NAME,
+                     project.getProjectGroup().getLocalRepository().getName() );
         }
 
         return map;
@@ -599,10 +731,12 @@ public class DefaultDistributedReleaseMa
 
         if ( file.exists() )
         {
+            FileInputStream fis = null;
             try
             {
+                fis = new FileInputStream( file );
                 ContinuumPrepareReleasesModelXpp3Reader reader = new ContinuumPrepareReleasesModelXpp3Reader();
-                PreparedReleaseModel model = reader.read( new InputStreamReader( new FileInputStream( file ) ) );
+                PreparedReleaseModel model = reader.read( new InputStreamReader( fis ) );
 
                 return model.getPreparedReleases();
             }
@@ -616,25 +750,26 @@ public class DefaultDistributedReleaseMa
                 log.error( e.getMessage(), e );
                 throw new ContinuumReleaseException( e.getMessage(), e );
             }
+            finally
+            {
+                if ( fis != null )
+                {
+                    IOUtil.close( fis );
+                }
+            }
         }
 
         return null;
     }
 
-    private void addReleasePrepare( String releaseId, String buildAgentUrl, String releaseName )
+    private void addReleasePrepare( String releaseId, String buildAgentUrl, String releaseName, String releaseType )
         throws ContinuumReleaseException
     {
-        File file = getPreparedReleasesFile();
-
-        if ( !file.exists() )
-        {
-            file.getParentFile().mkdirs();
-        }
-
         PreparedRelease release = new PreparedRelease();
         release.setReleaseId( releaseId );
         release.setBuildAgentUrl( buildAgentUrl );
         release.setReleaseName( releaseName );
+        release.setReleaseType( releaseType );
 
         List<PreparedRelease> preparedReleases = getPreparedReleases();
 
@@ -642,42 +777,28 @@ public class DefaultDistributedReleaseMa
         {
             preparedReleases = new ArrayList<PreparedRelease>();
         }
-        else
-        {
-            boolean found = false;
 
-            for ( PreparedRelease preparedRelease : preparedReleases )
-            {
-                if ( preparedRelease.getReleaseId().equals( release.getReleaseId() ) &&
-                    preparedRelease.getReleaseName().equals( release.getReleaseName() ) )
-                {
-                    preparedRelease.setBuildAgentUrl( release.getBuildAgentUrl() );
-                    found = true;
-                }
-            }
+        boolean found = false;
 
-            if ( !found )
+        for ( PreparedRelease preparedRelease : preparedReleases )
+        {
+            if ( preparedRelease.getReleaseId().equals( release.getReleaseId() ) &&
+                 preparedRelease.getReleaseName().equals( release.getReleaseName() ) )
             {
-                preparedReleases.add( release );
+                preparedRelease.setBuildAgentUrl( release.getBuildAgentUrl() );
+                found = true;
             }
         }
 
-        PreparedReleaseModel model = new PreparedReleaseModel();
-        model.setPreparedReleases( preparedReleases );
-
-        try
+        if ( !found )
         {
-            ContinuumPrepareReleasesModelXpp3Writer writer = new ContinuumPrepareReleasesModelXpp3Writer();
-            FileWriter fileWriter = new FileWriter( file );
-            writer.write( fileWriter, model );
-        }
-        catch ( IOException e )
-        {
-            throw new ContinuumReleaseException( "Failed to write prepared releases in file", e );
+            preparedReleases.add( release );
         }
+
+        savePreparedReleases( preparedReleases );
     }
 
-    private void addReleaseInProgress( String releaseId, String releaseType, int projectId )
+    private void addReleaseInProgress( String releaseId, String releaseType, int projectId, String username )
     {
         if ( releasesInProgress == null )
         {
@@ -687,6 +808,7 @@ public class DefaultDistributedReleaseMa
         Map<String, Object> map = new HashMap<String, Object>();
         map.put( DistributedReleaseUtil.KEY_RELEASE_GOAL, releaseType );
         map.put( DistributedReleaseUtil.KEY_PROJECT_ID, projectId );
+        map.put( DistributedReleaseUtil.KEY_USERNAME, username );
 
         releasesInProgress.put( releaseId, map );
     }
@@ -733,7 +855,60 @@ public class DefaultDistributedReleaseMa
             return true;
         }
 
-        log.info( "Build agent: " + buildAgentUrl + "is either disabled or removed" );
+        log.info( "Build agent: " + buildAgentUrl + " is either disabled or removed" );
         return false;
     }
+
+    private void removeFromPreparedReleases( String releaseId )
+        throws ContinuumReleaseException
+    {
+        List<PreparedRelease> releases = getPreparedReleases();
+
+        for ( PreparedRelease release : releases )
+        {
+            if ( release.getReleaseId().equals( releaseId ) )
+            {
+                if ( release.getReleaseType().equals( "perform" ) )
+                {
+                    releases.remove( release );
+                    savePreparedReleases( releases );
+                    break;
+                }
+            }
+        }
+    }
+
+    private void savePreparedReleases( List<PreparedRelease> preparedReleases)
+        throws ContinuumReleaseException
+    {
+        File file = getPreparedReleasesFile();
+
+        if ( !file.exists() )
+        {
+            file.getParentFile().mkdirs();
+        }
+
+        PreparedReleaseModel model = new PreparedReleaseModel();
+        model.setPreparedReleases( preparedReleases );
+
+        try
+        {
+            ContinuumPrepareReleasesModelXpp3Writer writer = new ContinuumPrepareReleasesModelXpp3Writer();
+            FileWriter fileWriter = new FileWriter( file );
+            writer.write( fileWriter, model );
+            fileWriter.flush();
+            fileWriter.close();
+        }
+        catch ( IOException e )
+        {
+            throw new ContinuumReleaseException( "Failed to write prepared releases in file", e );
+        }
+    }
+    
+    // for unit test
+    
+    public void setBuildResultDao( BuildResultDao buildResultDao )
+    {
+        this.buildResultDao = buildResultDao;
+    }
 }
\ No newline at end of file

Modified: continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/taskqueue/DefaultOverallBuildQueue.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/taskqueue/DefaultOverallBuildQueue.java?rev=941625&r1=941624&r2=941625&view=diff
==============================================================================
--- continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/taskqueue/DefaultOverallBuildQueue.java (original)
+++ continuum/branches/continuum-flat-multi-module/continuum-core/src/main/java/org/apache/continuum/taskqueue/DefaultOverallBuildQueue.java Thu May  6 09:23:13 2010
@@ -27,6 +27,7 @@ import javax.annotation.Resource;
 import org.apache.commons.lang.ArrayUtils;
 import org.apache.continuum.dao.BuildDefinitionDao;
 import org.apache.continuum.taskqueueexecutor.ParallelBuildsThreadedTaskQueueExecutor;
+import org.apache.continuum.utils.build.BuildTrigger;
 import org.apache.maven.continuum.model.project.BuildDefinition;
 import org.apache.maven.continuum.store.ContinuumStoreException;
 import org.codehaus.plexus.taskqueue.Task;
@@ -323,9 +324,10 @@ public class DefaultOverallBuildQueue
     }
 
     /**
-     * @see OverallBuildQueue#removeProjectFromBuildQueue(int, int, int, String)
+     * @see OverallBuildQueue#removeProjectFromBuildQueue(int, int, BuildTrigger, String, int)
      */
-    public boolean removeProjectFromBuildQueue( int projectId, int buildDefinitionId, int trigger, String projectName )
+    public boolean removeProjectFromBuildQueue( int projectId, int buildDefinitionId, BuildTrigger buildTrigger,
+    		                                    String projectName, int projectGroupId )
         throws TaskQueueException
     {
         BuildDefinition buildDefinition;
@@ -347,7 +349,8 @@ public class DefaultOverallBuildQueue
         }
 
         BuildProjectTask buildProjectTask =
-            new BuildProjectTask( projectId, buildDefinitionId, trigger, projectName, buildDefinitionLabel, null );
+        	                      new BuildProjectTask( projectId, buildDefinitionId, buildTrigger, projectName, 
+                                  buildDefinitionLabel, null, projectGroupId );
 
         return getBuildQueue().remove( buildProjectTask );
     }