1 package org.apache.maven.continuum.release.executors;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
57
58
59 public class PerformReleaseTaskExecutor
60 extends AbstractReleaseTaskExecutor
61 implements Contextualizable
62 {
63
64
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
100 descriptor.setCheckoutDirectory( performTask.getBuildDirectory().getAbsolutePath() );
101
102
103
104
105 MavenProject project = new MavenProject();
106 project.setFile( new File( descriptor.getCheckoutDirectory(), "pom.xml" ) );
107 reactorProjects = Collections.singletonList( project );
108
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
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
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 }