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 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
55
56
57 public class PerformReleaseTaskExecutor
58 extends AbstractReleaseTaskExecutor
59 implements Contextualizable
60 {
61
62
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
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
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
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 }