View Javadoc
1   package org.apache.maven.project;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
5    * agreements. See the NOTICE file distributed with this work for additional information regarding
6    * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance with the License. You may obtain a
8    * copy of the License at
9    *
10   * http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software distributed under the License
13   * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
14   * or implied. See the License for the specific language governing permissions and limitations under
15   * the License.
16   */
17  
18  import java.io.File;
19  import java.io.FileNotFoundException;
20  import java.net.URI;
21  import java.net.URISyntaxException;
22  import java.net.URL;
23  import java.util.Arrays;
24  
25  import org.apache.maven.artifact.repository.ArtifactRepository;
26  import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
27  import org.apache.maven.model.building.ModelBuildingException;
28  import org.apache.maven.model.building.ModelProblem;
29  import org.apache.maven.repository.RepositorySystem;
30  import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
31  import org.codehaus.plexus.ContainerConfiguration;
32  import org.codehaus.plexus.PlexusConstants;
33  import org.codehaus.plexus.PlexusTestCase;
34  import org.eclipse.aether.DefaultRepositorySystemSession;
35  
36  /**
37   * @author Jason van Zyl
38   */
39  public abstract class AbstractMavenProjectTestCase
40      extends PlexusTestCase
41  {
42      protected ProjectBuilder projectBuilder;
43  
44      protected RepositorySystem repositorySystem;
45  
46      @Override
47      protected void customizeContainerConfiguration( ContainerConfiguration containerConfiguration )
48      {
49          super.customizeContainerConfiguration( containerConfiguration );
50          containerConfiguration.setAutoWiring( true );
51          containerConfiguration.setClassPathScanning( PlexusConstants.SCANNING_INDEX );
52      }
53  
54      protected void setUp()
55          throws Exception
56      {
57          super.setUp();
58  
59          if ( getContainer().hasComponent( ProjectBuilder.class, "test" ) )
60          {
61              projectBuilder = lookup( ProjectBuilder.class, "test" );
62          }
63          else
64          {
65              // default over to the main project builder...
66              projectBuilder = lookup( ProjectBuilder.class );
67          }
68  
69          repositorySystem = lookup( RepositorySystem.class );
70      }
71  
72      @Override
73      protected void tearDown()
74          throws Exception
75      {
76          projectBuilder = null;
77  
78          super.tearDown();
79      }
80  
81      protected ProjectBuilder getProjectBuilder()
82      {
83          return projectBuilder;
84      }
85  
86      @Override
87      protected String getCustomConfigurationName()
88      {
89          return AbstractMavenProjectTestCase.class.getName().replace( '.', '/' ) + ".xml";
90      }
91  
92      // ----------------------------------------------------------------------
93      // Local repository
94      // ----------------------------------------------------------------------
95  
96      protected File getLocalRepositoryPath()
97          throws FileNotFoundException, URISyntaxException
98      {
99          File markerFile = getFileForClasspathResource( "local-repo/marker.txt" );
100 
101         return markerFile.getAbsoluteFile().getParentFile();
102     }
103 
104     protected static File getFileForClasspathResource( String resource )
105         throws FileNotFoundException
106     {
107         ClassLoader cloader = Thread.currentThread().getContextClassLoader();
108 
109         URL resourceUrl = cloader.getResource( resource );
110 
111         if ( resourceUrl == null )
112         {
113             throw new FileNotFoundException( "Unable to find: " + resource );
114         }
115 
116         return new File( URI.create( resourceUrl.toString().replaceAll( " ", "%20" ) ) );
117     }
118 
119     protected ArtifactRepository getLocalRepository()
120         throws Exception
121     {
122         ArtifactRepositoryLayout repoLayout = lookup( ArtifactRepositoryLayout.class, "legacy" );
123 
124         ArtifactRepository r = repositorySystem.createArtifactRepository( "local", "file://" + getLocalRepositoryPath().getAbsolutePath(), repoLayout, null, null );
125 
126         return r;
127     }
128 
129     // ----------------------------------------------------------------------
130     // Project building
131     // ----------------------------------------------------------------------
132 
133     protected MavenProject getProjectWithDependencies( File pom )
134         throws Exception
135     {
136         ProjectBuildingRequest configuration = newBuildingRequest();
137         configuration.setRemoteRepositories( Arrays.asList( new ArtifactRepository[] {} ) );
138         configuration.setProcessPlugins( false );
139         configuration.setResolveDependencies( true );
140 
141         try
142         {
143             return projectBuilder.build( pom, configuration ).getProject();
144         }
145         catch ( Exception e )
146         {
147             Throwable cause = e.getCause();
148             if ( cause instanceof ModelBuildingException )
149             {
150                 String message = "In: " + pom + "\n\n";
151                 for ( ModelProblem problem : ( (ModelBuildingException) cause ).getProblems() )
152                 {
153                     message += problem + "\n";
154                 }
155                 System.out.println( message );
156             }
157 
158             throw e;
159         }
160     }
161 
162     protected MavenProject getProject( File pom )
163         throws Exception
164     {
165         ProjectBuildingRequest configuration = newBuildingRequest();
166 
167         return projectBuilder.build( pom, configuration ).getProject();
168     }
169 
170     protected MavenProject getProjectFromRemoteRepository( final File pom )
171         throws Exception
172     {
173         final ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
174         configuration.setLocalRepository( this.getLocalRepository() );
175         configuration.setRemoteRepositories( Arrays.asList( this.repositorySystem.createDefaultRemoteRepository() ) );
176         initRepoSession( configuration );
177 
178         return projectBuilder.build( pom, configuration ).getProject();
179     }
180 
181     protected ProjectBuildingRequest newBuildingRequest()
182         throws Exception
183     {
184         ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
185         configuration.setLocalRepository( getLocalRepository() );
186         initRepoSession( configuration );
187         return configuration;
188     }
189 
190     protected void initRepoSession( ProjectBuildingRequest request )
191     {
192         File localRepo = new File( request.getLocalRepository().getBasedir() );
193         DefaultRepositorySystemSession repoSession = MavenRepositorySystemUtils.newSession();
194         repoSession.setLocalRepositoryManager( new LegacyLocalRepositoryManager( localRepo ) );
195         request.setRepositorySession( repoSession );
196     }
197 
198 }