001 package org.apache.maven;
002
003 /*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements. See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership. The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License. You may obtain a copy of the License at
011 *
012 * http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied. See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022 import java.io.File;
023 import java.util.Arrays;
024 import java.util.List;
025 import java.util.Properties;
026
027 import org.apache.maven.artifact.Artifact;
028 import org.apache.maven.artifact.InvalidRepositoryException;
029 import org.apache.maven.artifact.repository.ArtifactRepository;
030 import org.apache.maven.execution.DefaultMavenExecutionRequest;
031 import org.apache.maven.execution.DefaultMavenExecutionResult;
032 import org.apache.maven.execution.MavenExecutionRequest;
033 import org.apache.maven.execution.MavenSession;
034 import org.apache.maven.model.Build;
035 import org.apache.maven.model.Dependency;
036 import org.apache.maven.model.Exclusion;
037 import org.apache.maven.model.Model;
038 import org.apache.maven.model.Plugin;
039 import org.apache.maven.model.Repository;
040 import org.apache.maven.model.RepositoryPolicy;
041 import org.apache.maven.project.DefaultProjectBuildingRequest;
042 import org.apache.maven.project.MavenProject;
043 import org.apache.maven.project.ProjectBuildingRequest;
044 import org.apache.maven.repository.RepositorySystem;
045 import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
046 import org.codehaus.plexus.ContainerConfiguration;
047 import org.codehaus.plexus.PlexusTestCase;
048 import org.codehaus.plexus.component.annotations.Requirement;
049 import org.codehaus.plexus.util.FileUtils;
050 import org.eclipse.aether.DefaultRepositorySystemSession;
051 import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
052 import org.eclipse.aether.repository.LocalRepository;
053
054 public abstract class AbstractCoreMavenComponentTestCase
055 extends PlexusTestCase
056 {
057 @Requirement
058 protected RepositorySystem repositorySystem;
059
060 @Requirement
061 protected org.apache.maven.project.ProjectBuilder projectBuilder;
062
063 protected void setUp()
064 throws Exception
065 {
066 repositorySystem = lookup( RepositorySystem.class );
067 projectBuilder = lookup( org.apache.maven.project.ProjectBuilder.class );
068 }
069
070 @Override
071 protected void tearDown()
072 throws Exception
073 {
074 repositorySystem = null;
075 projectBuilder = null;
076 super.tearDown();
077 }
078
079 abstract protected String getProjectsDirectory();
080
081 protected File getProject( String name )
082 throws Exception
083 {
084 File source = new File( new File( getBasedir(), getProjectsDirectory() ), name );
085 File target = new File( new File( getBasedir(), "target" ), name );
086 FileUtils.copyDirectoryStructureIfModified( source, target );
087 return new File( target, "pom.xml" );
088 }
089
090 /**
091 * We need to customize the standard Plexus container with the plugin discovery listener which
092 * is what looks for the META-INF/maven/plugin.xml resources that enter the system when a Maven
093 * plugin is loaded.
094 *
095 * We also need to customize the Plexus container with a standard plugin discovery listener
096 * which is the MavenPluginCollector. When a Maven plugin is discovered the MavenPluginCollector
097 * collects the plugin descriptors which are found.
098 */
099 protected void customizeContainerConfiguration( ContainerConfiguration containerConfiguration )
100 {
101 containerConfiguration.setAutoWiring( true );
102 }
103
104 protected MavenExecutionRequest createMavenExecutionRequest( File pom )
105 throws Exception
106 {
107 MavenExecutionRequest request = new DefaultMavenExecutionRequest()
108 .setPom( pom )
109 .setProjectPresent( true )
110 .setShowErrors( true )
111 .setPluginGroups( Arrays.asList( "org.apache.maven.plugins" ) )
112 .setLocalRepository( getLocalRepository() )
113 .setRemoteRepositories( getRemoteRepositories() )
114 .setPluginArtifactRepositories( getPluginArtifactRepositories() )
115 .setGoals( Arrays.asList( "package" ) );
116
117 return request;
118 }
119
120 // layer the creation of a project builder configuration with a request, but this will need to be
121 // a Maven subclass because we don't want to couple maven to the project builder which we need to
122 // separate.
123 protected MavenSession createMavenSession( File pom )
124 throws Exception
125 {
126 return createMavenSession( pom, new Properties() );
127 }
128
129 protected MavenSession createMavenSession( File pom, Properties executionProperties )
130 throws Exception
131 {
132 MavenExecutionRequest request = createMavenExecutionRequest( pom );
133
134 ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest()
135 .setLocalRepository( request.getLocalRepository() )
136 .setRemoteRepositories( request.getRemoteRepositories() )
137 .setPluginArtifactRepositories( request.getPluginArtifactRepositories() )
138 .setSystemProperties( executionProperties );
139
140 MavenProject project = null;
141
142 if ( pom != null )
143 {
144 project = projectBuilder.build( pom, configuration ).getProject();
145 }
146 else
147 {
148 project = createStubMavenProject();
149 project.setRemoteArtifactRepositories( request.getRemoteRepositories() );
150 project.setPluginArtifactRepositories( request.getPluginArtifactRepositories() );
151 }
152
153 initRepoSession( configuration );
154
155 MavenSession session =
156 new MavenSession( getContainer(), configuration.getRepositorySession(), request,
157 new DefaultMavenExecutionResult() );
158 session.setProjects( Arrays.asList( project ) );
159
160 return session;
161 }
162
163 protected void initRepoSession( ProjectBuildingRequest request )
164 throws Exception
165 {
166 File localRepoDir = new File( request.getLocalRepository().getBasedir() );
167 LocalRepository localRepo = new LocalRepository( localRepoDir );
168 DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
169 session.setLocalRepositoryManager( new SimpleLocalRepositoryManagerFactory().newInstance( session, localRepo ) );
170 request.setRepositorySession( session );
171 }
172
173 protected MavenProject createStubMavenProject()
174 {
175 Model model = new Model();
176 model.setGroupId( "org.apache.maven.test" );
177 model.setArtifactId( "maven-test" );
178 model.setVersion( "1.0" );
179 return new MavenProject( model );
180 }
181
182 protected List<ArtifactRepository> getRemoteRepositories()
183 throws InvalidRepositoryException
184 {
185 File repoDir = new File( getBasedir(), "src/test/remote-repo" ).getAbsoluteFile();
186
187 RepositoryPolicy policy = new RepositoryPolicy();
188 policy.setEnabled( true );
189 policy.setChecksumPolicy( "ignore" );
190 policy.setUpdatePolicy( "always" );
191
192 Repository repository = new Repository();
193 repository.setId( RepositorySystem.DEFAULT_REMOTE_REPO_ID );
194 repository.setUrl( "file://" + repoDir.toURI().getPath() );
195 repository.setReleases( policy );
196 repository.setSnapshots( policy );
197
198 return Arrays.asList( repositorySystem.buildArtifactRepository( repository ) );
199 }
200
201 protected List<ArtifactRepository> getPluginArtifactRepositories()
202 throws InvalidRepositoryException
203 {
204 return getRemoteRepositories();
205 }
206
207 protected ArtifactRepository getLocalRepository()
208 throws InvalidRepositoryException
209 {
210 File repoDir = new File( getBasedir(), "target/local-repo" ).getAbsoluteFile();
211
212 return repositorySystem.createLocalRepository( repoDir );
213 }
214
215 protected class ProjectBuilder
216 {
217 private MavenProject project;
218
219 public ProjectBuilder( MavenProject project )
220 {
221 this.project = project;
222 }
223
224 public ProjectBuilder( String groupId, String artifactId, String version )
225 {
226 Model model = new Model();
227 model.setModelVersion( "4.0.0" );
228 model.setGroupId( groupId );
229 model.setArtifactId( artifactId );
230 model.setVersion( version );
231 model.setBuild( new Build() );
232 project = new MavenProject( model );
233 }
234
235 public ProjectBuilder setGroupId( String groupId )
236 {
237 project.setGroupId( groupId );
238 return this;
239 }
240
241 public ProjectBuilder setArtifactId( String artifactId )
242 {
243 project.setArtifactId( artifactId );
244 return this;
245 }
246
247 public ProjectBuilder setVersion( String version )
248 {
249 project.setVersion( version );
250 return this;
251 }
252
253 // Dependencies
254 //
255 public ProjectBuilder addDependency( String groupId, String artifactId, String version, String scope )
256 {
257 return addDependency( groupId, artifactId, version, scope, (Exclusion)null );
258 }
259
260 public ProjectBuilder addDependency( String groupId, String artifactId, String version, String scope, Exclusion exclusion )
261 {
262 return addDependency( groupId, artifactId, version, scope, null, exclusion );
263 }
264
265 public ProjectBuilder addDependency( String groupId, String artifactId, String version, String scope, String systemPath )
266 {
267 return addDependency( groupId, artifactId, version, scope, systemPath, null );
268 }
269
270 public ProjectBuilder addDependency( String groupId, String artifactId, String version, String scope, String systemPath, Exclusion exclusion )
271 {
272 Dependency d = new Dependency();
273 d.setGroupId( groupId );
274 d.setArtifactId( artifactId );
275 d.setVersion( version );
276 d.setScope( scope );
277
278 if ( systemPath != null && scope.equals( Artifact.SCOPE_SYSTEM ) )
279 {
280 d.setSystemPath( systemPath );
281 }
282
283 if ( exclusion != null )
284 {
285 d.addExclusion( exclusion );
286 }
287
288 project.getDependencies().add( d );
289
290 return this;
291 }
292
293 // Plugins
294 //
295 public ProjectBuilder addPlugin( Plugin plugin )
296 {
297 project.getBuildPlugins().add( plugin );
298 return this;
299 }
300
301 public MavenProject get()
302 {
303 return project;
304 }
305 }
306
307 protected class PluginBuilder
308 {
309 private Plugin plugin;
310
311 public PluginBuilder( String groupId, String artifactId, String version )
312 {
313 plugin = new Plugin();
314 plugin.setGroupId( groupId );
315 plugin.setArtifactId( artifactId );
316 plugin.setVersion( version );
317 }
318
319 // Dependencies
320 //
321 public PluginBuilder addDependency( String groupId, String artifactId, String version, String scope, Exclusion exclusion )
322 {
323 return addDependency( groupId, artifactId, version, scope, exclusion );
324 }
325
326 public PluginBuilder addDependency( String groupId, String artifactId, String version, String scope, String systemPath )
327 {
328 return addDependency( groupId, artifactId, version, scope, systemPath, null );
329 }
330
331 public PluginBuilder addDependency( String groupId, String artifactId, String version, String scope, String systemPath, Exclusion exclusion )
332 {
333 Dependency d = new Dependency();
334 d.setGroupId( groupId );
335 d.setArtifactId( artifactId );
336 d.setVersion( version );
337 d.setScope( scope );
338
339 if ( systemPath != null && scope.equals( Artifact.SCOPE_SYSTEM ) )
340 {
341 d.setSystemPath( systemPath );
342 }
343
344 if ( exclusion != null )
345 {
346 d.addExclusion( exclusion );
347 }
348
349 plugin.getDependencies().add( d );
350
351 return this;
352 }
353
354 public Plugin get()
355 {
356 return plugin;
357 }
358 }
359 }