Modified: continuum/trunk/continuum-core/src/main/java/org/apache/continuum/buildmanager/ParallelBuildsManager.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/continuum/buildmanager/ParallelBuildsManager.java?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-core/src/main/java/org/apache/continuum/buildmanager/ParallelBuildsManager.java (original) +++ continuum/trunk/continuum-core/src/main/java/org/apache/continuum/buildmanager/ParallelBuildsManager.java Sun May 17 18:21:35 2009 @@ -31,6 +31,7 @@ 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; @@ -80,6 +81,9 @@ @Resource private BuildDefinitionDao buildDefinitionDao; + @Resource + private ProjectDao projectDao; + private TaskQueue prepareBuildQueue; @Resource @@ -91,10 +95,10 @@ private PlexusContainer container; /** - * @see BuildsManager#buildProject(int, BuildDefinition, String, int, ScmResult) + * @see BuildsManager#buildProject(int, BuildDefinition, String, int, ScmResult, int) */ public void buildProject( int projectId, BuildDefinition buildDefinition, String projectName, int trigger, - ScmResult scmResult ) + ScmResult scmResult, int projectGroupId ) throws BuildManagerException { try @@ -111,8 +115,12 @@ "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 ); + + if ( overallBuildQueue == null ) + { + overallBuildQueue = getOverallBuildQueue( BUILD_QUEUE, buildDefinition.getSchedule().getBuildQueues() ); + } String buildDefinitionLabel = buildDefinition.getDescription(); if ( StringUtils.isEmpty( buildDefinitionLabel ) ) @@ -122,7 +130,7 @@ BuildProjectTask buildTask = new BuildProjectTask( projectId, buildDefinition.getId(), trigger, projectName, buildDefinitionLabel, - scmResult ); + scmResult, projectGroupId ); try { log.info( @@ -136,10 +144,10 @@ } /** - * @see BuildsManager#buildProjects(List, Map, int, Map) + * @see BuildsManager#buildProjects(List, Map, int, Map, int) */ public void buildProjects( List projects, Map projectsBuildDefinitionsMap, - int trigger, Map scmResultMap ) + int trigger, Map scmResultMap, int projectGroupId ) throws BuildManagerException { int firstProjectId = 0; @@ -163,8 +171,12 @@ 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 ) { @@ -196,7 +208,7 @@ ScmResult scmResult = scmResultMap.get( project.getId() ); BuildProjectTask buildTask = new BuildProjectTask( project.getId(), buildDefinition.getId(), trigger, project.getName(), - buildDefinitionLabel, scmResult ); + buildDefinitionLabel, scmResult, projectGroupId ); buildTask.setMaxExecutionTime( buildDefinition.getSchedule().getMaxJobExecutionTime() * 1000 ); try @@ -592,7 +604,8 @@ /** * @see BuildsManager#removeProjectFromBuildQueue(int, int, int, String) */ - public void removeProjectFromBuildQueue( int projectId, int buildDefinitionId, int trigger, String projectName ) + public void removeProjectFromBuildQueue( int projectId, int buildDefinitionId, int trigger, String projectName, + int projectGroupId ) throws BuildManagerException { try @@ -600,7 +613,8 @@ OverallBuildQueue overallBuildQueue = getOverallBuildQueueWhereProjectIsQueued( projectId, BUILD_QUEUE ); if ( overallBuildQueue != null ) { - overallBuildQueue.removeProjectFromBuildQueue( projectId, buildDefinitionId, trigger, projectName ); + overallBuildQueue.removeProjectFromBuildQueue( projectId, buildDefinitionId, trigger, projectName, + projectGroupId ); } else { @@ -859,7 +873,7 @@ buildDefinitionDao.getBuildDefinition( buildTask.getBuildDefinitionId() ); buildProject( buildTask.getProjectId(), buildDefinition, buildTask.getProjectName(), - buildTask.getTrigger(), buildTask.getScmResult() ); + buildTask.getTrigger(), buildTask.getScmResult(), buildTask.getProjectGroupId() ); } catch ( ContinuumStoreException e ) { @@ -1134,25 +1148,35 @@ 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++; @@ -1192,6 +1216,63 @@ return whereToBeQueued; } + public OverallBuildQueue getOverallBuildQueueWhereProjectsInGroupAreQueued( int projectGroupId ) + throws BuildManagerException + { + OverallBuildQueue whereToBeQueued = null; + + try + { + List 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 void contextualize( Context context ) throws ContextException { @@ -1272,4 +1353,9 @@ { this.buildDefinitionDao = buildDefinitionDao; } + + public void setProjectDao( ProjectDao projectDao ) + { + this.projectDao = projectDao; + } } Modified: continuum/trunk/continuum-core/src/main/java/org/apache/continuum/taskqueue/DefaultOverallBuildQueue.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/continuum/taskqueue/DefaultOverallBuildQueue.java?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-core/src/main/java/org/apache/continuum/taskqueue/DefaultOverallBuildQueue.java (original) +++ continuum/trunk/continuum-core/src/main/java/org/apache/continuum/taskqueue/DefaultOverallBuildQueue.java Sun May 17 18:21:35 2009 @@ -323,9 +323,10 @@ } /** - * @see OverallBuildQueue#removeProjectFromBuildQueue(int, int, int, String) + * @see OverallBuildQueue#removeProjectFromBuildQueue(int, int, int, String, int) */ - public boolean removeProjectFromBuildQueue( int projectId, int buildDefinitionId, int trigger, String projectName ) + public boolean removeProjectFromBuildQueue( int projectId, int buildDefinitionId, int trigger, String projectName, + int projectGroupId ) throws TaskQueueException { BuildDefinition buildDefinition; @@ -347,7 +348,8 @@ } BuildProjectTask buildProjectTask = - new BuildProjectTask( projectId, buildDefinitionId, trigger, projectName, buildDefinitionLabel, null ); + new BuildProjectTask( projectId, buildDefinitionId, trigger, projectName, + buildDefinitionLabel, null, projectGroupId ); return getBuildQueue().remove( buildProjectTask ); } 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=775729&r1=775728&r2=775729&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 Sun May 17 18:21:35 2009 @@ -901,6 +901,7 @@ } Map> map = new HashMap>(); + List sortedScmRoot = new ArrayList(); for ( Project project : projectsList ) { @@ -929,6 +930,11 @@ projectsAndBuildDefinitionsMap.put( project.getId(), buildDefId ); map.put( scmRoot, projectsAndBuildDefinitionsMap ); + + if ( !sortedScmRoot.contains( scmRoot ) ) + { + sortedScmRoot.add( scmRoot ); + } } } catch ( BuildManagerException e ) @@ -939,7 +945,7 @@ } } - prepareBuildProjects( map, ContinuumProjectState.TRIGGER_SCHEDULED ); + prepareBuildProjects( map, ContinuumProjectState.TRIGGER_SCHEDULED, sortedScmRoot ); } public void buildProject( int projectId ) @@ -3231,6 +3237,7 @@ throws ContinuumException { Map> map = new HashMap>(); + List sortedScmRoot = new ArrayList(); for ( Project project : projects ) { @@ -3313,15 +3320,21 @@ projectsAndBuildDefinitionsMap.put( projectId, buildDefId ); map.put( scmRoot, projectsAndBuildDefinitionsMap ); + + if ( !sortedScmRoot.contains( scmRoot ) ) + { + sortedScmRoot.add( scmRoot ); + } } - prepareBuildProjects( map, trigger ); + prepareBuildProjects( map, trigger, sortedScmRoot ); } private void prepareBuildProjects( Collection projects, int buildDefinitionId, int trigger ) throws ContinuumException { Map> map = new HashMap>(); + List sortedScmRoot = new ArrayList(); for ( Project project : projects ) { @@ -3353,6 +3366,11 @@ projectsAndBuildDefinitionsMap.put( projectId, buildDefinitionId ); map.put( scmRoot, projectsAndBuildDefinitionsMap ); + + if ( !sortedScmRoot.contains( scmRoot ) ) + { + sortedScmRoot.add( scmRoot ); + } } catch ( BuildManagerException e ) { @@ -3360,13 +3378,14 @@ } } - prepareBuildProjects( map, trigger ); + prepareBuildProjects( map, trigger, sortedScmRoot ); } - private void prepareBuildProjects( Map> map, int trigger ) + private void prepareBuildProjects( Map> map, int trigger, + List scmRoots ) throws ContinuumException { - for ( ProjectScmRoot scmRoot : map.keySet() ) + for ( ProjectScmRoot scmRoot : scmRoots ) { prepareBuildProjects( map.get( scmRoot ), trigger, scmRoot.getScmRootAddress(), scmRoot.getProjectGroup().getId(), scmRoot.getId() ); @@ -3383,14 +3402,8 @@ { if ( configurationService.isDistributedBuildEnabled() ) { - if ( !taskQueueManager.isInDistributedBuildQueue( projectGroupId, scmRootAddress ) ) - { - PrepareBuildProjectsTask task = - new PrepareBuildProjectsTask( projectsBuildDefinitionsMap, trigger, projectGroupId, - group.getName(), scmRootAddress, scmRootId ); - - taskQueueManager.getDistributedBuildQueue().put( task ); - } + distributedBuildManager.prepareBuildProjects( projectsBuildDefinitionsMap, trigger, projectGroupId, + group.getName(), scmRootAddress, scmRootId ); } else { @@ -3398,14 +3411,6 @@ group.getName(), scmRootAddress, scmRootId ); } } - catch ( TaskQueueManagerException e ) - { - throw logAndCreateException( e.getMessage(), e ); - } - catch ( TaskQueueException e ) - { - throw logAndCreateException( "Error while creating enqueuing object.", e ); - } catch ( BuildManagerException e ) { throw logAndCreateException( "Error while creating enqueuing object.", e ); Modified: continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/core/action/CreateBuildProjectTaskAction.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/core/action/CreateBuildProjectTaskAction.java?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/core/action/CreateBuildProjectTaskAction.java (original) +++ continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/core/action/CreateBuildProjectTaskAction.java Sun May 17 18:21:35 2009 @@ -65,6 +65,7 @@ Map scmResultMap = AbstractContinuumAction.getScmResultMap( context ); List projectsToBeBuilt = new ArrayList(); int trigger = AbstractContinuumAction.getTrigger( context ); + int projectGroupId = AbstractContinuumAction.getProjectGroupId( context ); // update state of each project first for ( Project project : projects ) @@ -127,6 +128,7 @@ } } - parallelBuildsManager.buildProjects( projectsToBeBuilt, projectsBuildDefinitionsMap, trigger, scmResultMap ); + parallelBuildsManager.buildProjects( projectsToBeBuilt, projectsBuildDefinitionsMap, + trigger, scmResultMap, projectGroupId ); } } Modified: continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/scm/queue/PrepareBuildProjectsTaskExecutor.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/scm/queue/PrepareBuildProjectsTaskExecutor.java?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/scm/queue/PrepareBuildProjectsTaskExecutor.java (original) +++ continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/scm/queue/PrepareBuildProjectsTaskExecutor.java Sun May 17 18:21:35 2009 @@ -562,6 +562,7 @@ AbstractContinuumAction.setProjectsBuildDefinitionsMap( context, projectsBuildDefinitionsMap ); AbstractContinuumAction.setTrigger( context, trigger ); AbstractContinuumAction.setScmResultMap( context, scmResultMap ); + AbstractContinuumAction.setProjectGroupId( context, projectGroupId ); log.info( "Performing action create-build-project-task" ); actionManager.lookup( "create-build-project-task" ).execute( context ); Modified: continuum/trunk/continuum-core/src/test/java/org/apache/continuum/buildmanager/ParallelBuildsManagerTest.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test/java/org/apache/continuum/buildmanager/ParallelBuildsManagerTest.java?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-core/src/test/java/org/apache/continuum/buildmanager/ParallelBuildsManagerTest.java (original) +++ continuum/trunk/continuum-core/src/test/java/org/apache/continuum/buildmanager/ParallelBuildsManagerTest.java Sun May 17 18:21:35 2009 @@ -28,6 +28,7 @@ import org.apache.continuum.buildqueue.BuildQueueService; 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; @@ -35,7 +36,9 @@ import org.apache.maven.continuum.configuration.ConfigurationService; import org.apache.maven.continuum.model.project.BuildDefinition; import org.apache.maven.continuum.model.project.BuildQueue; +import org.apache.maven.continuum.model.project.Project; import org.apache.maven.continuum.model.project.Schedule; +import org.apache.maven.continuum.store.ContinuumStoreException; import org.codehaus.plexus.spring.PlexusInSpringTestCase; import org.codehaus.plexus.taskqueue.Task; import org.codehaus.plexus.taskqueue.TaskQueue; @@ -60,6 +63,8 @@ private BuildDefinitionDao buildDefinitionDao; + private ProjectDao projectDao; + private ConfigurationService configurationService; private OverallBuildQueue overallBuildQueue; @@ -68,6 +73,12 @@ private TaskQueue checkoutQueue; + private List projects; + + private TaskQueueExecutor buildTaskQueueExecutor; + + private TaskQueueExecutor checkoutTaskQueueExecutor; + @Override public void setUp() throws Exception @@ -98,6 +109,14 @@ buildQueue = context.mock( TaskQueue.class, "build-queue" ); checkoutQueue = context.mock( TaskQueue.class, "checkout-queue" ); + + projectDao = context.mock( ProjectDao.class ); + + buildsManager.setProjectDao( projectDao ); + + buildTaskQueueExecutor = context.mock( TaskQueueExecutor.class, "build-task-queue" ); + + checkoutTaskQueueExecutor = context.mock( TaskQueueExecutor.class, "checkout-task-queue" ); } @Override @@ -159,7 +178,7 @@ // build project recordings private void recordStartOfBuildProjectSequence() - throws TaskQueueException + throws TaskQueueException, ContinuumStoreException { context.checking( new Expectations() { @@ -167,16 +186,22 @@ exactly( 5 ).of( overallBuildQueue ).isInBuildQueue( with( any( int.class ) ) ); will( returnValue( false ) ); + one( projectDao ).getProjectsInGroup( with( any( int.class ) ) ); + will( returnValue( projects ) ); + one( configurationService ).getNumberOfBuildsInParallel(); will( returnValue( 2 ) ); exactly( 2 ).of( overallBuildQueue ).getBuildQueue(); will( returnValue( buildQueue ) ); + + exactly( 2 ).of( overallBuildQueue ).getBuildTaskQueueExecutor(); + will( returnValue( buildTaskQueueExecutor ) ); }} ); } private void recordBuildProjectBuildQueuesAreEmpty() - throws TaskQueueException + throws TaskQueueException, ContinuumStoreException { // shouldn't only the build queues attached to the schedule be checked? recordStartOfBuildProjectSequence(); @@ -185,8 +210,11 @@ context.checking( new Expectations() { { - exactly( 3 ).of( buildQueue ).getQueueSnapshot(); + exactly( 2 ).of( buildQueue ).getQueueSnapshot(); will( returnValue( tasks ) ); + + exactly( 2 ).of( buildTaskQueueExecutor ).getCurrentTask(); + will( returnValue( null ) ); one( overallBuildQueue ).getName(); will( returnValue( "BUILD_QUEUE_2" ) ); @@ -220,6 +248,9 @@ exactly( 2 ).of( overallBuildQueue ).getCheckoutQueue(); will( returnValue( checkoutQueue ) ); + + exactly( 2 ).of( overallBuildQueue ).getCheckoutTaskQueueExecutor(); + will( returnValue( checkoutTaskQueueExecutor ) ); }} ); } @@ -233,9 +264,12 @@ context.checking( new Expectations() { { - exactly( 3 ).of( checkoutQueue ).getQueueSnapshot(); + exactly( 2 ).of( checkoutQueue ).getQueueSnapshot(); will( returnValue( tasks ) ); + exactly( 2 ).of( checkoutTaskQueueExecutor ).getCurrentTask(); + will( returnValue( null ) ); + one( overallBuildQueue ).getName(); will( returnValue( "BUILD_QUEUE_2" ) ); }} ); @@ -276,7 +310,7 @@ recordBuildProjectBuildQueuesAreEmpty(); - buildsManager.buildProject( 1, buildDef, "continuum-project-test-1", 1, null ); + buildsManager.buildProject( 1, buildDef, "continuum-project-test-1", 1, null, 1 ); context.assertIsSatisfied(); } @@ -292,7 +326,7 @@ recordBuildProjectBuildQueuesAreEmpty(); - buildsManager.buildProject( 1, buildDef, "continuum-project-test-1", 1, null ); + buildsManager.buildProject( 1, buildDef, "continuum-project-test-1", 1, null, 1 ); context.assertIsSatisfied(); //queue second project - 1st queue is not empty, 2nd queue is empty @@ -302,24 +336,27 @@ final List tasks = new ArrayList(); final List tasksOfFirstBuildQueue = new ArrayList(); tasksOfFirstBuildQueue.add( - new BuildProjectTask( 2, 1, 1, "continuum-project-test-2", buildDef.getDescription(), null ) ); + new BuildProjectTask( 2, 1, 1, "continuum-project-test-2", buildDef.getDescription(), null, 2 ) ); context.checking( new Expectations() { { - exactly( 2 ).of( buildQueue ).getQueueSnapshot(); + one( buildQueue ).getQueueSnapshot(); will( returnValue( tasksOfFirstBuildQueue ) ); // the second build queue has no tasks queued, so it should return 0 - exactly( 2 ).of( buildQueue ).getQueueSnapshot(); + one( buildQueue ).getQueueSnapshot(); will( returnValue( tasks ) ); + exactly( 2 ).of( buildTaskQueueExecutor ).getCurrentTask(); + will( returnValue( null ) ); + one( overallBuildQueue ).getName(); will( returnValue( "BUILD_QUEUE_3" ) ); }} ); recordAddToBuildQueue(); - buildsManager.buildProject( 2, buildDef, "continuum-project-test-2", 1, null ); + buildsManager.buildProject( 2, buildDef, "continuum-project-test-2", 1, null, 2 ); context.assertIsSatisfied(); // queue third project - both queues have 1 task queued each @@ -329,16 +366,19 @@ context.checking( new Expectations() { { - exactly( 3 ).of( buildQueue ).getQueueSnapshot(); + exactly( 2 ).of( buildQueue ).getQueueSnapshot(); will( returnValue( tasksOfFirstBuildQueue ) ); + exactly( 2 ).of( buildTaskQueueExecutor ).getCurrentTask(); + will( returnValue( null ) ); + one( overallBuildQueue ).getName(); will( returnValue( "BUILD_QUEUE_2" ) ); }} ); recordAddToBuildQueue(); - buildsManager.buildProject( 3, buildDef, "continuum-project-test-3", 1, null ); + buildsManager.buildProject( 3, buildDef, "continuum-project-test-3", 1, null, 3 ); context.assertIsSatisfied(); } @@ -426,12 +466,15 @@ context.checking( new Expectations() { { - exactly( 2 ).of( checkoutQueue ).getQueueSnapshot(); + one( checkoutQueue ).getQueueSnapshot(); will( returnValue( tasksInFirstCheckoutQueue ) ); - exactly( 2 ).of( checkoutQueue ).getQueueSnapshot(); + one( checkoutQueue ).getQueueSnapshot(); will( returnValue( tasks ) ); + exactly( 2 ).of( checkoutTaskQueueExecutor ).getCurrentTask(); + will( returnValue( null ) ); + one( overallBuildQueue ).getName(); will( returnValue( "BUILD_QUEUE_3" ) ); }} ); @@ -449,9 +492,12 @@ context.checking( new Expectations() { { - exactly( 3 ).of( checkoutQueue ).getQueueSnapshot(); + exactly( 2 ).of( checkoutQueue ).getQueueSnapshot(); will( returnValue( tasksInFirstCheckoutQueue ) ); + exactly( 2 ).of( checkoutTaskQueueExecutor ).getCurrentTask(); + will( returnValue( null ) ); + one( overallBuildQueue ).getName(); will( returnValue( "BUILD_QUEUE_2" ) ); }} ); @@ -558,7 +604,7 @@ context.mock( TaskQueueExecutor.class, "checkout-queue-executor" ); final List buildTasks = new ArrayList(); - buildTasks.add( new BuildProjectTask( 2, 1, 1, "continuum-project-test-2", "BUILD_DEF", null ) ); + buildTasks.add( new BuildProjectTask( 2, 1, 1, "continuum-project-test-2", "BUILD_DEF", null, 2 ) ); final List checkoutTasks = new ArrayList(); checkoutTasks.add( @@ -626,15 +672,24 @@ exactly( 4 ).of( overallBuildQueue ).isInBuildQueue( with( any( int.class ) ) ); will( returnValue( false ) ); + one( projectDao ).getProjectsInGroup( with( any( int.class ) ) ); + will( returnValue( projects ) ); + one( configurationService ).getNumberOfBuildsInParallel(); will( returnValue( 2 ) ); exactly( 2 ).of( overallBuildQueue ).getBuildQueue(); will( returnValue( buildQueue ) ); - exactly( 3 ).of( buildQueue ).getQueueSnapshot(); + exactly( 2 ).of( overallBuildQueue ).getBuildTaskQueueExecutor(); + will( returnValue( buildQueueExecutor ) ); + + exactly( 2 ).of( buildQueue ).getQueueSnapshot(); will( returnValue( tasks ) ); + exactly( 2 ).of( buildQueueExecutor ).getCurrentTask(); + will( returnValue( null ) ); + one( overallBuildQueue ).getName(); will( returnValue( "BUILD_QUEUE_2" ) ); @@ -654,9 +709,15 @@ exactly( 2 ).of( overallBuildQueue ).getCheckoutQueue(); will( returnValue( checkoutQueue ) ); - exactly( 3 ).of( checkoutQueue ).getQueueSnapshot(); + exactly( 2 ).of( overallBuildQueue ).getCheckoutTaskQueueExecutor(); + will( returnValue( checkoutQueueExecutor ) ); + + exactly( 2 ).of( checkoutQueue ).getQueueSnapshot(); will( returnValue( tasks ) ); + exactly( 2 ).of( checkoutQueueExecutor ).getCurrentTask(); + will( returnValue( null ) ); + one( overallBuildQueue ).getName(); will( returnValue( "BUILD_QUEUE_2" ) ); @@ -680,10 +741,10 @@ buildDef.setSchedule( getSchedule( 1, 1, 2 ) ); final TaskQueueExecutor buildQueueExecutor = context.mock( TaskQueueExecutor.class, "build-queue-executor" ); - final Task buildTask = new BuildProjectTask( 1, 1, 1, "continuum-project-test-1", "BUILD_DEF", null ); + final Task buildTask = new BuildProjectTask( 1, 1, 1, "continuum-project-test-1", "BUILD_DEF", null, 1 ); final List buildTasks = new ArrayList(); - buildTasks.add( new BuildProjectTask( 2, 1, 1, "continuum-project-test-2", "BUILD_DEF", null ) ); + buildTasks.add( new BuildProjectTask( 2, 1, 1, "continuum-project-test-2", "BUILD_DEF", null, 2 ) ); final List checkoutTasks = new ArrayList(); checkoutTasks.add( @@ -743,6 +804,9 @@ one( overallBuildQueue ).isInBuildQueue( with( any( int.class ) ) ); will( returnValue( false ) ); + one( projectDao ).getProjectsInGroup( with( any( int.class ) ) ); + will( returnValue( projects ) ); + one( configurationService ).getNumberOfBuildsInParallel(); will( returnValue( 2 ) ); @@ -752,7 +816,7 @@ one( overallBuildQueue ).addToBuildQueue( with( any( BuildProjectTask.class ) ) ); }} ); - buildsManager.buildProject( 1, buildDef, "continuum-project-test-1", 1, null ); + buildsManager.buildProject( 1, buildDef, "continuum-project-test-1", 1, null, 1 ); context.assertIsSatisfied(); } @@ -762,7 +826,7 @@ setupMockOverallBuildQueues(); final List tasks = new ArrayList(); - tasks.add( new BuildProjectTask( 2, 1, 1, "continuum-project-test-2", "BUILD_DEF", null ) ); + tasks.add( new BuildProjectTask( 2, 1, 1, "continuum-project-test-2", "BUILD_DEF", null, 2 ) ); context.checking( new Expectations() { Modified: continuum/trunk/continuum-core/src/test/java/org/apache/continuum/taskqueue/DefaultOverallBuildQueueTest.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test/java/org/apache/continuum/taskqueue/DefaultOverallBuildQueueTest.java?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-core/src/test/java/org/apache/continuum/taskqueue/DefaultOverallBuildQueueTest.java (original) +++ continuum/trunk/continuum-core/src/test/java/org/apache/continuum/taskqueue/DefaultOverallBuildQueueTest.java Sun May 17 18:21:35 2009 @@ -184,7 +184,7 @@ throws Exception { final BuildProjectTask buildTask = - new BuildProjectTask( 2, 1, 1, "continuum-project-test-2", "BUILD_DEF", null ); + new BuildProjectTask( 2, 1, 1, "continuum-project-test-2", "BUILD_DEF", null, 2 ); final TaskQueue buildQueue = context.mock( TaskQueue.class, "build-queue" ); context.checking( new Expectations() @@ -205,7 +205,7 @@ { final TaskQueue buildQueue = context.mock( TaskQueue.class, "build-queue" ); final List tasks = new ArrayList(); - tasks.add( new BuildProjectTask( 2, 1, 1, "continuum-project-test-2", "BUILD_DEF", null ) ); + tasks.add( new BuildProjectTask( 2, 1, 1, "continuum-project-test-2", "BUILD_DEF", null, 2 ) ); context.checking( new Expectations() { @@ -229,7 +229,7 @@ { final TaskQueue buildQueue = context.mock( TaskQueue.class, "build-queue" ); final List tasks = new ArrayList(); - tasks.add( new BuildProjectTask( 2, 1, 1, "continuum-project-test-2", "BUILD_DEF", null ) ); + tasks.add( new BuildProjectTask( 2, 1, 1, "continuum-project-test-2", "BUILD_DEF", null, 2 ) ); context.checking( new Expectations() { @@ -248,7 +248,7 @@ public void testCancelBuildTask() throws Exception { - final Task buildTask = new BuildProjectTask( 2, 1, 1, "continuum-project-test-2", "BUILD_DEF", null ); + final Task buildTask = new BuildProjectTask( 2, 1, 1, "continuum-project-test-2", "BUILD_DEF", null, 2 ); context.checking( new Expectations() { @@ -266,7 +266,7 @@ public void testCancelCurrentBuild() throws Exception { - final Task buildTask = new BuildProjectTask( 2, 1, 1, "continuum-project-test-2", "BUILD_DEF", null ); + final Task buildTask = new BuildProjectTask( 2, 1, 1, "continuum-project-test-2", "BUILD_DEF", null, 2 ); context.checking( new Expectations() { @@ -302,14 +302,14 @@ one( buildQueue ).remove( with( any( Task.class ) ) ); }} ); - overallQueue.removeProjectFromBuildQueue( 1, 1, 1, "continuum-project-test-1" ); + overallQueue.removeProjectFromBuildQueue( 1, 1, 1, "continuum-project-test-1", 1 ); context.assertIsSatisfied(); } public void testRemoveProjectFromBuildQueue() throws Exception { - final Task buildTask = new BuildProjectTask( 1, 1, 1, "continuum-project-test-2", "BUILD_DEF", null ); + final Task buildTask = new BuildProjectTask( 1, 1, 1, "continuum-project-test-2", "BUILD_DEF", null, 1 ); final TaskQueue buildQueue = context.mock( TaskQueue.class, "build-queue" ); final List tasks = new ArrayList(); Modified: continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/buildcontroller/BuildProjectTaskExecutorTest.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/buildcontroller/BuildProjectTaskExecutorTest.java?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/buildcontroller/BuildProjectTaskExecutorTest.java (original) +++ continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/buildcontroller/BuildProjectTaskExecutorTest.java Sun May 17 18:21:35 2009 @@ -246,7 +246,7 @@ // projectGroup = continuumStore.addProjectGroup( projectGroup ); BuildProjectTask task = new BuildProjectTask( project.getId(), buildDefinition.getId(), 0, project.getName(), - buildDefinition.getDescription(), null ); + buildDefinition.getDescription(), null, projectGroupId ); task.setMaxExecutionTime( maxRunTime ); Modified: continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/buildqueue/BuildQueueTest.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/buildqueue/BuildQueueTest.java?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/buildqueue/BuildQueueTest.java (original) +++ continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/buildqueue/BuildQueueTest.java Sun May 17 18:21:35 2009 @@ -22,6 +22,7 @@ import org.apache.continuum.taskqueue.BuildProjectTask; import org.apache.maven.continuum.AbstractContinuumTest; import org.apache.maven.continuum.model.project.Project; +import org.apache.maven.continuum.model.project.ProjectGroup; import org.apache.maven.continuum.project.ContinuumProjectState; import org.codehaus.plexus.taskqueue.Task; import org.codehaus.plexus.taskqueue.TaskQueue; @@ -131,7 +132,8 @@ private void buildProject( int projectId, int trigger ) throws Exception { - buildQueue.put( new BuildProjectTask( projectId, 0, trigger, null, null, null ) ); + ProjectGroup group = getDefaultProjectGroup(); + buildQueue.put( new BuildProjectTask( projectId, 0, trigger, null, null, null, group.getId() ) ); } private void assertNextBuildIs( int expectedProjectId ) Modified: continuum/trunk/continuum-distributed/continuum-distributed-master/continuum-distributed-master-server/src/main/java/org/apache/continuum/distributed/transport/master/MasterBuildAgentTransportServer.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-distributed/continuum-distributed-master/continuum-distributed-master-server/src/main/java/org/apache/continuum/distributed/transport/master/MasterBuildAgentTransportServer.java?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-distributed/continuum-distributed-master/continuum-distributed-master-server/src/main/java/org/apache/continuum/distributed/transport/master/MasterBuildAgentTransportServer.java (original) +++ continuum/trunk/continuum-distributed/continuum-distributed-master/continuum-distributed-master-server/src/main/java/org/apache/continuum/distributed/transport/master/MasterBuildAgentTransportServer.java Sun May 17 18:21:35 2009 @@ -21,7 +21,7 @@ import java.util.Map; -import org.apache.continuum.builder.distributed.manager.DistributedBuildManager; +import org.apache.continuum.builder.distributed.DistributedBuildService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,18 +33,18 @@ { private static final Logger log = LoggerFactory.getLogger( MasterBuildAgentTransportServer.class ); - private final DistributedBuildManager distributedBuildManager; + private final DistributedBuildService distributedBuildService; - public MasterBuildAgentTransportServer( DistributedBuildManager distributedBuildManager ) + public MasterBuildAgentTransportServer( DistributedBuildService distributedBuildService ) { - this.distributedBuildManager = distributedBuildManager; + this.distributedBuildService = distributedBuildService; } public Boolean returnBuildResult( Map buildResult ) throws Exception { log.info( "Build result returned." ); - distributedBuildManager.updateBuildResult( buildResult ); + distributedBuildService.updateBuildResult( buildResult ); return Boolean.TRUE; } @@ -60,7 +60,7 @@ throws Exception { log.info( "Prepare build finished." ); - distributedBuildManager.prepareBuildFinished( prepareBuildResult ); + distributedBuildService.prepareBuildFinished( prepareBuildResult ); return Boolean.TRUE; } @@ -68,7 +68,7 @@ throws Exception { log.info( "Start project build." ); - distributedBuildManager.startProjectBuild( projectId ); + distributedBuildService.startProjectBuild( projectId ); return Boolean.TRUE; } @@ -76,7 +76,7 @@ throws Exception { log.info( "Start prepare build." ); - distributedBuildManager.startPrepareBuild( prepareBuildResult ); + distributedBuildService.startPrepareBuild( prepareBuildResult ); return Boolean.TRUE; } @@ -84,14 +84,14 @@ throws Exception { log.info( "Retrieving environments" ); - return distributedBuildManager.getEnvironments( buildDefinitionId, installationType ); + return distributedBuildService.getEnvironments( buildDefinitionId, installationType ); } public Boolean updateProject( Map project ) throws Exception { log.info( "Start updating project" ); - distributedBuildManager.updateProject( project ); + distributedBuildService.updateProject( project ); return Boolean.TRUE; } @@ -99,6 +99,6 @@ throws Exception { log.info( "Checking if project should build" ); - return distributedBuildManager.shouldBuild( context ); + return distributedBuildService.shouldBuild( context ); } } Modified: continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-api/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportService.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-api/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportService.java?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-api/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportService.java (original) +++ continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-api/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportService.java Sun May 17 18:21:35 2009 @@ -36,7 +36,7 @@ public Map getBuildResult( int projectId ) throws Exception; - public Integer getProjectCurrentlyBuilding() + public Map getProjectCurrentlyBuilding() throws Exception; public List> getAvailableInstallations() @@ -90,4 +90,19 @@ public Boolean releaseRollback( String releaseId, int projectId ) throws Exception; + + public Integer getBuildSizeOfAgent() + throws Exception; + + public List> getProjectsInPrepareBuildQueue() + throws Exception; + + public List> getProjectsInBuildQueue() + throws Exception; + + public Map getProjectCurrentlyPreparingBuild() + throws Exception; + + public Boolean isProjectGroupInQueue( int projectGroupId ) + throws Exception; } Modified: continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-client/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportClient.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-client/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportClient.java?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-client/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportClient.java (original) +++ continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-client/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportClient.java Sun May 17 18:21:35 2009 @@ -125,15 +125,15 @@ return buildResult; } - public Integer getProjectCurrentlyBuilding() + public Map getProjectCurrentlyBuilding() throws Exception { - Integer projectId; + Map map; try { - projectId = slave.getProjectCurrentlyBuilding(); - log.info( "Currently building project " + projectId ); + map = slave.getProjectCurrentlyBuilding(); + log.info( "Retrieving currently building project" ); } catch ( Exception e ) { @@ -141,7 +141,7 @@ throw new Exception( "Failed to get the currently building project", e ); } - return projectId; + return map; } public Boolean ping() @@ -436,4 +436,99 @@ return result; } + + public Integer getBuildSizeOfAgent() + throws Exception + { + Integer size; + + try + { + size = slave.getBuildSizeOfAgent(); + log.info( "Retrieving build size of agent" ); + } + catch ( Exception e ) + { + log.error( "Failed to retrieve build size of agent", e ); + throw new Exception( "Failed to retrieve build size of agent", e ); + } + + return size; + } + + public Map getProjectCurrentlyPreparingBuild() + throws Exception + { + Map projects; + + try + { + projects = slave.getProjectCurrentlyPreparingBuild(); + log.info( "Retrieving projects currently preparing build" ); + } + catch ( Exception e ) + { + log.error( "Failed to retrieve projects currently preparing build", e ); + throw new Exception( "Failed to retrieve projects currently preparing build", e ); + } + + return projects; + } + + public List> getProjectsInBuildQueue() + throws Exception + { + List> projects; + + try + { + projects = slave.getProjectsInBuildQueue(); + log.info( "Retrieving projects in build queue" ); + } + catch ( Exception e ) + { + log.error( "Failed to retrieve projects in build queue", e ); + throw new Exception( "Failed to retrieve projects in build queue", e ); + } + + return projects; + } + + public List> getProjectsInPrepareBuildQueue() + throws Exception + { + List> projects; + + try + { + projects = slave.getProjectsInPrepareBuildQueue(); + log.info( "Retrieving projects in prepare build queue" ); + } + catch ( Exception e ) + { + log.error( "Failed to retrieve projects in prepare build queue", e ); + throw new Exception( "Failed to retrieve projects in prepare build queue", e ); + } + + return projects; + } + + public Boolean isProjectGroupInQueue( int projectGroupId ) + throws Exception + { + Boolean result; + + try + { + result = slave.isProjectGroupInQueue( projectGroupId ); + log.info( "Checking if project group is in queue" ); + } + catch ( Exception e ) + { + log.error( "Failed to check if project group is in queue", e ); + throw new Exception( "Failed to check if project group is in queue", e ); + } + + return result; + } } Modified: continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-server/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportServer.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-server/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportServer.java?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-server/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportServer.java (original) +++ continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-server/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportServer.java Sun May 17 18:21:35 2009 @@ -101,14 +101,14 @@ return buildResult; } - public Integer getProjectCurrentlyBuilding() + public Map getProjectCurrentlyBuilding() throws Exception { - Integer projectId = continuumBuildAgentService.getProjectCurrentlyBuilding(); + Map project = continuumBuildAgentService.getProjectCurrentlyBuilding(); - log.info( "Currently building project " + projectId ); + log.info( "Retrieving currently building project"); - return projectId; + return project; } public Boolean ping() @@ -343,4 +343,66 @@ return result; } + + public Integer getBuildSizeOfAgent() + throws Exception + { + try + { + return continuumBuildAgentService.getBuildSizeOfAgent(); + } + catch ( ContinuumBuildAgentException e ) + { + log.error( "Failed to retrieve build size of agent", e ); + throw e; + } + } + + public Map getProjectCurrentlyPreparingBuild() + throws Exception + { + try + { + return continuumBuildAgentService.getProjectCurrentlyPreparingBuild(); + } + catch ( ContinuumBuildAgentException e ) + { + log.error( "Failed to retrieve projects currently preparing build", e ); + throw e; + } + } + + public List> getProjectsInBuildQueue() + throws Exception + { + try + { + return continuumBuildAgentService.getProjectsInBuildQueue(); + } + catch ( ContinuumBuildAgentException e ) + { + log.error( "Failed to retrieve projects in build queue", e ); + throw e; + } + } + + public List> getProjectsInPrepareBuildQueue() + throws Exception + { + try + { + return continuumBuildAgentService.getProjectsInPrepareBuildQueue(); + } + catch ( ContinuumBuildAgentException e ) + { + log.error( "Failed to retrieve projects in prepare build queue", e ); + throw e; + } + } + + public Boolean isProjectGroupInQueue( int projectGroupId ) + throws Exception + { + return continuumBuildAgentService.isProjectGroupInQueue( projectGroupId ); + } } Modified: continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/admin/BuildAgentAction.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/admin/BuildAgentAction.java?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/admin/BuildAgentAction.java (original) +++ continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/admin/BuildAgentAction.java Sun May 17 18:21:35 2009 @@ -52,11 +52,6 @@ { private static final Logger logger = LoggerFactory.getLogger( BuildAgentAction.class ); - /** - * @plexus.requirement - */ - private DistributedBuildManager distributedBuildManager; - private List buildAgents; private BuildAgentConfiguration buildAgent; @@ -139,7 +134,7 @@ try { - installations = distributedBuildManager.getAvailableInstallations( buildAgent.getUrl() ); + installations = getContinuum().getDistributedBuildManager().getAvailableInstallations( buildAgent.getUrl() ); } catch ( ContinuumException e ) { @@ -188,7 +183,7 @@ } } - distributedBuildManager.reload(); + getContinuum().getDistributedBuildManager().reload(); return SUCCESS; } @@ -201,33 +196,39 @@ return CONFIRM; } - if ( distributedBuildManager.isBuildAgentBusy( buildAgent.getUrl() ) ) + if ( getContinuum().getDistributedBuildManager().isBuildAgentBusy( buildAgent.getUrl() ) ) { message = getText( "buildAgent.error.delete.busy" ); return ERROR; } else { - distributedBuildManager.removeAgentFromTaskQueueExecutor( buildAgent.getUrl() ); + getContinuum().getDistributedBuildManager().removeDistributedBuildQueueOfAgent( buildAgent.getUrl() ); } ConfigurationService configuration = getContinuum().getConfiguration(); - for ( BuildAgentGroupConfiguration buildAgentGroup : configuration.getBuildAgentGroups() ) - { - if ( configuration.containsBuildAgentUrl( buildAgent.getUrl(), buildAgentGroup ) ) + if ( configuration.getBuildAgentGroups() != null ) + { + for ( BuildAgentGroupConfiguration buildAgentGroup : configuration.getBuildAgentGroups() ) { - message = getText( "buildAgent.error.remove.in.use" ); - return ERROR; + if ( configuration.containsBuildAgentUrl( buildAgent.getUrl(), buildAgentGroup ) ) + { + message = getText( "buildAgent.error.remove.in.use" ); + return ERROR; + } } } - for ( BuildAgentConfiguration agent : configuration.getBuildAgents() ) + if ( configuration.getBuildAgents() != null ) { - if ( buildAgent.getUrl().equals( agent.getUrl() ) ) + for ( BuildAgentConfiguration agent : configuration.getBuildAgents() ) { - configuration.removeBuildAgent( agent ); - return SUCCESS; + if ( buildAgent.getUrl().equals( agent.getUrl() ) ) + { + configuration.removeBuildAgent( agent ); + return SUCCESS; + } } } @@ -324,7 +325,7 @@ } } - distributedBuildManager.reload(); + getContinuum().getDistributedBuildManager().reload(); return SUCCESS; } Modified: continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/startup/ContinuumStartup.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/startup/ContinuumStartup.java?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/startup/ContinuumStartup.java (original) +++ continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/startup/ContinuumStartup.java Sun May 17 18:21:35 2009 @@ -82,12 +82,5 @@ DistributedBuildManager distributedBuildManager = (DistributedBuildManager) wac.getBean( PlexusToSpringUtils .buildSpringId( DistributedBuildManager.class ) ); - - TaskQueueExecutor distributedBuildProjectOverall = (TaskQueueExecutor) wac.getBean( PlexusToSpringUtils - .buildSpringId( TaskQueueExecutor.class, "distributed-build-project-overall" ) ); - - TaskQueueExecutor distributedBuildProjectDeferred = (TaskQueueExecutor) wac.getBean( PlexusToSpringUtils - .buildSpringId( TaskQueueExecutor.class, "distributed-build-project-deferred" ) ); } - } Modified: continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/admin/QueuesAction.java URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/admin/QueuesAction.java?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/admin/QueuesAction.java (original) +++ continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/admin/QueuesAction.java Sun May 17 18:21:35 2009 @@ -33,6 +33,7 @@ import org.apache.continuum.taskqueue.CheckOutTask; import org.apache.continuum.taskqueue.PrepareBuildProjectsTask; import org.apache.continuum.taskqueue.manager.TaskQueueManagerException; +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.project.ContinuumProjectState; @@ -43,6 +44,7 @@ import org.apache.maven.continuum.web.exception.AuthenticationRequiredException; import org.apache.maven.continuum.web.exception.AuthorizationRequiredException; import org.apache.maven.continuum.web.model.DistributedBuildSummary; +import org.apache.maven.continuum.web.model.DistributedPrepareBuildSummary; import org.codehaus.plexus.redback.rbac.Resource; import org.codehaus.plexus.taskqueue.TaskQueueException; import org.codehaus.redback.integration.interceptor.SecureAction; @@ -85,23 +87,23 @@ private List checkoutsInQueue = new ArrayList(); - /** - * @plexus.requirement - */ - DistributedBuildManager distributedBuildManager; + private List currentDistributedPrepareBuilds = new ArrayList(); - private List distributedBuildSummary; + private List distributedPrepareBuildQueues = new ArrayList(); - private List distributedBuildQueues; + private List currentDistributedBuilds = new ArrayList(); + private List distributedBuildQueues = new ArrayList(); private String buildAgentUrl; private int projectGroupId; - private String scmRootAddress; + private int scmRootId; private List selectedDistributedBuildTaskHashCodes; + private List selectedDistributedPrepareBuildTaskHashCodes; + // ----------------------------------------------------- // webwork // ----------------------------------------------------- @@ -203,38 +205,89 @@ { if ( getContinuum().getConfiguration().isDistributedBuildEnabled() ) { - distributedBuildSummary = new ArrayList(); - - Map map = distributedBuildManager.getDistributedBuildProjects(); + // current prepare build task + Map currentPrepareBuildMap = getContinuum().getDistributedBuildManager().getProjectsCurrentlyPreparingBuild(); - for ( String url : map.keySet() ) + for ( String url : currentPrepareBuildMap.keySet() ) { - PrepareBuildProjectsTask task = map.get( url ); + PrepareBuildProjectsTask task = currentPrepareBuildMap.get( url ); ProjectGroup projectGroup = getContinuum().getProjectGroup( task.getProjectGroupId() ); - DistributedBuildSummary summary = new DistributedBuildSummary(); - summary.setUrl( url ); + DistributedPrepareBuildSummary summary = new DistributedPrepareBuildSummary(); + summary.setBuildAgentUrl( url ); summary.setProjectGroupId( task.getProjectGroupId() ); summary.setProjectGroupName( projectGroup.getName() ); summary.setScmRootAddress( task.getScmRootAddress() ); + summary.setScmRootId( task.getProjectScmRootId() ); + + currentDistributedPrepareBuilds.add( summary ); + } + + // current builds + Map currentBuildMap = getContinuum().getDistributedBuildManager().getProjectsCurrentlyBuilding(); - ProjectScmRoot scmRoot = - getContinuum().getProjectScmRootByProjectGroupAndScmRootAddress( task.getProjectGroupId(), - task.getScmRootAddress() ); - if ( scmRoot.getState() == ContinuumProjectState.UPDATING ) + for ( String url : currentBuildMap.keySet() ) + { + BuildProjectTask task = currentBuildMap.get( url ); + + Project project = getContinuum().getProject( task.getProjectId() ); + + DistributedBuildSummary summary = new DistributedBuildSummary(); + summary.setProjectId( project.getId() ); + summary.setProjectName( project.getName() ); + summary.setProjectGroupName( project.getProjectGroup().getName() ); + summary.setBuildDefinitionId( task.getBuildDefinitionId() ); + summary.setBuildDefinitionLabel( task.getBuildDefinitionLabel() ); + summary.setHashCode( task.getHashCode() ); + summary.setBuildAgentUrl( url ); + + currentDistributedBuilds.add( summary ); + } + + // prepare build queues + Map> prepareBuildMap = getContinuum().getDistributedBuildManager().getProjectsInPrepareBuildQueue(); + + for ( String url : prepareBuildMap.keySet() ) + { + for ( PrepareBuildProjectsTask task : prepareBuildMap.get( url ) ) { - summary.setCancelEnabled( false ); + ProjectGroup projectGroup = getContinuum().getProjectGroup( task.getProjectGroupId() ); + + DistributedPrepareBuildSummary summary = new DistributedPrepareBuildSummary(); + summary.setBuildAgentUrl( url ); + summary.setProjectGroupId( task.getProjectGroupId() ); + summary.setProjectGroupName( projectGroup.getName() ); + summary.setScmRootAddress( task.getScmRootAddress() ); + summary.setScmRootId( task.getProjectScmRootId() ); + summary.setHashCode( task.getHashCode() ); + + distributedPrepareBuildQueues.add( summary ); } - else + } + + // build queues + Map> buildMap = getContinuum().getDistributedBuildManager().getProjectsInBuildQueue(); + + for ( String url : buildMap.keySet() ) + { + for ( BuildProjectTask task : buildMap.get( url ) ) { - summary.setCancelEnabled( true ); - } + DistributedBuildSummary summary = new DistributedBuildSummary(); - distributedBuildSummary.add( summary ); - } + Project project = getContinuum().getProject( task.getProjectId() ); + + summary.setProjectId( project.getId() ); + summary.setProjectName( project.getName() ); + summary.setProjectGroupName( project.getProjectGroup().getName() ); + summary.setBuildDefinitionId( task.getBuildDefinitionId() ); + summary.setBuildDefinitionLabel( task.getBuildDefinitionLabel() ); + summary.setHashCode( task.getHashCode() ); + summary.setBuildAgentUrl( url ); - distributedBuildQueues = aggregateQueues(); + distributedBuildQueues.add( summary ); + } + } return DISTRIBUTED_BUILD_SUCCESS; } @@ -349,7 +402,7 @@ } getContinuum().getBuildsManager().removeProjectFromBuildQueue( projectId, buildDefinitionId, trigger, - projectName ); + projectName, projectGroupId ); Project project = getContinuum().getProject( projectId ); project.setState( project.getOldState() ); getContinuum().updateProject( project ); @@ -421,7 +474,7 @@ return REQUIRES_AUTHENTICATION; } - distributedBuildManager.cancelDistributedBuild( buildAgentUrl, projectGroupId, scmRootAddress ); + getContinuum().getDistributedBuildManager().cancelDistributedBuild( buildAgentUrl, projectGroupId, scmRootId ); return SUCCESS; } @@ -444,7 +497,7 @@ return REQUIRES_AUTHENTICATION; } - getContinuum().getTaskQueueManager().removeFromDistributedBuildQueue( projectGroupId, scmRootAddress ); + getContinuum().getDistributedBuildManager().removeFromDistributedBuildQueue( projectGroupId, scmRootId ); return SUCCESS; } @@ -467,7 +520,7 @@ return REQUIRES_AUTHENTICATION; } - getContinuum().getTaskQueueManager().removeTasksFromDistributedBuildQueueWithHashCodes( + getContinuum().getDistributedBuildManager().removeFromDistributedBuildQueue( listToIntArray( this.getSelectedDistributedBuildTaskHashCodes() ) ); return SUCCESS; @@ -635,34 +688,34 @@ this.checkoutsInQueue = checkoutsInQueue; } - public List getDistributedBuildSummary() + public List getCurrentDistributedPrepareBuilds() { - return distributedBuildSummary; + return currentDistributedPrepareBuilds; } - public void setDistributedBuildSummary( List distributedBuildSummary ) + public List getCurrentDistributedBuilds() { - this.distributedBuildSummary = distributedBuildSummary; + return currentDistributedBuilds; } - public String getBuildAgentUrl() + public List getDistributedPrepareBuildQueues() { - return buildAgentUrl; + return distributedPrepareBuildQueues; } - public void setBuildAgentUrl( String buildAgentUrl ) + public List getDistributedBuildQueues() { - this.buildAgentUrl = buildAgentUrl; + return distributedBuildQueues; } - - public List getDistributedBuildQueues() + + public String getBuildAgentUrl() { - return distributedBuildQueues; + return buildAgentUrl; } - public void setDistributedBuildQueues( List distributedBuildQueues ) + public void setBuildAgentUrl( String buildAgentUrl ) { - this.distributedBuildQueues = distributedBuildQueues; + this.buildAgentUrl = buildAgentUrl; } public List getSelectedDistributedBuildTaskHashCodes() @@ -675,45 +728,23 @@ this.selectedDistributedBuildTaskHashCodes = selectedDistributedBuildTaskHashCodes; } - public String getScmRootAddress() + public List getSelectedDistributedPrepareBuildTaskHashCodes() { - return scmRootAddress; + return selectedDistributedPrepareBuildTaskHashCodes; } - public void setScmRootAddress( String scmRootAddress ) + public void setSelectedDistributedPrepareBuildTaskHashCodes( List selectedDistributedPrepareBuildTaskHashCodes ) { - this.scmRootAddress = scmRootAddress; + this.selectedDistributedPrepareBuildTaskHashCodes = selectedDistributedPrepareBuildTaskHashCodes; } - private List aggregateQueues() - throws TaskQueueManagerException + public void setProjectGroupId( int projectGroupId ) { - List aggregatedQueues = new ArrayList(); - - List overallQueues = - getContinuum().getTaskQueueManager().getDistributedBuildProjectsInQueue(); - - Map agentTaskQueueExecutors = - distributedBuildManager.getTaskQueueExecutors(); - - for ( String url : agentTaskQueueExecutors.keySet() ) - { - try - { - logger.debug( "size of each queue snapshot " + url + " : " + - agentTaskQueueExecutors.get( url ).getQueue().getQueueSnapshot().size() ); - aggregatedQueues.addAll( agentTaskQueueExecutors.get( url ).getQueue().getQueueSnapshot() ); - } - catch ( TaskQueueException e ) - { - //silently ignore error - logger.error( "Error encountered retrieving queue snapshot from queue :" + url, e ); - } - } - - logger.debug( "size of agg. queue " + aggregatedQueues.size() ); - aggregatedQueues.addAll( overallQueues ); + this.projectGroupId = projectGroupId; + } - return aggregatedQueues; + public void setScmRootId( int scmRootId ) + { + this.scmRootId = scmRootId; } } Modified: continuum/trunk/continuum-webapp/src/main/mdo/view-models.mdo URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/mdo/view-models.mdo?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-webapp/src/main/mdo/view-models.mdo (original) +++ continuum/trunk/continuum-webapp/src/main/mdo/view-models.mdo Sun May 17 18:21:35 2009 @@ -495,11 +495,11 @@ - DistributedBuildSummary + DistributedPrepareBuildSummary 1.0.0+ - url + buildAgentUrl 1.0.0 true URL of the build agent @@ -527,11 +527,17 @@ String - cancelEnabled + scmRootId 1.0.0 true - Determines if the cancel button is enabled - boolean + ID of the scm root + int + + + hashCode + 1.0.0 + false + int @@ -601,5 +607,53 @@ + + DistributedBuildSummary + 1.0.0+ + + + projectId + 1.0.0 + true + int + + + projectName + 1.0.0 + true + String + + + projectGroupName + 1.0.0 + true + String + + + buildDefinitionId + 1.0.0 + true + int + + + buildDefinitionLabel + 1.0.0 + true + String + + + buildAgentUrl + 1.0.0 + true + String + + + hashCode + 1.0.0 + true + int + + + Modified: continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties (original) +++ continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties Sun May 17 18:21:35 2009 @@ -1153,13 +1153,21 @@ # Page: View Distributed Build # ---------------------------------------------------------------------- distributedBuilds.page.title = Continuum - View Distributed Builds -distributedBuilds.section.title = View Distributed Builds -distributedBuilds.buildQueue.section.title = Build Queue +distributedBuilds.currentPrepareBuild.section.title = Current Prepare Builds +distributedBuilds.currentBuild.section.title = Current Builds +distributedBuilds.prepareBuildQueue.section.title = Prepare Build Queues +distributedBuilds.buildQueue.section.title = Build Queues +distributedPrepareBuild.table.projectGroupName = Project Group Name +distributedPrepareBuild.table.scmRootAddress = Scm Root Address +distributedPrepareBuild.table.buildAgentUrl = Build Agent URL +distributedPrepareBuilds.empty = No Prepare Builds +distributedPrepareBuilds.removeEntries = Cancel Prepare Builds +distributedBuild.table.projectName = Project Name +distributedBuild.table.buildDefinitionLabel = Build Definition Label distributedBuild.table.projectGroupName = Project Group Name -distributedBuild.table.scmRootAddress = Scm Root Address -distributedBuild.table.agentUrl = Build Agent URL -distributedBuilds.empty = No Distributed Builds -distributedBuilds.removeEntries = Cancel Entries +distributedBuild.table.buildAgentUrl = Build Agent URL +distributedBuilds.empty = No Builds +distributedBuilds.removeEntries = Cancel Builds # ---------------------------------------------------------------------- # Page: Delete BuildAgentGroup Modified: continuum/trunk/continuum-webapp/src/main/resources/struts.xml URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/resources/struts.xml?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-webapp/src/main/resources/struts.xml (original) +++ continuum/trunk/continuum-webapp/src/main/resources/struts.xml Sun May 17 18:21:35 2009 @@ -825,6 +825,18 @@ + + + displayQueues + + + + + + displayQueues + + + displayQueues Modified: continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/applicationContext.xml URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/applicationContext.xml?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/applicationContext.xml (original) +++ continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/applicationContext.xml Sun May 17 18:21:35 2009 @@ -66,7 +66,7 @@ - + Modified: continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/buildQueueView.jsp URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/buildQueueView.jsp?rev=775729&r1=775728&r2=775729&view=diff ============================================================================== --- continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/buildQueueView.jsp (original) +++ continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/buildQueueView.jsp Sun May 17 18:21:35 2009 @@ -106,6 +106,7 @@ ${queue.task.buildDefinitionId} ${queue.task.trigger} ${queue.task.projectName} + ${queue.task.projectGroupId} " alt="" title="" border="0">