View Javadoc

1   package org.apache.maven.continuum.release.executors;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.apache.continuum.model.repository.LocalRepository;
23  import org.apache.maven.artifact.repository.ArtifactRepository;
24  import org.apache.maven.artifact.repository.DefaultArtifactRepository;
25  import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
26  import org.apache.maven.continuum.release.ContinuumReleaseException;
27  import org.apache.maven.continuum.release.tasks.PerformReleaseProjectTask;
28  import org.apache.maven.continuum.release.tasks.ReleaseProjectTask;
29  import org.apache.maven.profiles.DefaultProfileManager;
30  import org.apache.maven.profiles.ProfileManager;
31  import org.apache.maven.project.DuplicateProjectException;
32  import org.apache.maven.project.MavenProject;
33  import org.apache.maven.project.MavenProjectBuilder;
34  import org.apache.maven.project.ProjectBuildingException;
35  import org.apache.maven.project.ProjectSorter;
36  import org.apache.maven.settings.Settings;
37  import org.apache.maven.shared.release.ReleaseManagerListener;
38  import org.apache.maven.shared.release.ReleaseResult;
39  import org.apache.maven.shared.release.config.ReleaseDescriptor;
40  import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
41  import org.codehaus.plexus.PlexusConstants;
42  import org.codehaus.plexus.PlexusContainer;
43  import org.codehaus.plexus.context.Context;
44  import org.codehaus.plexus.context.ContextException;
45  import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
46  import org.codehaus.plexus.taskqueue.execution.TaskExecutionException;
47  import org.codehaus.plexus.util.StringUtils;
48  import org.codehaus.plexus.util.dag.CycleDetectedException;
49  
50  import java.io.File;
51  import java.util.ArrayList;
52  import java.util.Collections;
53  import java.util.List;
54  
55  /**
56   * @author Edwin Punzalan
57   * @version $Id: PerformReleaseTaskExecutor.java 1372260 2012-08-13 04:29:09Z brett $
58   */
59  public class PerformReleaseTaskExecutor
60      extends AbstractReleaseTaskExecutor
61      implements Contextualizable
62  {
63      /**
64       * @plexus.requirement
65       */
66      private MavenProjectBuilder projectBuilder;
67  
68      private ProfileManager profileManager;
69  
70      private PlexusContainer container;
71  
72      private LocalRepository repository;
73  
74      public void execute( ReleaseProjectTask task )
75          throws TaskExecutionException
76      {
77          PerformReleaseProjectTask performTask = (PerformReleaseProjectTask) task;
78  
79          ReleaseManagerListener listener = performTask.getListener();
80  
81          ReleaseDescriptor descriptor = performTask.getDescriptor();
82          descriptor.setUseReleaseProfile( performTask.isUseReleaseProfile() );
83          descriptor.setPerformGoals( performTask.getGoals() );
84          descriptor.setCheckoutDirectory( performTask.getBuildDirectory().getAbsolutePath() );
85  
86          repository = performTask.getLocalRepository();
87  
88          List reactorProjects;
89  
90          try
91          {
92              if ( !StringUtils.isEmpty( descriptor.getWorkingDirectory() ) )
93              {
94                  MavenProject mavenProject = getMavenProject( performTask );
95                  reactorProjects = getReactorProjects( descriptor, mavenProject );
96              }
97              else
98              {
99                  //Perform with provided release parameters (CONTINUUM-1541)
100                 descriptor.setCheckoutDirectory( performTask.getBuildDirectory().getAbsolutePath() );
101 
102                 // Workaround bugs in maven-release-manager 2.1 that require a project even though it will ultimately
103                 // not be used. TODO: check if upgrading will fix, and return to being an empty list
104                 // The project is fake and won't exist in this location
105                 MavenProject project = new MavenProject();
106                 project.setFile( new File( descriptor.getCheckoutDirectory(), "pom.xml" ) );
107                 reactorProjects = Collections.singletonList( project );
108 //                reactorProjects = Collections.emptyList();
109             }
110         }
111         catch ( ContinuumReleaseException e )
112         {
113             ReleaseResult result = createReleaseResult();
114 
115             result.appendError( e );
116 
117             continuumReleaseManager.getReleaseResults().put( performTask.getReleaseId(), result );
118 
119             performTask.getListener().error( e.getMessage() );
120 
121             throw new TaskExecutionException( "Failed to build reactor projects.", e );
122         }
123 
124         ReleaseResult result = releaseManager.performWithResult( descriptor,
125                                                                  new DefaultReleaseEnvironment().setSettings(
126                                                                      settings ), reactorProjects, listener );
127 
128         //override to show the actual start time
129         result.setStartTime( getStartTime() );
130 
131         if ( result.getResultCode() == ReleaseResult.SUCCESS )
132         {
133             continuumReleaseManager.getPreparedReleases().remove( performTask.getReleaseId() );
134         }
135 
136         continuumReleaseManager.getReleaseResults().put( performTask.getReleaseId(), result );
137     }
138 
139     /**
140      * @todo remove and use generate-reactor-projects phase
141      */
142     protected List<MavenProject> getReactorProjects( ReleaseDescriptor descriptor, MavenProject project )
143         throws ContinuumReleaseException
144     {
145         List<MavenProject> reactorProjects = new ArrayList<MavenProject>();
146 
147         reactorProjects.add( project );
148 
149         addModules( reactorProjects, project );
150 
151         try
152         {
153             reactorProjects = new ProjectSorter( reactorProjects ).getSortedProjects();
154         }
155         catch ( CycleDetectedException e )
156         {
157             throw new ContinuumReleaseException( "Failed to sort projects.", e );
158         }
159         catch ( DuplicateProjectException e )
160         {
161             throw new ContinuumReleaseException( "Failed to sort projects.", e );
162         }
163 
164         return reactorProjects;
165     }
166 
167     private void addModules( List<MavenProject> reactorProjects, MavenProject project )
168         throws ContinuumReleaseException
169     {
170         for ( Object o : project.getModules() )
171         {
172             String moduleDir = o.toString();
173 
174             File pomFile = new File( project.getBasedir(), moduleDir + "/pom.xml" );
175 
176             try
177             {
178                 MavenProject reactorProject = projectBuilder.build( pomFile, getLocalRepository(), getProfileManager(
179                     settings ) );
180 
181                 reactorProjects.add( reactorProject );
182 
183                 addModules( reactorProjects, reactorProject );
184             }
185             catch ( ProjectBuildingException e )
186             {
187                 throw new ContinuumReleaseException( "Failed to build project.", e );
188             }
189         }
190     }
191 
192     private File getProjectDescriptorFile( ReleaseDescriptor descriptor )
193     {
194         String parentPath = descriptor.getWorkingDirectory();
195 
196         String pomFilename = descriptor.getPomFileName();
197         if ( pomFilename == null )
198         {
199             pomFilename = "pom.xml";
200         }
201 
202         return new File( parentPath, pomFilename );
203     }
204 
205     private ArtifactRepository getLocalRepository()
206     {
207         if ( repository == null )
208         {
209             return new DefaultArtifactRepository( "local-repository", "file://" + settings.getLocalRepository(),
210                                                   new DefaultRepositoryLayout() );
211         }
212         else
213         {
214             return new DefaultArtifactRepository( repository.getName(), "file://" + repository.getLocation(),
215                                                   new DefaultRepositoryLayout() );
216         }
217     }
218 
219     private ProfileManager getProfileManager( Settings settings )
220     {
221         if ( profileManager == null )
222         {
223             profileManager = new DefaultProfileManager( container, settings );
224         }
225 
226         return profileManager;
227     }
228 
229     public void contextualize( Context context )
230         throws ContextException
231     {
232         container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
233     }
234 
235     protected MavenProject getMavenProject( PerformReleaseProjectTask releaseTask )
236         throws ContinuumReleaseException
237     {
238         ReleaseDescriptor descriptor = releaseTask.getDescriptor();
239 
240         MavenProject project;
241         try
242         {
243             project = projectBuilder.build( getProjectDescriptorFile( descriptor ), getLocalRepository(),
244                                             getProfileManager( settings ) );
245         }
246         catch ( ProjectBuildingException e )
247         {
248             throw new ContinuumReleaseException( "Failed to build project.", e );
249         }
250 
251         return project;
252     }
253 }