From commits-return-4561-apmail-continuum-commits-archive=continuum.apache.org@continuum.apache.org Fri Nov 28 00:49:21 2008 Return-Path: Delivered-To: apmail-continuum-commits-archive@www.apache.org Received: (qmail 48503 invoked from network); 28 Nov 2008 00:49:21 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 28 Nov 2008 00:49:21 -0000 Received: (qmail 19406 invoked by uid 500); 28 Nov 2008 00:49:32 -0000 Delivered-To: apmail-continuum-commits-archive@continuum.apache.org Received: (qmail 19379 invoked by uid 500); 28 Nov 2008 00:49:32 -0000 Mailing-List: contact commits-help@continuum.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@continuum.apache.org Delivered-To: mailing list commits@continuum.apache.org Received: (qmail 19370 invoked by uid 99); 28 Nov 2008 00:49:32 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 27 Nov 2008 16:49:32 -0800 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 28 Nov 2008 00:48:03 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 600D4238889D; Thu, 27 Nov 2008 16:48:50 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r721318 - in /continuum/branches/continuum-distributed-builds: continuum-api/src/main/java/org/apache/continuum/dao/ continuum-api/src/main/java/org/apache/continuum/distributed/ continuum-api/src/main/java/org/apache/continuum/distributed/... Date: Fri, 28 Nov 2008 00:48:49 -0000 To: commits@continuum.apache.org From: ctan@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20081128004850.600D4238889D@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: ctan Date: Thu Nov 27 16:48:48 2008 New Revision: 721318 URL: http://svn.apache.org/viewvc?rev=721318&view=rev Log: - added distributed build manager - more fix in buildagent Added: continuum/branches/continuum-distributed-builds/continuum-api/src/main/java/org/apache/continuum/distributed/ continuum/branches/continuum-distributed-builds/continuum-api/src/main/java/org/apache/continuum/distributed/manager/ continuum/branches/continuum-distributed-builds/continuum-api/src/main/java/org/apache/continuum/distributed/manager/DistributedBuildManager.java continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/continuum/distributed/ continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/continuum/distributed/BuildAgent.java continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/continuum/distributed/manager/ continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/continuum/distributed/manager/AbstractDistributedBuildManager.java continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/continuum/distributed/manager/DefaultDistributedBuildManager.java continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/AbstractContinuumBuildAgentService.java continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/configuration/ConfigurationService.java continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/configuration/DefaultConfigurationService.java continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/model/ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/model/BuildContext.java Modified: continuum/branches/continuum-distributed-builds/continuum-api/src/main/java/org/apache/continuum/dao/ProjectDao.java continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java continuum/branches/continuum-distributed-builds/continuum-core/src/main/resources/META-INF/spring-context.xml continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentService.java continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentServiceImpl.java continuum/branches/continuum-distributed-builds/continuum-store/src/main/java/org/apache/continuum/dao/ProjectDaoImpl.java continuum/branches/continuum-distributed-builds/continuum-test/src/main/java/org/apache/maven/continuum/configuration/ConfigurationServiceMock.java Modified: continuum/branches/continuum-distributed-builds/continuum-api/src/main/java/org/apache/continuum/dao/ProjectDao.java URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-api/src/main/java/org/apache/continuum/dao/ProjectDao.java?rev=721318&r1=721317&r2=721318&view=diff ============================================================================== --- continuum/branches/continuum-distributed-builds/continuum-api/src/main/java/org/apache/continuum/dao/ProjectDao.java (original) +++ continuum/branches/continuum-distributed-builds/continuum-api/src/main/java/org/apache/continuum/dao/ProjectDao.java Thu Nov 27 16:48:48 2008 @@ -79,4 +79,7 @@ ProjectGroup getProjectGroupByProjectId( int projectId ) throws ContinuumObjectNotFoundException; + + Project getProjectWithDependencies( int projectId ) + throws ContinuumStoreException; } Added: continuum/branches/continuum-distributed-builds/continuum-api/src/main/java/org/apache/continuum/distributed/manager/DistributedBuildManager.java URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-api/src/main/java/org/apache/continuum/distributed/manager/DistributedBuildManager.java?rev=721318&view=auto ============================================================================== --- continuum/branches/continuum-distributed-builds/continuum-api/src/main/java/org/apache/continuum/distributed/manager/DistributedBuildManager.java (added) +++ continuum/branches/continuum-distributed-builds/continuum-api/src/main/java/org/apache/continuum/distributed/manager/DistributedBuildManager.java Thu Nov 27 16:48:48 2008 @@ -0,0 +1,46 @@ +package org.apache.continuum.distributed.manager; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.util.Map; + +import org.apache.maven.continuum.ContinuumException; + +/** + * @author Maria Catherine Tan + */ +public interface DistributedBuildManager +{ + String ROLE = DistributedBuildManager.class.getName(); + + void reload(); + + void buildProjects( Map projectsAndBuildDefinitionsMap, int trigger ) + throws ContinuumException; + + void buildProjectsInQueue() + throws ContinuumException; + + void updateProjectScmRoot( Map context ) + throws ContinuumException; + + void updateBuildResult( Map context ) + throws ContinuumException; +} Added: continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/continuum/distributed/BuildAgent.java URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/continuum/distributed/BuildAgent.java?rev=721318&view=auto ============================================================================== --- continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/continuum/distributed/BuildAgent.java (added) +++ continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/continuum/distributed/BuildAgent.java Thu Nov 27 16:48:48 2008 @@ -0,0 +1,44 @@ +package org.apache.continuum.distributed; + +import java.util.List; + +import org.apache.maven.continuum.model.project.Project; + +public class BuildAgent +{ + String url; + + boolean busy; + + List projects; + + public String getUrl() + { + return url; + } + + public void setUrl( String url ) + { + this.url = url; + } + + public boolean isBusy() + { + return busy; + } + + public void setBusy( boolean busy ) + { + this.busy = busy; + } + + public List getProjects() + { + return projects; + } + + public void setProjects( List projects ) + { + this.projects = projects; + } +} Added: continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/continuum/distributed/manager/AbstractDistributedBuildManager.java URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/continuum/distributed/manager/AbstractDistributedBuildManager.java?rev=721318&view=auto ============================================================================== --- continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/continuum/distributed/manager/AbstractDistributedBuildManager.java (added) +++ continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/continuum/distributed/manager/AbstractDistributedBuildManager.java Thu Nov 27 16:48:48 2008 @@ -0,0 +1,225 @@ +package org.apache.continuum.distributed.manager; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.util.Map; + +import org.apache.continuum.distributed.manager.DistributedBuildManager; + +public abstract class AbstractDistributedBuildManager + implements DistributedBuildManager +{ + public static final String KEY_PROJECT_ID = "project-id"; + + public static final String KEY_BUILD_DEFINITION_ID = "builddefinition-id"; + + public static final String KEY_TRIGGER = "trigger"; + + public static final String KEY_EXECUTOR_ID = "executor-id"; + + public static final String KEY_SCM_URL = "scm-url"; + + public static final String KEY_SCM_USERNAME = "scm-username"; + + public static final String KEY_SCM_PASSWORD = "scm-password"; + + public static final String KEY_BUILD_FILE = "build-file"; + + public static final String KEY_GOALS = "goals"; + + public static final String KEY_ARGUMENTS = "arguments"; + + public static final String KEY_BUILD_FRESH = "build-fresh"; + + public static final String KEY_BUILD_START = "build-start"; + + public static final String KEY_BUILD_END = "build-end"; + + public static final String KEY_BUILD_ERROR = "build-error"; + + public static final String KEY_BUILD_EXIT_CODE = "build-exit-code"; + + public static final String KEY_BUILD_STATE = "build-state"; + + public static final String KEY_SCM_STATE = "scm-state"; + + public static final String KEY_SCM_COMMAND_OUTPUT = "scm-command-output"; + + public static final String KEY_SCM_COMMAND_LINE = "scm-command-line"; + + public static final String KEY_SCM_PROVIDER_MESSAGE = "scm-provider-message"; + + public static final String KEY_SCM_EXCEPTION = "scm-exception"; + + public static final String KEY_PREPARE_BUILD_FINISHED = "prepare-build-finished"; + + public static final String KEY_AGENT_URL = "agent-url"; + + public static int getProjectId( Map context ) + { + return getInteger( context, KEY_PROJECT_ID ); + } + + public static int getBuildDefinitionId( Map context ) + { + return getInteger( context, KEY_BUILD_DEFINITION_ID ); + } + + public static String getBuildError( Map context ) + { + return getString( context, KEY_BUILD_ERROR ); + } + + public static int getTrigger( Map context ) + { + return getInteger( context, KEY_TRIGGER ); + } + + public static long getBuildStart( Map context ) + { + return getLong( context, KEY_BUILD_START ); + } + + public static long getBuildEnd( Map context ) + { + return getLong( context, KEY_BUILD_END ); + } + + public static int getBuildExitCode( Map context ) + { + return getInteger( context, KEY_BUILD_EXIT_CODE ); + } + + public static int getBuildState( Map context ) + { + return getInteger( context, KEY_BUILD_STATE ); + } + + public static String getScmCommandLine( Map context ) + { + return getString( context, KEY_SCM_COMMAND_LINE ); + } + + public static String getScmCommandOutput( Map context ) + { + return getString( context, KEY_SCM_COMMAND_OUTPUT ); + } + + public static String getScmException( Map context ) + { + return getString( context, KEY_SCM_EXCEPTION ); + } + + public static String getScmProviderMessage( Map context ) + { + return getString( context, KEY_SCM_PROVIDER_MESSAGE ); + } + + public static boolean isPrepareBuildFinished( Map context ) + { + return getBoolean( context, KEY_PREPARE_BUILD_FINISHED ); + } + + public static String getAgentUrl( Map context ) + { + return getString( context, KEY_AGENT_URL ); + } + + // ---------------------------------------------------------------------- + // + // ---------------------------------------------------------------------- + + protected static String getString( Map context, String key ) + { + return (String) getObject( context, key ); + } + + protected static String getString( Map context, String key, String defaultValue ) + { + return (String) getObject( context, key, defaultValue ); + } + + protected static boolean getBoolean( Map context, String key ) + { + return ( (Boolean) getObject( context, key ) ).booleanValue(); + } + + protected static boolean getBoolean( Map context, String key, boolean defaultValue ) + { + return ( (Boolean) getObject( context, key, Boolean.valueOf( defaultValue ) ) ).booleanValue(); + } + + protected static int getInteger( Map context, String key ) + { + Object obj = getObject( context, key, null ); + + if ( obj == null ) + { + return 0; + } + else + { + return ( (Integer) obj ).intValue(); + } + } + + protected static long getLong( Map context, String key ) + { + Object obj = getObject( context, key, null ); + + if ( obj == null ) + { + return 0; + } + else + { + return ( (Long) obj ).longValue(); + } + } + + protected static Object getObject( Map context, String key ) + { + if ( !context.containsKey( key ) ) + { + throw new RuntimeException( "Missing key '" + key + "'." ); + } + + Object value = context.get( key ); + + if ( value == null ) + { + throw new RuntimeException( "Missing value for key '" + key + "'." ); + } + + return value; + } + + protected static Object getObject( Map context, String key, Object defaultValue ) + { + Object value = context.get( key ); + + if ( value == null ) + { + return defaultValue; + } + + return value; + } +} Added: continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/continuum/distributed/manager/DefaultDistributedBuildManager.java URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/continuum/distributed/manager/DefaultDistributedBuildManager.java?rev=721318&view=auto ============================================================================== --- continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/continuum/distributed/manager/DefaultDistributedBuildManager.java (added) +++ continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/continuum/distributed/manager/DefaultDistributedBuildManager.java Thu Nov 27 16:48:48 2008 @@ -0,0 +1,494 @@ +package org.apache.continuum.distributed.manager; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.continuum.configuration.BuildAgentConfiguration; +import org.apache.continuum.dao.BuildDefinitionDao; +import org.apache.continuum.dao.BuildResultDao; +import org.apache.continuum.dao.ProjectDao; +import org.apache.continuum.dao.ProjectScmRootDao; +import org.apache.continuum.distributed.BuildAgent; +import org.apache.continuum.model.project.ProjectScmRoot; +import org.apache.maven.continuum.ContinuumException; +import org.apache.maven.continuum.configuration.ConfigurationService; +import org.apache.maven.continuum.model.project.BuildDefinition; +import org.apache.maven.continuum.model.project.BuildResult; +import org.apache.maven.continuum.model.project.Project; +import org.apache.maven.continuum.model.project.ProjectDependency; +import org.apache.maven.continuum.model.scm.ScmResult; +import org.apache.maven.continuum.project.ContinuumProjectState; +import org.apache.maven.continuum.scm.queue.PrepareBuildProjectsTask; +import org.apache.maven.continuum.store.ContinuumStoreException; +import org.apache.maven.continuum.utils.ProjectSorter; +import org.codehaus.plexus.util.StringUtils; +import org.codehaus.plexus.util.dag.CycleDetectedException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Maria Catherine Tan + * @plexus.component role="org.apache.continuum.distributed.DistributedBuildManager" + */ +public class DefaultDistributedBuildManager + extends AbstractDistributedBuildManager +{ + private Logger log = LoggerFactory.getLogger( this.getClass() ); + + /** + * @plexus.requirement + */ + private ConfigurationService configurationService; + + /** + * @plexus.requirement + */ + private ProjectDao projectDao; + + /** + * @plexus.requirement + */ + private BuildDefinitionDao buildDefinitionDao; + + /** + * @plexus.requirement + */ + private ProjectScmRootDao projectScmRootDao; + + /** + * @plexus.requirement + */ + private BuildResultDao buildResultDao; + + private List projectsBuildQueue; + + private List buildAgents; + + public void initialize() + { + List agents = configurationService.getBuildAgents(); + + if ( buildAgents == null ) + { + buildAgents = new ArrayList(); + } + + for ( BuildAgentConfiguration agent : agents ) + { + if ( agent.isEnabled() ) + { + boolean found = false; + + for ( BuildAgent buildAgent : buildAgents ) + { + if ( buildAgent.getUrl().equals( agent.getUrl() ) ) + { + found = true; + break; + } + } + + if ( !found ) + { + BuildAgent buildAgent = new BuildAgent(); + buildAgent.setUrl( agent.getUrl() ); + buildAgent.setBusy( false ); + buildAgents.add( buildAgent ); + } + } + } + } + + public void buildProjects( Map projectsAndBuildDefinitionsMap, int trigger ) + throws ContinuumException + { + buildProjects( projectsAndBuildDefinitionsMap, trigger, false ); + } + + public void buildProjectsInQueue() + throws ContinuumException + { + for ( PrepareBuildProjectsTask task : projectsBuildQueue ) + { + Map projectsAndBuildDefinitions = task.getProjectsBuildDefinitionsMap(); + int trigger = task.getTrigger(); + + buildProjects( projectsAndBuildDefinitions, trigger, true ); + } + } + + public synchronized void buildProjects( Map projectsAndBuildDefinitionsMap, int trigger, boolean inBuildQueue ) + throws ContinuumException + { + boolean found = false; + + for ( BuildAgent buildAgent : buildAgents ) + { + if ( !buildAgent.isBusy() ) + { + List buildContext = initializeBuildContext( projectsAndBuildDefinitionsMap, trigger, buildAgent ); + + //BuildAgentXMLRpcClient client = new BuildAgentXmlRpcClient( buildAgent.getUrl(), null, null ); + //client.buildProjects( buildContext ); + log.info( "dispatched build to " + buildAgent.getUrl() ); + found = true; + } + } + + if ( !found && !inBuildQueue ) + { + // all build agents are busy, put into projectBuildQueue for now + if ( projectsBuildQueue == null ) + { + projectsBuildQueue = new ArrayList(); + } + + PrepareBuildProjectsTask prepareBuildTask = new PrepareBuildProjectsTask( projectsAndBuildDefinitionsMap, trigger ); + projectsBuildQueue.add( prepareBuildTask ); + } + } + + public void updateProjectScmRoot( Map context ) + throws ContinuumException + { + try + { + int projectId = getProjectId( context ); + + Project project = projectDao.getProjectWithScmDetails( projectId ); + + ScmResult scmResult = new ScmResult(); + scmResult.setCommandLine( getScmCommandLine( context ) ); + scmResult.setCommandOutput( getScmCommandOutput( context ) ); + scmResult.setException( getScmException( context ) ); + scmResult.setProviderMessage( getScmProviderMessage( context ) ); + + String error = convertScmResultToError( scmResult ); + + if ( error == null ) + { + scmResult.setSuccess( true ); + } + else + { + scmResult.setSuccess( false ); + } + + project.setScmResult( scmResult ); + projectDao.updateProject( project ); + + if ( error != null || isPrepareBuildFinished( context ) ) + { + List scmRoots = projectScmRootDao.getProjectScmRootByProjectGroup( project.getProjectGroup().getId() ); + + for ( ProjectScmRoot scmRoot : scmRoots ) + { + if ( project.getScmUrl().startsWith( scmRoot.getScmRootAddress() ) ) + { + if ( error != null ) + { + scmRoot.setError( error ); + scmRoot.setState( ContinuumProjectState.ERROR ); + } + else + { + scmRoot.setState( ContinuumProjectState.UPDATED ); + } + projectScmRootDao.updateProjectScmRoot( scmRoot ); + } + } + } + } + catch ( ContinuumStoreException e ) + { + throw new ContinuumException( "Error updating project scm root", e ); + } + } + + public void updateBuildResult( Map context ) + throws ContinuumException + { + try + { + int projectId = getProjectId( context ); + int buildDefinitionId = getBuildDefinitionId( context ); + + Project project = projectDao.getProjectWithBuildDetails( projectId ); + BuildDefinition buildDefinition = buildDefinitionDao.getBuildDefinition( buildDefinitionId ); + + BuildResult oldBuildResult = + buildResultDao.getLatestBuildResultForBuildDefinition( projectId, buildDefinitionId ); + + int buildNumber = project.getBuildNumber() + 1; + + // ---------------------------------------------------------------------- + // Make the buildResult + // ---------------------------------------------------------------------- + + BuildResult buildResult = new BuildResult(); + + buildResult.setStartTime( getBuildStart( context ) ); + buildResult.setEndTime( getBuildEnd( context ) ); + buildResult.setBuildDefinition( buildDefinition ); + buildResult.setBuildNumber( buildNumber ); + buildResult.setError( getBuildError( context ) ); + buildResult.setExitCode( getBuildExitCode( context ) ); + buildResult.setModifiedDependencies( getModifiedDependencies( oldBuildResult, context ) ); + buildResult.setProject( project ); + buildResult.setState( getBuildState( context ) ); + buildResult.setTrigger( getTrigger( context ) ); + + buildResultDao.addBuildResult( project, buildResult ); + + project.setBuildNumber( buildNumber ); + project.setLatestBuildId( buildResult.getId() ); + project.setOldState( project.getState() ); + project.setState( getBuildState( context ) ); + + projectDao.updateProject( project ); + + updateBuildAgent( context ); + } + catch ( ContinuumStoreException e ) + { + throw new ContinuumException( "Error while updating build result for project", e ); + } + } + + public void reload() + { + this.initialize(); + } + + private List initializeBuildContext( Map projectsAndBuildDefinitions, int trigger, BuildAgent buildAgent ) + throws ContinuumException + { + List buildContext = new ArrayList(); + List projects = new ArrayList(); + + try + { + for ( Integer projectId : projectsAndBuildDefinitions.keySet() ) + { + Project project = projectDao.getProjectWithDependencies( projectId ); + projects.add( project ); + } + + try + { + projects = ProjectSorter.getSortedProjects( projects, null ); + } + catch ( CycleDetectedException e ) + { + log.info( "Cycle Detected" ); + } + + int ctr = 0; + + for ( Project project : projects ) + { + if ( ctr == 0 ) + { + List scmRoots = projectScmRootDao.getProjectScmRootByProjectGroup( project.getProjectGroup().getId() ); + for ( ProjectScmRoot scmRoot : scmRoots ) + { + if ( project.getScmUrl().startsWith( scmRoot.getScmRootAddress() ) ) + { + scmRoot.setOldState( scmRoot.getState() ); + scmRoot.setState( ContinuumProjectState.UPDATING ); + projectScmRootDao.updateProjectScmRoot( scmRoot ); + break; + } + } + } + + int buildDefinitionId = projectsAndBuildDefinitions.get( project.getId() ); + BuildDefinition buildDef = buildDefinitionDao.getBuildDefinition( buildDefinitionId ); + BuildResult oldBuildResult = + buildResultDao.getLatestBuildResultForBuildDefinition( project.getId(), buildDefinitionId ); + + Map context = new HashMap(); + context.put( KEY_PROJECT_ID, project.getId() ); + context.put( KEY_EXECUTOR_ID, project.getExecutorId() ); + context.put( KEY_SCM_URL, project.getScmUrl() ); + context.put( KEY_SCM_USERNAME, project.getScmUsername() ); + context.put( KEY_SCM_PASSWORD, project.getScmPassword() ); + context.put( KEY_BUILD_DEFINITION_ID, buildDefinitionId ); + context.put( KEY_BUILD_FILE, buildDef.getBuildFile() ); + context.put( KEY_GOALS, buildDef.getGoals() ); + context.put( KEY_ARGUMENTS, buildDef.getArguments() ); + context.put( KEY_TRIGGER, trigger ); + context.put( KEY_BUILD_FRESH, buildDef.isBuildFresh() ); + + buildContext.add( context ); + ctr++; + } + + buildAgent.setBusy( true ); + buildAgent.setProjects( projects ); + + return buildContext; + } + catch ( ContinuumStoreException e ) + { + throw new ContinuumException( "Error while initializing build context", e ); + } + } + + private List getModifiedDependencies( BuildResult oldBuildResult, Map context ) + throws ContinuumException + { + if ( oldBuildResult == null ) + { + return null; + } + + try + { + Project project = projectDao.getProjectWithAllDetails( getProjectId( context ) ); + List dependencies = project.getDependencies(); + + if ( dependencies == null ) + { + dependencies = new ArrayList(); + } + + if ( project.getParent() != null ) + { + dependencies.add( project.getParent() ); + } + + if ( dependencies.isEmpty() ) + { + return null; + } + + List modifiedDependencies = new ArrayList(); + + for ( ProjectDependency dep : dependencies ) + { + Project dependencyProject = + projectDao.getProject( dep.getGroupId(), dep.getArtifactId(), dep.getVersion() ); + + if ( dependencyProject != null ) + { + List buildResults = buildResultDao.getBuildResultsInSuccessForProject( dependencyProject.getId(), + oldBuildResult.getEndTime() ); + if ( buildResults != null && !buildResults.isEmpty() ) + { + log.debug( "Dependency changed: " + dep.getGroupId() + ":" + dep.getArtifactId() + ":" + + dep.getVersion() ); + modifiedDependencies.add( dep ); + } + else + { + log.debug( "Dependency not changed: " + dep.getGroupId() + ":" + dep.getArtifactId() + + ":" + dep.getVersion() ); + } + } + else + { + log.debug( "Skip non Continuum project: " + dep.getGroupId() + ":" + dep.getArtifactId() + + ":" + dep.getVersion() ); + } + } + + return modifiedDependencies; + } + catch ( ContinuumStoreException e ) + { + log.warn( "Can't get the project dependencies", e ); + } + + return null; + } + + private String convertScmResultToError( ScmResult result ) + { + String error = ""; + + if ( result == null ) + { + error = "Scm result is null."; + } + else + { + if ( result.getCommandLine() != null ) + { + error = "Command line: " + StringUtils.clean( result.getCommandLine() ) + + System.getProperty( "line.separator" ); + } + + if ( result.getProviderMessage() != null ) + { + error = "Provider message: " + StringUtils.clean( result.getProviderMessage() ) + + System.getProperty( "line.separator" ); + } + + if ( result.getCommandOutput() != null ) + { + error += "Command output: " + System.getProperty( "line.separator" ); + error += "-------------------------------------------------------------------------------" + + System.getProperty( "line.separator" ); + error += StringUtils.clean( result.getCommandOutput() ) + System.getProperty( "line.separator" ); + error += "-------------------------------------------------------------------------------" + + System.getProperty( "line.separator" ); + } + + if ( result.getException() != null ) + { + error += "Exception:" + System.getProperty( "line.separator" ); + error += result.getException(); + } + } + + return error; + } + + private void updateBuildAgent( Map context ) + throws ContinuumException + { + for ( BuildAgent buildAgent : buildAgents ) + { + if ( buildAgent.getUrl().equals( getAgentUrl( context ) ) ) + { + for ( Project project : buildAgent.getProjects() ) + { + if ( project.getId() == getProjectId( context ) ) + { + buildAgent.getProjects().remove( project ); + break; + } + } + + if ( buildAgent.getProjects() == null || buildAgent.getProjects().size() == 0 ) + { + buildAgent.setBusy( false ); + buildProjectsInQueue(); + } + } + } + } + +} Modified: continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java?rev=721318&r1=721317&r2=721318&view=diff ============================================================================== --- continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java (original) +++ continuum/branches/continuum-distributed-builds/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java Thu Nov 27 16:48:48 2008 @@ -43,6 +43,7 @@ import org.apache.continuum.dao.ProjectGroupDao; import org.apache.continuum.dao.ProjectScmRootDao; import org.apache.continuum.dao.ScheduleDao; +import org.apache.continuum.distributed.manager.DistributedBuildManager; import org.apache.continuum.model.project.ProjectScmRoot; import org.apache.continuum.model.release.ContinuumReleaseResult; import org.apache.continuum.purge.ContinuumPurgeManager; @@ -220,7 +221,6 @@ private PlexusContainer container; - /** * @plexus.requirement role-hint="continuumUrl" */ @@ -248,6 +248,11 @@ */ private TaskQueueManager taskQueueManager; + /** + * @plexus.requirement + */ + private DistributedBuildManager distributedBuildManager; + public DefaultContinuum() { Runtime.getRuntime().addShutdownHook( new Thread() @@ -3354,7 +3359,7 @@ { if ( configurationService.isDistributedBuildEnabled() ) { - + distributedBuildManager.buildProjects( projectsBuildDefinitionsMap, trigger ); } else { Modified: continuum/branches/continuum-distributed-builds/continuum-core/src/main/resources/META-INF/spring-context.xml URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-core/src/main/resources/META-INF/spring-context.xml?rev=721318&r1=721317&r2=721318&view=diff ============================================================================== --- continuum/branches/continuum-distributed-builds/continuum-core/src/main/resources/META-INF/spring-context.xml (original) +++ continuum/branches/continuum-distributed-builds/continuum-core/src/main/resources/META-INF/spring-context.xml Thu Nov 27 16:48:48 2008 @@ -32,5 +32,13 @@ - + + + + + + + + Added: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/AbstractContinuumBuildAgentService.java URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/AbstractContinuumBuildAgentService.java?rev=721318&view=auto ============================================================================== --- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/AbstractContinuumBuildAgentService.java (added) +++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/AbstractContinuumBuildAgentService.java Thu Nov 27 16:48:48 2008 @@ -0,0 +1,165 @@ +package org.apache.continuum.buildagent; + +import java.util.Map; + +public abstract class AbstractContinuumBuildAgentService + implements ContinuumBuildAgentService +{ + public static final String KEY_PROJECT_ID = "project-id"; + + public static final String KEY_BUILD_DEFINITION_ID = "builddefinition-id"; + + public static final String KEY_TRIGGER = "trigger"; + + public static final String KEY_EXECUTOR_ID = "executor-id"; + + public static final String KEY_SCM_URL = "scm-url"; + + public static final String KEY_SCM_USERNAME = "scm-username"; + + public static final String KEY_SCM_PASSWORD = "scm-password"; + + public static final String KEY_BUILD_FILE = "build-file"; + + public static final String KEY_GOALS = "goals"; + + public static final String KEY_ARGUMENTS = "arguments"; + + public static final String KEY_BUILD_FRESH = "build-fresh"; + + public static final String KEY_BUILD_START = "build-start"; + + public static final String KEY_BUILD_END = "build-end"; + + public static final String KEY_BUILD_ERROR = "build-error"; + + public static final String KEY_BUILD_EXIT_CODE = "build-exit-code"; + + public static final String KEY_BUILD_STATE = "build-state"; + + public static final String KEY_SCM_STATE = "scm-state"; + + public static final String KEY_SCM_COMMAND_OUTPUT = "scm-command-output"; + + public static final String KEY_SCM_COMMAND_LINE = "scm-command-line"; + + public static final String KEY_SCM_PROVIDER_MESSAGE = "scm-provider-message"; + + public static final String KEY_SCM_EXCEPTION = "scm-exception"; + + public static Integer getProjectId( Map context ) + { + return getInteger( context, KEY_PROJECT_ID ); + } + + public static Integer getBuildDefinitionId( Map context ) + { + return getInteger( context, KEY_BUILD_DEFINITION_ID ); + } + + public static String getBuildFile( Map context ) + { + return getString( context, KEY_BUILD_FILE ); + } + + public static String getExecutorId( Map context ) + { + return getString( context, KEY_EXECUTOR_ID ); + } + + public static String getGoals( Map context ) + { + return getString( context, KEY_GOALS ); + } + + public static String getArguments( Map context ) + { + return getString( context, KEY_ARGUMENTS ); + } + + public static String getScmUrl( Map context ) + { + return getString( context, KEY_SCM_URL ); + } + + public static String getScmUsername( Map context ) + { + return getString( context, KEY_SCM_USERNAME ); + } + + public static String getScmPassword( Map context ) + { + return getString( context, KEY_SCM_PASSWORD ); + } + + public static boolean isBuildFresh( Map context ) + { + return getBoolean( context, KEY_BUILD_FRESH ); + } + // ---------------------------------------------------------------------- + // + // ---------------------------------------------------------------------- + + protected static String getString( Map context, String key ) + { + return (String) getObject( context, key ); + } + + protected static String getString( Map context, String key, String defaultValue ) + { + return (String) getObject( context, key, defaultValue ); + } + + protected static boolean getBoolean( Map context, String key ) + { + return ( (Boolean) getObject( context, key ) ).booleanValue(); + } + + protected static boolean getBoolean( Map context, String key, boolean defaultValue ) + { + return ( (Boolean) getObject( context, key, Boolean.valueOf( defaultValue ) ) ).booleanValue(); + } + + protected static int getInteger( Map context, String key ) + { + Object obj = getObject( context, key, null ); + + if ( obj == null ) + { + return 0; + } + else + { + return ( (Integer) obj ).intValue(); + } + } + + protected static Object getObject( Map context, String key ) + { + if ( !context.containsKey( key ) ) + { + throw new RuntimeException( "Missing key '" + key + "'." ); + } + + Object value = context.get( key ); + + if ( value == null ) + { + throw new RuntimeException( "Missing value for key '" + key + "'." ); + } + + return value; + } + + protected static Object getObject( Map context, String key, Object defaultValue ) + { + Object value = context.get( key ); + + if ( value == null ) + { + return defaultValue; + } + + return value; + } +} Modified: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentService.java URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentService.java?rev=721318&r1=721317&r2=721318&view=diff ============================================================================== --- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentService.java (original) +++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentService.java Thu Nov 27 16:48:48 2008 @@ -7,7 +7,7 @@ public interface ContinuumBuildAgentService { - void buildProject( List projectsBuildContext ) + void buildProjects( List projectsBuildContext ) throws ContinuumBuildAgentException; List getAvailableInstallations() Modified: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentServiceImpl.java URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentServiceImpl.java?rev=721318&r1=721317&r2=721318&view=diff ============================================================================== --- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentServiceImpl.java (original) +++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentServiceImpl.java Thu Nov 27 16:48:48 2008 @@ -1,41 +1,34 @@ package org.apache.continuum.buildagent; +import java.util.ArrayList; import java.util.List; import java.util.Map; -import org.apache.continuum.buildagent.configuration.ContinuumBuildAgentConfiguration; -import org.apache.continuum.buildagent.configuration.ContinuumConfiguration; -import org.apache.continuum.buildagent.configuration.ContinuumConfigurationException; +import org.apache.continuum.buildagent.configuration.ConfigurationService; +import org.apache.continuum.buildagent.model.BuildContext; import org.apache.continuum.buildagent.model.Installation; public class ContinuumBuildAgentServiceImpl - implements ContinuumBuildAgentService + extends AbstractContinuumBuildAgentService { /** * @plexus.requirement */ - private ContinuumConfiguration configuration; + private ConfigurationService configurationService; - private ContinuumBuildAgentConfiguration buildAgentConfiguration; - - public void initialize() + public void buildProjects( List projectsBuildContext ) throws ContinuumBuildAgentException { - loadData(); - } + List buildContext = initializeBuildContext( projectsBuildContext ); - public void buildProject( List projectsBuildContext ) - throws ContinuumBuildAgentException - { - // TODO Auto-generated method stub + prepareBuildProjects( buildContext ); } public List getAvailableInstallations() throws ContinuumBuildAgentException { - // TODO Auto-generated method stub - return null; + return configurationService.getAvailableInstallations(); } public Map getBuildResult( int projectId ) @@ -52,22 +45,50 @@ return false; } - private void loadData() - throws ContinuumBuildAgentException + public int getProjectCurrentlyBuilding() + { + // TODO Auto-generated method stub + return 0; + } + + private List initializeBuildContext( List projectsBuildContext ) { - try + List buildContext = new ArrayList(); + + for ( Map map : projectsBuildContext ) { - buildAgentConfiguration = configuration.getContinuumBuildAgentConfiguration(); + BuildContext context = new BuildContext(); + context.setProjectId( getProjectId( map ) ); + context.setBuildDefinitionId( getBuildDefinitionId( map ) ); + context.setBuildFile( getBuildFile( map ) ); + context.setExecutorId( getExecutorId( map ) ); + context.setGoals( getGoals( map ) ); + context.setArguments( getArguments( map ) ); + context.setScmUrl( getScmUrl( map ) ); + context.setScmUsername( getScmUsername( map ) ); + context.setScmPassword( getScmPassword( map ) ); + context.setBuildFresh( isBuildFresh( map ) ); + + buildContext.add( context ); } - catch ( ContinuumConfigurationException e ) + + return buildContext; + } + + private void prepareBuildProjects( List context ) + { + for ( BuildContext buildContext : context ) { - throw new ContinuumBuildAgentException( "Unable to load build agent configuration", e ); + if ( buildContext.isBuildFresh() ) + { + // clean working directory + cleanWorkingDirectory( buildContext ); + } } } - public int getProjectCurrentlyBuilding() + private void cleanWorkingDirectory( BuildContext context ) { - // TODO Auto-generated method stub - return 0; + } } Added: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/configuration/ConfigurationService.java URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/configuration/ConfigurationService.java?rev=721318&view=auto ============================================================================== --- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/configuration/ConfigurationService.java (added) +++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/configuration/ConfigurationService.java Thu Nov 27 16:48:48 2008 @@ -0,0 +1,29 @@ +package org.apache.continuum.buildagent.configuration; + +import java.io.File; +import java.util.List; + +import org.apache.continuum.buildagent.model.Installation; + +public interface ConfigurationService +{ + String ROLE = ConfigurationService.class.getName(); + + File getBuildOutputDirectory(); + + File getBuildOutputDirectory( int projectId ); + + File getWorkingDirectory(); + + File getWorkingDirectory( int projectId ); + + String getContinuumServerUrl(); + + String getBuildOutput( int projectId ) + throws ContinuumConfigurationException; + + File getBuildOutputFile( int projectId ) + throws ContinuumConfigurationException; + + List getAvailableInstallations(); +} Added: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/configuration/DefaultConfigurationService.java URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/configuration/DefaultConfigurationService.java?rev=721318&view=auto ============================================================================== --- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/configuration/DefaultConfigurationService.java (added) +++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/configuration/DefaultConfigurationService.java Thu Nov 27 16:48:48 2008 @@ -0,0 +1,123 @@ +package org.apache.continuum.buildagent.configuration; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +import org.apache.continuum.buildagent.model.Installation; +import org.codehaus.plexus.util.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DefaultConfigurationService + implements ConfigurationService +{ + private Logger log = LoggerFactory.getLogger( this.getClass() ); + + /** + * @plexus.requirement + */ + private ContinuumConfiguration configuration; + + private ContinuumBuildAgentConfiguration buildAgentConfiguration; + + public void initialize() + throws ContinuumConfigurationException + { + loadData(); + } + + public ContinuumConfiguration getConfiguration() + { + return configuration; + } + + public void setConfiguration( ContinuumConfiguration configuration ) + { + this.configuration = configuration; + } + + public File getBuildOutputDirectory() + { + return buildAgentConfiguration.getBuildOutputDirectory(); + } + + public File getBuildOutputDirectory( int projectId ) + { + File dir = new File( getBuildOutputDirectory(), Integer.toString( projectId ) ); + + try + { + dir = dir.getCanonicalFile(); + } + catch ( IOException e ) + { + } + + return dir; + } + + public File getWorkingDirectory() + { + return buildAgentConfiguration.getWorkingDirectory(); + } + + public File getWorkingDirectory( int projectId ) + { + return new File( buildAgentConfiguration.getWorkingDirectory(), Integer.toString( projectId ) ); + } + + public String getBuildOutput( int projectId ) + throws ContinuumConfigurationException + { + File file = getBuildOutputFile( projectId ); + + try + { + if ( file.exists() ) + { + return FileUtils.fileRead( file.getAbsolutePath() ); + } + else + { + return "There are no output for this build."; + } + } + catch ( IOException e ) + { + log.warn( "Error reading build output for project '" + projectId + "'.", e ); + + return null; + } + } + + public File getBuildOutputFile( int projectId ) + throws ContinuumConfigurationException + { + File dir = getBuildOutputDirectory( projectId ); + + if ( !dir.exists() && !dir.mkdirs() ) + { + throw new ContinuumConfigurationException( + "Could not make the build output directory: " + "'" + dir.getAbsolutePath() + "'." ); + } + + return new File( dir, "build.log.txt" ); + } + + public String getContinuumServerUrl() + { + return buildAgentConfiguration.getContinuumServerUrl(); + } + + public List getAvailableInstallations() + { + return buildAgentConfiguration.getInstallations(); + } + + private void loadData() + throws ContinuumConfigurationException + { + buildAgentConfiguration = configuration.getContinuumBuildAgentConfiguration(); + } +} Added: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/model/BuildContext.java URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/model/BuildContext.java?rev=721318&view=auto ============================================================================== --- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/model/BuildContext.java (added) +++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/src/main/java/org/apache/continuum/buildagent/model/BuildContext.java Thu Nov 27 16:48:48 2008 @@ -0,0 +1,136 @@ +package org.apache.continuum.buildagent.model; + +public class BuildContext +{ + private int projectId; + + private int buildDefinitionId; + + private String buildFile; + + private String goals; + + private String arguments; + + private String executorId; + + private String scmUrl; + + private String scmUsername; + + private String scmPassword; + + private int trigger; + + private boolean buildFresh; + + public int getProjectId() + { + return projectId; + } + + public void setProjectId( int projectId ) + { + this.projectId = projectId; + } + + public int getBuildDefinitionId() + { + return buildDefinitionId; + } + + public void setBuildDefinitionId( int buildDefinitionId ) + { + this.buildDefinitionId = buildDefinitionId; + } + + public String getBuildFile() + { + return buildFile; + } + + public void setBuildFile( String buildFile ) + { + this.buildFile = buildFile; + } + + public String getGoals() + { + return goals; + } + + public void setGoals( String goals ) + { + this.goals = goals; + } + + public String getArguments() + { + return arguments; + } + + public void setArguments( String arguments ) + { + this.arguments = arguments; + } + + public String getExecutorId() + { + return executorId; + } + + public void setExecutorId( String executorId ) + { + this.executorId = executorId; + } + + public String getScmUrl() + { + return scmUrl; + } + + public void setScmUrl( String scmUrl ) + { + this.scmUrl = scmUrl; + } + + public String getScmUsername() + { + return scmUsername; + } + + public void setScmUsername( String scmUsername ) + { + this.scmUsername = scmUsername; + } + + public String getScmPassword() + { + return scmPassword; + } + + public void setScmPassword( String scmPassword ) + { + this.scmPassword = scmPassword; + } + + public int getTrigger() + { + return trigger; + } + + public void setTrigger( int trigger ) + { + this.trigger = trigger; + } + + public boolean isBuildFresh() + { + return buildFresh; + } + + public void setBuildFresh( boolean buildFresh ) + { + this.buildFresh = buildFresh; + } +} Modified: continuum/branches/continuum-distributed-builds/continuum-store/src/main/java/org/apache/continuum/dao/ProjectDaoImpl.java URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-store/src/main/java/org/apache/continuum/dao/ProjectDaoImpl.java?rev=721318&r1=721317&r2=721318&view=diff ============================================================================== --- continuum/branches/continuum-distributed-builds/continuum-store/src/main/java/org/apache/continuum/dao/ProjectDaoImpl.java (original) +++ continuum/branches/continuum-distributed-builds/continuum-store/src/main/java/org/apache/continuum/dao/ProjectDaoImpl.java Thu Nov 27 16:48:48 2008 @@ -297,4 +297,10 @@ } } + + public Project getProjectWithDependencies( int projectId ) + throws ContinuumStoreException + { + return (Project) getObjectById( Project.class, projectId, PROJECT_DEPENDENCIES_FETCH_GROUP ); + } } Modified: continuum/branches/continuum-distributed-builds/continuum-test/src/main/java/org/apache/maven/continuum/configuration/ConfigurationServiceMock.java URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-test/src/main/java/org/apache/maven/continuum/configuration/ConfigurationServiceMock.java?rev=721318&r1=721317&r2=721318&view=diff ============================================================================== --- continuum/branches/continuum-distributed-builds/continuum-test/src/main/java/org/apache/maven/continuum/configuration/ConfigurationServiceMock.java (original) +++ continuum/branches/continuum-distributed-builds/continuum-test/src/main/java/org/apache/maven/continuum/configuration/ConfigurationServiceMock.java Thu Nov 27 16:48:48 2008 @@ -19,10 +19,12 @@ * under the License. */ +import org.apache.continuum.configuration.BuildAgentConfiguration; import org.apache.maven.continuum.model.project.Schedule; import org.apache.maven.continuum.store.ContinuumStoreException; import java.io.File; +import java.util.List; import java.util.Map; /** @@ -240,4 +242,27 @@ return null; } + public void addBuildAgent( BuildAgentConfiguration buildAgent ) + throws ConfigurationException + { + } + + public List getBuildAgents() + { + return null; + } + + public boolean isDistributedBuildEnabled() + { + return false; + } + + public void removeBuildAgent( BuildAgentConfiguration buildAgent ) + { + } + + public void setDistributedBuildEnabled( boolean distributedBuildEnabled ) + { + } + }