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 [3/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...

Added: continuum/trunk/continuum-core/src/main/java/org/apache/continuum/release/distributed/manager/DefaultDistributedReleaseManager.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/continuum/release/distributed/manager/DefaultDistributedReleaseManager.java?rev=751433&view=auto
==============================================================================
--- continuum/trunk/continuum-core/src/main/java/org/apache/continuum/release/distributed/manager/DefaultDistributedReleaseManager.java (added)
+++ continuum/trunk/continuum-core/src/main/java/org/apache/continuum/release/distributed/manager/DefaultDistributedReleaseManager.java Sun Mar  8 14:41:33 2009
@@ -0,0 +1,598 @@
+package org.apache.continuum.release.distributed.manager;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.continuum.dao.BuildResultDao;
+import org.apache.continuum.distributed.transport.slave.SlaveBuildAgentTransportClient;
+import org.apache.continuum.model.repository.LocalRepository;
+import org.apache.continuum.release.distributed.DistributedReleaseUtil;
+import org.apache.continuum.release.model.PreparedRelease;
+import org.apache.continuum.release.model.PreparedReleaseModel;
+import org.apache.continuum.release.model.io.xpp3.ContinuumPrepareReleasesModelXpp3Reader;
+import org.apache.continuum.release.model.io.xpp3.ContinuumPrepareReleasesModelXpp3Writer;
+import org.apache.maven.continuum.installation.InstallationService;
+import org.apache.maven.continuum.model.project.BuildResult;
+import org.apache.maven.continuum.model.project.Project;
+import org.apache.maven.continuum.release.ContinuumReleaseException;
+import org.apache.maven.shared.release.ReleaseResult;
+import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @plexus.component role="org.apache.continuum.release.distributed.manager.DistributedReleaseManager"
+ */
+public class DefaultDistributedReleaseManager
+    implements DistributedReleaseManager
+{
+    private Logger log = LoggerFactory.getLogger( this.getClass() );
+
+    public final String PREPARED_RELEASES_FILENAME = "prepared-releases.xml";
+
+    /**
+     * @plexus.requirement
+     */
+    BuildResultDao buildResultDao;
+
+    /**
+     * @plexus.requirement
+     */
+    InstallationService installationService;
+    
+    public Map getReleasePluginParameters( int projectId, String pomFilename )
+        throws ContinuumReleaseException
+    {
+        BuildResult buildResult = buildResultDao.getLatestBuildResultForProject( projectId );
+
+        String buildAgentUrl = buildResult.getBuildUrl();
+
+        try
+        {
+            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+            return client.getReleasePluginParameters( projectId, pomFilename );
+        }
+        catch ( MalformedURLException e )
+        {
+           log.error( "Invalid build agent url " + buildAgentUrl ); 
+           throw new ContinuumReleaseException( "Invalid build agent url " + buildAgentUrl );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Failed to retrieve release plugin parameters", e );
+            throw new ContinuumReleaseException( "Failed to retrieve release plugin parameters", e );
+        }
+    }
+
+    public List<Map<String, String>> processProject( int projectId, String pomFilename, boolean autoVersionSubmodules )
+        throws ContinuumReleaseException
+    {
+        BuildResult buildResult = buildResultDao.getLatestBuildResultForProject( projectId );
+
+        String buildAgentUrl = buildResult.getBuildUrl();
+
+        try
+        {
+            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+            return client.processProject( projectId, pomFilename, autoVersionSubmodules );
+        }
+        catch ( MalformedURLException e )
+        {
+            log.error( "Invalid build agent url " + buildAgentUrl );
+            throw new ContinuumReleaseException( "Invalid build agent url " + buildAgentUrl );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Failed to process project for releasing", e );
+            throw new ContinuumReleaseException( "Failed to process project for releasing", e );
+        }
+    }
+
+    public String releasePrepare( Project project, Properties releaseProperties, Map<String, String> releaseVersion, 
+                                  Map<String, String> developmentVersion, Map<String, String> environments )
+        throws ContinuumReleaseException
+    {
+        BuildResult buildResult = buildResultDao.getLatestBuildResultForProject( project.getId() );
+
+        String buildAgentUrl = buildResult.getBuildUrl();
+
+        if ( StringUtils.isBlank( buildAgentUrl ) )
+        {
+            return null;
+        }
+
+        try
+        {
+            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+            String releaseId = client.releasePrepare( createProjectMap( project ), createPropertiesMap( releaseProperties ),
+                                                      releaseVersion, developmentVersion, environments );
+
+            addReleasePrepare( releaseId, buildAgentUrl );
+
+            return releaseId;
+        }
+        catch ( MalformedURLException e )
+        {
+            log.error( "Invalid build agent url " + buildAgentUrl );
+            throw new ContinuumReleaseException( "Invalid build agent url " + buildAgentUrl );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Failed to prepare release project " + project.getName(), e );
+            throw new ContinuumReleaseException( "Failed to prepare release project " + project.getName(), e );
+        }
+    }
+
+    public ReleaseResult getReleaseResult( String releaseId )
+        throws ContinuumReleaseException
+    {
+        String buildAgentUrl = getBuildAgentUrl( releaseId );
+
+        if ( StringUtils.isBlank( buildAgentUrl ) )
+        {
+            return null;
+        }
+
+        try
+        {
+            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+            Map result = client.getReleaseResult( releaseId );
+
+            ReleaseResult releaseResult = new ReleaseResult();
+            releaseResult.setStartTime( DistributedReleaseUtil.getStartTime( result ) );
+            releaseResult.setEndTime( DistributedReleaseUtil.getEndTime( result ) );
+            releaseResult.setResultCode( DistributedReleaseUtil.getReleaseResultCode( result ) );
+            releaseResult.getOutputBuffer().append( DistributedReleaseUtil.getReleaseOutput( result ) );
+
+            return releaseResult;
+        }
+        catch ( MalformedURLException e )
+        {
+            log.error( "Invalid build agent url " + buildAgentUrl );
+            throw new ContinuumReleaseException( "Invalid build agent url " + buildAgentUrl );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Failed to get release result of " + releaseId, e );
+            throw new ContinuumReleaseException( "Failed to get release result of " + releaseId, e );
+        }
+    }
+
+    public Map getListener( String releaseId )
+        throws ContinuumReleaseException
+    {
+        String buildAgentUrl = getBuildAgentUrl( releaseId );
+
+        if ( StringUtils.isBlank( buildAgentUrl ) )
+        {
+            return null;
+        }
+
+        try
+        {
+            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+            return client.getListener( releaseId );
+        }
+        catch ( MalformedURLException e )
+        {
+            log.error( "Invalid build agent url " + buildAgentUrl );
+            throw new ContinuumReleaseException( "Invalid build agent url " + buildAgentUrl );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Failed to get listener for " + releaseId, e );
+            throw new ContinuumReleaseException( "Failed to get listener for " + releaseId, e );
+        }
+    }
+
+    public void removeListener( String releaseId )
+        throws ContinuumReleaseException
+    {
+        String buildAgentUrl = getBuildAgentUrl( releaseId );
+
+        if ( StringUtils.isBlank( buildAgentUrl ) )
+        {
+            return;
+        }
+
+        try
+        {
+            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+            client.removeListener( releaseId );
+        }
+        catch ( MalformedURLException e )
+        {
+            log.error( "Invalid build agent url " + buildAgentUrl );
+            throw new ContinuumReleaseException( "Invalid build agent url " + buildAgentUrl );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Failed to remove listener of " + releaseId, e );
+            throw new ContinuumReleaseException( "Failed to remove listener of " + releaseId, e );
+        }
+    }
+
+    public String getPreparedReleaseName( String releaseId )
+        throws ContinuumReleaseException
+    {
+        String buildAgentUrl = getBuildAgentUrl( releaseId );
+
+        if ( StringUtils.isBlank( buildAgentUrl ) )
+        {
+            log.info( "Unable to get prepared release name because no build agent found for " + releaseId );
+            return null;
+        }
+
+        try
+        {
+            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+            return client.getPreparedReleaseName( releaseId );
+        }
+        catch ( MalformedURLException e )
+        {
+            log.error( "Invalid build agent url " + buildAgentUrl );
+            throw new ContinuumReleaseException( "Invalid build agent url " + buildAgentUrl );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Failed to get prepared release name of " + releaseId, e );
+            throw new ContinuumReleaseException( "Failed to get prepared release name of " + releaseId, e );
+        }
+    }
+
+    public void releasePerform( String releaseId, String goals, String arguments, boolean useReleaseProfile, LocalRepository repository )
+        throws ContinuumReleaseException
+    {
+        String buildAgentUrl = getBuildAgentUrl( releaseId );
+
+        if ( StringUtils.isBlank( buildAgentUrl ) )
+        {
+            log.error( "Unable to perform release because no build agent found for " + releaseId );
+            return;
+        }
+
+        if ( goals == null )
+        {
+            goals = "";
+        }
+
+        if ( arguments == null )
+        {
+            arguments = "";
+        }
+
+        Map map = new HashMap();
+
+        if ( repository != null )
+        {
+            map.put( DistributedReleaseUtil.KEY_LOCAL_REPOSITORY, repository.getLocation() );
+            map.put( DistributedReleaseUtil.KEY_LOCAL_REPOSITORY_NAME, repository.getName() );
+            map.put( DistributedReleaseUtil.KEY_LOCAL_REPOSITORY_LAYOUT, repository.getLayout() );
+        }
+        
+        try
+        {
+            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+            client.releasePerform( releaseId, goals, arguments, useReleaseProfile, map );
+        }
+        catch ( MalformedURLException e )
+        {
+            log.error( "Invalid build agent url " + buildAgentUrl );
+            throw new ContinuumReleaseException( "Invalid build agent url " + buildAgentUrl );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Failed to perform release of " + releaseId, e );
+            throw new ContinuumReleaseException( "Failed to perform release of " + releaseId, e );
+        }
+    }
+
+    public void releasePerformFromScm( int projectId, String goals, String arguments, boolean useReleaseProfile, LocalRepository repository, 
+                                       String scmUrl, String scmUsername, String scmPassword, String scmTag, String scmTagBase, Map environments )
+        throws ContinuumReleaseException
+    {
+        BuildResult buildResult = buildResultDao.getLatestBuildResultForProject( projectId );
+
+        String buildAgentUrl = buildResult.getBuildUrl();
+
+        if ( StringUtils.isBlank( buildAgentUrl ) )
+        {
+            log.error( "Unable to perform release because no build agent found" );
+            return;
+        }
+        
+        if ( goals == null )
+        {
+            goals = "";
+        }
+
+        if ( arguments == null )
+        {
+            arguments = "";
+        }
+
+        Map map = new HashMap();
+
+        if ( repository != null )
+        {
+            map.put( DistributedReleaseUtil.KEY_LOCAL_REPOSITORY, repository.getLocation() );
+            map.put( DistributedReleaseUtil.KEY_LOCAL_REPOSITORY_NAME, repository.getName() );
+            map.put( DistributedReleaseUtil.KEY_LOCAL_REPOSITORY_LAYOUT, repository.getLayout() );
+        }
+
+        try
+        {
+            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+            client.releasePerformFromScm( goals, arguments, useReleaseProfile, map, scmUrl, scmUsername, scmPassword,
+                                          scmTag, scmTagBase, environments );
+        }
+        catch ( MalformedURLException e )
+        {
+            log.error( "Invalid build agent url " + buildAgentUrl );
+            throw new ContinuumReleaseException( "Invalid build agent url " + buildAgentUrl );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Failed to perform release", e );
+            throw new ContinuumReleaseException( "Failed to perform release", e );
+        }
+    }
+
+    public void releaseRollback( String releaseId, int projectId )
+        throws ContinuumReleaseException
+    {
+        //TODO
+    }
+
+    public String releaseCleanup( String releaseId )
+        throws ContinuumReleaseException
+    {
+        String buildAgentUrl = getBuildAgentUrl( releaseId );
+
+        if ( StringUtils.isBlank( buildAgentUrl ) )
+        {
+            log.info( "Unable to cleanup release for " + releaseId );
+            return null;
+        }
+
+        try
+        {
+            SlaveBuildAgentTransportClient client = new SlaveBuildAgentTransportClient( new URL( buildAgentUrl ) );
+            return client.releaseCleanup( releaseId );
+        }
+        catch ( MalformedURLException e )
+        {
+            log.error( "Invalid build agent url " + buildAgentUrl );
+            throw new ContinuumReleaseException( "Invalid build agent url " + buildAgentUrl );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Failed to get prepared release name of " + releaseId, e );
+            throw new ContinuumReleaseException( "Failed to get prepared release name of " + releaseId, e );
+        }
+    }
+
+    private Map createProjectMap( Project project )
+    {
+        Map map = new HashMap();
+
+        map.put( DistributedReleaseUtil.KEY_PROJECT_ID, new Integer( project.getId() ) );
+        map.put( DistributedReleaseUtil.KEY_GROUP_ID, project.getGroupId() );
+        map.put( DistributedReleaseUtil.KEY_ARTIFACT_ID, project.getArtifactId() );
+        map.put( DistributedReleaseUtil.KEY_SCM_URL, project.getScmUrl() );
+        if ( project.getProjectGroup().getLocalRepository() != null )
+        {
+            map.put( DistributedReleaseUtil.KEY_LOCAL_REPOSITORY, project.getProjectGroup().getLocalRepository().getLocation() );
+        }
+
+        return map;
+    }
+
+    private Map createPropertiesMap( Properties properties )
+    {
+        Map map = new HashMap();
+
+        String prop = properties.getProperty( "username" );
+        if ( prop != null )
+        {
+            map.put( DistributedReleaseUtil.KEY_SCM_USERNAME, prop );
+        }
+
+        prop = properties.getProperty( "password" );
+        if ( prop != null )
+        {
+            map.put( DistributedReleaseUtil.KEY_SCM_PASSWORD, prop );
+        }
+
+        prop = properties.getProperty( "tagBase" );
+        if ( prop != null )
+        {
+            map.put( DistributedReleaseUtil.KEY_SCM_TAGBASE, prop );
+        }
+
+        prop = properties.getProperty( "commentPrefix" );
+        if ( prop != null )
+        {
+            map.put( DistributedReleaseUtil.KEY_SCM_COMMENT_PREFIX, prop );
+        }
+
+        prop = properties.getProperty( "tag" );
+        if ( prop != null )
+        {
+            map.put( DistributedReleaseUtil.KEY_SCM_TAG, prop );
+        }
+
+        prop = properties.getProperty( "prepareGoals" );
+        if ( prop != null )
+        {
+            map.put( DistributedReleaseUtil.KEY_PREPARE_GOALS, prop );
+        }
+
+        prop = properties.getProperty( "arguments" );
+        if ( prop != null )
+        {
+            map.put( DistributedReleaseUtil.KEY_ARGUMENTS, prop );
+        }
+
+        prop = properties.getProperty( "useEditMode" );
+        if ( prop != null )
+        {
+            map.put( DistributedReleaseUtil.KEY_USE_EDIT_MODE, prop );
+        }
+
+        prop = properties.getProperty( "addSchema" );
+        if ( prop != null )
+        {
+            map.put( DistributedReleaseUtil.KEY_ADD_SCHEMA, prop );
+        }
+
+        prop = properties.getProperty( "autoVersionSubmodules" );
+        if ( prop != null )
+        {
+            map.put( DistributedReleaseUtil.KEY_AUTO_VERSION_SUBMODULES, prop );
+        }
+
+        return map;
+    }
+
+    private List<PreparedRelease> getPreparedReleases()
+        throws ContinuumReleaseException
+    {
+        File file = getPreparedReleasesFile();
+
+        if ( file.exists() )
+        {
+            try
+            {
+                ContinuumPrepareReleasesModelXpp3Reader reader = new ContinuumPrepareReleasesModelXpp3Reader();
+                PreparedReleaseModel model = reader.read( new InputStreamReader( new FileInputStream( file ) ) );
+    
+                return model.getPreparedReleases();
+            }
+            catch ( IOException e )
+            {
+                log.error( e.getMessage(), e );
+                throw new ContinuumReleaseException( "Unable to get prepared releases", e );
+            }
+            catch ( XmlPullParserException e )
+            {
+                log.error( e.getMessage(), e );
+                throw new ContinuumReleaseException( e.getMessage(), e );
+            }
+        }
+
+        return null;
+    }
+
+    private void addReleasePrepare( String releaseId, String buildAgentUrl )
+        throws ContinuumReleaseException
+    {
+        File file = getPreparedReleasesFile();
+
+        if ( !file.exists() )
+        {
+            file.getParentFile().mkdirs();
+        }
+
+        PreparedRelease release = new PreparedRelease();
+        release.setReleaseId( releaseId );
+        release.setBuildAgentUrl( buildAgentUrl );
+
+        List<PreparedRelease> preparedReleases = getPreparedReleases();
+
+        if ( preparedReleases == null )
+        {
+            preparedReleases = new ArrayList<PreparedRelease>();
+        }
+        else 
+        {
+            boolean found = false;
+
+            for ( PreparedRelease preparedRelease : preparedReleases )
+            {
+                if ( preparedRelease.getReleaseId().equals( release.getReleaseId() ) )
+                {
+                    preparedRelease.setBuildAgentUrl( release.getBuildAgentUrl() );
+                    found = true;
+                }
+            }
+            
+            if ( !found )
+            {
+                preparedReleases.add( release );
+            }
+        }
+
+        PreparedReleaseModel model = new PreparedReleaseModel();
+        model.setPreparedReleases( preparedReleases );
+
+        try
+        {
+            ContinuumPrepareReleasesModelXpp3Writer writer = new ContinuumPrepareReleasesModelXpp3Writer();
+            FileWriter fileWriter = new FileWriter( file );
+            writer.write( fileWriter, model );
+        }
+        catch ( IOException e )
+        {
+            throw new ContinuumReleaseException( "Failed to write prepared releases in file", e );
+        }
+    }
+
+    private void removePrepareRelease( String releaseId )
+        throws ContinuumReleaseException
+    {
+        List<PreparedRelease> preparedReleases = getPreparedReleases();
+    }
+
+    private String getBuildAgentUrl( String releaseId )
+        throws ContinuumReleaseException
+    {
+        List<PreparedRelease> preparedReleases = getPreparedReleases();
+        
+        for ( PreparedRelease preparedRelease : preparedReleases )
+        {
+            if ( preparedRelease.getReleaseId().equals( releaseId ) )
+            {
+                return preparedRelease.getBuildAgentUrl();
+            }
+        }
+
+        return null;
+    }
+
+    private File getPreparedReleasesFile()
+    {
+        return new File( System.getProperty( "appserver.base" ) + File.separator + "conf" + File.separator
+                         + PREPARED_RELEASES_FILENAME );
+    }
+}
\ No newline at end of file

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

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

Modified: continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java (original)
+++ continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java Sun Mar  8 14:41:33 2009
@@ -52,6 +52,7 @@
 import org.apache.continuum.model.release.ContinuumReleaseResult;
 import org.apache.continuum.purge.ContinuumPurgeManager;
 import org.apache.continuum.purge.PurgeConfigurationService;
+import org.apache.continuum.release.distributed.manager.DistributedReleaseManager;
 import org.apache.continuum.repository.RepositoryService;
 import org.apache.continuum.taskqueue.PrepareBuildProjectsTask;
 import org.apache.continuum.taskqueue.manager.TaskQueueManager;
@@ -270,6 +271,11 @@
      */
     private DistributedBuildManager distributedBuildManager;
 
+    /**
+     * @plexus.requirement
+     */
+    private DistributedReleaseManager distributedReleaseManager;
+
     public DefaultContinuum()
     {
         Runtime.getRuntime().addShutdownHook( new Thread()
@@ -328,6 +334,11 @@
         return parallelBuildsManager;
     }
 
+    public DistributedReleaseManager getDistributedReleaseManager()
+    {
+        return distributedReleaseManager;
+    }
+
     // ----------------------------------------------------------------------
     // Project Groups
     // ----------------------------------------------------------------------
@@ -1476,7 +1487,10 @@
 
         executeAction( "store-project", context );
 
-        executeAction( "add-project-to-checkout-queue", context );
+        if ( !configurationService.isDistributedBuildEnabled() )
+        {
+            executeAction( "add-project-to-checkout-queue", context );
+        }
 
         executeAction( "add-assignable-roles", context );
 
@@ -1727,7 +1741,10 @@
                 // used by BuildManager to determine on which build queue will the project be put
                 context.put( AbstractContinuumAction.KEY_BUILD_DEFINITION, defaultBuildDefinition );
 
-                executeAction( "add-project-to-checkout-queue", context );
+                if ( !configurationService.isDistributedBuildEnabled() )
+                {
+                    executeAction( "add-project-to-checkout-queue", context );
+                }
 
             }
         }

Modified: continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/scm/queue/PrepareBuildProjectsTaskExecutor.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/scm/queue/PrepareBuildProjectsTaskExecutor.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/scm/queue/PrepareBuildProjectsTaskExecutor.java (original)
+++ continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/scm/queue/PrepareBuildProjectsTaskExecutor.java Sun Mar  8 14:41:33 2009
@@ -120,14 +120,14 @@
                 log.info( "Initializing prepare build" );
                 context = initializeContext( projectId, buildDefinitionId );
 
+                log.info( "Starting prepare build of project: " + AbstractContinuumAction.getProject( context ).getName() );
+                startPrepareBuild( context );
+
                 if ( !checkProjectScmRoot( context ) )
                 {
                     break;
                 }
 
-                log.info( "Starting prepare build of project: " + AbstractContinuumAction.getProject( context ).getName() );
-                startPrepareBuild( context );
-
                 try
                 {
                     if ( AbstractContinuumAction.getBuildDefinition( context ).isBuildFresh() )

Modified: continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-api/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportService.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-api/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportService.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-api/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportService.java (original)
+++ continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-api/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportService.java Sun Mar  8 14:41:33 2009
@@ -47,4 +47,35 @@
 
     public String getProjectFileContent( int projectId, String directory, String filename )
         throws Exception;
+
+    public Map getReleasePluginParameters( int projectId, String pomFilename )
+        throws Exception;
+
+    public List<Map<String, String>> processProject( int projectId, String pomFilename, boolean autoVersionSubmodules )
+        throws Exception;
+
+    public String releasePrepare( Map project, Map properties, Map releaseVersion, Map developmentVersion, Map environments )
+        throws Exception;
+
+    public Map getReleaseResult( String releaseId )
+        throws Exception;
+
+    public Map getListener( String releaseId )
+        throws Exception;
+
+    public Boolean removeListener( String releaseId )
+        throws Exception;
+
+    public String getPreparedReleaseName( String releaseId )
+        throws Exception;
+
+    public Boolean releasePerform( String releaseId, String goals, String arguments, boolean useReleaseProfile, Map repository )
+        throws Exception;
+
+    public Boolean releasePerformFromScm( String goals, String arguments, boolean useReleaseProfile, Map repository, String scmUrl, 
+                                          String scmUsername, String scmPassword, String scmTag, String scmTagBase, Map environments )
+        throws Exception;
+
+    public String releaseCleanup( String releaseId )
+        throws Exception;
 }

Modified: continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-client/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportClient.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-client/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportClient.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-client/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportClient.java (original)
+++ continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-client/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportClient.java Sun Mar  8 14:41:33 2009
@@ -215,4 +215,199 @@
 
         return result;
     }
+
+    public Map getReleasePluginParameters( int projectId, String pomFilename )
+        throws Exception
+    {
+        Map result = null;
+
+        try
+        {
+            result = slave.getReleasePluginParameters( projectId, pomFilename );
+            log.info(  "Retrieving release plugin parameters" );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Error retrieving release plugin parameters", e );
+            throw new Exception( "Error retrieving release plugin parameters", e );
+        }
+
+        return result;
+    }
+
+    public List<Map<String, String>> processProject( int projectId, String pomFilename, boolean autoVersionSubmodules )
+        throws Exception
+    {
+        List<Map<String, String>> result = null;
+
+        try
+        {
+            result = slave.processProject( projectId, pomFilename, autoVersionSubmodules );
+            log.info( "Processing project" );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Error processing project", e );
+            throw new Exception( "Error processing project", e );
+        }
+
+        return result;
+    }
+
+    public String releasePrepare( Map project, Map properties, Map releaseVersion, Map developmentVersion, Map environments )
+        throws Exception
+    {
+        String releaseId = null;
+
+        try
+        {
+            releaseId = slave.releasePrepare( project, properties, releaseVersion, developmentVersion, environments );
+            log.info( "Preparing release" );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Error while preparing release", e );
+            throw new Exception( "Error while preparing release", e );
+        }
+
+        return releaseId;
+    }
+
+    public Map getReleaseResult( String releaseId )
+        throws Exception
+    {
+        Map result = null;
+
+        try
+        {
+            result = slave.getReleaseResult( releaseId );
+            log.info( "Retrieving release result for " + releaseId );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Error retrieving release result for " + releaseId, e );
+            throw new Exception( "Error retrieving release result for " + releaseId, e );
+        }
+
+        return result;
+    }
+
+    public Map getListener( String releaseId )
+        throws Exception
+    {
+        Map result = null;
+
+        try
+        {
+            result = slave.getListener( releaseId );
+            log.info( "Retrieving listener for " + releaseId );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Error retrieving listener for " + releaseId, e );
+            throw new Exception( "Error retrieving listener for " + releaseId, e );
+        }
+
+        return result;
+    }
+
+    public Boolean removeListener( String releaseId )
+        throws Exception
+    {
+        Boolean result = null;
+
+        try
+        {
+            slave.removeListener( releaseId );
+            result = Boolean.FALSE;
+            log.info( "Removing listener for " + releaseId );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Error removing listener for " + releaseId, e );
+            throw new Exception( "Error removing listener for " + releaseId, e );
+        }
+
+        return result;
+    }
+
+    public String getPreparedReleaseName( String releaseId )
+        throws Exception
+    {
+        String result = null;
+
+        try
+        {
+            result = slave.getPreparedReleaseName( releaseId );
+            log.info( "Retrieving prepared release name for " + releaseId );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Error while retrieving prepared release name for " + releaseId );
+            throw new Exception( "Error while retrieving prepared release name for " + releaseId );
+        }
+
+        return result;
+    }
+
+    public Boolean releasePerform( String releaseId, String goals, String arguments, boolean useReleaseProfile, Map repository )
+        throws Exception
+    {
+        Boolean result = null;
+
+        try
+        {
+            slave.releasePerform( releaseId, goals, arguments, useReleaseProfile, repository );
+            result = Boolean.FALSE;
+            log.info( "Performing release" );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Error performing release", e );
+            throw new Exception( "Error performing release", e );
+        }
+
+        return result;
+    }
+
+    public Boolean releasePerformFromScm( String goals, String arguments, boolean useReleaseProfile, Map repository, String scmUrl,
+                                          String scmUsername, String scmPassword, String scmTag, String scmTagBase, Map environments )
+        throws Exception
+    {
+        Boolean result = null;
+
+        try
+        {
+            slave.releasePerformFromScm( goals, arguments, useReleaseProfile, repository, scmUrl, scmUsername, scmPassword, scmTag,
+                                         scmTagBase, environments);
+            result = Boolean.FALSE;
+            log.info( "Performing release" );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Error performing release from scm", e );
+            throw new Exception( "Error performing release from scm", e );
+        }
+
+        return result;
+    }
+
+    public String releaseCleanup( String releaseId )
+        throws Exception
+    {
+        String result = null;
+
+        try
+        {
+            result = slave.releaseCleanup( releaseId );
+            log.info( "Cleanup release of " + releaseId );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Error cleaning up release of " + releaseId, e );
+            throw new Exception( "Error cleaning up release of " + releaseId, e );
+        }
+
+        return result;
+    }
 }

Modified: continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-server/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportServer.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-server/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportServer.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-server/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportServer.java (original)
+++ continuum/trunk/continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-server/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportServer.java Sun Mar  8 14:41:33 2009
@@ -167,4 +167,161 @@
             throw e;
         }
     }
+
+    public Map getReleasePluginParameters( int projectId, String pomFilename )
+        throws Exception
+    {
+        try
+        {
+            return continuumBuildAgentService.getReleasePluginParameters( projectId, pomFilename );
+        }
+        catch ( ContinuumBuildAgentException e )
+        {
+            log.error( "Failed to retrieve release plugin parameters", e );
+            throw e;
+        }
+    }
+
+    public List<Map<String, String>> processProject( int projectId, String pomFilename, boolean autoVersionSubmodules )
+        throws Exception
+    {
+        try
+        {
+            return continuumBuildAgentService.processProject( projectId, pomFilename, autoVersionSubmodules );
+        }
+        catch ( ContinuumBuildAgentException e )
+        {
+            log.error( "Failed to process project", e );
+            throw e;
+        }
+    }
+
+    public String releasePrepare( Map project, Map properties, Map releaseVersion, Map developmentVersion, Map environments )
+        throws Exception
+    {
+        try
+        {
+            return continuumBuildAgentService.releasePrepare( project, properties, releaseVersion, developmentVersion, environments );
+        }
+        catch ( ContinuumBuildAgentException e )
+        {
+            log.error( "Failed to prepare release", e );
+            throw e;
+        }
+    }
+
+    public Map getListener( String releaseId )
+        throws Exception
+    {
+        try
+        {
+            return continuumBuildAgentService.getListener( releaseId );
+        }
+        catch ( ContinuumBuildAgentException e )
+        {
+            log.error( "Failed to retrieve listener state of " + releaseId, e );
+            throw e;
+        }
+    }
+
+    public Map getReleaseResult( String releaseId )
+        throws Exception
+    {
+        try
+        {
+            return continuumBuildAgentService.getReleaseResult( releaseId );
+        }
+        catch ( ContinuumBuildAgentException e )
+        {
+            log.error( "Failed to retrieve release result of " + releaseId, e );
+            throw e;
+        }
+    }
+
+    public Boolean removeListener( String releaseId )
+        throws Exception
+    {
+        Boolean result = Boolean.FALSE;
+
+        try
+        {
+            continuumBuildAgentService.removeListener( releaseId );
+            result = Boolean.TRUE;
+        }
+        catch ( ContinuumBuildAgentException e )
+        {
+            log.error( "Failed to remove listener of " + releaseId, e );
+            throw e;
+        }
+
+        return result;
+    }
+
+    public String getPreparedReleaseName( String releaseId )
+        throws Exception
+    {
+        try
+        {
+            return continuumBuildAgentService.getPreparedReleaseName( releaseId );
+        }
+        catch ( ContinuumBuildAgentException e )
+        {
+            log.error( "Failed to retrieve prepared release name of " + releaseId );
+            throw e;
+        }
+    }
+
+    public Boolean releasePerform( String releaseId, String goals, String arguments, boolean useReleaseProfile, Map repository )
+        throws Exception
+    {
+        Boolean result = Boolean.FALSE;
+
+        try
+        {
+            continuumBuildAgentService.releasePerform( releaseId, goals, arguments, useReleaseProfile, repository );
+            result = Boolean.TRUE;
+        }
+        catch ( ContinuumBuildAgentException e )
+        {
+            log.error( "Unable to perform release", e );
+            throw e;
+        }
+
+        return result;
+    }
+
+    public Boolean releasePerformFromScm( String goals, String arguments, boolean useReleaseProfile, Map repository, String scmUrl,
+                                          String scmUsername, String scmPassword, String scmTag, String scmTagBase, Map environments )
+        throws Exception
+    {
+        Boolean result = Boolean.FALSE;
+    
+        try
+        {
+            continuumBuildAgentService.releasePerformFromScm( goals, arguments, useReleaseProfile, repository, scmUrl, scmUsername,
+                                                              scmPassword, scmTag, scmTagBase, environments );
+            result = Boolean.TRUE;
+        }
+        catch ( ContinuumBuildAgentException e )
+        {
+            log.error( "Unable to perform release", e );
+            throw e;
+        }
+    
+        return result;
+    }
+
+    public String releaseCleanup( String releaseId )
+        throws Exception
+    {
+        try
+        {
+            return continuumBuildAgentService.releaseCleanup( releaseId );
+        }
+        catch ( ContinuumBuildAgentException e )
+        {
+            log.error( "Unable to cleanup release of " + releaseId, e );
+            throw e;
+        }
+    }
 }

Modified: continuum/trunk/continuum-release/pom.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-release/pom.xml?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-release/pom.xml (original)
+++ continuum/trunk/continuum-release/pom.xml Sun Mar  8 14:41:33 2009
@@ -36,10 +36,6 @@
       <artifactId>continuum-api</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.apache.continuum</groupId>
-      <artifactId>continuum-commons</artifactId>
-    </dependency>
-    <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-settings</artifactId>
     </dependency>
@@ -111,6 +107,29 @@
     </dependency>
   </dependencies>
   <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.modello</groupId>
+        <artifactId>modello-maven-plugin</artifactId>
+        <configuration>
+          <models>
+            <model>src/main/mdo/prepared-releases.mdo</model>
+          </models>
+          <version>1.0.0</version>
+        </configuration>
+        <executions>
+          <execution>
+            <id>continuum-modello</id>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>java</goal>
+              <goal>xpp3-reader</goal>
+              <goal>xpp3-writer</goal>
+            </goals>
+          </execution>                   
+        </executions>
+      </plugin>
+    </plugins>
     <testResources>
       <testResource>
         <directory>src/test/resources</directory>

Modified: continuum/trunk/continuum-release/src/main/java/org/apache/continuum/release/config/ContinuumReleaseDescriptor.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-release/src/main/java/org/apache/continuum/release/config/ContinuumReleaseDescriptor.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-release/src/main/java/org/apache/continuum/release/config/ContinuumReleaseDescriptor.java (original)
+++ continuum/trunk/continuum-release/src/main/java/org/apache/continuum/release/config/ContinuumReleaseDescriptor.java Sun Mar  8 14:41:33 2009
@@ -32,6 +32,8 @@
 {
     private Map<String, String> environments;
 
+    private String executable;
+
     public void addEnvironment( String name, String value )
     {
         getEnvironments().put( name, value );
@@ -65,4 +67,14 @@
     {
         this.environments = environments;
     }
+
+    public String getExecutable()
+    {
+        return executable;
+    }
+
+    public void setExecutable( String executable )
+    {
+        this.executable = executable;
+    }
 }

Modified: continuum/trunk/continuum-release/src/main/java/org/apache/continuum/release/phase/AbstractContinuumRunGoalsPhase.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-release/src/main/java/org/apache/continuum/release/phase/AbstractContinuumRunGoalsPhase.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-release/src/main/java/org/apache/continuum/release/phase/AbstractContinuumRunGoalsPhase.java (original)
+++ continuum/trunk/continuum-release/src/main/java/org/apache/continuum/release/phase/AbstractContinuumRunGoalsPhase.java Sun Mar  8 14:41:33 2009
@@ -59,21 +59,14 @@
             if ( !StringUtils.isEmpty( goals ) )
             {
                 Map<String, String> environments = null;
-                
+
+                String executable = null;
+
                 if ( releaseDescriptor instanceof ContinuumReleaseDescriptor )
                 {
                     environments = ( (ContinuumReleaseDescriptor) releaseDescriptor ).getEnvironments();
-                }
 
-                String executable = installationService.getExecutorConfigurator( InstallationService.MAVEN2_TYPE ).getExecutable();
-
-                if ( environments != null )
-                {
-                    String m2Home = environments.get( installationService.getEnvVar( InstallationService.MAVEN2_TYPE ) );
-                    if ( StringUtils.isNotEmpty( m2Home ) )
-                    {
-                        executable = m2Home + File.separator + "bin" + File.separator + executable;
-                    }
+                    executable = ( (ContinuumReleaseDescriptor) releaseDescriptor).getExecutable();
                 }
 
                 shellCommandHelper.executeGoals( determineWorkingDirectory( workingDirectory,

Modified: continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/DefaultContinuumReleaseManager.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/DefaultContinuumReleaseManager.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/DefaultContinuumReleaseManager.java (original)
+++ continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/DefaultContinuumReleaseManager.java Sun Mar  8 14:41:33 2009
@@ -22,14 +22,10 @@
 import org.apache.commons.lang.BooleanUtils;
 import org.apache.continuum.model.repository.LocalRepository;
 import org.apache.continuum.release.config.ContinuumReleaseDescriptor;
-import org.apache.maven.continuum.installation.InstallationService;
 import org.apache.maven.continuum.model.project.Project;
-import org.apache.maven.continuum.model.system.Installation;
-import org.apache.maven.continuum.model.system.Profile;
 import org.apache.maven.continuum.release.tasks.PerformReleaseProjectTask;
 import org.apache.maven.continuum.release.tasks.PrepareReleaseProjectTask;
 import org.apache.maven.continuum.release.tasks.RollbackReleaseProjectTask;
-import org.apache.maven.continuum.utils.WorkingDirectoryService;
 import org.apache.maven.scm.manager.ScmManager;
 import org.apache.maven.scm.provider.ScmProvider;
 import org.apache.maven.scm.repository.ScmRepository;
@@ -40,13 +36,9 @@
 import org.codehaus.plexus.taskqueue.Task;
 import org.codehaus.plexus.taskqueue.TaskQueue;
 import org.codehaus.plexus.taskqueue.TaskQueueException;
-import org.codehaus.plexus.util.StringUtils;
 
 import java.io.File;
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.Hashtable;
-import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 
@@ -81,16 +73,6 @@
     /**
      * @plexus.requirement
      */
-    private WorkingDirectoryService workingDirectoryService;
-
-    /**
-     * @plexus.requirement
-     */
-    private InstallationService installationService;
-
-    /**
-     * @plexus.requirement
-     */
     private ScmManager scmManager;
 
     private Map<String, ContinuumReleaseManagerListener> listeners;
@@ -110,28 +92,29 @@
     private static Map releaseResults;
 
     public String prepare( Project project, Properties releaseProperties, Map<String, String> relVersions,
-                           Map<String, String> devVersions, ContinuumReleaseManagerListener listener )
+                           Map<String, String> devVersions, ContinuumReleaseManagerListener listener,
+                           String workingDirectory )
         throws ContinuumReleaseException
     {
-        return prepare( project, releaseProperties, relVersions, devVersions, listener, null );
+        return prepare( project, releaseProperties, relVersions, devVersions, listener, workingDirectory, null, null );
     }
 
     public String prepare( Project project, Properties releaseProperties, Map<String, String> relVersions,
-                           Map<String, String> devVersions, ContinuumReleaseManagerListener listener, Profile profile )
+                           Map<String, String> devVersions, ContinuumReleaseManagerListener listener,
+                           String workingDirectory, Map<String, String> environments, String executable )
         throws ContinuumReleaseException
     {
         String releaseId = project.getGroupId() + ":" + project.getArtifactId();
 
         ReleaseDescriptor descriptor =
-            getReleaseDescriptor( project, releaseProperties, relVersions, devVersions, profile );
+            getReleaseDescriptor( project, releaseProperties, relVersions, devVersions, environments, workingDirectory, executable );
 
         getListeners().put( releaseId, listener );
 
         try
         {
             prepareReleaseQueue.put(
-                new PrepareReleaseProjectTask( releaseId, descriptor, (ReleaseManagerListener) listener, profile ) );
-
+                new PrepareReleaseProjectTask( releaseId, descriptor, (ReleaseManagerListener) listener ) );
         }
         catch ( TaskQueueException e )
         {
@@ -236,42 +219,13 @@
         return releaseResults;
     }
 
-    public Map<String, String> getEnvironments( Profile profile )
-    {
-        if ( profile == null )
-        {
-            return Collections.EMPTY_MAP;
-        }
-
-        Map<String, String> envVars = new HashMap<String, String>();
-
-        String javaHome = getJavaHomeValue( profile );
-        if ( !StringUtils.isEmpty( javaHome ) )
-        {
-            envVars.put( installationService.getEnvVar( InstallationService.JDK_TYPE ), javaHome );
-        }
-
-        Installation builder = profile.getBuilder();
-        if ( builder != null )
-        {
-            envVars.put( installationService.getEnvVar( InstallationService.MAVEN2_TYPE ), builder.getVarValue() );
-        }
-
-        List<Installation> installations = profile.getEnvironmentVariables();
-        for ( Installation installation : installations )
-        {
-            envVars.put( installation.getVarName(), installation.getVarValue() );
-        }
-        return envVars;
-    }
-
     private ReleaseDescriptor getReleaseDescriptor( Project project, Properties releaseProperties,
                                                     Map<String, String> relVersions, Map<String, String> devVersions,
-                                                    Profile profile )
+                                                    Map<String, String> environments, String workingDirectory,
+                                                    String executable )
     {
         ContinuumReleaseDescriptor descriptor = new ContinuumReleaseDescriptor();
-        String workingDirectory = workingDirectoryService.getWorkingDirectory( project ).getPath();
-
+        
         //release properties from the project
         descriptor.setWorkingDirectory( workingDirectory );
         descriptor.setScmSourceUrl( project.getScmUrl() );
@@ -322,7 +276,8 @@
         descriptor.setInteractive( false );
 
         //set environments
-        descriptor.setEnvironments( getEnvironments( profile ) );
+        descriptor.setEnvironments( environments );
+        descriptor.setExecutable( executable );
 
         return descriptor;
     }
@@ -355,16 +310,6 @@
         return listeners;
     }
 
-    private String getJavaHomeValue( Profile profile )
-    {
-        Installation jdk = profile.getJdk();
-        if ( jdk == null )
-        {
-            return null;
-        }
-        return jdk.getVarValue();
-    }
-
     public String sanitizeTagName( String scmUrl, String tagName )
         throws Exception
     {

Modified: continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/tasks/AbstractReleaseProjectTask.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/tasks/AbstractReleaseProjectTask.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/tasks/AbstractReleaseProjectTask.java (original)
+++ continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/tasks/AbstractReleaseProjectTask.java Sun Mar  8 14:41:33 2009
@@ -39,15 +39,11 @@
 
     private long maxExecutionTime;
 
-    private Profile profile;
-
-    public AbstractReleaseProjectTask( String releaseId, ReleaseDescriptor descriptor, ReleaseManagerListener listener,
-                                       Profile profile )
+    public AbstractReleaseProjectTask( String releaseId, ReleaseDescriptor descriptor, ReleaseManagerListener listener )
     {
         this.releaseId = releaseId;
         this.descriptor = descriptor;
         this.listener = listener;
-        this.profile = profile;
     }
 
     public ReleaseDescriptor getDescriptor()
@@ -89,14 +85,4 @@
     {
         this.maxExecutionTime = maxTime;
     }
-
-    public Profile getProfile()
-    {
-        return profile;
-    }
-
-    public void setProfile( Profile profile )
-    {
-        this.profile = profile;
-    }
 }

Modified: continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/tasks/PerformReleaseProjectTask.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/tasks/PerformReleaseProjectTask.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/tasks/PerformReleaseProjectTask.java (original)
+++ continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/tasks/PerformReleaseProjectTask.java Sun Mar  8 14:41:33 2009
@@ -20,7 +20,6 @@
  */
 
 import org.apache.continuum.model.repository.LocalRepository;
-import org.apache.maven.continuum.model.system.Profile;
 import org.apache.maven.shared.release.ReleaseManagerListener;
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
 
@@ -44,20 +43,13 @@
     public PerformReleaseProjectTask( String releaseId, ReleaseDescriptor descriptor, File buildDirectory, String goals,
                                       boolean useReleaseProfile, ReleaseManagerListener listener )
     {
-        this( releaseId, descriptor, buildDirectory, goals, useReleaseProfile, listener, null, null );
+        this( releaseId, descriptor, buildDirectory, goals, useReleaseProfile, listener, null );
     }
 
     public PerformReleaseProjectTask( String releaseId, ReleaseDescriptor descriptor, File buildDirectory, String goals,
                                       boolean useReleaseProfile, ReleaseManagerListener listener, LocalRepository repository )
     {
-        this( releaseId, descriptor, buildDirectory, goals, useReleaseProfile, listener, repository, null );
-    }
-    
-    public PerformReleaseProjectTask( String releaseId, ReleaseDescriptor descriptor, File buildDirectory, String goals,
-                                      boolean useReleaseProfile, ReleaseManagerListener listener, LocalRepository repository,
-                                      Profile profile )
-    {
-        super( releaseId, descriptor, listener, profile );
+        super( releaseId, descriptor, listener );
         setBuildDirectory( buildDirectory );
         setGoals( goals );
         setUseReleaseProfile( useReleaseProfile );

Modified: continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/tasks/PrepareReleaseProjectTask.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/tasks/PrepareReleaseProjectTask.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/tasks/PrepareReleaseProjectTask.java (original)
+++ continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/tasks/PrepareReleaseProjectTask.java Sun Mar  8 14:41:33 2009
@@ -19,7 +19,6 @@
  * under the License.
  */
 
-import org.apache.maven.continuum.model.system.Profile;
 import org.apache.maven.shared.release.ReleaseManagerListener;
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
 
@@ -32,11 +31,6 @@
 {
     public PrepareReleaseProjectTask( String releaseId, ReleaseDescriptor descriptor, ReleaseManagerListener listener )
     {
-        this( releaseId, descriptor, listener, null );
-    }
-    
-    public PrepareReleaseProjectTask( String releaseId, ReleaseDescriptor descriptor, ReleaseManagerListener listener, Profile profile )
-    {
-        super( releaseId, descriptor, listener, profile );
+        super( releaseId, descriptor, listener );
     }
 }

Modified: continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/tasks/RollbackReleaseProjectTask.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/tasks/RollbackReleaseProjectTask.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/tasks/RollbackReleaseProjectTask.java (original)
+++ continuum/trunk/continuum-release/src/main/java/org/apache/maven/continuum/release/tasks/RollbackReleaseProjectTask.java Sun Mar  8 14:41:33 2009
@@ -32,11 +32,6 @@
 {
     public RollbackReleaseProjectTask( String releaseId, ReleaseDescriptor descriptor, ReleaseManagerListener listener )
     {
-        this( releaseId, descriptor, listener, null );
-    }
-    
-    public RollbackReleaseProjectTask( String releaseId, ReleaseDescriptor descriptor, ReleaseManagerListener listener, Profile profile )
-    {
-        super( releaseId, descriptor, listener, profile );
+        super( releaseId, descriptor, listener );
     }
 }

Added: continuum/trunk/continuum-release/src/main/mdo/prepared-releases.mdo
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-release/src/main/mdo/prepared-releases.mdo?rev=751433&view=auto
==============================================================================
--- continuum/trunk/continuum-release/src/main/mdo/prepared-releases.mdo (added)
+++ continuum/trunk/continuum-release/src/main/mdo/prepared-releases.mdo Sun Mar  8 14:41:33 2009
@@ -0,0 +1,67 @@
+<?xml version="1.0"?>
+<!--
+  ~ 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.
+  -->
+<model>
+  <id>continuum-prepared-releases</id>
+  <name>ContinuumPrepareReleasesModel</name>
+  <defaults>
+    <default>
+      <key>package</key>
+      <value>org.apache.continuum.release.model</value>
+    </default>
+  </defaults>
+  <classes>
+    <class rootElement="true" xml.tagName="prepared-releases">
+      <name>PreparedReleaseModel</name>
+      <version>1.0.0</version>
+      <fields>
+        <field>
+          <name>preparedReleases</name>
+          <version>1.0.0</version>
+          <description></description>
+          <required>true</required>
+          <association>
+            <type>PreparedRelease</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+    </class>
+    <class>
+      <name>PreparedRelease</name>
+      <version>1.0.0</version>
+      <fields>
+        <field>
+          <name>releaseId</name>
+          <version>1.0.0</version>
+          <required>true</required>
+          <description>release</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>buildAgentUrl</name>
+          <version>1.0.0</version>
+          <required>true</required>
+          <description>build agent url</description>
+          <type>String</type>
+        </field>
+      </fields>
+    </class>
+  </classes>
+</model>
\ No newline at end of file

Modified: continuum/trunk/continuum-release/src/main/resources/META-INF/plexus/components.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-release/src/main/resources/META-INF/plexus/components.xml?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-release/src/main/resources/META-INF/plexus/components.xml (original)
+++ continuum/trunk/continuum-release/src/main/resources/META-INF/plexus/components.xml Sun Mar  8 14:41:33 2009
@@ -44,12 +44,6 @@
           <field-name>rollbackReleaseQueue</field-name>
         </requirement>
         <requirement>
-          <role>org.apache.maven.continuum.utils.WorkingDirectoryService</role>
-        </requirement>
-        <requirement>
-          <role>org.apache.maven.continuum.installation.InstallationService</role>
-        </requirement>
-        <requirement>
           <role>org.apache.maven.scm.manager.ScmManager</role>
         </requirement>
       </requirements>
@@ -318,9 +312,6 @@
         <requirement>
           <role>org.apache.continuum.utils.shell.ShellCommandHelper</role>
         </requirement>
-        <requirement>
-          <role>org.apache.maven.continuum.installation.InstallationService</role>
-        </requirement>
       </requirements>
     </component>
     <component>
@@ -331,9 +322,6 @@
         <requirement>
           <role>org.apache.continuum.utils.shell.ShellCommandHelper</role>
         </requirement>
-        <requirement>
-          <role>org.apache.maven.continuum.installation.InstallationService</role>
-        </requirement>
       </requirements>
     </component>
     

Added: continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/AbstractReleaseAction.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/AbstractReleaseAction.java?rev=751433&view=auto
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/AbstractReleaseAction.java (added)
+++ continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/AbstractReleaseAction.java Sun Mar  8 14:41:33 2009
@@ -0,0 +1,74 @@
+package org.apache.continuum.web.action;
+
+/*
+ * 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.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.continuum.installation.InstallationService;
+import org.apache.maven.continuum.model.system.Installation;
+import org.apache.maven.continuum.model.system.Profile;
+import org.apache.maven.continuum.web.action.ContinuumActionSupport;
+import org.codehaus.plexus.util.StringUtils;
+
+public class AbstractReleaseAction
+    extends ContinuumActionSupport
+{
+    protected Map<String, String> getEnvironments( Profile profile )
+    {
+        if ( profile == null )
+        {
+            return Collections.EMPTY_MAP;
+        }
+
+        Map<String, String> envVars = new HashMap<String, String>();
+
+        String javaHome = getJavaHomeValue( profile );
+        if ( !StringUtils.isEmpty( javaHome ) )
+        {
+            envVars.put( getContinuum().getInstallationService().getEnvVar( InstallationService.JDK_TYPE ), javaHome );
+        }
+
+        Installation builder = profile.getBuilder();
+        if ( builder != null )
+        {
+            envVars.put( getContinuum().getInstallationService().getEnvVar( InstallationService.MAVEN2_TYPE ), builder.getVarValue() );
+        }
+
+        List<Installation> installations = profile.getEnvironmentVariables();
+        for ( Installation installation : installations )
+        {
+            envVars.put( installation.getVarName(), installation.getVarValue() );
+        }
+        return envVars;
+    }
+
+    private String getJavaHomeValue( Profile profile )
+    {
+        Installation jdk = profile.getJdk();
+        if ( jdk == null )
+        {
+            return null;
+        }
+        return jdk.getVarValue();
+    }
+}

Propchange: continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/AbstractReleaseAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/AbstractReleaseAction.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleaseCleanupAction.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleaseCleanupAction.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleaseCleanupAction.java (original)
+++ continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleaseCleanupAction.java Sun Mar  8 14:41:33 2009
@@ -19,10 +19,12 @@
  * under the License.
  */
 
+import org.apache.continuum.release.distributed.manager.DistributedReleaseManager;
 import org.apache.maven.continuum.ContinuumException;
 import org.apache.maven.continuum.release.ContinuumReleaseManager;
 import org.apache.maven.continuum.release.ContinuumReleaseManagerListener;
 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
+import org.codehaus.plexus.util.StringUtils;
 
 /**
  * @author Edwin Punzalan
@@ -51,24 +53,41 @@
             return REQUIRES_AUTHORIZATION;
         }
 
-        ContinuumReleaseManager releaseManager = getContinuum().getReleaseManager();
-
-        releaseManager.getReleaseResults().remove( releaseId );
-
-        ContinuumReleaseManagerListener listener =
-            (ContinuumReleaseManagerListener) releaseManager.getListeners().remove( releaseId );
-
-        if ( listener != null )
+        if ( getContinuum().getConfiguration().isDistributedBuildEnabled() )
         {
-            String goal = listener.getGoalName();
+            DistributedReleaseManager releaseManager = getContinuum().getDistributedReleaseManager();
 
-            return goal + "Finished";
+            String goal = releaseManager.releaseCleanup( releaseId );
+
+            if ( StringUtils.isNotBlank( goal ) )
+            {
+                return goal;
+            }
+            else
+            {
+                throw new Exception( "No listener to cleanup for id " + releaseId );
+            }
         }
         else
         {
-            throw new Exception( "No listener to cleanup for id " + releaseId );
+            ContinuumReleaseManager releaseManager = getContinuum().getReleaseManager();
+    
+            releaseManager.getReleaseResults().remove( releaseId );
+    
+            ContinuumReleaseManagerListener listener =
+                (ContinuumReleaseManagerListener) releaseManager.getListeners().remove( releaseId );
+    
+            if ( listener != null )
+            {
+                String goal = listener.getGoalName();
+    
+                return goal + "Finished";
+            }
+            else
+            {
+                throw new Exception( "No listener to cleanup for id " + releaseId );
+            }
         }
-
     }
 
     public String getReleaseId()

Modified: continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleaseInProgressAction.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleaseInProgressAction.java?rev=751433&r1=751432&r2=751433&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleaseInProgressAction.java (original)
+++ continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleaseInProgressAction.java Sun Mar  8 14:41:33 2009
@@ -23,8 +23,11 @@
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.util.Map;
 
 import org.apache.continuum.model.release.ContinuumReleaseResult;
+import org.apache.continuum.release.distributed.DistributedReleaseUtil;
+import org.apache.continuum.release.distributed.manager.DistributedReleaseManager;
 import org.apache.maven.continuum.ContinuumException;
 import org.apache.maven.continuum.configuration.ConfigurationException;
 import org.apache.maven.continuum.model.project.Project;
@@ -32,6 +35,7 @@
 import org.apache.maven.continuum.release.ContinuumReleaseManager;
 import org.apache.maven.continuum.release.ContinuumReleaseManagerListener;
 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
+import org.apache.maven.continuum.web.model.ReleaseListenerSummary;
 import org.apache.maven.shared.release.ReleaseResult;
 
 /**
@@ -54,6 +58,8 @@
 
     private String projectGroupName = "";
 
+    private ReleaseListenerSummary listenerSummary;
+
     public String execute()
         throws Exception
     {
@@ -68,38 +74,92 @@
 
         String status = "";
 
-        ContinuumReleaseManager releaseManager = getContinuum().getReleaseManager();
-
-        listener = (ContinuumReleaseManagerListener) releaseManager.getListeners().get( releaseId );
+        listenerSummary = new ReleaseListenerSummary();
 
-        if ( listener != null )
+        if ( getContinuum().getConfiguration().isDistributedBuildEnabled() )
         {
-            if ( listener.getState() == ContinuumReleaseManagerListener.LISTENING )
-            {
-                status = "inProgress";
-            }
-            else if ( listener.getState() == ContinuumReleaseManagerListener.FINISHED )
+            DistributedReleaseManager releaseManager = getContinuum().getDistributedReleaseManager();
+
+            Map map = releaseManager.getListener( releaseId );
+
+            if ( map != null && !map.isEmpty() )
             {
-                status = SUCCESS;
+                int state = DistributedReleaseUtil.getReleaseState( map );
+
+                if ( state == ContinuumReleaseManagerListener.LISTENING )
+                {
+                    status = "inProgress";
+                }
+                else if ( state == ContinuumReleaseManagerListener.FINISHED )
+                {
+                    status = SUCCESS;
+                }
+                else
+                {
+                    status = "initialized";
+                }
+    
+                if ( status.equals( SUCCESS ) )
+                {
+                    ReleaseResult result = releaseManager.getReleaseResult( releaseId );
+    
+                    if ( result != null && getContinuum().getContinuumReleaseResult( projectId, releaseGoal, result.getStartTime(), result.getEndTime() ) == null )
+                    {
+                        ContinuumReleaseResult releaseResult = createContinuumReleaseResult( result );
+                        getContinuum().addContinuumReleaseResult( releaseResult );
+                    }
+                }
+
+                listenerSummary.setPhases( DistributedReleaseUtil.getReleasePhases( map ) );
+                listenerSummary.setCompletedPhases( DistributedReleaseUtil.getCompletedReleasePhases( map ) );
+                listenerSummary.setInProgress( DistributedReleaseUtil.getReleaseInProgress( map ) );
+                listenerSummary.setError( DistributedReleaseUtil.getReleaseError( map ) );
             }
             else
             {
-                status = "initialized";
+                throw new Exception( "There is no on-going or finished release operation with id " + releaseId );
             }
         }
         else
         {
-            throw new Exception( "There is no on-going or finished release operation with id " + releaseId );
-        }
-
-        if ( status.equals( SUCCESS ) )
-        {
-            ReleaseResult result = (ReleaseResult) releaseManager.getReleaseResults().get( releaseId );
+            ContinuumReleaseManager releaseManager = getContinuum().getReleaseManager();
+    
+            listener = (ContinuumReleaseManagerListener) releaseManager.getListeners().get( releaseId );
+    
+            if ( listener != null )
+            {
+                if ( listener.getState() == ContinuumReleaseManagerListener.LISTENING )
+                {
+                    status = "inProgress";
+                }
+                else if ( listener.getState() == ContinuumReleaseManagerListener.FINISHED )
+                {
+                    status = SUCCESS;
+                }
+                else
+                {
+                    status = "initialized";
+                }
+
+                listenerSummary.setPhases( listener.getPhases() );
+                listenerSummary.setCompletedPhases( listener.getCompletedPhases() );
+                listenerSummary.setInProgress( listener.getInProgress() );
+                listenerSummary.setError( listener.getError() );
+            }
+            else
+            {
+                throw new Exception( "There is no on-going or finished release operation with id " + releaseId );
+            }
 
-            if ( result != null && getContinuum().getContinuumReleaseResult( projectId, releaseGoal, result.getStartTime(), result.getEndTime() ) == null )
+            if ( status.equals( SUCCESS ) )
             {
-                ContinuumReleaseResult releaseResult = createContinuumReleaseResult( result );
-                getContinuum().addContinuumReleaseResult( releaseResult );
+                ReleaseResult result = (ReleaseResult) releaseManager.getReleaseResults().get( releaseId );
+
+                if ( result != null && getContinuum().getContinuumReleaseResult( projectId, releaseGoal, result.getStartTime(), result.getEndTime() ) == null )
+                {
+                    ContinuumReleaseResult releaseResult = createContinuumReleaseResult( result );
+                    getContinuum().addContinuumReleaseResult( releaseResult );
+                }
             }
         }
 
@@ -118,26 +178,67 @@
             return REQUIRES_AUTHORIZATION;
         }
 
-        ContinuumReleaseManager releaseManager = getContinuum().getReleaseManager();
-
-        listener = (ContinuumReleaseManagerListener) releaseManager.getListeners().get( releaseId );
+        listenerSummary = new ReleaseListenerSummary();
 
-        if ( listener != null )
+        if ( getContinuum().getConfiguration().isDistributedBuildEnabled() )
         {
-            if ( listener.getState() == ContinuumReleaseManagerListener.FINISHED )
+            DistributedReleaseManager releaseManager = getContinuum().getDistributedReleaseManager();
+
+            Map map = releaseManager.getListener( releaseId );
+
+            if ( map != null && !map.isEmpty() )
             {
-                result = (ReleaseResult) releaseManager.getReleaseResults().get( releaseId );
+                int state = DistributedReleaseUtil.getReleaseState( map );
 
-                return SUCCESS;
+                listenerSummary.setPhases( DistributedReleaseUtil.getReleasePhases( map ) );
+                listenerSummary.setCompletedPhases( DistributedReleaseUtil.getCompletedReleasePhases( map ) );
+                listenerSummary.setInProgress( DistributedReleaseUtil.getReleaseInProgress( map ) );
+                listenerSummary.setError( DistributedReleaseUtil.getReleaseError( map ) );
+
+                if ( state == ContinuumReleaseManagerListener.FINISHED )
+                {
+                    result = releaseManager.getReleaseResult( releaseId );
+    
+                    return SUCCESS;
+                }
+                else
+                {
+                    throw new Exception( "The release operation with id " + releaseId + "has not finished yet." );
+                }
             }
             else
             {
-                throw new Exception( "The release operation with id " + releaseId + "has not finished yet." );
+                throw new Exception( "There is no finished release operation with id " + releaseId );
             }
         }
         else
         {
-            throw new Exception( "There is no finished release operation with id " + releaseId );
+            ContinuumReleaseManager releaseManager = getContinuum().getReleaseManager();
+    
+            listener = (ContinuumReleaseManagerListener) releaseManager.getListeners().get( releaseId );
+    
+            if ( listener != null )
+            {
+                listenerSummary.setPhases( listener.getPhases() );
+                listenerSummary.setCompletedPhases( listener.getCompletedPhases() );
+                listenerSummary.setInProgress( listener.getInProgress() );
+                listenerSummary.setError( listener.getError() );
+
+                if ( listener.getState() == ContinuumReleaseManagerListener.FINISHED )
+                {
+                    result = (ReleaseResult) releaseManager.getReleaseResults().get( releaseId );
+    
+                    return SUCCESS;
+                }
+                else
+                {
+                    throw new Exception( "The release operation with id " + releaseId + "has not finished yet." );
+                }
+            }
+            else
+            {
+                throw new Exception( "There is no finished release operation with id " + releaseId );
+            }
         }
     }
 
@@ -202,6 +303,16 @@
         return projectGroupName;
     }
 
+    public ReleaseListenerSummary getListenerSummary()
+    {
+        return listenerSummary;
+    }
+
+    public void setListenerSummary( ReleaseListenerSummary listenerSummary )
+    {
+        this.listenerSummary = listenerSummary;
+    }
+
     private ContinuumReleaseResult createContinuumReleaseResult( ReleaseResult result )
         throws ContinuumException
     {