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 java.io.File;
23  import java.util.ArrayList;
24  import java.util.List;
25  
26  import org.apache.continuum.model.repository.LocalRepository;
27  import org.apache.maven.artifact.repository.ArtifactRepository;
28  import org.apache.maven.artifact.repository.DefaultArtifactRepository;
29  import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
30  import org.apache.maven.continuum.release.ContinuumReleaseException;
31  import org.apache.maven.continuum.release.tasks.PerformReleaseProjectTask;
32  import org.apache.maven.continuum.release.tasks.ReleaseProjectTask;
33  import org.apache.maven.profiles.DefaultProfileManager;
34  import org.apache.maven.profiles.ProfileManager;
35  import org.apache.maven.project.DuplicateProjectException;
36  import org.apache.maven.project.MavenProject;
37  import org.apache.maven.project.MavenProjectBuilder;
38  import org.apache.maven.project.ProjectBuildingException;
39  import org.apache.maven.project.ProjectSorter;
40  import org.apache.maven.settings.Settings;
41  import org.apache.maven.shared.release.ReleaseManagerListener;
42  import org.apache.maven.shared.release.ReleaseResult;
43  import org.apache.maven.shared.release.config.ReleaseDescriptor;
44  import org.codehaus.plexus.PlexusConstants;
45  import org.codehaus.plexus.PlexusContainer;
46  import org.codehaus.plexus.context.Context;
47  import org.codehaus.plexus.context.ContextException;
48  import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
49  import org.codehaus.plexus.taskqueue.execution.TaskExecutionException;
50  import org.codehaus.plexus.util.StringUtils;
51  import org.codehaus.plexus.util.dag.CycleDetectedException;
52  
53  /**
54   * @author Edwin Punzalan
55   * @version $Id: PerformReleaseTaskExecutor.java 767304 2009-04-21 21:32:15Z evenisse $
56   */
57  public class PerformReleaseTaskExecutor
58      extends AbstractReleaseTaskExecutor
59      implements Contextualizable
60  {
61      /**
62       * @plexus.requirement
63       */
64      private MavenProjectBuilder projectBuilder;
65  
66      private ProfileManager profileManager;
67  
68      private PlexusContainer container;
69  
70      private LocalRepository repository;
71  
72      public void execute( ReleaseProjectTask task )
73          throws TaskExecutionException
74      {
75          PerformReleaseProjectTask performTask = (PerformReleaseProjectTask) task;
76  
77          ReleaseManagerListener listener = performTask.getListener();
78  
79          ReleaseDescriptor descriptor = performTask.getDescriptor();
80          descriptor.setUseReleaseProfile( performTask.isUseReleaseProfile() );
81          descriptor.setPerformGoals( performTask.getGoals() );
82          descriptor.setCheckoutDirectory( performTask.getBuildDirectory().getAbsolutePath() );
83  
84          repository = performTask.getLocalRepository();
85  
86          List<MavenProject> reactorProjects = getReactorProjects( performTask );
87  
88          ReleaseResult result = releaseManager.performWithResult( descriptor, settings, reactorProjects, listener );
89  
90          //override to show the actual start time
91          result.setStartTime( getStartTime() );
92  
93          if ( result.getResultCode() == ReleaseResult.SUCCESS )
94          {
95              continuumReleaseManager.getPreparedReleases().remove( performTask.getReleaseId() );
96          }
97  
98          continuumReleaseManager.getReleaseResults().put( performTask.getReleaseId(), result );
99      }
100 
101     protected List<MavenProject> getReactorProjects( PerformReleaseProjectTask releaseTask )
102         throws TaskExecutionException
103     {
104         List<MavenProject> reactorProjects;
105         ReleaseDescriptor descriptor = releaseTask.getDescriptor();
106 
107         if ( StringUtils.isEmpty( descriptor.getWorkingDirectory() ) )
108         {
109             //Perform with provided release parameters (CONTINUUM-1541)
110             descriptor.setCheckoutDirectory( releaseTask.getBuildDirectory().getAbsolutePath() );
111             return null;
112         }
113 
114         try
115         {
116             reactorProjects = getReactorProjects( descriptor );
117         }
118         catch ( ContinuumReleaseException e )
119         {
120             ReleaseResult result = createReleaseResult();
121 
122             result.appendError( e );
123 
124             continuumReleaseManager.getReleaseResults().put( releaseTask.getReleaseId(), result );
125 
126             releaseTask.getListener().error( e.getMessage() );
127 
128             throw new TaskExecutionException( "Failed to build reactor projects.", e );
129         }
130 
131         return reactorProjects;
132     }
133 
134     /**
135      * @todo remove and use generate-reactor-projects phase
136      */
137     protected List<MavenProject> getReactorProjects( ReleaseDescriptor descriptor )
138         throws ContinuumReleaseException
139     {
140         List<MavenProject> reactorProjects = new ArrayList<MavenProject>();
141 
142         MavenProject project;
143         try
144         {
145             project = projectBuilder.build( getProjectDescriptorFile( descriptor ), getLocalRepository(),
146                                             getProfileManager( settings ) );
147 
148             reactorProjects.add( project );
149 
150             addModules( reactorProjects, project );
151         }
152         catch ( ProjectBuildingException e )
153         {
154             throw new ContinuumReleaseException( "Failed to build project.", e );
155         }
156 
157         try
158         {
159             reactorProjects = new ProjectSorter( reactorProjects ).getSortedProjects();
160         }
161         catch ( CycleDetectedException e )
162         {
163             throw new ContinuumReleaseException( "Failed to sort projects.", e );
164         }
165         catch ( DuplicateProjectException e )
166         {
167             throw new ContinuumReleaseException( "Failed to sort projects.", e );
168         }
169 
170         return reactorProjects;
171     }
172 
173     private void addModules( List<MavenProject> reactorProjects, MavenProject project )
174         throws ContinuumReleaseException
175     {
176         for ( Object o : project.getModules() )
177         {
178             String moduleDir = o.toString();
179 
180             File pomFile = new File( project.getBasedir(), moduleDir + "/pom.xml" );
181             System.out.println( pomFile.getAbsolutePath() );
182 
183             try
184             {
185                 MavenProject reactorProject =
186                     projectBuilder.build( pomFile, getLocalRepository(), getProfileManager( settings ) );
187 
188                 reactorProjects.add( reactorProject );
189 
190                 addModules( reactorProjects, reactorProject );
191             }
192             catch ( ProjectBuildingException e )
193             {
194                 throw new ContinuumReleaseException( "Failed to build project.", e );
195             }
196         }
197     }
198 
199     private File getProjectDescriptorFile( ReleaseDescriptor descriptor )
200     {
201         String parentPath = descriptor.getWorkingDirectory();
202 
203         String pomFilename = descriptor.getPomFileName();
204         if ( pomFilename == null )
205         {
206             pomFilename = "pom.xml";
207         }
208 
209         return new File( parentPath, pomFilename );
210     }
211 
212     private ArtifactRepository getLocalRepository()
213     {
214         if ( repository == null )
215         {
216             return new DefaultArtifactRepository( "local-repository", "file://" + settings.getLocalRepository(),
217                                                   new DefaultRepositoryLayout() );
218         }
219         else
220         {
221             return new DefaultArtifactRepository( repository.getName(), "file://" + repository.getLocation(),
222                                                   new DefaultRepositoryLayout() );
223         }
224     }
225 
226     private ProfileManager getProfileManager( Settings settings )
227     {
228         if ( profileManager == null )
229         {
230             profileManager = new DefaultProfileManager( container, settings );
231         }
232 
233         return profileManager;
234     }
235 
236     public void contextualize( Context context )
237         throws ContextException
238     {
239         container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
240     }
241 }