You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@continuum.apache.org by ct...@apache.org on 2010/04/13 02:26:43 UTC

svn commit: r933451 [1/2] - in /continuum/trunk: continuum-api/src/main/java/org/apache/continuum/builder/distributed/manager/ continuum-buildagent/continuum-buildagent-api/src/main/java/org/apache/continuum/buildagent/ continuum-buildagent/continuum-b...

Author: ctan
Date: Tue Apr 13 00:26:42 2010
New Revision: 933451

URL: http://svn.apache.org/viewvc?rev=933451&view=rev
Log:
[CONTINUUM-2476] Projects are not built in the correct build agent when the project is already in the build queue and then triggered to be built again
- added unit tests
- fix concurrent modification exception
- added checks to see if project and build definition is already in queue or currently preparing build or building
- select the build agent based on the scm roots of the same project group


Added:
    continuum/trunk/continuum-core/src/test/java/org/apache/continuum/builder/distributed/stubs/
    continuum/trunk/continuum-core/src/test/java/org/apache/continuum/builder/distributed/stubs/DefaultDistributedBuildManagerStub.java
    continuum/trunk/continuum-core/src/test/java/org/apache/continuum/builder/distributed/stubs/SlaveBuildAgentTransportClientStub.java
Modified:
    continuum/trunk/continuum-api/src/main/java/org/apache/continuum/builder/distributed/manager/DistributedBuildManager.java
    continuum/trunk/continuum-buildagent/continuum-buildagent-api/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentService.java
    continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentServiceImpl.java
    continuum/trunk/continuum-core/src/main/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManager.java
    continuum/trunk/continuum-core/src/main/java/org/apache/continuum/release/distributed/manager/DefaultDistributedReleaseManager.java
    continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java
    continuum/trunk/continuum-core/src/test/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManagerTest.java
    continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-api/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportService.java
    continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-client/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportClient.java
    continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-server/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportServer.java

Modified: continuum/trunk/continuum-api/src/main/java/org/apache/continuum/builder/distributed/manager/DistributedBuildManager.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-api/src/main/java/org/apache/continuum/builder/distributed/manager/DistributedBuildManager.java?rev=933451&r1=933450&r2=933451&view=diff
==============================================================================
--- continuum/trunk/continuum-api/src/main/java/org/apache/continuum/builder/distributed/manager/DistributedBuildManager.java (original)
+++ continuum/trunk/continuum-api/src/main/java/org/apache/continuum/builder/distributed/manager/DistributedBuildManager.java Tue Apr 13 00:26:42 2010
@@ -24,6 +24,7 @@ import java.util.Map;
 
 import org.apache.continuum.buildagent.NoBuildAgentException;
 import org.apache.continuum.buildagent.NoBuildAgentInGroupException;
+import org.apache.continuum.model.project.ProjectScmRoot;
 import org.apache.continuum.taskqueue.BuildProjectTask;
 import org.apache.continuum.taskqueue.PrepareBuildProjectsTask;
 import org.apache.continuum.utils.build.BuildTrigger;
@@ -64,7 +65,7 @@ public interface DistributedBuildManager
         throws ContinuumException;
 
     void prepareBuildProjects( Map<Integer, Integer> projectsBuildDefinitionsMap, BuildTrigger buildTrigger, int projectGroupId,  
-                               String projectGroupName, String scmRootAddress, int scmRootId )
+                               String projectGroupName, String scmRootAddress, int scmRootId, List<ProjectScmRoot> scmRoots )
         throws ContinuumException, NoBuildAgentException, NoBuildAgentInGroupException;
 
     Map<String, PrepareBuildProjectsTask> getProjectsCurrentlyPreparingBuild()
@@ -87,4 +88,16 @@ public interface DistributedBuildManager
 
     boolean isAgentAvailable( String buildAgentUrl )
         throws ContinuumException;
+
+    boolean isProjectInAnyPrepareBuildQueue( int projectId, int buildDefinitionId )
+        throws ContinuumException;
+
+    boolean isProjectInAnyBuildQueue( int projectId, int buildDefinitionId )
+        throws ContinuumException;
+
+    boolean isProjectCurrentlyPreparingBuild( int projectId, int buildDefinitionId )
+        throws ContinuumException;
+
+    boolean isProjectCurrentlyBuilding( int projectId, int buildDefinitionId )
+        throws ContinuumException;
 }
\ No newline at end of file

Modified: continuum/trunk/continuum-buildagent/continuum-buildagent-api/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentService.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-buildagent/continuum-buildagent-api/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentService.java?rev=933451&r1=933450&r2=933451&view=diff
==============================================================================
--- continuum/trunk/continuum-buildagent/continuum-buildagent-api/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentService.java (original)
+++ continuum/trunk/continuum-buildagent/continuum-buildagent-api/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentService.java Tue Apr 13 00:26:42 2010
@@ -84,6 +84,9 @@ public interface ContinuumBuildAgentServ
     List<Map<String, Object>> getProjectsInPrepareBuildQueue()
         throws ContinuumBuildAgentException;
 
+    List<Map<String, Object>> getProjectsAndBuildDefinitionsInPrepareBuildQueue()
+        throws ContinuumBuildAgentException;
+
     List<Map<String, Object>> getProjectsInBuildQueue()
         throws ContinuumBuildAgentException;
 
@@ -93,8 +96,13 @@ public interface ContinuumBuildAgentServ
     Map<String, Object> getProjectCurrentlyPreparingBuild()
         throws ContinuumBuildAgentException;
 
+    List<Map<String, Object>> getProjectsAndBuildDefinitionsCurrentlyPreparingBuild()
+        throws ContinuumBuildAgentException;
+
     boolean isProjectGroupInQueue( int projectGroupId );
 
+    boolean isProjectScmRootInQueue( int projectScmRootId, List<Integer> projectIds );
+
     boolean isProjectCurrentlyBuilding( int projectId );
 
     boolean isProjectInBuildQueue( int projectId );

Modified: continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentServiceImpl.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentServiceImpl.java?rev=933451&r1=933450&r2=933451&view=diff
==============================================================================
--- continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentServiceImpl.java (original)
+++ continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentServiceImpl.java Tue Apr 13 00:26:42 2010
@@ -628,6 +628,35 @@ public class ContinuumBuildAgentServiceI
         }
     }
 
+    public List<Map<String, Object>> getProjectsAndBuildDefinitionsInPrepareBuildQueue()
+        throws ContinuumBuildAgentException
+    {
+        try
+        {
+            List<Map<String, Object>> projects = new ArrayList<Map<String, Object>>();
+
+            for ( PrepareBuildProjectsTask task : buildAgentTaskQueueManager.getProjectsInPrepareBuildQueue() )
+            {
+                for ( BuildContext context : task.getBuildContexts() )
+                {
+                    Map<String, Object> map = new HashMap<String, Object>();
+
+                    map.put( ContinuumBuildAgentUtil.KEY_PROJECT_ID, context.getProjectId() );
+                    map.put( ContinuumBuildAgentUtil.KEY_BUILD_DEFINITION_ID, context.getBuildDefinitionId() );
+
+                    projects.add( map );
+                }
+            }
+
+            return projects;
+        }
+        catch( TaskQueueManagerException e )
+        {
+            log.error( "Error occurred while retrieving projects in prepare build queue", e );
+            throw new ContinuumBuildAgentException( "Error occurred while retrieving projects in prepare build queue", e );
+        }
+    }
+
     public List<Map<String, Object>> getProjectsInBuildQueue()
         throws ContinuumBuildAgentException
     {
@@ -684,6 +713,36 @@ public class ContinuumBuildAgentServiceI
         }
     }
 
+    public List<Map<String, Object>> getProjectsAndBuildDefinitionsCurrentlyPreparingBuild()
+        throws ContinuumBuildAgentException
+    {
+        try
+        {
+            List<Map<String, Object>> projects = new ArrayList<Map<String, Object>>();
+
+            PrepareBuildProjectsTask task = buildAgentTaskQueueManager.getCurrentProjectInPrepareBuild();
+
+            if ( task != null )
+            {
+                for ( BuildContext context : task.getBuildContexts() )
+                {
+                    Map<String, Object> map = new HashMap<String, Object>();
+
+                    map.put( ContinuumBuildAgentUtil.KEY_PROJECT_ID, context.getProjectId() );
+                    map.put( ContinuumBuildAgentUtil.KEY_BUILD_DEFINITION_ID, context.getBuildDefinitionId() );
+
+                    projects.add( map );
+                }
+            }
+
+            return projects;
+        }
+        catch ( TaskQueueManagerException e )
+        {
+            log.error( "Error occurred while retrieving current projects in prepare build", e );
+            throw new ContinuumBuildAgentException( "Error occurred while retrieving current projects in prepare build", e );
+        }
+    }
     public Map<String, Object> getProjectCurrentlyBuilding()
         throws ContinuumBuildAgentException
     {
@@ -754,6 +813,61 @@ public class ContinuumBuildAgentServiceI
         return false;
     }
 
+    public boolean isProjectScmRootInQueue( int projectScmRootId, List<Integer> projectIds )
+    {
+        try
+        {
+            PrepareBuildProjectsTask currentPrepareBuildTask = buildAgentTaskQueueManager.getCurrentProjectInPrepareBuild();
+
+            if ( currentPrepareBuildTask != null && currentPrepareBuildTask.getScmRootId() == projectScmRootId )
+            {
+                return true;
+            }
+
+            BuildProjectTask currentBuildTask = buildAgentTaskQueueManager.getCurrentProjectInBuilding();
+            
+            if ( currentBuildTask != null )
+            {
+                int projectId = currentBuildTask.getProjectId();
+
+                for ( Integer pid : projectIds )
+                {
+                    if ( pid == projectId )
+                    {
+                        return true;
+                    }
+                }
+            }
+
+            for ( PrepareBuildProjectsTask task : buildAgentTaskQueueManager.getProjectsInPrepareBuildQueue() )
+            {
+                if ( task.getScmRootId() == projectScmRootId )
+                {
+                    return true;
+                }
+            }
+
+            for ( BuildProjectTask task : buildAgentTaskQueueManager.getProjectsInBuildQueue() )
+            {
+                int projectId = task.getProjectId();
+
+                for ( Integer pid : projectIds )
+                {
+                    if ( pid == projectId )
+                    {
+                        return true;
+                    }
+                }
+            }
+        }
+        catch ( TaskQueueManagerException e )
+        {
+            log.error( "Error while checking if project scm root " + projectScmRootId + " is queued in agent", e);
+        }
+
+        return false;
+    }
+
     public boolean isProjectCurrentlyBuilding( int projectId )
     {
         try

Modified: continuum/trunk/continuum-core/src/main/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManager.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManager.java?rev=933451&r1=933450&r2=933451&view=diff
==============================================================================
--- continuum/trunk/continuum-core/src/main/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManager.java (original)
+++ continuum/trunk/continuum-core/src/main/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManager.java Tue Apr 13 00:26:42 2010
@@ -38,6 +38,8 @@ import org.apache.continuum.dao.BuildDef
 import org.apache.continuum.dao.BuildResultDao;
 import org.apache.continuum.dao.ProjectDao;
 import org.apache.continuum.distributed.transport.slave.SlaveBuildAgentTransportClient;
+import org.apache.continuum.distributed.transport.slave.SlaveBuildAgentTransportService;
+import org.apache.continuum.model.project.ProjectScmRoot;
 import org.apache.continuum.taskqueue.BuildProjectTask;
 import org.apache.continuum.taskqueue.OverallDistributedBuildQueue;
 import org.apache.continuum.taskqueue.PrepareBuildProjectsTask;
@@ -131,9 +133,8 @@ public class DefaultDistributedBuildMana
                     {
                         try
                         {
-                            SlaveBuildAgentTransportClient client =
-                                new SlaveBuildAgentTransportClient( new URL( agent.getUrl() ) );
-    
+                            SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( agent.getUrl() );
+
                             if ( client.ping() )
                             {
                                 log.info(
@@ -180,8 +181,7 @@ public class DefaultDistributedBuildMana
                 {
                     try
                     {
-                        SlaveBuildAgentTransportClient client =
-                            new SlaveBuildAgentTransportClient( new URL( agent.getUrl() ) );
+                        SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( agent.getUrl() );
     
                         if ( client.ping() )
                         {
@@ -215,34 +215,41 @@ public class DefaultDistributedBuildMana
     }
 
     public void prepareBuildProjects( Map<Integer, Integer>projectsBuildDefinitionsMap, BuildTrigger buildTrigger, int projectGroupId, 
-                                      String projectGroupName, String scmRootAddress, int scmRootId )
+                                      String projectGroupName, String scmRootAddress, int scmRootId, List<ProjectScmRoot> scmRoots )
         throws ContinuumException, NoBuildAgentException, NoBuildAgentInGroupException
     {
     	PrepareBuildProjectsTask task = new PrepareBuildProjectsTask( projectsBuildDefinitionsMap, buildTrigger,
                                                                       projectGroupId, projectGroupName, 
                                                                       scmRootAddress, scmRootId );
 
-        OverallDistributedBuildQueue overallDistributedBuildQueue = getOverallDistributedBuildQueueByGroup( projectGroupId );
-        
-        if ( hasBuildagentGroup( projectsBuildDefinitionsMap ) && overallDistributedBuildQueue == null )
+        OverallDistributedBuildQueue overallDistributedBuildQueue = getOverallDistributedBuildQueueByGroup( projectGroupId, scmRoots, scmRootId );
+
+        if ( overallDistributedBuildQueue == null )
         {
-            if ( !hasBuildagentInGroup( projectsBuildDefinitionsMap ) )
-            {
-                log.warn( "No build agent configured in build agent group. Not building projects." );
+            log.info( "no overall build queue by group" );
 
-                throw new NoBuildAgentInGroupException( "No build agent configured in build agent group" );
+            if ( hasBuildagentGroup( projectsBuildDefinitionsMap ) )
+            {
+                if ( !hasBuildagentInGroup( projectsBuildDefinitionsMap ) )
+                {
+                    log.warn( "No build agent configured in build agent group. Not building projects." );
+    
+                    throw new NoBuildAgentInGroupException( "No build agent configured in build agent group" );
+                }
+                else
+                {
+                    // get overall distributed build queue from build agent group
+                    overallDistributedBuildQueue = getOverallDistributedBuildQueueByAgentGroup( projectsBuildDefinitionsMap );
+                    log.info( "got overall build queue by agent group" );
+                }
             }
             else
             {
-                // get overall distributed build queue from build agent group
-                overallDistributedBuildQueue = getOverallDistributedBuildQueueByAgentGroup( projectsBuildDefinitionsMap );
+                // project does not have build agent group
+                overallDistributedBuildQueue = getOverallDistributedBuildQueue();
+                log.info( "get overall build queue in all agents" );
             }
         }
-        else if ( overallDistributedBuildQueue == null )
-        {
-            // project does not have build agent group
-            overallDistributedBuildQueue = getOverallDistributedBuildQueue();
-        }
 
         if ( overallDistributedBuildQueue != null )
         {
@@ -329,8 +336,7 @@ public class DefaultDistributedBuildMana
                 {
                     if ( isAgentAvailable( buildAgentUrl ) )
                     {
-                        SlaveBuildAgentTransportClient client =
-                            new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                        SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
 
                         List<Map<String, Object>> projects = client.getProjectsInPrepareBuildQueue();
     
@@ -353,6 +359,9 @@ public class DefaultDistributedBuildMana
             }
         }
 
+        // call reload in case we disable a build agent
+        reload();
+
         return map;
     }
 
@@ -369,8 +378,7 @@ public class DefaultDistributedBuildMana
                 {
                     if ( isAgentAvailable( buildAgentUrl ) )
                     {
-                        SlaveBuildAgentTransportClient client =
-                            new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                        SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
                         Map<String, Object> project = client.getProjectCurrentlyPreparingBuild();
     
                         if ( !project.isEmpty() )
@@ -389,6 +397,10 @@ public class DefaultDistributedBuildMana
                 }
             }
         }
+
+        // call reload in case we disable a build agent
+        reload();
+
         return map;
     }
  
@@ -405,8 +417,7 @@ public class DefaultDistributedBuildMana
                 {
                     if ( isAgentAvailable( buildAgentUrl ) )
                     {
-                        SlaveBuildAgentTransportClient client =
-                            new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                        SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
                         Map<String, Object> project = client.getProjectCurrentlyBuilding();
     
                         if ( !project.isEmpty() )
@@ -426,6 +437,9 @@ public class DefaultDistributedBuildMana
             }
         }
 
+        // call reload in case we disable a build agent
+        reload();
+
         return map;
     }
 
@@ -444,8 +458,7 @@ public class DefaultDistributedBuildMana
                 {
                     if ( isAgentAvailable( buildAgentUrl ) )
                     {
-                        SlaveBuildAgentTransportClient client =
-                            new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                        SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
                         List<Map<String, Object>> projects = client.getProjectsInBuildQueue();
     
                         for ( Map<String, Object> context : projects )
@@ -466,6 +479,10 @@ public class DefaultDistributedBuildMana
                 }
             }
         }
+
+        // call reload in case we disable a build agent
+        reload();
+
         return map;
     }
 
@@ -494,10 +511,13 @@ public class DefaultDistributedBuildMana
         {
             if ( isAgentAvailable( buildAgentUrl ) )
             {
-                SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
     
                 client.cancelBuild();
             }
+
+            // call reload in case we disable the build agent
+            reload();
         }
         catch ( MalformedURLException e )
         {
@@ -515,40 +535,40 @@ public class DefaultDistributedBuildMana
         throws ContinuumException
     {
         Map<String, Object> map = new HashMap<String, Object>();
-    
+
         String buildAgentUrl = getBuildAgent( projectId );
-    
+
         if ( buildAgentUrl == null )
         {
             return null;
         }
-    
+
         try
         {
             if ( isAgentAvailable( buildAgentUrl ) )
             {
-                SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
-        
+                SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
+
                 Map<String, Object> result = client.getBuildResult( projectId );
-        
+
                 if ( result != null )
                 {
                     int buildDefinitionId = ContinuumBuildConstant.getBuildDefinitionId( result );
-        
+
                     Project project = projectDao.getProjectWithAllDetails( projectId );
                     BuildDefinition buildDefinition = buildDefinitionDao.getBuildDefinition( buildDefinitionId );
-        
+
                     BuildResult oldBuildResult =
                         buildResultDao.getLatestBuildResultForBuildDefinition( projectId, buildDefinitionId );
-        
+
                     BuildResult buildResult = distributedBuildUtil.convertMapToBuildResult( result );
                     buildResult.setBuildDefinition( buildDefinition );
                     buildResult.setBuildNumber( project.getBuildNumber() + 1 );
                     buildResult.setModifiedDependencies( distributedBuildUtil.getModifiedDependencies( oldBuildResult, result ) );
                     buildResult.setScmResult( distributedBuildUtil.getScmResult( result ) );
-        
+
                     String buildOutput = ContinuumBuildConstant.getBuildOutput( result );
-        
+
                     map.put( ContinuumBuildConstant.KEY_BUILD_RESULT, buildResult );
                     map.put( ContinuumBuildConstant.KEY_BUILD_OUTPUT, buildOutput );
                 }
@@ -562,7 +582,10 @@ public class DefaultDistributedBuildMana
         {
             throw new ContinuumException( "Error while retrieving build result for project" + projectId, e );
         }
-    
+
+        // call reload in case we disable the build agent
+        reload();
+
         return map;
     }
 
@@ -570,15 +593,15 @@ public class DefaultDistributedBuildMana
         throws ContinuumException
     {
         List<Installation> installations = new ArrayList<Installation>();
-    
+
         try
         {
             if ( isAgentAvailable( buildAgentUrl ) )
             {
-                SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
-        
+                SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
+
                 List<Map<String, String>> installationsList = client.getAvailableInstallations();
-        
+
                 for ( Map context : installationsList )
                 {
                     Installation installation = new Installation();
@@ -589,6 +612,10 @@ public class DefaultDistributedBuildMana
                     installations.add( installation );
                 }
             }
+
+            // call reload in case we disable the build agent
+            reload();
+
             return installations;
         }
         catch ( Exception e )
@@ -601,26 +628,26 @@ public class DefaultDistributedBuildMana
         throws ContinuumException
     {
         BuildResult buildResult = buildResultDao.getLatestBuildResultForProject( projectId );
-    
+
         if ( buildResult != null )
         {
             String buildAgentUrl = buildResult.getBuildUrl();
-    
+
             if ( buildAgentUrl == null )
             {
                 return "";
             }
-    
+
             try
             {
                 if ( directory == null )
                 {
                     directory = "";
                 }
-    
+
                 if ( isAgentAvailable( buildAgentUrl ) )
                 {
-                    SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                    SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
                     return client.generateWorkingCopyContent( projectId, directory, baseUrl, imageBaseUrl );
                 }
             }
@@ -633,6 +660,10 @@ public class DefaultDistributedBuildMana
                 log.error( "Error while generating working copy content from build agent " + buildAgentUrl, e );
             }
         }
+
+        // call reload in case we disable the build agent
+        reload();
+
         return "";
     }
     
@@ -640,21 +671,21 @@ public class DefaultDistributedBuildMana
         throws ContinuumException
     {
         BuildResult buildResult = buildResultDao.getLatestBuildResultForProject( projectId );
-    
+
         if ( buildResult != null )
         {
             String buildAgentUrl = buildResult.getBuildUrl();
-    
+
             if ( buildAgentUrl == null )
             {
                 return "";
             }
-    
+
             try
             {
                 if ( isAgentAvailable( buildAgentUrl ) )
                 {
-                    SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                    SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
                     return client.getProjectFileContent( projectId, directory, filename );
                 }
             }
@@ -667,6 +698,10 @@ public class DefaultDistributedBuildMana
                 log.error( "Error while retrieving content of " + filename, e );
             }
         }
+
+        // call reload in case we disable the build agent
+        reload();
+
         return "";
     }
 
@@ -677,7 +712,7 @@ public class DefaultDistributedBuildMana
         {
             if ( isAgentAvailable( buildAgentUrl ) )
             {
-                SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
                 client.removeFromPrepareBuildQueue( projectGroupId, scmRootId );
             }
         }
@@ -695,6 +730,9 @@ public class DefaultDistributedBuildMana
             throw new ContinuumException( "Error occurred while removing projectGroupId=" + projectGroupId + " scmRootId=" +
                                           scmRootId + " from prepare build queue of agent " + buildAgentUrl, e );
         }
+
+        // call reload in case we disable the build agent
+        reload();
     }
 
     public void removeFromBuildQueue( String buildAgentUrl, int projectId, int buildDefinitionId )
@@ -704,7 +742,7 @@ public class DefaultDistributedBuildMana
         {
             if ( isAgentAvailable( buildAgentUrl ) )
             {
-                SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
                 client.removeFromBuildQueue( projectId, buildDefinitionId );
             }
         }
@@ -722,6 +760,9 @@ public class DefaultDistributedBuildMana
             throw new ContinuumException( "Error occurred while removing project " + projectId + 
                                           " from build queue of agent " + buildAgentUrl, e );
         }
+
+        // call reload in case we disable the build agent
+        reload();
     }
 
     public void removeFromPrepareBuildQueue( List<String> hashCodes )
@@ -735,7 +776,7 @@ public class DefaultDistributedBuildMana
                 {
                     if ( isAgentAvailable( buildAgentUrl ) )
                     {
-                        SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                        SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
                         client.removeFromPrepareBuildQueue( hashCodes );
                     }
                 }
@@ -749,6 +790,9 @@ public class DefaultDistributedBuildMana
                 }
             }
         }
+
+        // call reload in case we disable a build agent
+        reload();
     }
 
     public void removeFromBuildQueue( List<String> hashCodes )
@@ -762,7 +806,7 @@ public class DefaultDistributedBuildMana
                 {
                     if ( isAgentAvailable( buildAgentUrl ) )
                     {
-                        SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                        SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
                         client.removeFromBuildQueue( hashCodes );
                     }
                 }
@@ -776,11 +820,171 @@ public class DefaultDistributedBuildMana
                 }
             }
         }
+
+        // call reload in case we disable a build agent
+        reload();
+    }
+
+    public boolean isProjectInAnyPrepareBuildQueue( int projectId, int buildDefinitionId )
+        throws ContinuumException
+    {
+        boolean found = false;
+
+        synchronized( overallDistributedBuildQueues )
+        {
+            for ( String buildAgentUrl : overallDistributedBuildQueues.keySet() )
+            {
+                try
+                {
+                    if ( isAgentAvailable( buildAgentUrl ) )
+                    {
+                        SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
+
+                        List<Map<String, Object>> projects = client.getProjectsAndBuildDefinitionsInPrepareBuildQueue();
+    
+                        for ( Map<String, Object> context : projects )
+                        {
+                            int pid = ContinuumBuildConstant.getProjectId( context );
+                            int buildId = ContinuumBuildConstant.getBuildDefinitionId( context );
+
+                            if ( pid == projectId && buildId == buildDefinitionId )
+                            {
+                                found = true;
+                                break;
+                            }
+
+                        }
+                    }
+
+                    if ( found )
+                    {
+                        break;
+                    }
+                }
+                catch ( MalformedURLException e )
+                {
+                    throw new ContinuumException( "Invalid build agent url: " + buildAgentUrl ); 
+                }
+                catch ( Exception e )
+                {
+                    throw new ContinuumException( "Error while retrieving projects in prepare build queue", e );
+                }
+            }
+        }
+
+        // call reload in case we disable a build agent
+        reload();
+
+        if ( found )
+        {
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    }
+
+    public boolean isProjectInAnyBuildQueue( int projectId, int buildDefinitionId )
+        throws ContinuumException
+    {
+        Map<String, List<BuildProjectTask>> map = getProjectsInBuildQueue();
+
+        for ( String url : map.keySet() )
+        {
+            for ( BuildProjectTask task : map.get( url ) )
+            {
+                if ( task.getProjectId() == projectId && task.getBuildDefinitionId() == buildDefinitionId )
+                {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    public boolean isProjectCurrentlyPreparingBuild( int projectId, int buildDefinitionId )
+        throws ContinuumException
+    {
+        boolean found = false;
+
+        synchronized( overallDistributedBuildQueues )
+        {
+            for ( String buildAgentUrl : overallDistributedBuildQueues.keySet() )
+            {
+                try
+                {
+                    if ( isAgentAvailable( buildAgentUrl ) )
+                    {
+                        SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
+                        List<Map<String, Object>> projects = client.getProjectsAndBuildDefinitionsCurrentlyPreparingBuild();
+    
+                        for ( Map<String, Object> context : projects )
+                        {
+                            int pid = ContinuumBuildConstant.getProjectId( context );
+                            int buildId = ContinuumBuildConstant.getBuildDefinitionId( context );
+    
+                            if ( pid == projectId && buildId == buildDefinitionId )
+                            {
+                                found = true;
+                                break;
+                            }
+                        }
+                    }
+
+                    if ( found )
+                    {
+                        break;
+                    }
+                }
+                catch ( MalformedURLException e )
+                {
+                    throw new ContinuumException( "Invalid build agent url: " + buildAgentUrl );
+                }
+                catch ( Exception e )
+                {
+                    throw new ContinuumException( "Error retrieving projects currently preparing build in " + buildAgentUrl, e );
+                }
+            }
+        }
+
+        // call reload in case we disable a build agent
+        reload();
+
+        if ( found )
+        {
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    }
+
+    public boolean isProjectCurrentlyBuilding( int projectId, int buildDefinitionId )
+        throws ContinuumException
+    {
+        Map<String, BuildProjectTask> map = getProjectsCurrentlyBuilding();
+
+        for ( String url : map.keySet() )
+        {
+            BuildProjectTask task = map.get( url );
+
+            if ( task.getProjectId() == projectId && task.getBuildDefinitionId() == buildDefinitionId )
+            {
+                return true;
+            }
+        }
+
+        return false;
     }
 
     private String getBuildAgent( int projectId )
         throws ContinuumException
     {
+        String agentUrl = null;
+
         synchronized( overallDistributedBuildQueues )
         {
             for ( String buildAgentUrl : overallDistributedBuildQueues.keySet() )
@@ -794,12 +998,12 @@ public class DefaultDistributedBuildMana
                     {
                         if ( isAgentAvailable( buildAgentUrl ) )
                         {
-                            SlaveBuildAgentTransportClient client = 
-                                new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                            SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
                             
                             if ( client.isProjectCurrentlyBuilding( projectId ) )
                             {
-                                return buildAgentUrl;
+                                agentUrl = buildAgentUrl;
+                                break;
                             }
                         }
                     }
@@ -814,8 +1018,11 @@ public class DefaultDistributedBuildMana
                 }
             }
         }
-    
-        return null;
+
+        // call reload in case we disable a build agent
+        reload();
+
+        return agentUrl;
     }
 
     private void createDistributedBuildQueueForAgent( String buildAgentUrl )
@@ -862,9 +1069,12 @@ public class DefaultDistributedBuildMana
         return null;
     }
 
-    private OverallDistributedBuildQueue getOverallDistributedBuildQueueByGroup( int projectGroupId )
+    private OverallDistributedBuildQueue getOverallDistributedBuildQueueByScmRoot( ProjectScmRoot scmRoot, int projectGroupId )
         throws ContinuumException
     {
+        OverallDistributedBuildQueue overallDistributedBuildQueue = null;
+        int scmRootId = scmRoot.getId();
+
         synchronized( overallDistributedBuildQueues )
         {
             for ( String buildAgentUrl : overallDistributedBuildQueues.keySet() )
@@ -873,51 +1083,96 @@ public class DefaultDistributedBuildMana
 
                 try
                 {
-                    
                     for ( PrepareBuildProjectsTask task : distributedBuildQueue.getProjectsInQueue() )
                     {
-                        if ( task.getProjectGroupId() == projectGroupId )
+                        if ( task.getProjectScmRootId() == scmRootId )
                         {
-                            return distributedBuildQueue;
+                            overallDistributedBuildQueue = distributedBuildQueue;
+                            break;
                         }
                     }
 
-                    Task task = distributedBuildQueue.getDistributedBuildTaskQueueExecutor().getCurrentTask();
-                    if ( task != null && ( (PrepareBuildProjectsTask) task ).getProjectGroupId() == projectGroupId )
+                    if ( overallDistributedBuildQueue == null )
                     {
-                        return distributedBuildQueue;
+                        Task task = distributedBuildQueue.getDistributedBuildTaskQueueExecutor().getCurrentTask();
+                        if ( task != null && ( (PrepareBuildProjectsTask) task ).getProjectScmRootId() == scmRootId )
+                        {
+                            overallDistributedBuildQueue = distributedBuildQueue;
+                        }
                     }
 
-                    if ( isAgentAvailable( buildAgentUrl ) )
+                    if ( overallDistributedBuildQueue == null )
                     {
-                        SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
-    
-                        if ( client.isProjectGroupInQueue( projectGroupId ) )
+                        if ( isAgentAvailable( buildAgentUrl ) )
                         {
-                            return distributedBuildQueue;
+                            List<Project> projects = projectDao.getProjectsInGroup( projectGroupId );
+                            List<Integer> pIds = new ArrayList<Integer>();
+                            
+                            for ( Project project : projects )
+                            {
+                                if ( project.getScmUrl().startsWith( scmRoot.getScmRootAddress() ) )
+                                {
+                                    pIds.add( project.getId() );
+                                }
+                            }
+
+                            SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
+
+                            if ( client.isProjectScmRootInQueue( scmRootId, pIds ) )
+                            {
+                                overallDistributedBuildQueue = distributedBuildQueue;
+                            }
                         }
                     }
+
+                    if ( overallDistributedBuildQueue != null )
+                    {
+                        break;
+                    }
                 }
                 catch ( TaskQueueException e )
                 {
-                    log.error( "Error occurred while retrieving distributed build queue of projectGroupId=" + projectGroupId, e );
-                    throw new ContinuumException( "Error occurred while retrieving distributed build queue of group", e );
+                    log.error( "Error occurred while retrieving distributed build queue of scmRootId=" + scmRootId, e );
+                    throw new ContinuumException( "Error occurred while retrieving distributed build queue of scmRoot", e );
                 }
                 catch ( MalformedURLException e )
                 {
-                    log.error( "Error occurred while retrieving distributed build queue of projectGroupId=" + projectGroupId + 
+                    log.error( "Error occurred while retrieving distributed build queue of scmRootId=" + scmRootId + 
                                ": Invalid build agent url " + buildAgentUrl );
-                    throw new ContinuumException( "Error occurred while retrieving distributed build queue of projectGroupId=" + projectGroupId + 
+                    throw new ContinuumException( "Error occurred while retrieving distributed build queue of scmRootId=" + scmRootId + 
                                ": Invalid build agent url " + buildAgentUrl );
                 }
                 catch ( Exception e )
                 {
-                    log.error( "Error occurred while retrieving distributed build queue of projectGroupId=" + projectGroupId, e );
-                    throw new ContinuumException( "Error occurred while retrieving distributed build queue of group", e );
+                    log.error( "Error occurred while retrieving distributed build queue of scmRootId=" + scmRootId, e );
+                    throw new ContinuumException( "Error occurred while retrieving distributed build queue of scmRoot", e );
                 }
             }
         }
 
+        // call reload in case we disable a build agent
+        reload();
+
+        return overallDistributedBuildQueue;
+    }
+
+    private OverallDistributedBuildQueue getOverallDistributedBuildQueueByGroup( int projectGroupId, List<ProjectScmRoot> scmRoots, int scmRootId )
+        throws ContinuumException
+    {
+        if ( scmRoots != null )
+        {
+            for ( ProjectScmRoot scmRoot : scmRoots )
+            {
+                if ( scmRoot.getId() == scmRootId )
+                {
+                    break;
+                }
+                else if ( scmRoot.getProjectGroup().getId() == projectGroupId )
+                {
+                    return getOverallDistributedBuildQueueByScmRoot( scmRoot, projectGroupId );
+                }
+            }
+        }
         return null;
     }
 
@@ -989,7 +1244,7 @@ public class DefaultDistributedBuildMana
                                 {
                                     if ( isAgentAvailable( buildAgentUrl ) )
                                     {
-                                        SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                                        SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
                                         int agentBuildSize = client.getBuildSizeOfAgent();
     
                                         if ( idx == 0 )
@@ -1018,6 +1273,9 @@ public class DefaultDistributedBuildMana
                         }
                     }
                 }
+
+                // call reload in case we disable a build agent
+                reload();
             }
         }
         return whereToBeQueued;
@@ -1049,7 +1307,7 @@ public class DefaultDistributedBuildMana
                     {
                         if ( isAgentAvailable( buildAgentUrl ) )
                         {
-                            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+                            SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
                             int agentBuildSize = client.getBuildSizeOfAgent();
     
                             if ( idx == 0 )
@@ -1079,6 +1337,9 @@ public class DefaultDistributedBuildMana
             }
         }
 
+        // call reload in case we disable a build agent
+        reload();
+
         return whereToBeQueued;
     }
 
@@ -1099,7 +1360,7 @@ public class DefaultDistributedBuildMana
                 projects.add( projectDao.getProjectWithDependencies( projectId ) );
             }
 
-            projects = ProjectSorter.getSortedProjects( projects, null );
+            projects = ProjectSorter.getSortedProjects( projects, log );
 
             int buildDefinitionId = projectsAndBuildDefinitions.get( projects.get( 0 ).getId() );
             BuildDefinition buildDefinition = buildDefinitionDao.getBuildDefinition( buildDefinitionId );
@@ -1152,8 +1413,7 @@ public class DefaultDistributedBuildMana
     {
         try
         {
-            SlaveBuildAgentTransportClient client =
-                new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+            SlaveBuildAgentTransportService client = createSlaveBuildAgentTransportClientConnection( buildAgentUrl );
 
             return client.ping();
         }
@@ -1192,8 +1452,6 @@ public class DefaultDistributedBuildMana
                 {
                     throw new ContinuumException( "Unable to disable build agent: " + buildAgentUrl, e );
                 }
-
-                removeDistributedBuildQueueOfAgent( buildAgentUrl );
             }
         }
     }
@@ -1216,6 +1474,12 @@ public class DefaultDistributedBuildMana
                buildAgentGroup.getBuildAgents().size() > 0 ? true : false;
     }
 
+    public SlaveBuildAgentTransportService createSlaveBuildAgentTransportClientConnection( String buildAgentUrl ) 
+        throws MalformedURLException, Exception
+    {
+        return new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+    }
+
     // for unit testing
 
     public void setOverallDistributedBuildQueues( Map<String, OverallDistributedBuildQueue> overallDistributedBuildQueues )
@@ -1243,4 +1507,9 @@ public class DefaultDistributedBuildMana
         this.buildResultDao = buildResultDao;
     }
 
+    public void setContainer( PlexusContainer container )
+    {
+        this.container = container;
+    }
+
 }
\ No newline at end of file

Modified: continuum/trunk/continuum-core/src/main/java/org/apache/continuum/release/distributed/manager/DefaultDistributedReleaseManager.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/continuum/release/distributed/manager/DefaultDistributedReleaseManager.java?rev=933451&r1=933450&r2=933451&view=diff
==============================================================================
--- continuum/trunk/continuum-core/src/main/java/org/apache/continuum/release/distributed/manager/DefaultDistributedReleaseManager.java (original)
+++ continuum/trunk/continuum-core/src/main/java/org/apache/continuum/release/distributed/manager/DefaultDistributedReleaseManager.java Tue Apr 13 00:26:42 2010
@@ -105,6 +105,9 @@ public class DefaultDistributedReleaseMa
                 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 )
@@ -139,6 +142,9 @@ public class DefaultDistributedReleaseMa
                 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 )
@@ -181,6 +187,9 @@ public class DefaultDistributedReleaseMa
                 return releaseId;
             }
 
+            // call reload in case we disable the build agent
+            distributedBuildManager.reload();
+
             throw new ContinuumReleaseException( "Failed to prepare release project because the build agent " + buildAgentUrl + " is not available" );
         }
         catch ( MalformedURLException e )
@@ -221,6 +230,9 @@ public class DefaultDistributedReleaseMa
                 return releaseResult;
             }
 
+            // call reload in case we disable a build agent
+            distributedBuildManager.reload();
+
             throw new ContinuumReleaseException( "Failed to get release result of " + releaseId + 
                                                  " because the build agent " + buildAgentUrl + " is not available" );
         }
@@ -254,6 +266,9 @@ public class DefaultDistributedReleaseMa
                 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" );
         }
@@ -287,6 +302,9 @@ public class DefaultDistributedReleaseMa
                 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" );
         }
@@ -321,6 +339,9 @@ public class DefaultDistributedReleaseMa
                 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" );
         }
@@ -387,6 +408,9 @@ public class DefaultDistributedReleaseMa
                 addReleaseInProgress( releaseId, "perform", projectId, username );
             }
 
+            // call reload in case we disable the build agent
+            distributedBuildManager.reload();
+
             throw new ContinuumReleaseException( "Failed to perform release of " + releaseId + 
                                                  " because the build agent " + buildAgentUrl + " is not available" );
         }
@@ -447,6 +471,9 @@ public class DefaultDistributedReleaseMa
                 return releaseId;
             }
 
+            // call reload in case we disable the build agent
+            distributedBuildManager.reload();
+
             throw new ContinuumReleaseException( "Failed to perform release because the build agent " + buildAgentUrl + " is not available" );
         }
         catch ( MalformedURLException e )
@@ -479,6 +506,9 @@ public class DefaultDistributedReleaseMa
                 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" );
         }
@@ -517,6 +547,9 @@ public class DefaultDistributedReleaseMa
                 return result;
             }
 
+            // call reload in case we disable the build agent
+            distributedBuildManager.reload();
+
             throw new ContinuumReleaseException( "Failed to cleanup release of " + releaseId + 
                                                  " because the build agent " + buildAgentUrl + " is not available" );
         }
@@ -587,6 +620,16 @@ 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;
     }
     

Modified: continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java?rev=933451&r1=933450&r2=933451&view=diff
==============================================================================
--- continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java (original)
+++ continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java Tue Apr 13 00:26:42 2010
@@ -945,37 +945,26 @@ public class DefaultContinuum
             {
                 for ( Integer buildDefId : buildDefIds )
                 {
-                    try
+                    if ( buildDefId != null && isProjectOkToBuild( project.getId(), buildDefId ) )
                     {
-                        if ( buildDefId != null &&
-                            !parallelBuildsManager.isInAnyBuildQueue( project.getId(), buildDefId ) &&
-                            !parallelBuildsManager.isInAnyCheckoutQueue( project.getId() ) &&
-                            !parallelBuildsManager.isInPrepareBuildQueue( project.getId() ) &&
-                            !parallelBuildsManager.isProjectCurrentlyPreparingBuild( project.getId() ) )
-                        {
-                            ProjectScmRoot scmRoot = getProjectScmRootByProject( project.getId() );
+                        ProjectScmRoot scmRoot = getProjectScmRootByProject( project.getId() );
 
-                            Map<Integer, Integer> projectsAndBuildDefinitionsMap = map.get( scmRoot );
+                        Map<Integer, Integer> projectsAndBuildDefinitionsMap = map.get( scmRoot );
 
-                            if ( projectsAndBuildDefinitionsMap == null )
-                            {
-                                projectsAndBuildDefinitionsMap = new HashMap<Integer, Integer>();
-                            }
+                        if ( projectsAndBuildDefinitionsMap == null )
+                        {
+                            projectsAndBuildDefinitionsMap = new HashMap<Integer, Integer>();
+                        }
 
-                            projectsAndBuildDefinitionsMap.put( project.getId(), buildDefId );
+                        projectsAndBuildDefinitionsMap.put( project.getId(), buildDefId );
 
-                            map.put( scmRoot, projectsAndBuildDefinitionsMap );
+                        map.put( scmRoot, projectsAndBuildDefinitionsMap );
 
-                            if ( !sortedScmRoot.contains( scmRoot ) )
-                            {
-                                sortedScmRoot.add( scmRoot );
-                            }
+                        if ( !sortedScmRoot.contains( scmRoot ) )
+                        {
+                            sortedScmRoot.add( scmRoot );
                         }
                     }
-                    catch ( BuildManagerException e )
-                    {
-                        throw new ContinuumException( e.getMessage(), e );
-                    }
                 }
             }
         }
@@ -987,7 +976,7 @@ public class DefaultContinuum
             try
             {
                 prepareBuildProjects( map.get( scmRoot ), buildTrigger, scmRoot.getScmRootAddress(),
-                                      scmRoot.getProjectGroup().getId(), scmRoot.getId() );
+                                      scmRoot.getProjectGroup().getId(), scmRoot.getId(), sortedScmRoot );
             }
             catch ( NoBuildAgentException e )
             {
@@ -1031,26 +1020,20 @@ public class DefaultContinuum
             throw new ContinuumException( "Project (id=" + projectId + " doens't have a default build definition." );
         }
 
-        try
-        {
-            if ( parallelBuildsManager.isInAnyBuildQueue( projectId, buildDef.getId() ) ||
-                parallelBuildsManager.isInAnyCheckoutQueue( projectId ) ||
-                parallelBuildsManager.isInPrepareBuildQueue( projectId ) )
-            {
-                return;
-            }
-        }
-        catch ( BuildManagerException e )
+        if ( !isProjectOkToBuild( projectId, buildDef.getId() ) )
         {
-            throw new ContinuumException( e.getMessage(), e );
+            return;
         }
 
         Map<Integer, Integer> projectsBuildDefinitionsMap = new HashMap<Integer, Integer>();
         projectsBuildDefinitionsMap.put( projectId, buildDef.getId() );
 
         ProjectScmRoot scmRoot = getProjectScmRootByProject( projectId );
+        List<ProjectScmRoot> sortedScmRoot = new ArrayList<ProjectScmRoot>();
+        sortedScmRoot.add(scmRoot);
+
         prepareBuildProjects( projectsBuildDefinitionsMap, buildTrigger, scmRoot.getScmRootAddress(),
-                              scmRoot.getProjectGroup().getId(), scmRoot.getId() );
+                              scmRoot.getProjectGroup().getId(), scmRoot.getId(), sortedScmRoot );
     }
 
     public void buildProject( int projectId, int buildDefinitionId, BuildTrigger buildTrigger )
@@ -1062,26 +1045,20 @@ public class DefaultContinuum
             throw new ContinuumException( "Project (id=" + projectId + ") is currently in release stage." );
         }
 
-        try
-        {
-            if ( parallelBuildsManager.isInAnyBuildQueue( projectId, buildDefinitionId ) ||
-                parallelBuildsManager.isInAnyCheckoutQueue( projectId ) ||
-                parallelBuildsManager.isInPrepareBuildQueue( projectId ) )
-            {
-                return;
-            }
-        }
-        catch ( BuildManagerException e )
+        if ( !isProjectOkToBuild( projectId, buildDefinitionId ) )
         {
-            throw new ContinuumException( e.getMessage(), e );
+            return;
         }
 
         Map<Integer, Integer> projectsBuildDefinitionsMap = new HashMap<Integer, Integer>();
         projectsBuildDefinitionsMap.put( projectId, buildDefinitionId );
 
         ProjectScmRoot scmRoot = getProjectScmRootByProject( projectId );
+        List<ProjectScmRoot> sortedScmRoot = new ArrayList<ProjectScmRoot>();
+        sortedScmRoot.add(scmRoot);
+
         prepareBuildProjects( projectsBuildDefinitionsMap, buildTrigger, scmRoot.getScmRootAddress(),
-                              scmRoot.getProjectGroup().getId(), scmRoot.getId() );
+                              scmRoot.getProjectGroup().getId(), scmRoot.getId(), sortedScmRoot );
     }
 
     public BuildResult getBuildResult( int buildId )
@@ -3434,27 +3411,6 @@ public class DefaultContinuum
         {
             int projectId = project.getId();
 
-            try
-            {
-                // check if project already in queue
-                if ( parallelBuildsManager.isInAnyBuildQueue( projectId ) ||
-                    parallelBuildsManager.isProjectInAnyCurrentBuild( projectId ) ||
-                    parallelBuildsManager.isInPrepareBuildQueue( projectId ) ||
-                    parallelBuildsManager.isProjectCurrentlyPreparingBuild( projectId ) )
-                {
-                    continue;
-                }
-
-                if ( parallelBuildsManager.isInAnyCheckoutQueue( projectId ) )
-                {
-                    parallelBuildsManager.removeProjectFromCheckoutQueue( projectId );
-                }
-            }
-            catch ( BuildManagerException e )
-            {
-                throw new ContinuumException( e.getMessage(), e );
-            }
-
             int buildDefId = -1;
 
             if ( bds != null )
@@ -3497,7 +3453,13 @@ public class DefaultContinuum
             if ( buildDefId == -1 )
             {
                 log.info( "Project " + projectId +
-                    " don't have a default build definition defined in the project or project group, will not be included in group prepare." );
+                    " don't have a default build definition defined in the project or project group, will not be included in group build." );
+                continue;
+            }
+
+            // check if project already in queue
+            if ( !isProjectOkToBuild( projectId, buildDefId ) )
+            {
                 continue;
             }
 
@@ -3533,44 +3495,29 @@ public class DefaultContinuum
         {
             int projectId = project.getId();
 
-            try
+            // check if project already in queue
+            if ( !isProjectOkToBuild( projectId, buildDefinitionId ) )
             {
-                // check if project already in queue
-                if ( parallelBuildsManager.isInAnyBuildQueue( projectId ) ||
-                    parallelBuildsManager.isProjectInAnyCurrentBuild( projectId ) ||
-                    parallelBuildsManager.isInPrepareBuildQueue( projectId ) ||
-                    parallelBuildsManager.isProjectCurrentlyPreparingBuild( projectId ) )
-                {
-                    log.info( "not building" );
-                    continue;
-                }
-
-                if ( parallelBuildsManager.isInAnyCheckoutQueue( projectId ) )
-                {
-                    parallelBuildsManager.removeProjectFromCheckoutQueue( projectId );
-                }
+                log.info( "not building" );
+                continue;
+            }
 
-                ProjectScmRoot scmRoot = getProjectScmRootByProject( projectId );
+            ProjectScmRoot scmRoot = getProjectScmRootByProject( projectId );
 
-                Map<Integer, Integer> projectsAndBuildDefinitionsMap = map.get( scmRoot );
+            Map<Integer, Integer> projectsAndBuildDefinitionsMap = map.get( scmRoot );
 
-                if ( projectsAndBuildDefinitionsMap == null )
-                {
-                    projectsAndBuildDefinitionsMap = new HashMap<Integer, Integer>();
-                }
+            if ( projectsAndBuildDefinitionsMap == null )
+            {
+                projectsAndBuildDefinitionsMap = new HashMap<Integer, Integer>();
+            }
 
-                projectsAndBuildDefinitionsMap.put( projectId, buildDefinitionId );
+            projectsAndBuildDefinitionsMap.put( projectId, buildDefinitionId );
 
-                map.put( scmRoot, projectsAndBuildDefinitionsMap );
+            map.put( scmRoot, projectsAndBuildDefinitionsMap );
 
-                if ( !sortedScmRoot.contains( scmRoot ) )
-                {
-                    sortedScmRoot.add( scmRoot );
-                }
-            }
-            catch ( BuildManagerException e )
+            if ( !sortedScmRoot.contains( scmRoot ) )
             {
-                throw new ContinuumException( e.getMessage(), e );
+                    sortedScmRoot.add( scmRoot );
             }
         }
 
@@ -3584,12 +3531,12 @@ public class DefaultContinuum
         for ( ProjectScmRoot scmRoot : scmRoots )
         {
         	prepareBuildProjects( map.get( scmRoot ), buildTrigger, scmRoot.getScmRootAddress(),
-                                  scmRoot.getProjectGroup().getId(), scmRoot.getId() );
+                                  scmRoot.getProjectGroup().getId(), scmRoot.getId(), scmRoots );
         }
     }
 
     private void prepareBuildProjects( Map<Integer, Integer> projectsBuildDefinitionsMap, BuildTrigger buildTrigger,
-                                       String scmRootAddress, int projectGroupId, int scmRootId )
+                                       String scmRootAddress, int projectGroupId, int scmRootId, List<ProjectScmRoot> scmRoots )
         throws ContinuumException, NoBuildAgentException, NoBuildAgentInGroupException
     {
         ProjectGroup group = getProjectGroup( projectGroupId );
@@ -3599,7 +3546,7 @@ public class DefaultContinuum
             if ( configurationService.isDistributedBuildEnabled() )
             {
             	distributedBuildManager.prepareBuildProjects( projectsBuildDefinitionsMap, buildTrigger, projectGroupId, 
-                                                              group.getName(), scmRootAddress, scmRootId );
+                                                              group.getName(), scmRootAddress, scmRootId, scmRoots );
             }
             else
             {
@@ -3778,6 +3725,44 @@ public class DefaultContinuum
         }
     }
 
+    private boolean isProjectOkToBuild( int projectId, int buildDefinitionId )
+        throws ContinuumException
+    {
+        if ( configurationService.isDistributedBuildEnabled() )
+        {
+            if ( !distributedBuildManager.isProjectInAnyPrepareBuildQueue( projectId, buildDefinitionId ) && 
+                 !distributedBuildManager.isProjectInAnyBuildQueue( projectId, buildDefinitionId ) &&
+                 !distributedBuildManager.isProjectCurrentlyPreparingBuild( projectId, buildDefinitionId ) &&
+                 !distributedBuildManager.isProjectCurrentlyBuilding( projectId, buildDefinitionId ) )
+            {
+                return true;
+            }
+        }
+        else
+        {
+            try
+            {
+                if ( !parallelBuildsManager.isInAnyBuildQueue( projectId, buildDefinitionId ) &&
+                     !parallelBuildsManager.isInAnyCheckoutQueue( projectId ) &&
+                     !parallelBuildsManager.isInPrepareBuildQueue( projectId ) &&
+                     !parallelBuildsManager.isProjectCurrentlyPreparingBuild( projectId ) )
+                {
+                    if ( parallelBuildsManager.isInAnyCheckoutQueue( projectId ) )
+                    {
+                        parallelBuildsManager.removeProjectFromCheckoutQueue( projectId );
+                    }
+
+                    return true;
+                }
+            }
+            catch ( BuildManagerException e )
+            {
+                throw new ContinuumException( e.getMessage(), e );
+            }
+        }
+
+        return false;
+    }
     void setTaskQueueManager( TaskQueueManager taskQueueManager )
     {
         this.taskQueueManager = taskQueueManager;

Modified: continuum/trunk/continuum-core/src/test/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManagerTest.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManagerTest.java?rev=933451&r1=933450&r2=933451&view=diff
==============================================================================
--- continuum/trunk/continuum-core/src/test/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManagerTest.java (original)
+++ continuum/trunk/continuum-core/src/test/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManagerTest.java Tue Apr 13 00:26:42 2010
@@ -26,15 +26,25 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.continuum.builder.distributed.executor.ThreadedDistributedBuildTaskQueueExecutor;
+import org.apache.continuum.builder.distributed.stubs.SlaveBuildAgentTransportClientStub;
 import org.apache.continuum.configuration.BuildAgentConfiguration;
+import org.apache.continuum.configuration.BuildAgentGroupConfiguration;
 import org.apache.continuum.dao.BuildDefinitionDao;
 import org.apache.continuum.dao.BuildResultDao;
 import org.apache.continuum.dao.ProjectDao;
+import org.apache.continuum.distributed.transport.slave.SlaveBuildAgentTransportService;
+import org.apache.continuum.model.project.ProjectScmRoot;
 import org.apache.continuum.taskqueue.BuildProjectTask;
 import org.apache.continuum.taskqueue.OverallDistributedBuildQueue;
 import org.apache.continuum.taskqueue.PrepareBuildProjectsTask;
+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.Project;
+import org.apache.maven.continuum.model.project.ProjectGroup;
+import org.apache.maven.continuum.model.system.Profile;
 import org.codehaus.plexus.spring.PlexusInSpringTestCase;
+import org.codehaus.plexus.taskqueue.Task;
 import org.codehaus.plexus.taskqueue.TaskQueue;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
@@ -44,10 +54,16 @@ import org.jmock.lib.legacy.ClassImposte
 public class DefaultDistributedBuildManagerTest
     extends PlexusInSpringTestCase
 {
-    private final String TEST_BUILD_AGENT = "http://sampleagent";
+    private final String TEST_BUILD_AGENT1 = "http://sampleagent";
+
+    private final String TEST_BUILD_AGENT2 = "http://testagent";
+    
+    private final String TEST_BUILD_AGENT_GROUP1 = "buildAgentGroup1";
 
     private DefaultDistributedBuildManager distributedBuildManager;
 
+    private DefaultDistributedBuildManager distributedBuildManagerStub = new DefaultDistributedBuildManagerStub();
+
     private Mockery context;
 
     private OverallDistributedBuildQueue overallDistributedBuildQueue;
@@ -62,12 +78,24 @@ public class DefaultDistributedBuildMana
 
     private List<BuildAgentConfiguration> buildAgents;
 
-    private BuildAgentConfiguration buildAgent;
+    private BuildAgentConfiguration buildAgent1;
+
+    private BuildAgentConfiguration buildAgent2;
 
     private ThreadedDistributedBuildTaskQueueExecutor distributedBuildTaskQueueExecutor;
 
     private TaskQueue distributedBuildQueue;
 
+    private Project project;
+
+    private Project project2;
+
+    private ProjectGroup projectGroup;
+
+    private BuildDefinition buildDefinition1;
+
+    private BuildAgentGroupConfiguration buildAgentGroup1;
+
     @Override
     public void setUp()
         throws Exception
@@ -81,27 +109,71 @@ public class DefaultDistributedBuildMana
 
         buildDefinitionDao = context.mock( BuildDefinitionDao.class );
         distributedBuildManager.setBuildDefinitionDao( buildDefinitionDao );
+        distributedBuildManagerStub.setBuildDefinitionDao( buildDefinitionDao );
 
         buildResultDao = context.mock( BuildResultDao.class );
         distributedBuildManager.setBuildResultDao( buildResultDao );
+        distributedBuildManagerStub.setBuildResultDao( buildResultDao );
 
         projectDao = context.mock( ProjectDao.class );
         distributedBuildManager.setProjectDao( projectDao );
+        distributedBuildManagerStub.setProjectDao( projectDao );
 
-        configurationService = context.mock( ConfigurationService.class );
+        distributedBuildManagerStub.setContainer( getContainer() );
 
-        buildAgent = new BuildAgentConfiguration();
-        buildAgent.setEnabled( true );
-        buildAgent.setUrl( TEST_BUILD_AGENT );
+        configurationService = context.mock( ConfigurationService.class );
 
         distributedBuildManager.setConfigurationService( configurationService );
-
-        buildAgents = new ArrayList<BuildAgentConfiguration>();
-        buildAgents.add( buildAgent );
+        distributedBuildManagerStub.setConfigurationService( configurationService );
 
         distributedBuildTaskQueueExecutor = (ThreadedDistributedBuildTaskQueueExecutor) context.mock( ThreadedDistributedBuildTaskQueueExecutor.class, "distributed-build-project" );
 
         distributedBuildQueue = context.mock( TaskQueue.class, "distributed-build-queue" );
+
+        overallDistributedBuildQueue = context.mock( OverallDistributedBuildQueue.class );
+
+        init();
+    }
+
+    private void init()
+    {
+        buildAgent1 = new BuildAgentConfiguration();
+        buildAgent1.setEnabled( true );
+        buildAgent1.setUrl( TEST_BUILD_AGENT1 );
+
+        buildAgent2 = new BuildAgentConfiguration();
+        buildAgent2.setEnabled( true );
+        buildAgent2.setUrl( TEST_BUILD_AGENT2 );
+        
+        buildAgentGroup1 = new BuildAgentGroupConfiguration();
+        buildAgentGroup1.setName( TEST_BUILD_AGENT_GROUP1 );
+        buildAgentGroup1.addBuildAgent( buildAgent1 );
+        buildAgentGroup1.addBuildAgent( buildAgent2 );
+
+        Profile buildEnv1 = new Profile();
+        buildEnv1.setBuildAgentGroup( TEST_BUILD_AGENT_GROUP1 );
+
+        buildDefinition1 = new BuildDefinition();
+        buildDefinition1.setId( 1 );
+        buildDefinition1.setProfile( buildEnv1 );
+
+        projectGroup = new ProjectGroup();
+        projectGroup.setId( 1 );
+        projectGroup.setGroupId( "group" );
+
+        project = new Project();
+        project.setId( 1 );
+        project.setGroupId( "groupId" );
+        project.setArtifactId( "artifactId" );
+        project.setVersion( "1.0" );
+        project.setProjectGroup( projectGroup );
+
+        project2 = new Project();
+        project2.setId( 2 );
+        project2.setGroupId( "groupId" );
+        project2.setArtifactId( "artifactId" );
+        project2.setVersion( "1.0" );
+        project2.setProjectGroup( projectGroup );
     }
 
     public void testViewQueuesAfterBuildAgentIsLost()
@@ -109,7 +181,7 @@ public class DefaultDistributedBuildMana
     {
         setUpMockOverallDistributedBuildQueues();
 
-        recordDisableOfBuildAgent();
+        recordViewQueuesAfterBuildAgentIsLost();
 
         Map<String, List<PrepareBuildProjectsTask>> prepareBuildQueues = distributedBuildManager.getProjectsInPrepareBuildQueue();
         Map<String, List<BuildProjectTask>> buildQueues = distributedBuildManager.getProjectsInBuildQueue();
@@ -128,34 +200,135 @@ public class DefaultDistributedBuildMana
         throws Exception
     {
         setUpMockOverallDistributedBuildQueues();
-
+        
         recordDisableOfBuildAgent();
 
-        distributedBuildManager.isAgentAvailable( TEST_BUILD_AGENT );
-
+        distributedBuildManager.isAgentAvailable( TEST_BUILD_AGENT1 );
+        
         context.assertIsSatisfied();
     }
 
-    public void testBuildProjectWithoutBuildAgent()
+    public void testViewQueuesWhen2BuildAgentsAreLost()
+        throws Exception
     {
-        
+        setUpMockOverallDistributedBuildQueues2();
+
+        recordViewQueuesAfter2BuildAgentsAreLost();
+
+        Map<String, List<PrepareBuildProjectsTask>> prepareBuildQueues = distributedBuildManager.getProjectsInPrepareBuildQueue();
+        Map<String, List<BuildProjectTask>> buildQueues = distributedBuildManager.getProjectsInBuildQueue();
+        Map<String, PrepareBuildProjectsTask> currentPrepareBuild = distributedBuildManager.getProjectsCurrentlyPreparingBuild();
+        Map<String, BuildProjectTask> currentBuild = distributedBuildManager.getProjectsCurrentlyBuilding();
+
+        assertEquals( prepareBuildQueues.size(), 0 );
+        assertEquals( buildQueues.size(), 0 );
+        assertEquals( currentPrepareBuild.size(), 0 );
+        assertEquals( currentBuild.size(), 0 );
+
+        context.assertIsSatisfied();        
     }
 
-    public void testBuildProjectWithBuildAgentGroupButWithoutBuildAgent()
+    public void testBuildProjectWithBuildAgentGroupWithNoCurrentBuilds()
+        throws Exception
     {
-        
+        setUpMockOverallDistributedBuildQueues3();
+
+        Map<Integer, Integer> projectsBuildDefinitionsMap = new HashMap<Integer, Integer>();
+        projectsBuildDefinitionsMap.put( 1, 1 );
+        projectsBuildDefinitionsMap.put( 2, 1 );
+
+        BuildTrigger buildTrigger = new BuildTrigger( 1 );
+
+        recordBuildOfProjectWithBuildAgentGroupWithNoCurrentBuilds();
+
+        List<ProjectScmRoot> scmRoots = new ArrayList<ProjectScmRoot>();
+        ProjectScmRoot scmRoot = new ProjectScmRoot();
+        scmRoot.setId( 1 );
+        scmRoot.setProjectGroup( projectGroup );
+        scmRoot.setScmRootAddress( "scmRootAddress1" );
+        scmRoots.add( scmRoot );
+
+        scmRoot = new ProjectScmRoot();
+        scmRoot.setId( 2 );
+        scmRoot.setProjectGroup( projectGroup );
+        scmRoot.setScmRootAddress( "scmRootAddress2" );
+        scmRoots.add( scmRoot );
+
+        distributedBuildManagerStub.prepareBuildProjects( projectsBuildDefinitionsMap, buildTrigger, 1, "sample", "scmRootAddress1", 1, scmRoots );
+
+        context.assertIsSatisfied();
     }
 
+    public void testBuildProjectWithBuildAgentGroupWithCurrentBuild()
+        throws Exception
+    {
+        setUpMockOverallDistributedBuildQueues3();
+
+        Map<Integer, Integer> projectsBuildDefinitionsMap = new HashMap<Integer, Integer>();
+        projectsBuildDefinitionsMap.put( 1, 1 );
+
+        BuildTrigger buildTrigger = new BuildTrigger( 1 );
+
+        recordBuildOfProjectWithBuildAgentGroupWithCurrentBuild();
+
+        List<ProjectScmRoot> scmRoots = new ArrayList<ProjectScmRoot>();
+        ProjectScmRoot scmRoot = new ProjectScmRoot();
+        scmRoot.setId( 2 );
+        scmRoot.setProjectGroup( projectGroup );
+        scmRoot.setScmRootAddress( "scmRootAddress2" );
+        scmRoots.add( scmRoot );
+
+        scmRoot = new ProjectScmRoot();
+        scmRoot.setId( 1 );
+        scmRoot.setProjectGroup( projectGroup );
+        scmRoot.setScmRootAddress( "scmRootAddress1" );
+        scmRoots.add( scmRoot );
+
+        distributedBuildManagerStub.prepareBuildProjects( projectsBuildDefinitionsMap, buildTrigger, 1, "sample", "scmRootAddress1", 1, scmRoots );
+
+        context.assertIsSatisfied();
+    }
     private void setUpMockOverallDistributedBuildQueues()
     {
         Map<String, OverallDistributedBuildQueue> overallDistributedBuildQueues =
             Collections.synchronizedMap( new HashMap<String, OverallDistributedBuildQueue>() );
-        overallDistributedBuildQueue = context.mock( OverallDistributedBuildQueue.class );
 
-        overallDistributedBuildQueues.put( TEST_BUILD_AGENT, overallDistributedBuildQueue );
+        buildAgents = new ArrayList<BuildAgentConfiguration>();
+        buildAgents.add( buildAgent1 );
+
+        overallDistributedBuildQueues.put( TEST_BUILD_AGENT1, overallDistributedBuildQueue );
+        distributedBuildManager.setOverallDistributedBuildQueues( overallDistributedBuildQueues );
+    }
+
+    private void setUpMockOverallDistributedBuildQueues2()
+    {
+        Map<String, OverallDistributedBuildQueue> overallDistributedBuildQueues =
+            Collections.synchronizedMap( new HashMap<String, OverallDistributedBuildQueue>() );
+
+        buildAgents = new ArrayList<BuildAgentConfiguration>();
+        buildAgents.add( buildAgent1 );
+        buildAgents.add( buildAgent2 );
+
+        overallDistributedBuildQueues.put( TEST_BUILD_AGENT1, overallDistributedBuildQueue );
+        overallDistributedBuildQueues.put( TEST_BUILD_AGENT2, overallDistributedBuildQueue );
         distributedBuildManager.setOverallDistributedBuildQueues( overallDistributedBuildQueues );
     }
 
+    private void setUpMockOverallDistributedBuildQueues3()
+    {
+
+        Map<String, OverallDistributedBuildQueue> overallDistributedBuildQueues =
+            Collections.synchronizedMap( new HashMap<String, OverallDistributedBuildQueue>() );
+
+        buildAgents = new ArrayList<BuildAgentConfiguration>();
+        buildAgents.add( buildAgent1 );
+        buildAgents.add( buildAgent2 );
+
+        overallDistributedBuildQueues.put( TEST_BUILD_AGENT1, overallDistributedBuildQueue );
+        overallDistributedBuildQueues.put( TEST_BUILD_AGENT2, overallDistributedBuildQueue );
+        distributedBuildManagerStub.setOverallDistributedBuildQueues( overallDistributedBuildQueues );
+    }
+
     private void recordDisableOfBuildAgent()
         throws Exception
     {
@@ -163,9 +336,24 @@ public class DefaultDistributedBuildMana
         {
             {
                 one( configurationService ).getBuildAgents();
-                will( returnValue( buildAgents )  );
+                will( returnValue( buildAgents ) );
 
-                one( configurationService ).updateBuildAgent( buildAgent );
+                one( configurationService ).updateBuildAgent( buildAgent1 );
+                one( configurationService ).store();
+            }
+        } );
+    }
+
+    private void recordViewQueuesAfterBuildAgentIsLost()
+        throws Exception
+    {
+        context.checking( new Expectations()
+        {
+            {
+                exactly( 5 ).of( configurationService ).getBuildAgents();
+                will( returnValue( buildAgents ) );
+
+                one( configurationService ).updateBuildAgent( buildAgent1 );
                 one( configurationService ).store();
 
                 exactly( 2 ).of( overallDistributedBuildQueue ).getDistributedBuildTaskQueueExecutor();
@@ -186,4 +374,97 @@ public class DefaultDistributedBuildMana
             }
         } );
     }
+
+    private void recordViewQueuesAfter2BuildAgentsAreLost()
+        throws Exception
+    {
+        context.checking( new Expectations()
+        {
+            {
+                exactly( 6 ).of( configurationService ).getBuildAgents();
+                will( returnValue( buildAgents ) );
+
+                one( configurationService ).updateBuildAgent( buildAgent1 );
+                one( configurationService ).updateBuildAgent( buildAgent2 );
+                exactly( 2 ).of( configurationService ).store();
+
+                exactly( 4 ).of( overallDistributedBuildQueue ).getDistributedBuildTaskQueueExecutor();
+                will( returnValue( distributedBuildTaskQueueExecutor ) );
+
+                exactly( 2 ).of( distributedBuildTaskQueueExecutor ).getCurrentTask();
+                will( returnValue( null ) );
+
+                exactly( 2 ).of( overallDistributedBuildQueue ).getProjectsInQueue();
+                will( returnValue( new ArrayList<PrepareBuildProjectsTask>() ) );
+
+                exactly( 2 ).of( overallDistributedBuildQueue ).getDistributedBuildQueue();
+                will( returnValue( distributedBuildQueue ) );
+
+                exactly( 2 ).of( distributedBuildQueue ).removeAll( new ArrayList<PrepareBuildProjectsTask>() );
+
+                exactly( 2 ).of( distributedBuildTaskQueueExecutor ).stop();
+            }
+        } );
+    }
+
+    private void recordBuildOfProjectWithBuildAgentGroupWithNoCurrentBuilds()
+        throws Exception
+    {
+        context.checking( new Expectations()
+        {
+            {
+                exactly( 3 ).of( projectDao ).getProjectWithDependencies( 1 );
+                will( returnValue( project ) );
+
+                exactly( 3 ).of( projectDao ).getProjectWithDependencies( 2 );
+                will( returnValue( project2) );
+
+                exactly( 3 ).of( buildDefinitionDao ).getBuildDefinition( 1 );
+                will( returnValue( buildDefinition1 ) );
+
+                exactly( 3 ).of( configurationService ).getBuildAgentGroup( TEST_BUILD_AGENT_GROUP1 );
+                will( returnValue( buildAgentGroup1 ) );
+
+                one( configurationService ).getBuildAgents();
+                will( returnValue( buildAgents ) );
+
+                one( overallDistributedBuildQueue ).addToDistributedBuildQueue( with( any( Task.class ) ) );
+            }
+        } );
+    }
+
+    private void recordBuildOfProjectWithBuildAgentGroupWithCurrentBuild()
+        throws Exception
+    {
+        context.checking( new Expectations()
+        {
+            {
+                one( overallDistributedBuildQueue ).getProjectsInQueue();
+
+                one( overallDistributedBuildQueue ).getDistributedBuildTaskQueueExecutor();
+                will( returnValue( distributedBuildTaskQueueExecutor ) );
+
+                one( distributedBuildTaskQueueExecutor ).getCurrentTask();
+                will( returnValue( null ) );
+
+                one( projectDao ).getProjectsInGroup( 1 );
+                will( returnValue( new ArrayList<Project>() ) );
+
+                one( configurationService ).getBuildAgents();
+                will( returnValue( buildAgents ) );
+
+                one( overallDistributedBuildQueue ).addToDistributedBuildQueue( with( any( Task.class ) ) );
+            }
+        } );
+    }
 }
+
+class DefaultDistributedBuildManagerStub
+    extends DefaultDistributedBuildManager
+{
+    @Override
+    public SlaveBuildAgentTransportService createSlaveBuildAgentTransportClientConnection( String buildAgentUrl )
+    {
+        return new SlaveBuildAgentTransportClientStub();
+    }
+}
\ No newline at end of file

Added: continuum/trunk/continuum-core/src/test/java/org/apache/continuum/builder/distributed/stubs/DefaultDistributedBuildManagerStub.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test/java/org/apache/continuum/builder/distributed/stubs/DefaultDistributedBuildManagerStub.java?rev=933451&view=auto
==============================================================================
--- continuum/trunk/continuum-core/src/test/java/org/apache/continuum/builder/distributed/stubs/DefaultDistributedBuildManagerStub.java (added)
+++ continuum/trunk/continuum-core/src/test/java/org/apache/continuum/builder/distributed/stubs/DefaultDistributedBuildManagerStub.java Tue Apr 13 00:26:42 2010
@@ -0,0 +1,14 @@
+package org.apache.continuum.builder.distributed.stubs;
+
+import org.apache.continuum.builder.distributed.manager.DefaultDistributedBuildManager;
+import org.apache.continuum.distributed.transport.slave.SlaveBuildAgentTransportService;
+
+public class DefaultDistributedBuildManagerStub
+    extends DefaultDistributedBuildManager
+{
+    @Override
+    public SlaveBuildAgentTransportService createSlaveBuildAgentTransportClientConnection( String buildAgentUrl )
+    {
+        return new SlaveBuildAgentTransportClientStub();
+    }
+}