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 | } |