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 2009/03/08 15:41:35 UTC

svn commit: r751433 [2/4] - in /continuum/trunk: continuum-api/ continuum-api/src/main/java/org/apache/continuum/release/ continuum-api/src/main/java/org/apache/continuum/release/distributed/ continuum-api/src/main/java/org/apache/continuum/release/dis...

Modified: continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/DefaultBuildAgentManager.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/DefaultBuildAgentManager.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/DefaultBuildAgentManager.java (original)
+++ continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/DefaultBuildAgentManager.java Sun Mar  8 14:41:33 2009
@@ -21,30 +21,11 @@
 
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
-import org.apache.continuum.buildagent.buildcontext.BuildContext;
 import org.apache.continuum.buildagent.configuration.BuildAgentConfigurationService;
-import org.apache.continuum.buildagent.taskqueue.manager.BuildAgentTaskQueueManager;
-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.distributed.transport.master.MasterBuildAgentTransportClient;
-import org.apache.continuum.taskqueue.BuildProjectTask;
-import org.apache.continuum.taskqueue.manager.TaskQueueManagerException;
 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.ChangeSet;
-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;
 
@@ -59,84 +40,8 @@
     /**
      * @plexus.requirement
      */
-    private ActionManager actionManager;
-
-    /**
-     * @plexus.requirement
-     */
     private BuildAgentConfigurationService buildAgentConfigurationService;
 
-    /**
-     * @plexus.requirement
-     */
-    private BuildAgentTaskQueueManager buildAgentTaskQueueManager;
-
-    public void prepareBuildProjects( List<BuildContext> buildContexts)
-        throws ContinuumException
-    {
-        Map<String, Object> context = null;
-
-        if ( buildContexts != null && buildContexts.size() > 0 )
-        {
-            try
-            {
-                for ( BuildContext buildContext : buildContexts )
-                {
-                    BuildDefinition buildDef = BuildContextToBuildDefinition.getBuildDefinition( buildContext );
-        
-                    log.info( "Check scm root state" );
-                    if ( !checkProjectScmRoot( context ) )
-                    {
-                        break;
-                    }
-                    
-                    log.info( "Starting prepare build" );
-                    startPrepareBuild( buildContext );
-                    
-                    log.info( "Initializing prepare build" );
-                    initializeActionContext( buildContext );
-                    
-                    try
-                    {
-                        if ( buildDef.isBuildFresh() )
-                        {
-                            log.info( "Clean up working directory" );
-                            cleanWorkingDirectory( buildContext );
-                        }
-            
-                        log.info( "Updating working directory" );
-                        updateWorkingDirectory( buildContext );
-
-                        log.info( "Merging SCM results" );
-                        //CONTINUUM-1393
-                        if ( !buildDef.isBuildFresh() )
-                        {
-                            mergeScmResults( buildContext );
-                        }
-                    }
-                    finally
-                    {
-                        endProjectPrepareBuild( buildContext );
-                        context = buildContext.getActionContext();
-                    }
-                }
-            }
-            finally
-            {
-                endPrepareBuild( context );
-            }
-
-            if ( checkProjectScmRoot( context ) )
-            {
-                buildProjects( buildContexts );
-            }
-        }
-        else
-        {
-            throw new ContinuumException( "No project build context" );
-        }
-    }
-
     public void startProjectBuild( int projectId )
         throws ContinuumException
     {
@@ -242,337 +147,43 @@
         }
     }
 
-    private void startPrepareBuild( BuildContext buildContext )
-        throws ContinuumException
-    {
-        Map<String, Object> actionContext = buildContext.getActionContext();
-        
-        if ( actionContext == null || !( ContinuumBuildAgentUtil.getScmRootState( actionContext ) == ContinuumProjectState.UPDATING ) ) 
-        {
-            Map<String, Object> map = new HashMap<String, Object>();
-            map.put( ContinuumBuildAgentUtil.KEY_PROJECT_GROUP_ID, new Integer( buildContext.getProjectGroupId() ) );
-            map.put( ContinuumBuildAgentUtil.KEY_SCM_ROOT_ADDRESS, buildContext.getScmRootAddress() );
-            
-            try
-            {
-                MasterBuildAgentTransportClient client = new MasterBuildAgentTransportClient(
-                    new URL( buildAgentConfigurationService.getContinuumServerUrl() ) );
-                client.startPrepareBuild( map );
-            }
-            catch ( MalformedURLException e )
-            {
-                log.error( "Invalid continuum server URL '" + buildAgentConfigurationService.getContinuumServerUrl() + "'" );
-                throw new ContinuumException( "Invalid continuum server URL '" + buildAgentConfigurationService.getContinuumServerUrl() + "'", e );
-            }
-            catch ( Exception e )
-            {
-                log.error( "Error starting prepare build", e );
-                throw new ContinuumException( "Error starting prepare build", e );
-            }
-        }
-    }
-
-    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() );
-        actionContext.put( ContinuumBuildAgentUtil.KEY_OLD_SCM_RESULT, buildContext.getOldScmResult() );
-        actionContext.put( ContinuumBuildAgentUtil.KEY_LATEST_UPDATE_DATE, buildContext.getLatestUpdateDate() );
-
-        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-working-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;
-
-        Date date = null;
-
-        if ( workingDirectoryExists )
-        {
-            performAction( "update-agent-working-directory", buildContext );
-    
-            scmResult = ContinuumBuildAgentUtil.getUpdateScmResult( actionContext, null );
-
-            date = ContinuumBuildAgentUtil.getLatestUpdateDate( actionContext );
-
-            if ( date == null )
-            {
-                // try to get latest update date from change log because sometimes date in the changefile is 0
-                performAction( "changelog-agent-project", buildContext );
-
-                date = ContinuumBuildAgentUtil.getLatestUpdateDate( actionContext );
-            }
-        }
-        else
-        {
-            Project project = ContinuumBuildAgentUtil.getProject( actionContext );
-    
-            actionContext.put( ContinuumBuildAgentUtil.KEY_WORKING_DIRECTORY,
-                               buildAgentConfigurationService.getWorkingDirectory( project.getId() ).getAbsolutePath() );
-
-            performAction( "checkout-agent-project", buildContext );
-
-            scmResult = ContinuumBuildAgentUtil.getCheckoutScmResult( actionContext, null );
-
-            performAction( "changelog-agent-project", buildContext );
-
-            date = ContinuumBuildAgentUtil.getLatestUpdateDate( actionContext );
-        }
-
-        buildContext.setScmResult( scmResult );
-        buildContext.setLatestUpdateDate( date );
-        actionContext.put( ContinuumBuildAgentUtil.KEY_SCM_RESULT, scmResult );
-    }
-
-    private void endProjectPrepareBuild( BuildContext buildContext )
+    public void startPrepareBuild( Map context )
         throws ContinuumException
     {
-        Map<String, Object> context = buildContext.getActionContext();
-
-        ScmResult scmResult = ContinuumBuildAgentUtil.getScmResult( context, null );
-
-        if ( scmResult == null || !scmResult.isSuccess() )
-        {
-            context.put( ContinuumBuildAgentUtil.KEY_SCM_ROOT_STATE, ContinuumProjectState.ERROR );
-        }
-        else
-        {
-            buildContext.setScmResult( scmResult );
-        }
-    }
-
-    private void endPrepareBuild( Map context )
-        throws ContinuumException
-    {
-        if ( context != null )
-        {
-            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 ) );
-            result.put( ContinuumBuildAgentUtil.KEY_SCM_ROOT_STATE, new Integer( ContinuumBuildAgentUtil.getScmRootState( context ) ) );
-            
-            if ( ContinuumBuildAgentUtil.getScmRootState( context ) == ContinuumProjectState.ERROR )
-            {
-                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 );
-                }
-            }
-            else
-            {
-                result.put( ContinuumBuildAgentUtil.KEY_SCM_ERROR, "" );
-            }
-
-            // connect to continuum server (master)
-            try
-            {
-                MasterBuildAgentTransportClient client = new MasterBuildAgentTransportClient(
-                     new URL( buildAgentConfigurationService.getContinuumServerUrl() ) );
-                client.prepareBuildFinished( result );
-            }
-            catch ( MalformedURLException e )
-            {
-                throw new ContinuumException( "Invalid Continuum Server URL '" + buildAgentConfigurationService.getContinuumServerUrl() + "'" );
-            }
-            catch ( Exception e )
-            {
-                throw new ContinuumException( "Error while finishing prepare build", e );
-            }
-        }
-        else
+        try
         {
-            throw new ContinuumException( "No project build context" );
+            MasterBuildAgentTransportClient client = new MasterBuildAgentTransportClient(
+                new URL( buildAgentConfigurationService.getContinuumServerUrl() ) );
+            client.startPrepareBuild( context );
         }
-    }
-
-    private String convertScmResultToError( ScmResult result )
-    {
-        String error = "";
-
-        if ( result == null )
+        catch ( MalformedURLException e )
         {
-            error = "Scm result is null.";
+            log.error( "Invalid continuum server URL '" + buildAgentConfigurationService.getContinuumServerUrl() + "'" );
+            throw new ContinuumException( "Invalid continuum server URL '" + buildAgentConfigurationService.getContinuumServerUrl() + "'", e );
         }
-        else
+        catch ( Exception e )
         {
-            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();
-            }
+            log.error( "Error starting prepare build", e );
+            throw new ContinuumException( "Error starting prepare build", e );
         }
-
-        return error;
     }
 
-    private void performAction( String actionName, BuildContext buildContext )
+    public void endPrepareBuild( Map context )
         throws ContinuumException
     {
-        ContinuumException exception = null;
-    
         try
         {
-            log.info( "Performing action " + actionName );
-            actionManager.lookup( actionName ).execute( buildContext.getActionContext() );
-            return;
+            MasterBuildAgentTransportClient client = new MasterBuildAgentTransportClient(
+                 new URL( buildAgentConfigurationService.getContinuumServerUrl() ) );
+            client.prepareBuildFinished( context );
         }
-        catch ( ActionNotFoundException e )
+        catch ( MalformedURLException e )
         {
-            exception = new ContinuumException( "Error looking up action '" + actionName + "'", e );
+            throw new ContinuumException( "Invalid Continuum Server URL '" + buildAgentConfigurationService.getContinuumServerUrl() + "'" );
         }
         catch ( Exception e )
         {
-            exception = new ContinuumException( "Error executing action '" + actionName + "'", e );
-        }
-        
-        ScmResult result = new ScmResult();
-        
-        result.setSuccess( false );
-        
-        result.setException( ContinuumBuildAgentUtil.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(),
-                                                                      "", 
-                                                                      buildContext.getScmResult() );
-
-            try
-            {
-                if ( !buildAgentTaskQueueManager.isProjectInBuildQueue( buildProjectTask.getProjectId() ) )
-                {
-                    buildAgentTaskQueueManager.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 );
-            }
-            catch ( TaskQueueManagerException e )
-            {
-                log.error( "Error while checking if project " + buildContext.getProjectId() + " is in build queue", e );
-                throw new ContinuumException( "Error while checking if project " + buildContext.getProjectId() + " is in build queue", e );
-            }
-        }
-
-        try
-        {
-            boolean stop = false;
-            while ( !stop )
-            {
-                if ( buildAgentTaskQueueManager.getCurrentProjectInBuilding() <= 0 && 
-                                !buildAgentTaskQueueManager.hasBuildTaskInQueue()  )
-                {
-                    stop = true;
-                }
-            }
-        }
-        catch ( TaskQueueManagerException e )
-        {
-            throw new ContinuumException( e.getMessage(), e );
-        }
-    }
-
-    private void mergeScmResults( BuildContext buildContext )
-    {
-        Map context = buildContext.getActionContext();
-        ScmResult oldScmResult = ContinuumBuildAgentUtil.getOldScmResult( context, null );
-        ScmResult newScmResult = ContinuumBuildAgentUtil.getScmResult( context, null );
-
-        if ( oldScmResult != null )
-        {
-            if ( newScmResult == null )
-            {
-                context.put( ContinuumBuildAgentUtil.KEY_SCM_RESULT, oldScmResult );
-            }
-            else
-            {
-                List<ChangeSet> oldChanges = oldScmResult.getChanges();
-
-                List<ChangeSet> newChanges = newScmResult.getChanges();
-
-                for ( ChangeSet change : newChanges )
-                {
-                    if ( !oldChanges.contains( change ) )
-                    {
-                        oldChanges.add( change );
-                    }
-                }
-
-                newScmResult.setChanges( oldChanges );
-            }
+            throw new ContinuumException( "Error while finishing prepare build", e );
         }
     }
 }

Added: continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/DefaultBuildAgentReleaseManager.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/DefaultBuildAgentReleaseManager.java?rev=751433&view=auto
==============================================================================
--- continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/DefaultBuildAgentReleaseManager.java (added)
+++ continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/DefaultBuildAgentReleaseManager.java Sun Mar  8 14:41:33 2009
@@ -0,0 +1,313 @@
+package org.apache.continuum.buildagent.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.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.continuum.buildagent.configuration.BuildAgentConfigurationService;
+import org.apache.continuum.buildagent.installation.BuildAgentInstallationService;
+import org.apache.continuum.buildagent.utils.ContinuumBuildAgentUtil;
+import org.apache.continuum.model.repository.LocalRepository;
+import org.apache.continuum.release.config.ContinuumReleaseDescriptor;
+import org.apache.maven.continuum.model.project.Project;
+import org.apache.maven.continuum.model.project.ProjectGroup;
+import org.apache.maven.continuum.release.ContinuumReleaseException;
+import org.apache.maven.continuum.release.ContinuumReleaseManager;
+import org.apache.maven.continuum.release.ContinuumReleaseManagerListener;
+import org.apache.maven.continuum.release.DefaultReleaseManagerListener;
+import org.apache.maven.shared.release.ReleaseResult;
+import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.codehaus.plexus.util.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @plexus.component role="org.apache.continuum.buildagent.manager.BuildAgentReleaseManager" role-hint="default"
+ */
+public class DefaultBuildAgentReleaseManager
+    implements BuildAgentReleaseManager
+{
+    private Logger log = LoggerFactory.getLogger( this.getClass() );
+
+    /**
+     * @plexus.requirement
+     */
+    ContinuumReleaseManager releaseManager;
+
+    /**
+     * @plexus.requirement
+     */
+    BuildAgentConfigurationService buildAgentConfigurationService;
+
+    /**
+     * @plexus.requirement
+     */
+    BuildAgentInstallationService buildAgentInstallationService;
+
+    public String releasePrepare( Map projectMap, Map properties, Map releaseVersion, Map developmentVersion, Map<String, String> environments )
+        throws ContinuumReleaseException
+    {
+        Project project = getProject( projectMap );
+
+        Properties releaseProperties = getReleaseProperties( properties );
+
+        ContinuumReleaseManagerListener listener = new DefaultReleaseManagerListener();
+
+        String workingDirectory = buildAgentConfigurationService.getWorkingDirectory( project.getId() ).getPath();
+
+        String executable = buildAgentInstallationService.getExecutorConfigurator( BuildAgentInstallationService.MAVEN2_TYPE ).getExecutable();
+
+        if ( environments != null )
+        {
+            String m2Home = environments.get( buildAgentInstallationService.getEnvVar( BuildAgentInstallationService.MAVEN2_TYPE ) );
+            if ( StringUtils.isNotEmpty( m2Home ) )
+            {
+                executable = m2Home + File.separator + "bin" + File.separator + executable;
+            }
+        }
+
+        try
+        {
+            return releaseManager.prepare( project, releaseProperties, releaseVersion, developmentVersion, listener,
+                                           workingDirectory, environments, executable );
+        }
+        catch ( ContinuumReleaseException e )
+        {
+            log.error( "Error while preparing release" );
+            throw e;
+        }
+    }
+
+    public ReleaseResult getReleaseResult( String releaseId )
+    {
+        return (ReleaseResult) releaseManager.getReleaseResults().get( releaseId );
+    }
+
+    public Map getListener( String releaseId )
+    {
+        ContinuumReleaseManagerListener listener = (ContinuumReleaseManagerListener) releaseManager.getListeners().get( releaseId );
+
+        Map map = new HashMap();
+
+        if ( listener != null )
+        { 
+            map.put( ContinuumBuildAgentUtil.KEY_RELEASE_STATE, new Integer( listener.getState() ) );
+            if ( listener.getPhases() != null )
+            {
+                map.put( ContinuumBuildAgentUtil.KEY_RELEASE_PHASES, listener.getPhases() );
+            }
+            if ( listener.getCompletedPhases() != null )
+            {
+                map.put( ContinuumBuildAgentUtil.KEY_COMPLETED_RELEASE_PHASES, listener.getCompletedPhases() );
+            }
+            if ( listener.getInProgress() != null )
+            {
+                map.put( ContinuumBuildAgentUtil.KEY_RELEASE_IN_PROGRESS, listener.getInProgress() );
+            }
+            if ( listener.getError() != null )
+            {
+                map.put( ContinuumBuildAgentUtil.KEY_RELEASE_ERROR, listener.getError() );
+            }
+        }
+
+        return map;
+    }
+
+    public void removeListener( String releaseId )
+    {
+        releaseManager.getListeners().remove( releaseId );
+    }
+
+    public String getPreparedReleaseName( String releaseId )
+    {
+        Map preparedReleases = releaseManager.getPreparedReleases();
+
+        if ( preparedReleases.containsKey( releaseId ) )
+        {
+            ReleaseDescriptor descriptor = (ReleaseDescriptor) preparedReleases.get( releaseId );
+            return descriptor.getReleaseVersions().get( releaseId ).toString();
+        }
+
+        return "";
+    }
+
+    public void releasePerform( String releaseId, String goals, String arguments, boolean useReleaseProfile, Map repository )
+        throws ContinuumReleaseException
+    {
+        ContinuumReleaseManagerListener listener = new DefaultReleaseManagerListener();
+
+        LocalRepository repo = null;
+
+        if ( !repository.isEmpty() )
+        {
+            repo = new LocalRepository();
+            repo.setLayout( ContinuumBuildAgentUtil.getLocalRepositoryLayout( repository ) );
+            repo.setName( ContinuumBuildAgentUtil.getLocalRepositoryName( repository ) );
+            repo.setLocation( ContinuumBuildAgentUtil.getLocalRepository( repository ) );
+        }
+
+        File performDirectory = new File( buildAgentConfigurationService.getWorkingDirectory(),
+                                          "releases-" + System.currentTimeMillis() );
+        performDirectory.mkdirs();
+
+        releaseManager.perform( releaseId, performDirectory, goals, arguments, useReleaseProfile, listener, repo );
+    }
+
+    public void releasePerformFromScm( String goals, String arguments, boolean useReleaseProfile, Map repository, String scmUrl, String scmUsername, 
+                                String scmPassword, String scmTag, String scmTagBase, Map<String, String> environments )
+        throws ContinuumReleaseException
+    {
+        ContinuumReleaseDescriptor descriptor = new ContinuumReleaseDescriptor();
+        descriptor.setScmSourceUrl( scmUrl );
+        descriptor.setScmUsername( scmUsername );
+        descriptor.setScmPassword( scmPassword );
+        descriptor.setScmReleaseLabel( scmTag );
+        descriptor.setScmTagBase( scmTagBase );
+        descriptor.setEnvironments( environments );
+
+        String releaseId = "";
+
+        do
+        {
+            releaseId = String.valueOf( System.currentTimeMillis() );
+        }
+        while ( releaseManager.getPreparedReleases().containsKey( releaseId ) );
+
+        releaseManager.getPreparedReleases().put( releaseId, descriptor );
+
+        releasePerform( releaseId, goals, arguments, useReleaseProfile, repository );
+    }
+
+    public String releaseCleanup( String releaseId )
+    {
+        releaseManager.getReleaseResults().remove( releaseId );
+
+        ContinuumReleaseManagerListener listener =
+            (ContinuumReleaseManagerListener) releaseManager.getListeners().remove( releaseId );
+
+        if ( listener != null )
+        {
+            return listener.getGoalName() + "Finished";
+        }
+        else
+        {
+            return "";
+        }
+    }
+
+    private Project getProject( Map context )
+    {
+        Project project = new Project();
+
+        project.setId( ContinuumBuildAgentUtil.getProjectId( context ) );
+        project.setGroupId( ContinuumBuildAgentUtil.getGroupId( context ) );
+        project.setArtifactId( ContinuumBuildAgentUtil.getArtifactId( context ) );
+        project.setScmUrl( ContinuumBuildAgentUtil.getScmUrl( context ) );
+
+        ProjectGroup group = new ProjectGroup();
+
+        String localRepo = ContinuumBuildAgentUtil.getLocalRepository( context );
+        if ( StringUtils.isBlank( localRepo ) )
+        {
+            group.setLocalRepository( null );
+        }
+        else
+        {
+            LocalRepository localRepository = new LocalRepository();
+            localRepository.setLocation( localRepo );
+            group.setLocalRepository( localRepository );
+        }
+
+        project.setProjectGroup( group );
+
+        return project;
+    }
+
+    private Properties getReleaseProperties( Map context )
+    {
+        Properties props = new Properties();
+
+        String prop = ContinuumBuildAgentUtil.getScmUsername( context );
+        if ( StringUtils.isNotBlank( prop ) )
+        {
+            props.put( "username", prop );
+        }
+
+        prop = ContinuumBuildAgentUtil.getScmPassword( context );
+        if ( StringUtils.isNotBlank( prop ) )
+        {
+            props.put( "password", prop );
+        }
+
+        prop = ContinuumBuildAgentUtil.getScmTagBase( context );
+        if ( StringUtils.isNotBlank( prop ) )
+        {
+            props.put( "tagBase", prop );
+        }
+
+        prop = ContinuumBuildAgentUtil.getScmCommentPrefix( context );
+        if ( StringUtils.isNotBlank( prop ) );
+        {
+            props.put( "commentPrefix", prop );
+        }
+
+        prop = ContinuumBuildAgentUtil.getScmTag( context );
+        if ( StringUtils.isNotBlank( prop ) )
+        {
+            props.put( "tag", prop );
+        }
+        
+        prop = ContinuumBuildAgentUtil.getPrepareGoals( context );
+        if ( StringUtils.isNotBlank( prop ) )
+        {
+            props.put( "prepareGoals", prop );
+        }
+
+        prop = ContinuumBuildAgentUtil.getArguments( context );
+        if ( StringUtils.isNotBlank( prop ) )
+        {
+            props.put( "arguments", prop );
+        }
+
+        prop = ContinuumBuildAgentUtil.getUseEditMode( context );
+        if ( StringUtils.isNotBlank( prop ) )
+        {
+            props.put( "useEditMode", prop );
+        }
+
+        prop = ContinuumBuildAgentUtil.getAddSchema( context );
+        if ( StringUtils.isNotBlank( prop ) )
+        {
+            props.put( "addSchema", prop );
+        }
+
+        prop = ContinuumBuildAgentUtil.getAutoVersionSubmodules( context );
+        if ( StringUtils.isNotBlank( prop ) )
+        {
+            props.put( "autoVersionSubmodules", prop );
+        }
+        return props;
+    }
+
+    
+}

Propchange: continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/DefaultBuildAgentReleaseManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/DefaultBuildAgentReleaseManager.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/PrepareBuildProjectsTask.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/PrepareBuildProjectsTask.java?rev=751433&view=auto
==============================================================================
--- continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/PrepareBuildProjectsTask.java (added)
+++ continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/PrepareBuildProjectsTask.java Sun Mar  8 14:41:33 2009
@@ -0,0 +1,71 @@
+package org.apache.continuum.buildagent.taskqueue;
+
+/*
+ * 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.List;
+
+import org.apache.continuum.buildagent.buildcontext.BuildContext;
+import org.codehaus.plexus.taskqueue.Task;
+
+public class PrepareBuildProjectsTask
+    implements Task
+{
+    private List<BuildContext> buildContexts;
+
+    private int trigger;
+
+    private int projectGroupId;
+
+    private String scmRootAddress;
+
+    public PrepareBuildProjectsTask( List<BuildContext> buildContexts, int trigger, int projectGroupId, String scmRootAddress )
+    {
+        this.buildContexts = buildContexts;
+        this.trigger = trigger;
+        this.projectGroupId = projectGroupId;
+        this.scmRootAddress = scmRootAddress;
+    }
+
+    public long getMaxExecutionTime()
+    {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    public List<BuildContext> getBuildContexts()
+    {
+        return buildContexts;
+    }
+
+    public int getTrigger()
+    {
+        return trigger;
+    }
+
+    public int getProjectGroupId()
+    {
+        return projectGroupId;
+    }
+
+    public String getScmRootAddress()
+    {
+        return scmRootAddress;
+    }
+}

Propchange: continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/PrepareBuildProjectsTask.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/PrepareBuildProjectsTask.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/execution/BuildProjectTaskExecutor.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/execution/BuildProjectTaskExecutor.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/execution/BuildProjectTaskExecutor.java (original)
+++ continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/execution/BuildProjectTaskExecutor.java Sun Mar  8 14:41:33 2009
@@ -210,8 +210,8 @@
         result.put( ContinuumBuildAgentUtil.KEY_BUILD_DEFINITION_ID, new Integer( buildContext.getBuildDefinitionId() ) );
         result.put( ContinuumBuildAgentUtil.KEY_TRIGGER, new Integer( buildContext.getTrigger() ) );
         result.put( ContinuumBuildAgentUtil.KEY_BUILD_STATE, new Integer( buildResult.getState() ) );
-        result.put( ContinuumBuildAgentUtil.KEY_BUILD_START, new Long( buildResult.getStartTime() ).toString() );
-        result.put( ContinuumBuildAgentUtil.KEY_BUILD_END, new Long( buildResult.getEndTime() ).toString() );
+        result.put( ContinuumBuildAgentUtil.KEY_START_TIME, new Long( buildResult.getStartTime() ).toString() );
+        result.put( ContinuumBuildAgentUtil.KEY_END_TIME, new Long( buildResult.getEndTime() ).toString() );
         result.put( ContinuumBuildAgentUtil.KEY_BUILD_EXIT_CODE, new Integer( buildResult.getExitCode() ) );
         if ( buildContext.getLatestUpdateDate() != null )
         {

Added: continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/execution/PrepareBuildProjectsTaskExecutor.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/execution/PrepareBuildProjectsTaskExecutor.java?rev=751433&view=auto
==============================================================================
--- continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/execution/PrepareBuildProjectsTaskExecutor.java (added)
+++ continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/execution/PrepareBuildProjectsTaskExecutor.java Sun Mar  8 14:41:33 2009
@@ -0,0 +1,422 @@
+package org.apache.continuum.buildagent.taskqueue.execution;
+
+/*
+ * 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.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.continuum.buildagent.buildcontext.BuildContext;
+import org.apache.continuum.buildagent.configuration.BuildAgentConfigurationService;
+import org.apache.continuum.buildagent.manager.BuildAgentManager;
+import org.apache.continuum.buildagent.taskqueue.PrepareBuildProjectsTask;
+import org.apache.continuum.buildagent.utils.BuildContextToBuildDefinition;
+import org.apache.continuum.buildagent.utils.BuildContextToProject;
+import org.apache.continuum.buildagent.utils.ContinuumBuildAgentUtil;
+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.ChangeSet;
+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.Task;
+import org.codehaus.plexus.taskqueue.execution.TaskExecutionException;
+import org.codehaus.plexus.taskqueue.execution.TaskExecutor;
+import org.codehaus.plexus.util.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @plexus.component role="org.codehaus.plexus.taskqueue.execution.TaskExecutor"
+ * role-hint="prepare-build-agent"
+ */
+public class PrepareBuildProjectsTaskExecutor
+    implements TaskExecutor
+{
+    private Logger log = LoggerFactory.getLogger( this.getClass() );
+
+    /**
+     * @plexus.requirement
+     */
+    private ActionManager actionManager;
+
+    /**
+     * @plexus.requirement
+     */
+    private BuildAgentConfigurationService buildAgentConfigurationService;
+
+    /**
+     * @plexus.requirement
+     */
+    private BuildAgentManager buildAgentManager;
+
+    public void executeTask( Task task )
+        throws TaskExecutionException
+    {
+        List<BuildContext> buildContexts = ( (PrepareBuildProjectsTask) task ).getBuildContexts();
+
+        Map<String, Object> context = null;
+
+        if ( buildContexts != null && buildContexts.size() > 0 )
+        {
+            try
+            {
+                for ( BuildContext buildContext : buildContexts )
+                {
+                    BuildDefinition buildDef = BuildContextToBuildDefinition.getBuildDefinition( buildContext );
+
+                    log.info( "Check scm root state" );
+                    if ( !checkProjectScmRoot( context ) )
+                    {
+                        break;
+                    }
+
+                    log.info( "Starting prepare build" );
+                    startPrepareBuild( buildContext );
+                    
+                    log.info( "Initializing prepare build" );
+                    initializeActionContext( buildContext );
+                    
+                    try
+                    {
+                        if ( buildDef.isBuildFresh() )
+                        {
+                            log.info( "Clean up working directory" );
+                            cleanWorkingDirectory( buildContext );
+                        }
+            
+                        log.info( "Updating working directory" );
+                        updateWorkingDirectory( buildContext );
+
+                        log.info( "Merging SCM results" );
+                        //CONTINUUM-1393
+                        if ( !buildDef.isBuildFresh() )
+                        {
+                            mergeScmResults( buildContext );
+                        }
+                    }
+                    finally
+                    {
+                        endProjectPrepareBuild( buildContext );
+                        context = buildContext.getActionContext();
+                    }
+                }
+            }
+            finally
+            {
+                endPrepareBuild( context );
+            }
+
+            if ( checkProjectScmRoot( context ) )
+            {
+                buildProjects( buildContexts );
+            }
+        }
+        else
+        {
+            throw new TaskExecutionException( "No project build context" );
+        }
+    }
+
+    private void startPrepareBuild( BuildContext buildContext )
+        throws TaskExecutionException
+    {
+        Map<String, Object> actionContext = buildContext.getActionContext();
+        
+        if ( actionContext == null || !( ContinuumBuildAgentUtil.getScmRootState( actionContext ) == ContinuumProjectState.UPDATING ) ) 
+        {
+            Map<String, Object> map = new HashMap<String, Object>();
+            map.put( ContinuumBuildAgentUtil.KEY_PROJECT_GROUP_ID, new Integer( buildContext.getProjectGroupId() ) );
+            map.put( ContinuumBuildAgentUtil.KEY_SCM_ROOT_ADDRESS, buildContext.getScmRootAddress() );
+
+            try
+            {
+                buildAgentManager.startPrepareBuild( map );
+            }
+            catch ( ContinuumException e )
+            {
+                throw new TaskExecutionException( e.getMessage(), e );
+            }
+        }
+    }
+    
+    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() );
+        actionContext.put( ContinuumBuildAgentUtil.KEY_OLD_SCM_RESULT, buildContext.getOldScmResult() );
+        actionContext.put( ContinuumBuildAgentUtil.KEY_LATEST_UPDATE_DATE, buildContext.getLatestUpdateDate() );
+    
+        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 TaskExecutionException
+    {
+        performAction( "clean-agent-working-directory", buildContext );
+    }
+    
+    private void updateWorkingDirectory( BuildContext buildContext )
+        throws TaskExecutionException
+    {
+        Map<String, Object> actionContext = buildContext.getActionContext();
+    
+        performAction( "check-agent-working-directory", buildContext );
+        
+        boolean workingDirectoryExists =
+            ContinuumBuildAgentUtil.getBoolean( actionContext, ContinuumBuildAgentUtil.KEY_WORKING_DIRECTORY_EXISTS );
+    
+        ScmResult scmResult;
+    
+        Date date = null;
+    
+        if ( workingDirectoryExists )
+        {
+            performAction( "update-agent-working-directory", buildContext );
+    
+            scmResult = ContinuumBuildAgentUtil.getUpdateScmResult( actionContext, null );
+    
+            date = ContinuumBuildAgentUtil.getLatestUpdateDate( actionContext );
+    
+            if ( date == null )
+            {
+                // try to get latest update date from change log because sometimes date in the changefile is 0
+                performAction( "changelog-agent-project", buildContext );
+    
+                date = ContinuumBuildAgentUtil.getLatestUpdateDate( actionContext );
+            }
+        }
+        else
+        {
+            Project project = ContinuumBuildAgentUtil.getProject( actionContext );
+    
+            actionContext.put( ContinuumBuildAgentUtil.KEY_WORKING_DIRECTORY,
+                               buildAgentConfigurationService.getWorkingDirectory( project.getId() ).getAbsolutePath() );
+    
+            performAction( "checkout-agent-project", buildContext );
+    
+            scmResult = ContinuumBuildAgentUtil.getCheckoutScmResult( actionContext, null );
+    
+            performAction( "changelog-agent-project", buildContext );
+    
+            date = ContinuumBuildAgentUtil.getLatestUpdateDate( actionContext );
+        }
+    
+        buildContext.setScmResult( scmResult );
+        buildContext.setLatestUpdateDate( date );
+        actionContext.put( ContinuumBuildAgentUtil.KEY_SCM_RESULT, scmResult );
+    }
+    
+    private void endProjectPrepareBuild( BuildContext buildContext )
+        throws TaskExecutionException
+    {
+        Map<String, Object> context = buildContext.getActionContext();
+    
+        ScmResult scmResult = ContinuumBuildAgentUtil.getScmResult( context, null );
+    
+        if ( scmResult == null || !scmResult.isSuccess() )
+        {
+            context.put( ContinuumBuildAgentUtil.KEY_SCM_ROOT_STATE, ContinuumProjectState.ERROR );
+        }
+        else
+        {
+            buildContext.setScmResult( scmResult );
+        }
+    }
+    
+    private void endPrepareBuild( Map context )
+        throws TaskExecutionException
+    {
+        if ( context != null )
+        {
+            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 ) );
+            result.put( ContinuumBuildAgentUtil.KEY_SCM_ROOT_STATE, new Integer( ContinuumBuildAgentUtil.getScmRootState( context ) ) );
+            
+            if ( ContinuumBuildAgentUtil.getScmRootState( context ) == ContinuumProjectState.ERROR )
+            {
+                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 );
+                }
+            }
+            else
+            {
+                result.put( ContinuumBuildAgentUtil.KEY_SCM_ERROR, "" );
+            }
+
+            try
+            {
+                buildAgentManager.endPrepareBuild( result );
+            }
+            catch ( ContinuumException e )
+            {
+                throw new TaskExecutionException( e.getMessage(), e );
+            }
+        }
+        else
+        {
+            throw new TaskExecutionException( "No project build context" );
+        }
+    }
+
+    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 TaskExecutionException
+    {
+        TaskExecutionException exception = null;
+    
+        try
+        {
+            log.info( "Performing action " + actionName );
+            actionManager.lookup( actionName ).execute( buildContext.getActionContext() );
+            return;
+        }
+        catch ( ActionNotFoundException e )
+        {
+            exception = new TaskExecutionException( "Error looking up action '" + actionName + "'", e );
+        }
+        catch ( Exception e )
+        {
+            exception = new TaskExecutionException( "Error executing action '" + actionName + "'", e );
+        }
+        
+        ScmResult result = new ScmResult();
+        
+        result.setSuccess( false );
+        
+        result.setException( ContinuumBuildAgentUtil.throwableToString( exception ) );
+
+        buildContext.setScmResult( result );
+        buildContext.getActionContext().put( ContinuumBuildAgentUtil.KEY_UPDATE_SCM_RESULT, result );
+        
+        throw exception;
+    }
+
+    private void mergeScmResults( BuildContext buildContext )
+    {
+        Map context = buildContext.getActionContext();
+        ScmResult oldScmResult = ContinuumBuildAgentUtil.getOldScmResult( context, null );
+        ScmResult newScmResult = ContinuumBuildAgentUtil.getScmResult( context, null );
+
+        if ( oldScmResult != null )
+        {
+            if ( newScmResult == null )
+            {
+                context.put( ContinuumBuildAgentUtil.KEY_SCM_RESULT, oldScmResult );
+            }
+            else
+            {
+                List<ChangeSet> oldChanges = oldScmResult.getChanges();
+
+                List<ChangeSet> newChanges = newScmResult.getChanges();
+
+                for ( ChangeSet change : newChanges )
+                {
+                    if ( !oldChanges.contains( change ) )
+                    {
+                        oldChanges.add( change );
+                    }
+                }
+
+                newScmResult.setChanges( oldChanges );
+            }
+        }
+    }
+
+    private void buildProjects( List<BuildContext> buildContexts )
+        throws TaskExecutionException
+    {
+        Map map = new HashMap();
+        map.put( ContinuumBuildAgentUtil.KEY_BUILD_CONTEXTS, buildContexts );
+        
+        BuildContext context = new BuildContext();
+        context.setActionContext( map );
+
+        performAction( "create-agent-build-project-task", context );
+    }
+}

Propchange: continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/execution/PrepareBuildProjectsTaskExecutor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/execution/PrepareBuildProjectsTaskExecutor.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/manager/BuildAgentTaskQueueManager.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/manager/BuildAgentTaskQueueManager.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/manager/BuildAgentTaskQueueManager.java (original)
+++ continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/manager/BuildAgentTaskQueueManager.java Sun Mar  8 14:41:33 2009
@@ -28,6 +28,8 @@
 
     TaskQueue getBuildQueue();
 
+    TaskQueue getPrepareBuildQueue();
+
     void cancelBuild()
         throws TaskQueueManagerException;
 
@@ -39,4 +41,7 @@
 
     boolean isProjectInBuildQueue( int projectId )
         throws TaskQueueManagerException;
+
+    boolean isInPrepareBuildQueue( int projectGroupId, int trigger, String scmRootAddress )
+        throws TaskQueueManagerException;
 }

Modified: continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/manager/DefaultBuildAgentTaskQueueManager.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/manager/DefaultBuildAgentTaskQueueManager.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/manager/DefaultBuildAgentTaskQueueManager.java (original)
+++ continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/taskqueue/manager/DefaultBuildAgentTaskQueueManager.java Sun Mar  8 14:41:33 2009
@@ -21,8 +21,7 @@
 
 import java.util.List;
 
-import javax.annotation.Resource;
-
+import org.apache.continuum.buildagent.taskqueue.PrepareBuildProjectsTask;
 import org.apache.continuum.taskqueue.BuildProjectTask;
 import org.apache.continuum.taskqueue.manager.TaskQueueManagerException;
 import org.codehaus.plexus.PlexusConstants;
@@ -37,17 +36,25 @@
 import org.codehaus.plexus.taskqueue.execution.TaskQueueExecutor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
 
-@Service("buildAgentTaskQueueManager")
+/**
+ * @plexus.component role="org.apache.continuum.buildagent.taskqueue.manager.BuildAgentTaskQueueManager" role-hint="default"
+ */
 public class DefaultBuildAgentTaskQueueManager
     implements BuildAgentTaskQueueManager, Contextualizable
 {
     private Logger log = LoggerFactory.getLogger( this.getClass() );
 
-    @Resource
+    /**
+     * @plexus.requirement role-hint="build-agent"
+     */
     private TaskQueue buildAgentBuildQueue;
 
+    /**
+     * @plexus.requirement role-hint="prepare-build-agent"
+     */
+    private TaskQueue buildAgentPrepareBuildQueue;
+
     private PlexusContainer container;
 
     public void cancelBuild()
@@ -75,6 +82,11 @@
         }
         return -1;
     }
+
+    public TaskQueue getPrepareBuildQueue()
+    {
+        return buildAgentPrepareBuildQueue;
+    }
     
     private void removeProjectsFromBuildQueue()
         throws TaskQueueManagerException
@@ -187,6 +199,37 @@
         return false;
     }
 
+    public boolean isInPrepareBuildQueue( int projectGroupId, int trigger, String scmRootAddress )
+        throws TaskQueueManagerException
+    {
+        try
+        {
+            List<PrepareBuildProjectsTask> queues = buildAgentPrepareBuildQueue.getQueueSnapshot();
+        
+            if ( queues != null )
+            {
+                for ( PrepareBuildProjectsTask task : queues )
+                {
+                    if ( task.getProjectGroupId() == projectGroupId && task.getTrigger() == trigger && task.getScmRootAddress().equals( scmRootAddress ) )
+                    {
+                        log.info( "projects already in build queue" );
+                        return true;
+                    }
+                }
+            }
+            else
+            {
+                log.info( "no prepare build task in queue" );
+            }
+        }
+        catch ( TaskQueueException e )
+        {
+            throw new TaskQueueManagerException( e.getMessage(), e );
+        }
+
+        return false;
+    }
+
     public void contextualize( Context context )
         throws ContextException
     {

Modified: continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/utils/ContinuumBuildAgentUtil.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/utils/ContinuumBuildAgentUtil.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/utils/ContinuumBuildAgentUtil.java (original)
+++ continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/utils/ContinuumBuildAgentUtil.java Sun Mar  8 14:41:33 2009
@@ -68,9 +68,9 @@
 
     public static final String KEY_BUILD_FRESH = "build-fresh";
 
-    public static final String KEY_BUILD_START = "build-start";
+    public static final String KEY_START_TIME = "start-time";
 
-    public static final String KEY_BUILD_END = "build-end";
+    public static final String KEY_END_TIME = "end-time";
 
     public static final String KEY_BUILD_ERROR = "build-error";
 
@@ -206,6 +206,46 @@
 
     public static final String KEY_BUILD_AGENT_URL = "build-agent-url";
 
+    public static final String KEY_SCM_TAGBASE = "scm-tagbase";
+
+    public static final String KEY_PREPARE_GOALS = "preparation-goals";
+
+    public static final String KEY_SCM_COMMENT_PREFIX = "scm-comment-prefix";
+
+    public static final String KEY_AUTO_VERSION_SUBMODULES = "auto-version-submodules";
+
+    public static final String KEY_ADD_SCHEMA = "add-schema";
+
+    public static final String KEY_USE_RELEASE_PROFILE = "use-release-profile";
+
+    public static final String KEY_RELEASE_VERSION = "release-version";
+
+    public static final String KEY_DEVELOPMENT_VERSION = "development-version";
+
+    public static final String KEY_USE_EDIT_MODE = "use-edit-mode";
+
+    public static final String KEY_RELEASE_RESULT_CODE = "release-result-code";
+
+    public static final String KEY_RELEASE_OUTPUT = "release-output";
+
+    public static final String KEY_BUILD_CONTEXTS = "build-contexts";
+
+    public static final String KEY_MAX_JOB_EXEC_TIME = "max-job-exec-time";
+
+    public static final String KEY_RELEASE_STATE = "state";
+
+    public static final String KEY_RELEASE_PHASES = "release-phases";
+
+    public static final String KEY_RELEASE_IN_PROGRESS = "release-in-progress";
+
+    public static final String KEY_COMPLETED_RELEASE_PHASES = "completed-release-phases";
+
+    public static final String KEY_RELEASE_ERROR = "release-error";
+
+    public static final String KEY_LOCAL_REPOSITORY_NAME = "repo-name";
+
+    public static final String KEY_LOCAL_REPOSITORY_LAYOUT = "repo-layout";
+
     public static Integer getProjectId( Map context )
     {
         return getInteger( context, KEY_PROJECT_ID );
@@ -253,12 +293,12 @@
 
     public static String getScmUsername( Map context )
     {
-        return getString( context, KEY_SCM_USERNAME );
+        return getString( context, KEY_SCM_USERNAME, "" );
     }
 
     public static String getScmPassword( Map context )
     {
-        return getString( context, KEY_SCM_PASSWORD );
+        return getString( context, KEY_SCM_PASSWORD, "" );
     }
 
     public static boolean isBuildFresh( Map context )
@@ -323,7 +363,7 @@
 
     public static String getLocalRepository( Map context )
     {
-        return getString( context, KEY_LOCAL_REPOSITORY );
+        return getString( context, KEY_LOCAL_REPOSITORY, "" );
     }
 
     public static String getProjectVersion( Map context )
@@ -410,6 +450,81 @@
         return getString( context, KEY_BUILD_AGENT_URL );
     }
 
+    public static String getGroupId( Map context )
+    {
+        return getString( context, KEY_GROUP_ID );
+    }
+
+    public static String getArtifactId( Map context )
+    {
+        return getString( context, KEY_ARTIFACT_ID );
+    }
+
+    public static Map getReleaseVersion( Map context )
+    {
+        return getMap( context, KEY_RELEASE_VERSION );
+    }
+
+    public static Map getDevelopmentVersion( Map context )
+    {
+        return getMap( context, KEY_DEVELOPMENT_VERSION );
+    }
+
+    public static String getScmTagBase( Map context )
+    {
+        return getString( context, KEY_SCM_TAGBASE, "" );
+    }
+
+    public static String getScmCommentPrefix( Map context )
+    {
+        return getString( context, KEY_SCM_COMMENT_PREFIX, "" );
+    }
+
+    public static String getScmTag( Map context )
+    {
+        return getString( context, KEY_SCM_TAG, "" );
+    }
+
+    public static String getPrepareGoals( Map context )
+    {
+        return getString( context, KEY_PREPARE_GOALS, "" );
+    }
+
+    public static String getUseEditMode( Map context )
+    {
+        return getString( context, KEY_USE_EDIT_MODE, "" );
+    }
+
+    public static String getAddSchema( Map context )
+    {
+        return getString( context, KEY_ADD_SCHEMA, "" );
+    }
+
+    public static String getAutoVersionSubmodules( Map context )
+    {
+        return getString( context, KEY_AUTO_VERSION_SUBMODULES, "" );
+    }
+
+    public static List getBuildContexts( Map context )
+    {
+        return getList( context, KEY_BUILD_CONTEXTS );
+    }
+
+    public static int getMaxExecutionTime( Map context )
+    {
+        return getInteger( context, KEY_MAX_JOB_EXEC_TIME );
+    }
+
+    public static String getLocalRepositoryName( Map context )
+    {
+        return getString( context, KEY_LOCAL_REPOSITORY_NAME, "" );
+    }
+
+    public static String getLocalRepositoryLayout( Map context )
+    {
+        return getString( context, KEY_LOCAL_REPOSITORY_LAYOUT, "" );
+    }
+
     // ----------------------------------------------------------------------
     //
     // ----------------------------------------------------------------------
@@ -459,19 +574,27 @@
         else
         {
             List list = new ArrayList();
-            Object[] objA = (Object[]) obj;
 
-            for ( Object o : objA )
+            if ( obj instanceof Object[] )
             {
-                if ( o instanceof Map )
-                {
-                    list.add( (Map) o );
-                }
-                else
+                Object[] objA = (Object[]) obj;
+    
+                for ( Object o : objA )
                 {
-                    list.add( o );
+                    if ( o instanceof Map )
+                    {
+                        list.add( (Map) o );
+                    }
+                    else
+                    {
+                        list.add( o );
+                    }
                 }
             }
+            else
+            {
+                list = (List) obj;
+            }
 
             return list;
         }
@@ -491,6 +614,20 @@
         }
     }
 
+    protected static Map getMap( Map context, String key )
+    {
+        Object obj = getObject( context, key, null );
+
+        if ( obj == null )
+        {
+            return null;
+        }
+        else
+        {
+            return (Map) obj;
+        }
+    }
+
     protected static Object getObject( Map context, String key )
     {
         if ( !context.containsKey( key ) )

Modified: continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/resources/META-INF/plexus/components.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/resources/META-INF/plexus/components.xml?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/resources/META-INF/plexus/components.xml (original)
+++ continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/resources/META-INF/plexus/components.xml Sun Mar  8 14:41:33 2009
@@ -27,6 +27,13 @@
     </component>
 
     <component>
+      <role>org.codehaus.plexus.taskqueue.TaskQueue</role>
+      <role-hint>prepare-build-agent</role-hint>
+      <implementation>org.codehaus.plexus.taskqueue.DefaultTaskQueue</implementation>
+      <lifecycle-handler>plexus-configurable</lifecycle-handler>
+    </component>
+
+    <component>
       <role>org.codehaus.plexus.taskqueue.execution.TaskQueueExecutor</role>
       <role-hint>build-agent</role-hint>
       <implementation>org.codehaus.plexus.taskqueue.execution.ThreadedTaskQueueExecutor</implementation>
@@ -45,5 +52,25 @@
         <name>build-agent</name>
       </configuration>
     </component>
+
+    <component>
+      <role>org.codehaus.plexus.taskqueue.execution.TaskQueueExecutor</role>
+      <role-hint>prepare-build-agent</role-hint>
+      <implementation>org.codehaus.plexus.taskqueue.execution.ThreadedTaskQueueExecutor</implementation>
+      <instantiation-strategy>singleton</instantiation-strategy>
+      <requirements>
+        <requirement>
+          <role>org.codehaus.plexus.taskqueue.execution.TaskExecutor</role>
+          <role-hint>prepare-build-agent</role-hint>
+        </requirement>
+        <requirement>
+          <role>org.codehaus.plexus.taskqueue.TaskQueue</role>
+          <role-hint>prepare-build-agent</role-hint>
+        </requirement>
+      </requirements>
+      <configuration>
+        <name>prepare-build-agent</name>
+      </configuration>
+    </component>
   </components>
 </component-set>
\ No newline at end of file

Modified: continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/resources/META-INF/spring-context.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/resources/META-INF/spring-context.xml?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/resources/META-INF/spring-context.xml (original)
+++ continuum/trunk/continuum-buildagent/continuum-buildagent-core/src/main/resources/META-INF/spring-context.xml Sun Mar  8 14:41:33 2009
@@ -38,7 +38,5 @@
      init-method="initialize">
     <property name="configurationFile" value="file:${CONTINUUM_BUILDAGENT_HOME}/conf/continuum-buildagent.xml" />
   </bean>
-
-  <bean id="actionManager" class="org.codehaus.plexus.action.DefaultActionManager"/>
 </beans>
 	
\ No newline at end of file

Modified: continuum/trunk/continuum-buildagent/continuum-buildagent-webapp/src/main/java/org/apache/continuum/web/startup/BuildAgentStartup.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-buildagent/continuum-buildagent-webapp/src/main/java/org/apache/continuum/web/startup/BuildAgentStartup.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-buildagent/continuum-buildagent-webapp/src/main/java/org/apache/continuum/web/startup/BuildAgentStartup.java (original)
+++ continuum/trunk/continuum-buildagent/continuum-buildagent-webapp/src/main/java/org/apache/continuum/web/startup/BuildAgentStartup.java Sun Mar  8 14:41:33 2009
@@ -36,5 +36,17 @@
         
         TaskQueueExecutor buildAgent = (TaskQueueExecutor) wac.getBean( PlexusToSpringUtils
             .buildSpringId( TaskQueueExecutor.class, "build-agent" ) );
+
+        TaskQueueExecutor prepareBuildAgent = (TaskQueueExecutor) wac.getBean( PlexusToSpringUtils
+            .buildSpringId( TaskQueueExecutor.class, "prepare-build-agent" ) );
+
+        TaskQueueExecutor prepareRelease = (TaskQueueExecutor) wac.getBean( PlexusToSpringUtils
+            .buildSpringId( TaskQueueExecutor.class, "prepare-release" ) );
+
+        TaskQueueExecutor performRelease = (TaskQueueExecutor) wac.getBean( PlexusToSpringUtils
+            .buildSpringId( TaskQueueExecutor.class, "perform-release" ) );
+
+        TaskQueueExecutor rollbackRelease = (TaskQueueExecutor) wac.getBean( PlexusToSpringUtils
+            .buildSpringId( TaskQueueExecutor.class, "rollback-release" ) ); 
     }
 }

Modified: continuum/trunk/continuum-builder/src/main/java/org/apache/continuum/builder/distributed/executor/DistributedBuildProjectTaskExecutor.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-builder/src/main/java/org/apache/continuum/builder/distributed/executor/DistributedBuildProjectTaskExecutor.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-builder/src/main/java/org/apache/continuum/builder/distributed/executor/DistributedBuildProjectTaskExecutor.java (original)
+++ continuum/trunk/continuum-builder/src/main/java/org/apache/continuum/builder/distributed/executor/DistributedBuildProjectTaskExecutor.java Sun Mar  8 14:41:33 2009
@@ -219,6 +219,7 @@
                 context.put( ContinuumBuildConstant.KEY_ALWAYS_BUILD, new Boolean( buildDef.isAlwaysBuild() ) );
                 context.put( ContinuumBuildConstant.KEY_OLD_SCM_CHANGES, getOldScmChanges( project.getId(), buildDefinitionId ) );
                 context.put( ContinuumBuildConstant.KEY_BUILD_AGENT_URL, buildAgentUrl );
+                context.put( ContinuumBuildConstant.KEY_MAX_JOB_EXEC_TIME, new Integer( buildDef.getSchedule().getMaxJobExecutionTime() ) );
 
                 buildContext.add( context );
             }

Modified: continuum/trunk/continuum-builder/src/main/java/org/apache/continuum/builder/utils/ContinuumBuildConstant.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-builder/src/main/java/org/apache/continuum/builder/utils/ContinuumBuildConstant.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-builder/src/main/java/org/apache/continuum/builder/utils/ContinuumBuildConstant.java (original)
+++ continuum/trunk/continuum-builder/src/main/java/org/apache/continuum/builder/utils/ContinuumBuildConstant.java Sun Mar  8 14:41:33 2009
@@ -56,9 +56,9 @@
 
     public static final String KEY_ALWAYS_BUILD = "always-build";
 
-    public static final String KEY_BUILD_START = "build-start";
+    public static final String KEY_START_TIME = "start-time";
 
-    public static final String KEY_BUILD_END = "build-end";
+    public static final String KEY_END_TIME = "end-time";
 
     public static final String KEY_BUILD_ERROR = "build-error";
 
@@ -176,6 +176,8 @@
 
     public static final String KEY_BUILD_AGENT_URL = "build-agent-url";
 
+    public static final String KEY_MAX_JOB_EXEC_TIME = "max-job-exec-time";
+
     public static int getProjectId( Map context )
     {
         return getInteger( context, KEY_PROJECT_ID );
@@ -196,14 +198,14 @@
         return getInteger( context, KEY_TRIGGER );
     }
 
-    public static long getBuildStart( Map context )
+    public static long getStartTime( Map context )
     {
-        return new Long( getString( context, KEY_BUILD_START ) );
+        return new Long( getString( context, KEY_START_TIME ) );
     }
 
-    public static long getBuildEnd( Map context )
+    public static long getEndTime( Map context )
     {
-        return new Long( getString( context, KEY_BUILD_END ) );
+        return new Long( getString( context, KEY_END_TIME ) );
     }
 
     public static int getBuildExitCode( Map context )

Modified: continuum/trunk/continuum-core/src/main/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManager.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManager.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-core/src/main/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManager.java (original)
+++ continuum/trunk/continuum-core/src/main/java/org/apache/continuum/builder/distributed/manager/DefaultDistributedBuildManager.java Sun Mar  8 14:41:33 2009
@@ -1076,8 +1076,8 @@
     {
         BuildResult buildResult = new BuildResult();
 
-        buildResult.setStartTime( ContinuumBuildConstant.getBuildStart( context ) );
-        buildResult.setEndTime( ContinuumBuildConstant.getBuildEnd( context ) );
+        buildResult.setStartTime( ContinuumBuildConstant.getStartTime( context ) );
+        buildResult.setEndTime( ContinuumBuildConstant.getEndTime( context ) );
         buildResult.setError( ContinuumBuildConstant.getBuildError( context ) );
         buildResult.setExitCode( ContinuumBuildConstant.getBuildExitCode( context ) );
         buildResult.setState( ContinuumBuildConstant.getBuildState( context ) );

Added: continuum/trunk/continuum-core/src/main/java/org/apache/continuum/release/distributed/DistributedReleaseUtil.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/continuum/release/distributed/DistributedReleaseUtil.java?rev=751433&view=auto
==============================================================================
--- continuum/trunk/continuum-core/src/main/java/org/apache/continuum/release/distributed/DistributedReleaseUtil.java (added)
+++ continuum/trunk/continuum-core/src/main/java/org/apache/continuum/release/distributed/DistributedReleaseUtil.java Sun Mar  8 14:41:33 2009
@@ -0,0 +1,287 @@
+package org.apache.continuum.release.distributed;
+
+/*
+ * 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.List;
+import java.util.Map;
+
+public class DistributedReleaseUtil
+{
+    public static final String KEY_SCM_TAG = "scm-tag";
+
+    public static final String KEY_SCM_TAGBASE = "scm-tagbase";
+
+    public static final String KEY_SCM_USERNAME = "scm-username";
+
+    public static final String KEY_SCM_PASSWORD = "scm-password";
+
+    public static final String KEY_ARGUMENTS = "arguments";
+
+    public static final String KEY_PREPARE_GOALS = "preparation-goals";
+
+    public static final String KEY_SCM_COMMENT_PREFIX = "scm-comment-prefix";
+
+    public static final String KEY_AUTO_VERSION_SUBMODULES = "auto-version-submodules";
+
+    public static final String KEY_ADD_SCHEMA = "add-schema";
+
+    public static final String KEY_PROJECT = "project";
+
+    public static final String KEY_PROFILE = "profile";
+
+    public static final String KEY_PROPERTIES = "properties";
+
+    public static final String KEY_RELEASE_VERSION = "releaseVersion";
+
+    public static final String KEY_DEVELOPMENT_VERSION = "developmentVersion";
+
+    public static final String KEY_PROJECT_ID = "project-id";
+
+    public static final String KEY_GROUP_ID = "group-id";
+
+    public static final String KEY_ARTIFACT_ID = "artifact-id";
+
+    public static final String KEY_SCM_URL = "scm-url";
+
+    public static final String KEY_LOCAL_REPOSITORY = "local-repository";
+
+    public static final String KEY_USE_EDIT_MODE = "use-edit-mode";
+
+    public static final String KEY_ENVIRONMENTS = "environments";
+
+    public static final String KEY_START_TIME = "start-time";
+
+    public static final String KEY_END_TIME = "end-time";
+
+    public static final String KEY_RELEASE_RESULT_CODE = "release-result-code";
+
+    public static final String KEY_RELEASE_OUTPUT = "release-output";
+
+    public static final String KEY_RELEASE_STATE = "state";
+
+    public static final String KEY_RELEASE_PHASES = "release-phases";
+
+    public static final String KEY_COMPLETED_RELEASE_PHASES = "completed-release-phases";
+
+    public static final String KEY_RELEASE_IN_PROGRESS = "release-in-progress";
+
+    public static final String KEY_RELEASE_ERROR = "release-error";
+
+    public static final String KEY_USE_RELEASE_PROFILE = "use-release-profile";
+
+    public static final String KEY_GOALS = "goals";
+
+    public static final String KEY_RELEASE_ID = "release-id";
+
+    public static final String KEY_LOCAL_REPOSITORY_NAME = "repo-name";
+
+    public static final String KEY_LOCAL_REPOSITORY_LAYOUT = "repo-layout";
+
+    public static String getScmTag( Map context, String defaultValue )
+    {
+        return getString( context, KEY_SCM_TAG, defaultValue );
+    }
+
+    public static String getScmTagBase( Map context, String defaultValue )
+    {
+        return getString( context, KEY_SCM_TAGBASE, defaultValue );
+    }
+
+    public static String getArguments( Map context, String defaultValue )
+    {
+        return getString( context, KEY_ARGUMENTS, defaultValue );
+    }
+
+    public static String getPrepareGoals( Map context, String defaultValue )
+    {
+        return getString( context, KEY_PREPARE_GOALS, defaultValue );
+    }
+
+    public static String getScmCommentPrefix( Map context, String defaultValue )
+    {
+        return getString( context, KEY_SCM_COMMENT_PREFIX, defaultValue );
+    }
+
+    public static Boolean getAutoVersionSubmodules( Map context, boolean defaultValue )
+    {
+        return getBoolean( context, KEY_AUTO_VERSION_SUBMODULES, defaultValue );
+    }
+
+    public static Boolean getAddSchema( Map context, boolean defaultValue )
+    {
+        return getBoolean( context, KEY_ADD_SCHEMA, defaultValue );
+    }
+
+    public static Long getStartTime( Map context )
+    {
+        return new Long( getString( context, KEY_START_TIME ) );
+    }
+
+    public static Long getEndTime( Map context )
+    {
+        return new Long( getString( context, KEY_END_TIME ) );
+    }
+
+    public static int getReleaseResultCode( Map context )
+    {
+        return getInteger( context, KEY_RELEASE_RESULT_CODE );
+    }
+
+    public static String getReleaseOutput( Map context )
+    {
+        return getString( context, KEY_RELEASE_OUTPUT );
+    }
+
+    public static int getReleaseState( Map context )
+    {
+        return getInteger( context, KEY_RELEASE_STATE );
+    }
+
+    public static List getReleasePhases( Map context )
+    {
+        return getList( context, KEY_RELEASE_PHASES, new ArrayList() );
+    }
+
+    public static List getCompletedReleasePhases( Map context )
+    {
+        return getList( context, KEY_COMPLETED_RELEASE_PHASES, new ArrayList() );
+    }
+
+    public static String getReleaseInProgress( Map context )
+    {
+        return getString( context, KEY_RELEASE_IN_PROGRESS, "" );
+    }
+
+    public static String getReleaseError( Map context )
+    {
+        return getString( context, KEY_RELEASE_ERROR, null );
+    }
+
+    public static boolean getUseReleaseProfile( Map context, boolean defaultValue )
+    {
+        return getBoolean( context, KEY_USE_RELEASE_PROFILE, defaultValue );
+    }
+
+    public static String getGoals( Map context, String defaultValue )
+    {
+        return getString( context, KEY_GOALS, defaultValue );
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    public static Integer getInteger( Map context, String key )
+    {
+        return (Integer) getObject( context, key );
+    }
+
+    public static Integer getInteger( Map context, String key, Object defaultValue )
+    {
+        return (Integer) getObject( context, key, defaultValue );
+    }
+
+    public static String getString( Map context, String key )
+    {
+        return (String) getObject( context, key );
+    }
+
+    public static String getString( Map context, String key, String defaultValue )
+    {
+        return (String) getObject( context, key, defaultValue );
+    }
+
+    public static boolean getBoolean( Map context, String key )
+    {
+        return ( (Boolean) getObject( context, key ) ).booleanValue();
+    }
+    
+    public static boolean getBoolean( Map context, String key, boolean defaultValue )
+    {
+        return ( (Boolean) getObject( context, key, Boolean.valueOf( defaultValue ) ) ).booleanValue();
+    }
+
+    public static List getList( Map context, String key, Object defaultValue )
+    {
+        Object obj = getObject( context, key, defaultValue );
+
+        if ( obj == null )
+        {
+            return null;
+        }
+        else
+        {
+            List list = new ArrayList();
+
+            if ( obj instanceof Object[] )
+            {
+                Object[] objA = (Object[]) obj;
+    
+                for ( Object o : objA )
+                {
+                    if ( o instanceof Map )
+                    {
+                        list.add( (Map) o );
+                    }
+                    else
+                    {
+                        list.add( o );
+                    }
+                }
+            }
+            else
+            {
+                list = (List) obj;
+            }
+
+            return list;
+        }
+    }
+
+    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;
+    }
+}
\ No newline at end of file

Propchange: continuum/trunk/continuum-core/src/main/java/org/apache/continuum/release/distributed/DistributedReleaseUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: continuum/trunk/continuum-core/src/main/java/org/apache/continuum/release/distributed/DistributedReleaseUtil.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision