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.MavenRepositorySystemSession;
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.sonatype.aether.impl.internal.SimpleLocalRepositoryManager;
051    
052    public abstract class AbstractCoreMavenComponentTestCase
053        extends PlexusTestCase
054    {
055        @Requirement
056        protected RepositorySystem repositorySystem;
057    
058        @Requirement
059        protected org.apache.maven.project.ProjectBuilder projectBuilder;
060    
061        protected void setUp()
062            throws Exception
063        {
064            repositorySystem = lookup( RepositorySystem.class );
065            projectBuilder = lookup( org.apache.maven.project.ProjectBuilder.class );
066        }
067    
068        @Override
069        protected void tearDown()
070            throws Exception
071        {
072            repositorySystem = null;
073            projectBuilder = null;
074            super.tearDown();
075        }
076    
077        abstract protected String getProjectsDirectory();
078    
079        protected File getProject( String name )
080            throws Exception
081        {
082            File source = new File( new File( getBasedir(), getProjectsDirectory() ), name );
083            File target = new File( new File( getBasedir(), "target" ), name );
084            FileUtils.copyDirectoryStructureIfModified( source, target );
085            return new File( target, "pom.xml" );
086        }
087    
088        /**
089         * We need to customize the standard Plexus container with the plugin discovery listener which
090         * is what looks for the META-INF/maven/plugin.xml resources that enter the system when a Maven
091         * plugin is loaded.
092         * 
093         * We also need to customize the Plexus container with a standard plugin discovery listener
094         * which is the MavenPluginCollector. When a Maven plugin is discovered the MavenPluginCollector
095         * collects the plugin descriptors which are found.
096         */
097        protected void customizeContainerConfiguration( ContainerConfiguration containerConfiguration )
098        {
099    //        containerConfiguration.addComponentDiscoverer( PluginManager.class );
100    //        containerConfiguration.addComponentDiscoveryListener( PluginManager.class );
101        }
102    
103        protected MavenExecutionRequest createMavenExecutionRequest( File pom )
104            throws Exception
105        {        
106            MavenExecutionRequest request = new DefaultMavenExecutionRequest()
107                .setPom( pom )
108                .setProjectPresent( true )
109                .setShowErrors( true )
110                .setPluginGroups( Arrays.asList( new String[] { "org.apache.maven.plugins" } ) )
111                .setLocalRepository( getLocalRepository() )
112                .setRemoteRepositories( getRemoteRepositories() )
113                .setPluginArtifactRepositories( getPluginArtifactRepositories() )
114                .setGoals( Arrays.asList( new String[] { "package" } ) );
115    
116            return request;
117        }
118    
119        // layer the creation of a project builder configuration with a request, but this will need to be
120        // a Maven subclass because we don't want to couple maven to the project builder which we need to
121        // separate.
122        protected MavenSession createMavenSession( File pom )
123            throws Exception        
124        {
125            return createMavenSession( pom, new Properties() );
126        }
127        
128        protected MavenSession createMavenSession( File pom, Properties executionProperties )
129            throws Exception
130        {
131            MavenExecutionRequest request = createMavenExecutionRequest( pom );
132            
133            ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest()
134                .setLocalRepository( request.getLocalRepository() )
135                .setRemoteRepositories( request.getRemoteRepositories() )
136                .setPluginArtifactRepositories( request.getPluginArtifactRepositories() )
137                .setSystemProperties( executionProperties );
138    
139            MavenProject project = null;
140    
141            if ( pom != null )
142            {
143                project = projectBuilder.build( pom, configuration ).getProject();
144            }
145            else
146            {
147                project = createStubMavenProject();
148                project.setRemoteArtifactRepositories( request.getRemoteRepositories() );
149                project.setPluginArtifactRepositories( request.getPluginArtifactRepositories() );
150            }
151    
152            initRepoSession( configuration );
153    
154            MavenSession session =
155                new MavenSession( getContainer(), configuration.getRepositorySession(), request,
156                                  new DefaultMavenExecutionResult() );
157            session.setProjects( Arrays.asList( project ) );
158    
159            return session;
160        }
161    
162        protected void initRepoSession( ProjectBuildingRequest request )
163        {
164            File localRepo = new File( request.getLocalRepository().getBasedir() );
165            MavenRepositorySystemSession session = new MavenRepositorySystemSession();
166            session.setLocalRepositoryManager( new SimpleLocalRepositoryManager( localRepo ) );
167            request.setRepositorySession( session );
168        }
169    
170        protected MavenProject createStubMavenProject()
171        {
172            Model model = new Model();
173            model.setGroupId( "org.apache.maven.test" );
174            model.setArtifactId( "maven-test" );
175            model.setVersion( "1.0" );
176            return new MavenProject( model );
177        }
178        
179        protected List<ArtifactRepository> getRemoteRepositories()
180            throws InvalidRepositoryException
181        {
182            File repoDir = new File( getBasedir(), "src/test/remote-repo" ).getAbsoluteFile();
183    
184            RepositoryPolicy policy = new RepositoryPolicy();
185            policy.setEnabled( true );
186            policy.setChecksumPolicy( "ignore" );
187            policy.setUpdatePolicy( "always" );
188    
189            Repository repository = new Repository();
190            repository.setId( RepositorySystem.DEFAULT_REMOTE_REPO_ID );
191            repository.setUrl( "file://" + repoDir.toURI().getPath() );
192            repository.setReleases( policy );
193            repository.setSnapshots( policy );
194    
195            return Arrays.asList( repositorySystem.buildArtifactRepository( repository ) );
196        }
197    
198        protected List<ArtifactRepository> getPluginArtifactRepositories()
199            throws InvalidRepositoryException
200        {
201            return getRemoteRepositories();
202        }
203    
204        protected ArtifactRepository getLocalRepository()
205            throws InvalidRepositoryException
206        {
207            File repoDir = new File( getBasedir(), "target/local-repo" ).getAbsoluteFile();
208    
209            return repositorySystem.createLocalRepository( repoDir );
210        }
211        
212        protected class ProjectBuilder
213        {
214            private MavenProject project;
215    
216            public ProjectBuilder( MavenProject project )
217            {
218                this.project = project;
219            }
220    
221            public ProjectBuilder( String groupId, String artifactId, String version )
222            {
223                Model model = new Model();
224                model.setModelVersion( "4.0.0" );
225                model.setGroupId( groupId );
226                model.setArtifactId( artifactId );
227                model.setVersion( version );  
228                model.setBuild(  new Build() );
229                project = new MavenProject( model );            
230            }
231            
232            public ProjectBuilder setGroupId( String groupId )
233            {
234                project.setGroupId( groupId );
235                return this;
236            }
237    
238            public ProjectBuilder setArtifactId( String artifactId )
239            {
240                project.setArtifactId( artifactId );
241                return this;
242            }
243            
244            public ProjectBuilder setVersion( String version )
245            {
246                project.setVersion( version );
247                return this;
248            }
249            
250            // Dependencies
251            //
252            public ProjectBuilder addDependency( String groupId, String artifactId, String version, String scope )
253            {
254                return addDependency( groupId, artifactId, version, scope, (Exclusion)null );
255            }
256            
257            public ProjectBuilder addDependency( String groupId, String artifactId, String version, String scope, Exclusion exclusion )
258            {
259                return addDependency( groupId, artifactId, version, scope, null, exclusion );            
260            }
261    
262            public ProjectBuilder addDependency( String groupId, String artifactId, String version, String scope, String systemPath )
263            {
264                return addDependency( groupId, artifactId, version, scope, systemPath, null );         
265            }
266            
267            public ProjectBuilder addDependency( String groupId, String artifactId, String version, String scope, String systemPath, Exclusion exclusion )
268            {
269                Dependency d = new Dependency();
270                d.setGroupId( groupId );
271                d.setArtifactId( artifactId );
272                d.setVersion( version );
273                d.setScope( scope );
274                
275                if ( systemPath != null && scope.equals(  Artifact.SCOPE_SYSTEM ) )
276                {
277                    d.setSystemPath( systemPath );
278                }
279                
280                if ( exclusion != null )
281                {
282                    d.addExclusion( exclusion );
283                }
284                
285                project.getDependencies().add( d );
286                
287                return this;
288            }
289            
290            // Plugins
291            //
292            public ProjectBuilder addPlugin( Plugin plugin )
293            {
294                project.getBuildPlugins().add( plugin );            
295                return this;
296            }
297            
298            public MavenProject get()
299            {
300                return project;
301            }        
302        }    
303        
304        protected class PluginBuilder
305        {
306            private Plugin plugin;
307            
308            public PluginBuilder( String groupId, String artifactId, String version )
309            {
310                plugin = new Plugin();
311                plugin.setGroupId( groupId );
312                plugin.setArtifactId( artifactId );
313                plugin.setVersion( version );                         
314            }
315                    
316            // Dependencies
317            //
318            public PluginBuilder addDependency( String groupId, String artifactId, String version, String scope, Exclusion exclusion )
319            {
320                return addDependency( groupId, artifactId, version, scope, exclusion );            
321            }
322    
323            public PluginBuilder addDependency( String groupId, String artifactId, String version, String scope, String systemPath )
324            {
325                return addDependency( groupId, artifactId, version, scope, systemPath, null );         
326            }
327            
328            public PluginBuilder addDependency( String groupId, String artifactId, String version, String scope, String systemPath, Exclusion exclusion )
329            {
330                Dependency d = new Dependency();
331                d.setGroupId( groupId );
332                d.setArtifactId( artifactId );
333                d.setVersion( version );
334                d.setScope( scope );
335                
336                if ( systemPath != null && scope.equals(  Artifact.SCOPE_SYSTEM ) )
337                {
338                    d.setSystemPath( systemPath );
339                }
340                
341                if ( exclusion != null )
342                {
343                    d.addExclusion( exclusion );
344                }
345                
346                plugin.getDependencies().add( d );
347                
348                return this;
349            }
350                    
351            public Plugin get()
352            {
353                return plugin;
354            }        
355        }        
356    }