You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@continuum.apache.org by ct...@apache.org on 2008/12/15 17:23:54 UTC

svn commit: r726727 [1/2] - in /continuum/branches/continuum-distributed-builds: continuum-builder/src/main/java/org/apache/continuum/builder/distributed/executor/ continuum-builder/src/main/java/org/apache/continuum/builder/utils/ continuum-distribute...

Author: ctan
Date: Mon Dec 15 08:23:53 2008
New Revision: 726727

URL: http://svn.apache.org/viewvc?rev=726727&view=rev
Log:
slave agent implementation

Added:
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/Continuum.java   (with props)
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/DefaultContinuum.java   (with props)
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/ant/
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/ant/AntBuildExecutor.java   (with props)
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m1/   (with props)
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m1/MavenOneBuildExecutor.java
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/DefaultMavenBuilderHelper.java   (with props)
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/MavenBuilderHelper.java   (with props)
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/MavenTwoBuildExecutor.java   (with props)
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/SettingsConfigurationException.java   (with props)
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/shell/
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/shell/ShellBuildExecutor.java   (with props)
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/installation/
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/installation/DefaultInstallationService.java   (with props)
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/installation/InstallationService.java   (with props)
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/manager/DefaultTaskQueueManager.java   (with props)
Removed:
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/action/DeployArtifactAction.java
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/execution/PrepareBuildTaskExecutor.java
Modified:
    continuum/branches/continuum-distributed-builds/continuum-builder/src/main/java/org/apache/continuum/builder/distributed/executor/DistributedBuildProjectTaskExecutor.java
    continuum/branches/continuum-distributed-builds/continuum-builder/src/main/java/org/apache/continuum/builder/utils/ContinuumBuildConstant.java
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-api/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentService.java
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentServiceImpl.java
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/action/ExecuteBuilderAction.java
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/AbstractBuildExecutor.java
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/buildcontext/BuildContext.java
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/execution/BuildProjectTaskExecutor.java
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/manager/TaskQueueManager.java
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/utils/BuildContextToProject.java
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/utils/ContinuumBuildAgentUtil.java
    continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/resources/META-INF/plexus/components.xml

Modified: continuum/branches/continuum-distributed-builds/continuum-builder/src/main/java/org/apache/continuum/builder/distributed/executor/DistributedBuildProjectTaskExecutor.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-builder/src/main/java/org/apache/continuum/builder/distributed/executor/DistributedBuildProjectTaskExecutor.java?rev=726727&r1=726726&r2=726727&view=diff
==============================================================================
--- continuum/branches/continuum-distributed-builds/continuum-builder/src/main/java/org/apache/continuum/builder/distributed/executor/DistributedBuildProjectTaskExecutor.java (original)
+++ continuum/branches/continuum-distributed-builds/continuum-builder/src/main/java/org/apache/continuum/builder/distributed/executor/DistributedBuildProjectTaskExecutor.java Mon Dec 15 08:23:53 2008
@@ -147,6 +147,7 @@
                 context.put( ContinuumBuildConstant.KEY_PROJECT_GROUP_ID, new Integer( project.getProjectGroup().getId() ) );
                 context.put( ContinuumBuildConstant.KEY_SCM_ROOT_ADDRESS, scmRootAddress );
                 context.put( ContinuumBuildConstant.KEY_PROJECT_ID, new Integer( project.getId() ) );
+                context.put( ContinuumBuildConstant.KEY_PROJECT_NAME, project.getName() );
                 context.put( ContinuumBuildConstant.KEY_EXECUTOR_ID, project.getExecutorId() );
                 context.put( ContinuumBuildConstant.KEY_SCM_URL, project.getScmUrl() );
 

Modified: continuum/branches/continuum-distributed-builds/continuum-builder/src/main/java/org/apache/continuum/builder/utils/ContinuumBuildConstant.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-builder/src/main/java/org/apache/continuum/builder/utils/ContinuumBuildConstant.java?rev=726727&r1=726726&r2=726727&view=diff
==============================================================================
--- continuum/branches/continuum-distributed-builds/continuum-builder/src/main/java/org/apache/continuum/builder/utils/ContinuumBuildConstant.java (original)
+++ continuum/branches/continuum-distributed-builds/continuum-builder/src/main/java/org/apache/continuum/builder/utils/ContinuumBuildConstant.java Mon Dec 15 08:23:53 2008
@@ -52,6 +52,8 @@
 
     public static final String KEY_SCM_ERROR = "scm-error";
 
+    public static final String KEY_PROJECT_NAME = "project-name";
+
     public static int getProjectId( Map context )
     {
         return getInteger( context, KEY_PROJECT_ID );

Modified: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-api/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/continuum-buildagent-api/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentService.java?rev=726727&r1=726726&r2=726727&view=diff
==============================================================================
--- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-api/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentService.java (original)
+++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-api/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentService.java Mon Dec 15 08:23:53 2008
@@ -19,7 +19,8 @@
     Map getBuildResult( int projectId )
         throws ContinuumBuildAgentException;
     
-    int getProjectCurrentlyBuilding();
+    int getProjectCurrentlyBuilding()
+        throws ContinuumBuildAgentException;
     
     void cancelBuild()
         throws ContinuumBuildAgentException;

Added: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/Continuum.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/Continuum.java?rev=726727&view=auto
==============================================================================
--- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/Continuum.java (added)
+++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/Continuum.java Mon Dec 15 08:23:53 2008
@@ -0,0 +1,14 @@
+package org.apache.continuum.buildagent;
+
+import java.util.List;
+
+import org.apache.continuum.buildagent.buildcontext.BuildContext;
+import org.apache.maven.continuum.ContinuumException;
+
+public interface Continuum
+{
+    String ROLE = Continuum.class.getName();
+
+    void prepareBuildProjects( List<BuildContext> buildContextList )
+        throws ContinuumException;
+}

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/Continuum.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/Continuum.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/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/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentServiceImpl.java?rev=726727&r1=726726&r2=726727&view=diff
==============================================================================
--- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentServiceImpl.java (original)
+++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentServiceImpl.java Mon Dec 15 08:23:53 2008
@@ -7,7 +7,10 @@
 import org.apache.continuum.buildagent.buildcontext.BuildContext;
 import org.apache.continuum.buildagent.configuration.ConfigurationService;
 import org.apache.continuum.buildagent.model.Installation;
+import org.apache.continuum.buildagent.taskqueue.manager.TaskQueueManager;
 import org.apache.continuum.buildagent.utils.ContinuumBuildAgentUtil;
+import org.apache.continuum.taskqueue.manager.TaskQueueManagerException;
+import org.apache.maven.continuum.ContinuumException;
 
 public class ContinuumBuildAgentServiceImpl
     implements ContinuumBuildAgentService
@@ -17,17 +20,28 @@
      */
     private ConfigurationService configurationService;
 
+    /**
+     * @plexus.requirement
+     */
+    private Continuum continuum;
+
+    /**
+     * @plexus.requirement
+     */
+    private TaskQueueManager taskQueueManager;
+
     public void buildProjects( List<Map> projectsBuildContext )
         throws ContinuumBuildAgentException
     {
-        List<BuildContext> buildContext = initializeBuildContext( projectsBuildContext );
+        List<BuildContext> buildContextList = initializeBuildContext( projectsBuildContext );
 
         try
         {
-            Thread.sleep( 60000 );
+            continuum.prepareBuildProjects( buildContextList );
         }
-        catch ( InterruptedException e )
+        catch ( ContinuumException e )
         {
+            throw new ContinuumBuildAgentException( e.getMessage(), e );
         }
     }
 
@@ -45,22 +59,34 @@
     }
 
     public boolean isBusy()
-        throws ContinuumBuildAgentException
     {
-        // TODO Auto-generated method stub
         return false;
     }
 
     public int getProjectCurrentlyBuilding()
+        throws ContinuumBuildAgentException
     {
-        // TODO Auto-generated method stub
-        return 0;
+        try
+        {
+            return taskQueueManager.getCurrentProjectInBuilding();
+        }
+        catch ( TaskQueueManagerException e )
+        {
+            throw new ContinuumBuildAgentException( e.getMessage(), e );
+        }
     }
 
     public void cancelBuild()
         throws ContinuumBuildAgentException
     {
-        
+        try
+        {
+            taskQueueManager.cancelBuild();
+        }
+        catch ( TaskQueueManagerException e )
+        {
+            throw new ContinuumBuildAgentException( e.getMessage(), e );
+        }
     }
 
     private List<BuildContext> initializeBuildContext( List<Map> projectsBuildContext )
@@ -82,6 +108,7 @@
             context.setBuildFresh( ContinuumBuildAgentUtil.isBuildFresh( map ) );
             context.setProjectGroupId( ContinuumBuildAgentUtil.getProjectGroupId( map ) );
             context.setScmRootAddress( ContinuumBuildAgentUtil.getScmRootAddress( map ) );
+            context.setProjectName( ContinuumBuildAgentUtil.getProjectName( map ) );
             
             buildContext.add( context );
         }
@@ -98,4 +125,24 @@
     {
         this.configurationService = configurationService;
     }
+    
+    public Continuum getContinuum()
+    {
+        return continuum;
+    }
+
+    public void setContinuum( Continuum continuum )
+    {
+        this.continuum = continuum;
+    }
+
+    public TaskQueueManager getTaskQueueManager()
+    {
+        return taskQueueManager;
+    }
+
+    public void setTaskQueueManager( TaskQueueManager taskQueueManager )
+    {
+        this.taskQueueManager = taskQueueManager;
+    }
 }

Added: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/DefaultContinuum.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/DefaultContinuum.java?rev=726727&view=auto
==============================================================================
--- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/DefaultContinuum.java (added)
+++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/DefaultContinuum.java Mon Dec 15 08:23:53 2008
@@ -0,0 +1,338 @@
+package org.apache.continuum.buildagent;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.continuum.buildagent.buildcontext.BuildContext;
+import org.apache.continuum.buildagent.buildcontext.manager.BuildContextManager;
+import org.apache.continuum.buildagent.configuration.ConfigurationService;
+import org.apache.continuum.buildagent.taskqueue.manager.TaskQueueManager;
+import org.apache.continuum.buildagent.utils.BuildContextToBuildDefinition;
+import org.apache.continuum.buildagent.utils.BuildContextToProject;
+import org.apache.continuum.buildagent.utils.ContinuumBuildAgentUtil;
+import org.apache.continuum.taskqueue.BuildProjectTask;
+import org.apache.continuum.utils.ContinuumUtils;
+import org.apache.maven.continuum.ContinuumException;
+import org.apache.maven.continuum.model.project.BuildDefinition;
+import org.apache.maven.continuum.model.project.Project;
+import org.apache.maven.continuum.model.scm.ScmResult;
+import org.apache.maven.continuum.project.ContinuumProjectState;
+import org.codehaus.plexus.action.ActionManager;
+import org.codehaus.plexus.action.ActionNotFoundException;
+import org.codehaus.plexus.taskqueue.TaskQueueException;
+import org.codehaus.plexus.util.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @plexus.component role="org.apache.continuum.buildagent.Continuum" role-hint="default"
+ */
+public class DefaultContinuum
+    implements Continuum
+{
+    private Logger log = LoggerFactory.getLogger( this.getClass() );
+
+    /**
+     * @plexus.requirement
+     */
+    private ActionManager actionManager;
+
+    /**
+     * @plexus.requirement
+     */
+    private ConfigurationService configurationService;
+
+    /**
+     * @plexus.requirement
+     */
+    private TaskQueueManager taskQueueManager;
+
+    public void prepareBuildProjects( List<BuildContext> buildContexts)
+        throws ContinuumException
+    {
+        Map<String, Object> context = null;
+
+        try
+        {
+            for ( BuildContext buildContext : buildContexts )
+            {
+                context = buildContext.getActionContext();
+
+                BuildDefinition buildDef = BuildContextToBuildDefinition.getBuildDefinition( buildContext );
+    
+                log.info( "Check scm root state" );
+                if ( !checkProjectScmRoot( context ) )
+                {
+                    break;
+                }
+                
+                log.info( "Initializing prepare build" );
+                initializeActionContext( buildContext );
+                
+                log.info( "Starting prepare build" );
+
+                try
+                {
+                    if ( buildDef.isBuildFresh() )
+                    {
+                        log.info( "Clean up working directory" );
+                        cleanWorkingDirectory( buildContext );
+                    }
+        
+                    log.info( "Updating working directory" );
+                    updateWorkingDirectory( buildContext );
+                }
+                finally
+                {
+                    endProjectPrepareBuild( buildContext );
+                }
+            }
+        }
+        finally
+        {
+            endPrepareBuild( context );
+        }
+
+        if ( !checkProjectScmRoot( context ) )
+        {
+            buildProjects( buildContexts );
+        }
+    }
+
+    private void initializeActionContext( BuildContext buildContext )
+    {
+        Map<String, Object> actionContext = new HashMap<String, Object>();
+
+        actionContext.put( ContinuumBuildAgentUtil.KEY_PROJECT_ID, buildContext.getProjectId() );
+        actionContext.put( ContinuumBuildAgentUtil.KEY_PROJECT, BuildContextToProject.getProject( buildContext ) );
+        actionContext.put( ContinuumBuildAgentUtil.KEY_BUILD_DEFINITION, BuildContextToBuildDefinition.getBuildDefinition( buildContext ) );
+        actionContext.put( ContinuumBuildAgentUtil.KEY_SCM_ROOT_STATE, ContinuumProjectState.UPDATING );
+        actionContext.put( ContinuumBuildAgentUtil.KEY_PROJECT_GROUP_ID, buildContext.getProjectGroupId() );
+        actionContext.put( ContinuumBuildAgentUtil.KEY_SCM_ROOT_ADDRESS, buildContext.getScmRootAddress() );
+        
+        buildContext.setActionContext( actionContext );
+    }
+
+    private boolean checkProjectScmRoot( Map context )
+    {
+        if ( context != null && ContinuumBuildAgentUtil.getScmRootState( context ) == ContinuumProjectState.ERROR )
+        {
+            return false;
+        }
+
+        return true;
+    }
+
+    private void cleanWorkingDirectory( BuildContext buildContext )
+        throws ContinuumException
+    {
+        performAction( "clean-agent-work-directory", buildContext );
+    }
+
+    private void updateWorkingDirectory( BuildContext buildContext )
+        throws ContinuumException
+    {
+        Map<String, Object> actionContext = buildContext.getActionContext();
+
+        performAction( "check-agent-working-directory", buildContext );
+        
+        boolean workingDirectoryExists =
+            ContinuumBuildAgentUtil.getBoolean( actionContext, ContinuumBuildAgentUtil.KEY_WORKING_DIRECTORY_EXISTS );
+    
+        ScmResult scmResult;
+    
+        if ( workingDirectoryExists )
+        {
+            performAction( "update-agent-working-directory", buildContext );
+    
+            scmResult = ContinuumBuildAgentUtil.getUpdateScmResult( actionContext, null );
+        }
+        else
+        {
+            Project project = ContinuumBuildAgentUtil.getProject( actionContext );
+    
+            actionContext.put( ContinuumBuildAgentUtil.KEY_WORKING_DIRECTORY,
+                               configurationService.getWorkingDirectory( project.getId() ).getAbsolutePath() );
+    
+            performAction( "checkout-project", buildContext );
+    
+            scmResult = ContinuumBuildAgentUtil.getCheckoutScmResult( actionContext, null );
+        }
+    
+        buildContext.setScmResult( scmResult );
+        actionContext.put( ContinuumBuildAgentUtil.KEY_SCM_RESULT, scmResult );
+    }
+
+    private void endProjectPrepareBuild( BuildContext buildContext )
+        throws ContinuumException
+    {
+        Map<String, Object> context = buildContext.getActionContext();
+
+        ScmResult scmResult = ContinuumBuildAgentUtil.getScmResult( context, null );
+        Project project = ContinuumBuildAgentUtil.getProject( context );
+
+        if ( scmResult == null || !scmResult.isSuccess() )
+        {
+            context.put( ContinuumBuildAgentUtil.KEY_SCM_ROOT_STATE, ContinuumProjectState.ERROR );
+        }
+    }
+
+    private void endPrepareBuild( Map context )
+        throws ContinuumException
+    {
+        Map<String, Object> result = new HashMap<String, Object>();
+        result.put( ContinuumBuildAgentUtil.KEY_PROJECT_GROUP_ID, new Integer( ContinuumBuildAgentUtil.getProjectGroupId( context ) ) );
+        result.put( ContinuumBuildAgentUtil.KEY_SCM_ROOT_ADDRESS, ContinuumBuildAgentUtil.getScmRootAddress( context ) );
+        
+        String error = convertScmResultToError( ContinuumBuildAgentUtil.getScmResult( context, null ) );
+        if ( StringUtils.isEmpty( error ) )
+        {
+            result.put( ContinuumBuildAgentUtil.KEY_SCM_ERROR, "" );
+        }
+        else
+        {
+            result.put( ContinuumBuildAgentUtil.KEY_SCM_ERROR, error );
+        }
+    }
+
+    private Map<String, Object> createScmResult( BuildContext buildContext )
+    {
+        Map<String, Object> result = new HashMap<String, Object>();
+        ScmResult scmResult = buildContext.getScmResult();
+
+        result.put( ContinuumBuildAgentUtil.KEY_PROJECT_ID, new Integer( buildContext.getProjectId() ) );
+        if ( StringUtils.isEmpty( scmResult.getCommandLine() ) )
+        {
+            result.put( ContinuumBuildAgentUtil.KEY_SCM_COMMAND_LINE, "" );
+        }
+        else
+        {
+            result.put( ContinuumBuildAgentUtil.KEY_SCM_COMMAND_LINE, scmResult.getCommandLine() );
+        }
+        if ( StringUtils.isEmpty( scmResult.getCommandOutput() ) )
+        {
+            result.put( ContinuumBuildAgentUtil.KEY_SCM_COMMAND_OUTPUT, "" );
+        }
+        else
+        {
+            result.put( ContinuumBuildAgentUtil.KEY_SCM_COMMAND_OUTPUT, scmResult.getCommandOutput() );
+        }
+        if ( StringUtils.isEmpty( scmResult.getProviderMessage() ) )
+        {
+            result.put( ContinuumBuildAgentUtil.KEY_SCM_PROVIDER_MESSAGE, "" );
+        }
+        else
+        {
+            result.put( ContinuumBuildAgentUtil.KEY_SCM_PROVIDER_MESSAGE, scmResult.getProviderMessage() );
+        }
+        if ( StringUtils.isEmpty( scmResult.getException() ) )
+        {
+            result.put( ContinuumBuildAgentUtil.KEY_SCM_EXCEPTION, "" );
+        }
+        else
+        {
+            result.put( ContinuumBuildAgentUtil.KEY_SCM_EXCEPTION, scmResult.getException() );
+        }
+        result.put( ContinuumBuildAgentUtil.KEY_SCM_SUCCESS, new Boolean( scmResult.isSuccess() ) );
+        
+        return result;
+    }
+
+    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 performAction( String actionName, BuildContext buildContext )
+        throws ContinuumException
+    {
+        ContinuumException exception = null;
+    
+        try
+        {
+            log.info( "Performing action " + actionName );
+            actionManager.lookup( actionName ).execute( buildContext.getActionContext() );
+            return;
+        }
+        catch ( ActionNotFoundException e )
+        {
+            exception = new ContinuumException( "Error looking up action '" + actionName + "'", e );
+        }
+        catch ( Exception e )
+        {
+            exception = new ContinuumException( "Error executing action '" + actionName + "'", e );
+        }
+        
+        ScmResult result = new ScmResult();
+        
+        result.setSuccess( false );
+        
+        result.setException( ContinuumUtils.throwableToString( exception ) );
+
+        buildContext.setScmResult( result );
+        buildContext.getActionContext().put( ContinuumBuildAgentUtil.KEY_UPDATE_SCM_RESULT, result );
+        
+        throw exception;
+    }
+    
+    private void buildProjects( List<BuildContext> buildContexts )
+        throws ContinuumException
+    {
+        for ( BuildContext buildContext : buildContexts )
+        {
+            BuildProjectTask buildProjectTask = new BuildProjectTask( buildContext.getProjectId(),
+                                                                      buildContext.getBuildDefinitionId(),
+                                                                      buildContext.getTrigger(),
+                                                                      buildContext.getProjectName(),
+                                                                      "" );
+            try
+            {
+                taskQueueManager.getBuildQueue().put( buildProjectTask );
+            }
+            catch ( TaskQueueException e )
+            {
+                log.error( "Error while enqueing build task for project " + buildContext.getProjectId(), e );
+                throw new ContinuumException( "Error while enqueuing build task for project " + buildContext.getProjectId(), e );
+            }
+        }
+    }
+
+}

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/DefaultContinuum.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/DefaultContinuum.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/action/ExecuteBuilderAction.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/action/ExecuteBuilderAction.java?rev=726727&r1=726726&r2=726727&view=diff
==============================================================================
--- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/action/ExecuteBuilderAction.java (original)
+++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/action/ExecuteBuilderAction.java Mon Dec 15 08:23:53 2008
@@ -17,6 +17,9 @@
 import org.apache.maven.continuum.project.ContinuumProjectState;
 import org.codehaus.plexus.action.AbstractAction;
 
+/**
+ * @plexus.component role="org.codehaus.plexus.action.Action" role-hint="execute-agent-builder"
+ */
 public class ExecuteBuilderAction
     extends AbstractAction
 {
@@ -76,8 +79,6 @@
             getLogger().info( "Cancelled build" );
             
             buildResult.setState( ContinuumProjectState.CANCELLED );
-            
-            context.put( ContinuumBuildAgentUtil.KEY_CANCELLED, new Boolean( true ) );
         }
         catch ( Throwable e )
         {
@@ -97,6 +98,8 @@
             {
                 buildResult.setState( ContinuumProjectState.ERROR );
             }
+
+            context.put( ContinuumBuildAgentUtil.KEY_BUILD_RESULT, buildResult );
         }
     }
 }
\ No newline at end of file

Modified: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/AbstractBuildExecutor.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/AbstractBuildExecutor.java?rev=726727&r1=726726&r2=726727&view=diff
==============================================================================
--- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/AbstractBuildExecutor.java (original)
+++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/AbstractBuildExecutor.java Mon Dec 15 08:23:53 2008
@@ -8,6 +8,7 @@
 import java.util.Properties;
 
 import org.apache.continuum.buildagent.configuration.ConfigurationService;
+import org.apache.continuum.buildagent.installation.InstallationService;
 import org.apache.continuum.utils.shell.ExecutionResult;
 import org.apache.continuum.utils.shell.ShellCommandHelper;
 import org.apache.maven.artifact.Artifact;
@@ -46,6 +47,11 @@
     private ConfigurationService configurationService;
 
     /**
+     * @plexus.requirement
+     */
+    private InstallationService installationService;
+
+    /**
      * @plexus.configuration
      */
     private String defaultExecutable;
@@ -94,6 +100,16 @@
         this.configurationService = configurationService;
     }
 
+    public InstallationService getInstallationService()
+    {
+        return installationService;
+    }
+
+    public void setInstallationService( InstallationService installationService )
+    {
+        this.installationService = installationService;
+    }
+
     // ----------------------------------------------------------------------
     // Component Lifecycle
     // ----------------------------------------------------------------------
@@ -241,73 +257,6 @@
         }
     }
 
-    private String getRelativePath( File chrootDir, File workingDirectory, String groupId )
-    {
-        String path = workingDirectory.getPath();
-        String chrootBase = new File( chrootDir, groupId ).getPath();
-        if ( path.startsWith( chrootBase ) )
-        {
-            return path.substring( chrootBase.length(), path.length() );
-        }
-        else
-        {
-            throw new IllegalArgumentException(
-                "Working directory is not inside the chroot jail " + chrootBase + " , " + path );
-        }
-    }
-
-    protected abstract Map<String, String> getEnvironments( BuildDefinition buildDefinition );
-
-    protected String getJavaHomeValue( BuildDefinition buildDefinition )
-    {
-        Profile profile = buildDefinition.getProfile();
-        if ( profile == null )
-        {
-            return null;
-        }
-        Installation jdk = profile.getJdk();
-        if ( jdk == null )
-        {
-            return null;
-        }
-        return jdk.getVarValue();
-    }
-
-    public void backupTestFiles( Project project, int buildId )
-    {
-        //Nothing to do, by default
-    }
-
-    /**
-     * By default, we return true because with a change, the project must be rebuilt.
-     */
-    public boolean shouldBuild( List<ChangeSet> changes, Project continuumProject, File workingDirectory,
-                                BuildDefinition buildDefinition )
-        throws ContinuumBuildExecutorException
-    {
-        return true;
-    }
-
-    protected Map<String, String> getEnvironmentVariables( BuildDefinition buildDefinition )
-    {
-        Profile profile = buildDefinition.getProfile();
-        Map<String, String> envVars = new HashMap<String, String>();
-        if ( profile == null )
-        {
-            return envVars;
-        }
-        List<Installation> environmentVariables = profile.getEnvironmentVariables();
-        if ( environmentVariables.isEmpty() )
-        {
-            return envVars;
-        }
-        for ( Installation installation : environmentVariables )
-        {
-            envVars.put( installation.getVarName(), installation.getVarValue() );
-        }
-        return envVars;
-    }
-
     protected Properties getContinuumSystemProperties( Project project )
     {
         Properties properties = new Properties();
@@ -324,14 +273,8 @@
     protected String getBuildFileForProject( Project project, BuildDefinition buildDefinition )
     {
         String buildFile = StringUtils.clean( buildDefinition.getBuildFile() );
-        String relPath = StringUtils.clean( project.getRelativePath() );
-
-        if ( StringUtils.isEmpty( relPath ) )
-        {
-            return buildFile;
-        }
-
-        return relPath + File.separator + buildFile;
+        
+        return buildFile;
     }
 
     public boolean isBuilding( Project project )
@@ -357,7 +300,6 @@
         return getConfigurationService().getWorkingDirectory( projectId );
     }
 
-
     public boolean isResolveExecutable()
     {
         return resolveExecutable;

Added: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/ant/AntBuildExecutor.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/ant/AntBuildExecutor.java?rev=726727&view=auto
==============================================================================
--- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/ant/AntBuildExecutor.java (added)
+++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/ant/AntBuildExecutor.java Mon Dec 15 08:23:53 2008
@@ -0,0 +1,62 @@
+package org.apache.continuum.buildagent.build.execution.ant;
+
+import java.io.File;
+import java.util.Enumeration;
+import java.util.Properties;
+
+import org.apache.continuum.buildagent.build.execution.AbstractBuildExecutor;
+import org.apache.continuum.buildagent.build.execution.ContinuumBuildCancelledException;
+import org.apache.continuum.buildagent.build.execution.ContinuumBuildExecutionResult;
+import org.apache.continuum.buildagent.build.execution.ContinuumBuildExecutor;
+import org.apache.continuum.buildagent.build.execution.ContinuumBuildExecutorException;
+import org.apache.continuum.buildagent.installation.InstallationService;
+import org.apache.maven.continuum.execution.ContinuumBuildExecutorConstants;
+import org.apache.maven.continuum.model.project.BuildDefinition;
+import org.apache.maven.continuum.model.project.Project;
+import org.codehaus.plexus.util.StringUtils;
+
+public class AntBuildExecutor
+    extends AbstractBuildExecutor   
+    implements ContinuumBuildExecutor
+{
+    public static final String CONFIGURATION_EXECUTABLE = "executable";
+
+    public static final String CONFIGURATION_TARGETS = "targets";
+
+    public static final String ID = ContinuumBuildExecutorConstants.ANT_BUILD_EXECUTOR;
+
+    protected AntBuildExecutor()
+    {
+        super( ID, true );
+    }
+
+    public ContinuumBuildExecutionResult build( Project project, BuildDefinition buildDefinition, File buildOutput )
+        throws ContinuumBuildExecutorException, ContinuumBuildCancelledException
+    {
+        String executable = getInstallationService().getExecutorConfigurator( InstallationService.ANT_TYPE )
+            .getExecutable();
+
+        StringBuffer arguments = new StringBuffer();
+    
+        String buildFile = getBuildFileForProject( project, buildDefinition );
+    
+        if ( !StringUtils.isEmpty( buildFile ) )
+        {
+            arguments.append( "-f " ).append( buildFile ).append( " " );
+        }
+    
+        arguments.append( StringUtils.clean( buildDefinition.getArguments() ) ).append( " " );
+    
+        Properties props = getContinuumSystemProperties( project );
+        for ( Enumeration itr = props.propertyNames(); itr.hasMoreElements(); )
+        {
+            String name = (String) itr.nextElement();
+            String value = props.getProperty( name );
+            arguments.append( "\"-D" ).append( name ).append( "=" ).append( value ).append( "\" " );
+        }
+    
+        arguments.append( StringUtils.clean( buildDefinition.getGoals() ) );
+
+        return executeShellCommand( project, executable, arguments.toString(), buildOutput, null );
+    }
+}

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/ant/AntBuildExecutor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/ant/AntBuildExecutor.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m1/
------------------------------------------------------------------------------
    svn:mergeinfo = 

Added: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m1/MavenOneBuildExecutor.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m1/MavenOneBuildExecutor.java?rev=726727&view=auto
==============================================================================
--- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m1/MavenOneBuildExecutor.java (added)
+++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m1/MavenOneBuildExecutor.java Mon Dec 15 08:23:53 2008
@@ -0,0 +1,61 @@
+package org.apache.continuum.buildagent.build.execution.maven.m1;
+
+import java.io.File;
+import java.util.Enumeration;
+import java.util.Properties;
+
+import org.apache.continuum.buildagent.build.execution.AbstractBuildExecutor;
+import org.apache.continuum.buildagent.build.execution.ContinuumBuildCancelledException;
+import org.apache.continuum.buildagent.build.execution.ContinuumBuildExecutionResult;
+import org.apache.continuum.buildagent.build.execution.ContinuumBuildExecutor;
+import org.apache.continuum.buildagent.build.execution.ContinuumBuildExecutorException;
+import org.apache.continuum.buildagent.installation.InstallationService;
+import org.apache.maven.continuum.execution.ContinuumBuildExecutorConstants;
+import org.apache.maven.continuum.model.project.BuildDefinition;
+import org.apache.maven.continuum.model.project.Project;
+import org.codehaus.plexus.util.StringUtils;
+
+public class MavenOneBuildExecutor
+    extends AbstractBuildExecutor
+    implements ContinuumBuildExecutor
+{
+    public final static String CONFIGURATION_GOALS = "goals";
+
+    public final static String ID = ContinuumBuildExecutorConstants.MAVEN_ONE_BUILD_EXECUTOR;
+
+    public MavenOneBuildExecutor()
+    {
+        super( ID, true );
+    }
+
+    public ContinuumBuildExecutionResult build( Project project, BuildDefinition buildDefinition, File buildOutput )
+        throws ContinuumBuildExecutorException, ContinuumBuildCancelledException
+    {
+        String executable = getInstallationService().getExecutorConfigurator( InstallationService.MAVEN1_TYPE )
+        .getExecutable();
+    
+        StringBuffer arguments = new StringBuffer();
+    
+        String buildFile = getBuildFileForProject( project, buildDefinition );
+    
+        if ( !StringUtils.isEmpty( buildFile ) && !"project.xml".equals( buildFile ) )
+        {
+            arguments.append( "-p " ).append( buildFile ).append( " " );
+        }
+    
+        arguments.append( StringUtils.clean( buildDefinition.getArguments() ) ).append( " " );
+    
+        Properties props = getContinuumSystemProperties( project );
+        for ( Enumeration itr = props.propertyNames(); itr.hasMoreElements(); )
+        {
+            String name = (String) itr.nextElement();
+            String value = props.getProperty( name );
+            arguments.append( "\"-D" ).append( name ).append( "=" ).append( value ).append( "\" " );
+        }
+        
+        arguments.append( StringUtils.clean( buildDefinition.getGoals() ) );
+    
+        return executeShellCommand( project, executable, arguments.toString(), buildOutput, null );
+    }
+
+}

Added: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/DefaultMavenBuilderHelper.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/DefaultMavenBuilderHelper.java?rev=726727&view=auto
==============================================================================
--- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/DefaultMavenBuilderHelper.java (added)
+++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/DefaultMavenBuilderHelper.java Mon Dec 15 08:23:53 2008
@@ -0,0 +1,402 @@
+package org.apache.continuum.buildagent.build.execution.maven.m2;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.maven.artifact.manager.WagonManager;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
+import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.continuum.project.builder.ContinuumProjectBuildingResult;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Profile;
+import org.apache.maven.model.Scm;
+import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
+import org.apache.maven.profiles.DefaultProfileManager;
+import org.apache.maven.profiles.ProfileManager;
+import org.apache.maven.project.InvalidProjectModelException;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.MavenProjectBuilder;
+import org.apache.maven.project.ProjectBuildingException;
+import org.apache.maven.project.validation.ModelValidationResult;
+import org.apache.maven.settings.MavenSettingsBuilder;
+import org.apache.maven.settings.Mirror;
+import org.apache.maven.settings.Proxy;
+import org.apache.maven.settings.Server;
+import org.apache.maven.settings.Settings;
+import org.apache.maven.settings.io.xpp3.SettingsXpp3Writer;
+import org.codehaus.plexus.PlexusConstants;
+import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.component.repository.exception.ComponentLifecycleException;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.codehaus.plexus.context.Context;
+import org.codehaus.plexus.context.ContextException;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
+import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.xml.Xpp3Dom;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @plexus.component role="org.apache.continuum.buildagent.build.execution.maven.m2.MavenBuilderHelper" role-hint="default"
+ */
+public class DefaultMavenBuilderHelper
+    implements MavenBuilderHelper, Contextualizable, Initializable
+{
+    private Logger log = LoggerFactory.getLogger( this.getClass() );
+
+    /**
+     * @plexus.requirement
+     */
+    private MavenProjectBuilder projectBuilder;
+
+    /**
+     * @plexus.requirement
+     */
+    private MavenSettingsBuilder mavenSettingsBuilder;
+
+    /**
+     * @plexus.requirement
+     */
+    private ArtifactRepositoryFactory artifactRepositoryFactory;
+
+    /**
+     * @plexus.requirement
+     */
+    private ArtifactRepositoryLayout repositoryLayout;
+
+    private PlexusContainer container;
+    
+    public MavenProject getMavenProject( ContinuumProjectBuildingResult result, File file )
+    {
+        MavenProject project;
+
+        try
+        {
+            //   TODO: This seems like code that is shared with DefaultMaven, so it should be moved to the project
+            //   builder perhaps
+
+            Settings settings = getSettings();
+
+            if ( log.isDebugEnabled() )
+            {
+                writeSettings( settings );
+            }
+
+            ProfileManager profileManager = new DefaultProfileManager( container, settings );
+
+            project = projectBuilder.build( file, getRepository( settings ), profileManager, false );
+
+            if ( log.isDebugEnabled() )
+            {
+                writePom( project );
+                writeActiveProfileStatement( project );
+            }
+
+        }
+        catch ( ProjectBuildingException e )
+        {
+            StringBuffer messages = new StringBuffer();
+
+            Throwable cause = e.getCause();
+
+            if ( cause != null )
+            {
+                while ( ( cause.getCause() != null ) && ( cause instanceof ProjectBuildingException ) )
+                {
+                    cause = cause.getCause();
+                }
+            }
+
+            if ( e instanceof InvalidProjectModelException )
+            {
+                InvalidProjectModelException ex = (InvalidProjectModelException) e;
+
+                ModelValidationResult validationResult = ex.getValidationResult();
+
+                if ( validationResult != null && validationResult.getMessageCount() > 0 )
+                {
+                    for ( Iterator<String> i = validationResult.getMessages().iterator(); i.hasNext(); )
+                    {
+                        String valmsg = i.next();
+                        result.addError( ContinuumProjectBuildingResult.ERROR_VALIDATION, valmsg );
+                        messages.append( valmsg );
+                        messages.append( "\n" );
+                    }
+                }
+            }
+
+            if ( cause instanceof ArtifactNotFoundException )
+            {
+                result.addError( ContinuumProjectBuildingResult.ERROR_ARTIFACT_NOT_FOUND,
+                                 ( (ArtifactNotFoundException) cause ).toString() );
+                return null;
+            }
+
+            result.addError( ContinuumProjectBuildingResult.ERROR_PROJECT_BUILDING, e.getMessage() );
+
+            String msg = "Cannot build maven project from " + file + " (" + e.getMessage() + ").\n" + messages;
+
+            file.delete();
+
+            log.error( msg );
+
+            return null;
+        }
+        // TODO catch all exceptions is bad
+        catch ( Exception e )
+        {
+            result.addError( ContinuumProjectBuildingResult.ERROR_PROJECT_BUILDING, e.getMessage() );
+
+            String msg = "Cannot build maven project from " + file + " (" + e.getMessage() + ").";
+
+            file.delete();
+
+            log.error( msg );
+
+            return null;
+        }
+
+        // ----------------------------------------------------------------------
+        // Validate the MavenProject using some Continuum rules
+        // ----------------------------------------------------------------------
+
+        // SCM connection
+        Scm scm = project.getScm();
+
+        if ( scm == null )
+        {
+            result.addError( ContinuumProjectBuildingResult.ERROR_MISSING_SCM, getProjectName( project ) );
+
+            log.error( "Missing 'scm' element in the " + getProjectName( project ) + " POM." );
+
+            return null;
+        }
+
+        String url = scm.getConnection();
+
+        if ( StringUtils.isEmpty( url ) )
+        {
+            result.addError( ContinuumProjectBuildingResult.ERROR_MISSING_SCM_CONNECTION, getProjectName( project ) );
+
+            log.error(
+                "Missing 'connection' element in the 'scm' element in the " + getProjectName( project ) + " POM." );
+
+            return null;
+        }
+
+        return project;
+    }
+
+    private Settings getSettings()
+        throws SettingsConfigurationException
+    {
+        try
+        {
+            return mavenSettingsBuilder.buildSettings( false );
+        }
+        catch ( IOException e )
+        {
+            throw new SettingsConfigurationException( "Error reading settings file", e );
+        }
+        catch ( XmlPullParserException e )
+        {
+            throw new SettingsConfigurationException( e.getMessage(), e.getDetail(), e.getLineNumber(),
+                                                      e.getColumnNumber() );
+        }
+    }
+
+    private ArtifactRepository getRepository( Settings settings )
+    {
+        return artifactRepositoryFactory.createArtifactRepository( "local", "file://" + settings.getLocalRepository(), 
+                                                                   repositoryLayout, null, null );
+    }
+    
+    public String getProjectName( MavenProject project )
+    {
+        String name = project.getName();
+
+        if ( StringUtils.isEmpty( name ) )
+        {
+            return project.getId();
+        }
+
+        return name;
+    }
+    
+    private void writeSettings( Settings settings )
+    {
+        StringWriter sWriter = new StringWriter();
+
+        SettingsXpp3Writer settingsWriter = new SettingsXpp3Writer();
+
+        try
+        {
+            settingsWriter.write( sWriter, settings );
+
+            StringBuffer message = new StringBuffer();
+
+            message.append( "\n************************************************************************************" );
+            message.append( "\nEffective Settings" );
+            message.append( "\n************************************************************************************" );
+            message.append( "\n" );
+            message.append( sWriter.toString() );
+            message.append( "\n************************************************************************************" );
+            message.append( "\n\n" );
+
+            log.debug( message.toString() );
+        }
+        catch ( IOException e )
+        {
+            log.warn( "Cannot serialize Settings to XML.", e );
+        }
+    }
+
+    private void writePom( MavenProject project )
+    {
+        StringBuffer message = new StringBuffer();
+
+        Model pom = project.getModel();
+
+        StringWriter sWriter = new StringWriter();
+
+        MavenXpp3Writer pomWriter = new MavenXpp3Writer();
+
+        try
+        {
+            pomWriter.write( sWriter, pom );
+
+            message.append( "\n************************************************************************************" );
+            message.append( "\nEffective POM for project \'" ).append( project.getId() ).append( "\'" );
+            message.append( "\n************************************************************************************" );
+            message.append( "\n" );
+            message.append( sWriter.toString() );
+            message.append( "\n************************************************************************************" );
+            message.append( "\n\n" );
+
+            log.debug( message.toString() );
+        }
+        catch ( IOException e )
+        {
+            log.warn( "Cannot serialize POM to XML.", e );
+        }
+    }
+    
+    private void writeActiveProfileStatement( MavenProject project )
+    {
+        List<Profile> profiles = project.getActiveProfiles();
+
+        StringBuffer message = new StringBuffer();
+
+        message.append( "\n" );
+
+        message.append( "\n************************************************************************************" );
+        message.append( "\nActive Profiles for Project \'" ).append( project.getId() ).append( "\'" );
+        message.append( "\n************************************************************************************" );
+        message.append( "\n" );
+
+        if ( profiles == null || profiles.isEmpty() )
+        {
+            message.append( "There are no active profiles." );
+        }
+        else
+        {
+            message.append( "The following profiles are active:\n" );
+
+            for ( Profile profile : profiles )
+            {
+                message.append( "\n - " ).append( profile.getId() ).append( " (source: " )
+                    .append( profile.getSource() ).append( ")" );
+            }
+
+        }
+
+        message.append( "\n************************************************************************************" );
+        message.append( "\n\n" );
+
+        log.debug( message.toString() );
+    }
+
+    public void contextualize( Context context )
+        throws ContextException
+    {
+        container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
+    }
+
+    public void initialize()
+        throws InitializationException
+    {
+        try
+        {
+            Settings settings = getSettings();
+
+            resolveParameters( settings );
+        }
+        catch ( Exception e )
+        {
+            throw new InitializationException( "Can't initialize '" + getClass().getName() + "'", e );
+        }
+    }
+    
+    /**
+     * @todo [BP] this might not be required if there is a better way to pass
+     * them in. It doesn't feel quite right.
+     * @todo [JC] we should at least provide a mapping of protocol-to-proxy for
+     * the wagons, shouldn't we?
+     */
+    private void resolveParameters( Settings settings )
+        throws ComponentLookupException, ComponentLifecycleException, SettingsConfigurationException
+    {
+        WagonManager wagonManager = (WagonManager) container.lookup( WagonManager.ROLE );
+
+        try
+        {
+            Proxy proxy = settings.getActiveProxy();
+
+            if ( proxy != null )
+            {
+                if ( proxy.getHost() == null )
+                {
+                    throw new SettingsConfigurationException( "Proxy in settings.xml has no host" );
+                }
+
+                wagonManager.addProxy( proxy.getProtocol(), proxy.getHost(), proxy.getPort(), proxy.getUsername(),
+                                       proxy.getPassword(), proxy.getNonProxyHosts() );
+            }
+
+            for ( Iterator<Server> i = settings.getServers().iterator(); i.hasNext(); )
+            {
+                Server server = i.next();
+
+                wagonManager.addAuthenticationInfo( server.getId(), server.getUsername(), server.getPassword(),
+                                                    server.getPrivateKey(), server.getPassphrase() );
+
+                wagonManager.addPermissionInfo( server.getId(), server.getFilePermissions(),
+                                                server.getDirectoryPermissions() );
+
+                if ( server.getConfiguration() != null )
+                {
+                    wagonManager.addConfiguration( server.getId(), (Xpp3Dom) server.getConfiguration() );
+                }
+            }
+
+            for ( Iterator<Mirror> i = settings.getMirrors().iterator(); i.hasNext(); )
+            {
+                Mirror mirror = i.next();
+
+                wagonManager.addMirror( mirror.getId(), mirror.getMirrorOf(), mirror.getUrl() );
+            }
+        }
+        finally
+        {
+            container.release( wagonManager );
+        }
+    }
+}

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/DefaultMavenBuilderHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/DefaultMavenBuilderHelper.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/MavenBuilderHelper.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/MavenBuilderHelper.java?rev=726727&view=auto
==============================================================================
--- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/MavenBuilderHelper.java (added)
+++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/MavenBuilderHelper.java Mon Dec 15 08:23:53 2008
@@ -0,0 +1,13 @@
+package org.apache.continuum.buildagent.build.execution.maven.m2;
+
+import java.io.File;
+
+import org.apache.maven.continuum.project.builder.ContinuumProjectBuildingResult;
+import org.apache.maven.project.MavenProject;
+
+public interface MavenBuilderHelper
+{
+    String ROLE = MavenBuilderHelper.class.getName();
+
+    MavenProject getMavenProject( ContinuumProjectBuildingResult result, File file );
+}

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/MavenBuilderHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/MavenBuilderHelper.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/MavenTwoBuildExecutor.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/MavenTwoBuildExecutor.java?rev=726727&view=auto
==============================================================================
--- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/MavenTwoBuildExecutor.java (added)
+++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/MavenTwoBuildExecutor.java Mon Dec 15 08:23:53 2008
@@ -0,0 +1,227 @@
+package org.apache.continuum.buildagent.build.execution.maven.m2;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.continuum.buildagent.build.execution.AbstractBuildExecutor;
+import org.apache.continuum.buildagent.build.execution.ContinuumBuildCancelledException;
+import org.apache.continuum.buildagent.build.execution.ContinuumBuildExecutionResult;
+import org.apache.continuum.buildagent.build.execution.ContinuumBuildExecutor;
+import org.apache.continuum.buildagent.build.execution.ContinuumBuildExecutorException;
+import org.apache.continuum.buildagent.installation.InstallationService;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.metadata.ArtifactMetadata;
+import org.apache.maven.continuum.execution.ContinuumBuildExecutorConstants;
+import org.apache.maven.continuum.model.project.BuildDefinition;
+import org.apache.maven.continuum.model.project.Project;
+import org.apache.maven.continuum.project.builder.ContinuumProjectBuildingResult;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.MavenProjectHelper;
+import org.apache.maven.project.artifact.ProjectArtifactMetadata;
+import org.codehaus.plexus.util.StringUtils;
+
+public class MavenTwoBuildExecutor
+    extends AbstractBuildExecutor
+    implements ContinuumBuildExecutor
+{
+    public static final String CONFIGURATION_GOALS = "goals";
+
+    public static final String ID = ContinuumBuildExecutorConstants.MAVEN_TWO_BUILD_EXECUTOR;
+
+    /**
+     * @plexus.requirement
+     */
+    private MavenProjectHelper projectHelper;
+
+    /**
+     * @plexus.requirement
+     */
+    private MavenBuilderHelper builderHelper;
+
+    public MavenTwoBuildExecutor()
+    {
+        super( ID, true );
+    }
+
+    public MavenProjectHelper getProjectHelper()
+    {
+        return projectHelper;
+    }
+
+    public void setProjectHelper( MavenProjectHelper projectHelper )
+    {
+        this.projectHelper = projectHelper;
+    }
+
+    public ContinuumBuildExecutionResult build( Project project, BuildDefinition buildDefinition, File buildOutput )
+        throws ContinuumBuildExecutorException, ContinuumBuildCancelledException
+    {
+        String executable = getInstallationService().getExecutorConfigurator( InstallationService.MAVEN2_TYPE )
+        .getExecutable();
+
+        StringBuffer arguments = new StringBuffer();
+    
+        String buildFile = getBuildFileForProject( project, buildDefinition );
+    
+        if ( !StringUtils.isEmpty( buildFile ) && !"pom.xml".equals( buildFile ) )
+        {
+            arguments.append( "-f " ).append( buildFile ).append( " " );
+        }
+    
+        arguments.append( StringUtils.clean( buildDefinition.getArguments() ) ).append( " " );
+    
+        Properties props = getContinuumSystemProperties( project );
+        for ( Enumeration itr = props.propertyNames(); itr.hasMoreElements(); )
+        {
+            String name = (String) itr.nextElement();
+            String value = props.getProperty( name );
+            arguments.append( "\"-D" ).append( name ).append( "=" ).append( value ).append( "\" " );
+        }
+    
+        arguments.append( StringUtils.clean( buildDefinition.getGoals() ) );
+
+        return executeShellCommand( project, executable, arguments.toString(), buildOutput, null );
+    }
+
+    @Override
+    public List<Artifact> getDeployableArtifacts( Project continuumProject, File workingDirectory,
+                                        BuildDefinition buildDefinition )
+        throws ContinuumBuildExecutorException
+    {
+        MavenProject project = getMavenProject( continuumProject, workingDirectory, buildDefinition );
+
+        // Maven could help us out a lot more here by knowing how to get the deployment artifacts from a project.
+        // TODO: this is currently quite lame
+
+        Artifact artifact = project.getArtifact();
+
+        String projectPackaging = project.getPackaging();
+
+        boolean isPomArtifact = "pom".equals( projectPackaging );
+
+        if ( isPomArtifact )
+        {
+            artifact.setFile( project.getFile() );
+        }
+        else
+        {
+            // Attach pom
+            ArtifactMetadata metadata = new ProjectArtifactMetadata( artifact, project.getFile() );
+
+            artifact.addMetadata( metadata );
+
+            String finalName = project.getBuild().getFinalName();
+
+            String filename = finalName + "." + artifact.getArtifactHandler().getExtension();
+
+            String buildDirectory = project.getBuild().getDirectory();
+
+            File artifactFile = new File( buildDirectory, filename );
+
+            artifact.setFile( artifactFile );
+
+            // sources jar
+            File sourcesFile = new File( buildDirectory, finalName + "-sources.jar" );
+
+            if ( sourcesFile.exists() )
+            {
+                projectHelper.attachArtifact( project, "java-source", "sources", sourcesFile );
+            }
+
+            // tests sources jar
+            File testsSourcesFile = new File( buildDirectory, finalName + "-test-sources.jar" );
+
+            if ( testsSourcesFile.exists() )
+            {
+                projectHelper.attachArtifact( project, "java-source", "test-sources", testsSourcesFile );
+            }
+
+            // javadoc jar
+            File javadocFile = new File( buildDirectory, finalName + "-javadoc.jar" );
+
+            if ( javadocFile.exists() )
+            {
+                projectHelper.attachArtifact( project, "javadoc", "javadoc", javadocFile );
+            }
+
+            // client jar
+            File clientFile = new File( buildDirectory, finalName + "-client.jar" );
+
+            if ( clientFile.exists() )
+            {
+                projectHelper.attachArtifact( project, projectPackaging + "-client", "client", clientFile );
+            }
+
+            // Tests jar
+            File testsFile = new File( buildDirectory, finalName + "-tests.jar" );
+
+            if ( testsFile.exists() )
+            {
+                projectHelper.attachArtifact( project, "jar", "tests", testsFile );
+            }
+        }
+
+        List<Artifact> attachedArtifacts = project.getAttachedArtifacts();
+
+        List<Artifact> artifacts = new ArrayList<Artifact>( attachedArtifacts.size() + 1 );
+
+        if ( artifact.getFile().exists() )
+        {
+            artifacts.add( artifact );
+        }
+
+        for ( Artifact attachedArtifact : attachedArtifacts )
+        {
+            artifacts.add( attachedArtifact );
+        }
+
+        return artifacts;
+    }
+
+    private MavenProject getMavenProject( Project continuumProject, File workingDirectory,
+                                          BuildDefinition buildDefinition )
+        throws ContinuumBuildExecutorException
+    {
+        ContinuumProjectBuildingResult result = new ContinuumProjectBuildingResult();
+
+        File f = getPomFile( getBuildFileForProject( continuumProject, buildDefinition ), workingDirectory );
+
+        if ( !f.exists() )
+        {
+            throw new ContinuumBuildExecutorException( "Could not find Maven project descriptor '" + f + "'." );
+        }
+
+        MavenProject project = builderHelper.getMavenProject( result, f );
+
+        if ( result.hasErrors() )
+        {
+            throw new ContinuumBuildExecutorException(
+                "Unable to read the Maven project descriptor '" + f + "': " + result.getErrorsAsString() );
+        }
+        return project;
+    }
+
+    private static File getPomFile( String projectBuildFile, File workingDirectory )
+    {
+        File f = null;
+
+        String buildFile = StringUtils.clean( projectBuildFile );
+
+        if ( !StringUtils.isEmpty( buildFile ) )
+        {
+            f = new File( workingDirectory, buildFile );
+        }
+
+        if ( f == null )
+        {
+            f = new File( workingDirectory, "pom.xml" );
+        }
+
+        return f;
+    }
+
+}

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/MavenTwoBuildExecutor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/MavenTwoBuildExecutor.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/SettingsConfigurationException.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/SettingsConfigurationException.java?rev=726727&view=auto
==============================================================================
--- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/SettingsConfigurationException.java (added)
+++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/SettingsConfigurationException.java Mon Dec 15 08:23:53 2008
@@ -0,0 +1,37 @@
+package org.apache.continuum.buildagent.build.execution.maven.m2;
+
+public class SettingsConfigurationException
+    extends Exception
+    {
+    private int lineNumber;
+    
+    private int columnNumber;
+    
+    public SettingsConfigurationException( String message )
+    {
+        super( message );
+    }
+    
+    public SettingsConfigurationException( String message, Throwable cause )
+    {
+        super( message, cause );
+    }
+    
+    public SettingsConfigurationException( String message, Throwable cause, int lineNumber, int columnNumber )
+    {
+        super( message + ( lineNumber > 0 ? "\n  Line:   " + lineNumber : "" ) +
+            ( columnNumber > 0 ? "\n  Column: " + columnNumber : "" ), cause );
+        this.lineNumber = lineNumber;
+        this.columnNumber = columnNumber;
+    }
+    
+    public int getColumnNumber()
+    {
+        return columnNumber;
+    }
+    
+    public int getLineNumber()
+    {
+        return lineNumber;
+    }
+}
\ No newline at end of file

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/SettingsConfigurationException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/maven/m2/SettingsConfigurationException.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/shell/ShellBuildExecutor.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/shell/ShellBuildExecutor.java?rev=726727&view=auto
==============================================================================
--- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/shell/ShellBuildExecutor.java (added)
+++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/shell/ShellBuildExecutor.java Mon Dec 15 08:23:53 2008
@@ -0,0 +1,34 @@
+package org.apache.continuum.buildagent.build.execution.shell;
+
+import java.io.File;
+
+import org.apache.continuum.buildagent.build.execution.AbstractBuildExecutor;
+import org.apache.continuum.buildagent.build.execution.ContinuumBuildCancelledException;
+import org.apache.continuum.buildagent.build.execution.ContinuumBuildExecutionResult;
+import org.apache.continuum.buildagent.build.execution.ContinuumBuildExecutor;
+import org.apache.continuum.buildagent.build.execution.ContinuumBuildExecutorException;
+import org.apache.maven.continuum.execution.ContinuumBuildExecutorConstants;
+import org.apache.maven.continuum.model.project.BuildDefinition;
+import org.apache.maven.continuum.model.project.Project;
+
+public class ShellBuildExecutor
+    extends AbstractBuildExecutor
+    implements ContinuumBuildExecutor
+{
+    public static final String CONFIGURATION_EXECUTABLE = "executable";
+
+    public static final String ID = ContinuumBuildExecutorConstants.SHELL_BUILD_EXECUTOR;
+
+    public ShellBuildExecutor()
+    {
+        super( ID, false );
+    }
+
+    public ContinuumBuildExecutionResult build( Project project, BuildDefinition buildDefinition, File buildOutput )
+        throws ContinuumBuildExecutorException, ContinuumBuildCancelledException
+    {
+        String executable = getBuildFileForProject( project, buildDefinition );
+
+        return executeShellCommand( project, executable, buildDefinition.getArguments(), buildOutput, null );
+    }
+}

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/shell/ShellBuildExecutor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/build/execution/shell/ShellBuildExecutor.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/buildcontext/BuildContext.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/buildcontext/BuildContext.java?rev=726727&r1=726726&r2=726727&view=diff
==============================================================================
--- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/buildcontext/BuildContext.java (original)
+++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/buildcontext/BuildContext.java Mon Dec 15 08:23:53 2008
@@ -9,6 +9,8 @@
 {
     private int projectId;
 
+    private String projectName;
+
     private int buildDefinitionId;
 
     private String buildFile;
@@ -71,6 +73,16 @@
         this.projectId = projectId;
     }
 
+    public String getProjectName()
+    {
+        return projectName;
+    }
+
+    public void setProjectName( String projectName )
+    {
+        this.projectName = projectName;
+    }
+
     public int getBuildDefinitionId()
     {
         return buildDefinitionId;

Added: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/installation/DefaultInstallationService.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/installation/DefaultInstallationService.java?rev=726727&view=auto
==============================================================================
--- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/installation/DefaultInstallationService.java (added)
+++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/installation/DefaultInstallationService.java Mon Dec 15 08:23:53 2008
@@ -0,0 +1,39 @@
+package org.apache.continuum.buildagent.installation;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.maven.continuum.execution.ExecutorConfigurator;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
+
+/**
+ * @plexus.component role="org.apache.continuum.buildagent.installation.InstallationService"
+ */
+public class DefaultInstallationService
+    implements InstallationService, Initializable
+{
+    private Map<String, ExecutorConfigurator> typesValues;
+
+    public ExecutorConfigurator getExecutorConfigurator( String type )
+    {
+        return this.typesValues.get( type );
+    }
+
+    public void initialize()
+        throws InitializationException
+    {
+        this.typesValues = new HashMap<String, ExecutorConfigurator>();
+        this.typesValues.put( InstallationService.ANT_TYPE,
+                              new ExecutorConfigurator( "ant", "bin", "ANT_HOME", "-version" ) );
+
+        this.typesValues.put( InstallationService.ENVVAR_TYPE, null );
+        this.typesValues.put( InstallationService.JDK_TYPE,
+                              new ExecutorConfigurator( "java", "bin", "JAVA_HOME", "-version" ) );
+        this.typesValues.put( InstallationService.MAVEN1_TYPE,
+                              new ExecutorConfigurator( "maven", "bin", "MAVEN_HOME", "-v" ) );
+        this.typesValues
+            .put( InstallationService.MAVEN2_TYPE, new ExecutorConfigurator( "mvn", "bin", "M2_HOME", "-v" ) );
+    }
+
+}

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/installation/DefaultInstallationService.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/installation/DefaultInstallationService.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/installation/InstallationService.java
URL: http://svn.apache.org/viewvc/continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/installation/InstallationService.java?rev=726727&view=auto
==============================================================================
--- continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/installation/InstallationService.java (added)
+++ continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/installation/InstallationService.java Mon Dec 15 08:23:53 2008
@@ -0,0 +1,24 @@
+package org.apache.continuum.buildagent.installation;
+
+import org.apache.maven.continuum.execution.ExecutorConfigurator;
+
+public interface InstallationService
+{
+    String ROLE = InstallationService.class.getName();
+
+    String JDK_TYPE = "jdk";
+
+    String MAVEN2_TYPE = "maven2";
+
+    String MAVEN1_TYPE = "maven1";
+
+    String ANT_TYPE = "ant";
+
+    String ENVVAR_TYPE = "envvar";
+
+    /**
+     * @param type
+     * @return ExecutorConfigurator or null if unknown type
+     */
+    public ExecutorConfigurator getExecutorConfigurator( String type );
+}

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/installation/InstallationService.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: continuum/branches/continuum-distributed-builds/continuum-distributed-build/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/installation/InstallationService.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision