blob: 5cb7024786cd4c39e16c2dccbd1924a36bd8ddb6 [file] [log] [blame]
package org.apache.maven.continuum.release.executors;
/*
* 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 org.apache.continuum.model.repository.LocalRepository;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.DefaultArtifactRepository;
import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
import org.apache.maven.continuum.release.ContinuumReleaseException;
import org.apache.maven.continuum.release.tasks.PerformReleaseProjectTask;
import org.apache.maven.continuum.release.tasks.ReleaseProjectTask;
import org.apache.maven.profiles.DefaultProfileManager;
import org.apache.maven.profiles.ProfileManager;
import org.apache.maven.project.DuplicateProjectException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectBuilder;
import org.apache.maven.project.MissingProjectException;
import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.project.ProjectSorter;
import org.apache.maven.settings.Settings;
import org.apache.maven.shared.release.ReleaseManagerListener;
import org.apache.maven.shared.release.ReleaseResult;
import org.apache.maven.shared.release.config.ReleaseDescriptor;
import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
import org.codehaus.plexus.PlexusConstants;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.context.Context;
import org.codehaus.plexus.context.ContextException;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
import org.codehaus.plexus.taskqueue.execution.TaskExecutionException;
import org.codehaus.plexus.util.StringUtils;
import org.codehaus.plexus.util.dag.CycleDetectedException;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author Edwin Punzalan
* @version $Id$
*/
public class PerformReleaseTaskExecutor
extends AbstractReleaseTaskExecutor
implements Contextualizable
{
/**
* @plexus.requirement
*/
private MavenProjectBuilder projectBuilder;
private ProfileManager profileManager;
private PlexusContainer container;
private LocalRepository repository;
public void execute( ReleaseProjectTask task )
throws TaskExecutionException
{
PerformReleaseProjectTask performTask = (PerformReleaseProjectTask) task;
ReleaseManagerListener listener = performTask.getListener();
ReleaseDescriptor descriptor = performTask.getDescriptor();
descriptor.setUseReleaseProfile( performTask.isUseReleaseProfile() );
descriptor.setPerformGoals( performTask.getGoals() );
descriptor.setCheckoutDirectory( performTask.getBuildDirectory().getAbsolutePath() );
repository = performTask.getLocalRepository();
List reactorProjects;
try
{
if ( !StringUtils.isEmpty( descriptor.getWorkingDirectory() ) )
{
MavenProject mavenProject = getMavenProject( performTask );
reactorProjects = getReactorProjects( descriptor, mavenProject );
}
else
{
//Perform with provided release parameters (CONTINUUM-1541)
descriptor.setCheckoutDirectory( performTask.getBuildDirectory().getAbsolutePath() );
// Workaround bugs in maven-release-manager 2.1 that require a project even though it will ultimately
// not be used. TODO: check if upgrading will fix, and return to being an empty list
// The project is fake and won't exist in this location
MavenProject project = new MavenProject();
project.setFile( new File( descriptor.getCheckoutDirectory(), "pom.xml" ) );
reactorProjects = Collections.singletonList( project );
// reactorProjects = Collections.emptyList();
}
}
catch ( ContinuumReleaseException e )
{
ReleaseResult result = createReleaseResult();
result.appendError( e );
continuumReleaseManager.getReleaseResults().put( performTask.getReleaseId(), result );
performTask.getListener().error( e.getMessage() );
throw new TaskExecutionException( "Failed to build reactor projects.", e );
}
ReleaseResult result = releaseManager.performWithResult( descriptor,
new DefaultReleaseEnvironment().setSettings(
settings ), reactorProjects, listener );
//override to show the actual start time
result.setStartTime( getStartTime() );
if ( result.getResultCode() == ReleaseResult.SUCCESS )
{
continuumReleaseManager.getPreparedReleases().remove( performTask.getReleaseId() );
}
continuumReleaseManager.getReleaseResults().put( performTask.getReleaseId(), result );
}
/**
* @todo remove and use generate-reactor-projects phase
*/
protected List<MavenProject> getReactorProjects( ReleaseDescriptor descriptor, MavenProject project )
throws ContinuumReleaseException
{
List<MavenProject> reactorProjects = new ArrayList<MavenProject>();
reactorProjects.add( project );
addModules( reactorProjects, project );
try
{
reactorProjects = new ProjectSorter( reactorProjects ).getSortedProjects();
}
catch ( CycleDetectedException e )
{
throw new ContinuumReleaseException( "Failed to sort projects.", e );
}
catch ( DuplicateProjectException e )
{
throw new ContinuumReleaseException( "Failed to sort projects.", e );
}
catch ( MissingProjectException e )
{
throw new ContinuumReleaseException( "Failed to sort projects.", e );
}
return reactorProjects;
}
private void addModules( List<MavenProject> reactorProjects, MavenProject project )
throws ContinuumReleaseException
{
for ( Object o : project.getModules() )
{
String moduleDir = o.toString();
File pomFile = new File( project.getBasedir(), moduleDir + "/pom.xml" );
try
{
MavenProject reactorProject = projectBuilder.build( pomFile, getLocalRepository(), getProfileManager(
settings ) );
reactorProjects.add( reactorProject );
addModules( reactorProjects, reactorProject );
}
catch ( ProjectBuildingException e )
{
throw new ContinuumReleaseException( "Failed to build project.", e );
}
}
}
private File getProjectDescriptorFile( ReleaseDescriptor descriptor )
{
String parentPath = descriptor.getWorkingDirectory();
String pomFilename = descriptor.getPomFileName();
if ( pomFilename == null )
{
pomFilename = "pom.xml";
}
return new File( parentPath, pomFilename );
}
private ArtifactRepository getLocalRepository()
{
if ( repository == null )
{
return new DefaultArtifactRepository( "local-repository", "file://" + settings.getLocalRepository(),
new DefaultRepositoryLayout() );
}
else
{
return new DefaultArtifactRepository( repository.getName(), "file://" + repository.getLocation(),
new DefaultRepositoryLayout() );
}
}
private ProfileManager getProfileManager( Settings settings )
{
if ( profileManager == null )
{
profileManager = new DefaultProfileManager( container, settings );
}
return profileManager;
}
public void contextualize( Context context )
throws ContextException
{
container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
}
protected MavenProject getMavenProject( PerformReleaseProjectTask releaseTask )
throws ContinuumReleaseException
{
ReleaseDescriptor descriptor = releaseTask.getDescriptor();
MavenProject project;
try
{
project = projectBuilder.build( getProjectDescriptorFile( descriptor ), getLocalRepository(),
getProfileManager( settings ) );
}
catch ( ProjectBuildingException e )
{
throw new ContinuumReleaseException( "Failed to build project.", e );
}
return project;
}
}