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          String name = AbstractMavenProjectTestCase.class.getName().replace( '.', '/' ) + ".xml";
90          System.out.println( name );
91          return name;
92      }
93  
94      // ----------------------------------------------------------------------
95      // Local repository
96      // ----------------------------------------------------------------------
97  
98      protected File getLocalRepositoryPath()
99          throws FileNotFoundException, URISyntaxException
100     {
101         File markerFile = getFileForClasspathResource( "local-repo/marker.txt" );
102 
103         return markerFile.getAbsoluteFile().getParentFile();
104     }
105 
106     protected static File getFileForClasspathResource( String resource )
107         throws FileNotFoundException
108     {
109         ClassLoader cloader = Thread.currentThread().getContextClassLoader();
110 
111         URL resourceUrl = cloader.getResource( resource );
112 
113         if ( resourceUrl == null )
114         {
115             throw new FileNotFoundException( "Unable to find: " + resource );
116         }
117 
118         return new File( URI.create( resourceUrl.toString().replaceAll( " ", "%20" ) ) );
119     }
120 
121     protected ArtifactRepository getLocalRepository()
122         throws Exception
123     {
124         ArtifactRepositoryLayout repoLayout = lookup( ArtifactRepositoryLayout.class, "legacy" );
125 
126         ArtifactRepository r = repositorySystem.createArtifactRepository( "local", "file://" + getLocalRepositoryPath().getAbsolutePath(), repoLayout, null, null );
127 
128         return r;
129     }
130 
131     // ----------------------------------------------------------------------
132     // Project building
133     // ----------------------------------------------------------------------
134 
135     protected MavenProject getProjectWithDependencies( File pom )
136         throws Exception
137     {
138         ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
139         configuration.setLocalRepository( getLocalRepository() );
140         configuration.setRemoteRepositories( Arrays.asList( new ArtifactRepository[] {} ) );
141         configuration.setProcessPlugins( false );
142         configuration.setResolveDependencies( true );
143         initRepoSession( configuration );
144 
145         try
146         {
147             return projectBuilder.build( pom, configuration ).getProject();
148         }
149         catch ( Exception e )
150         {
151             Throwable cause = e.getCause();
152             if ( cause instanceof ModelBuildingException )
153             {
154                 String message = "In: " + pom + "\n\n";
155                 for ( ModelProblem problem : ( (ModelBuildingException) cause ).getProblems() )
156                 {
157                     message += problem + "\n";
158                 }
159                 System.out.println( message );
160                 fail( message );
161             }
162 
163             throw e;
164         }
165     }
166 
167     protected MavenProject getProject( File pom )
168         throws Exception
169     {
170         ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
171         configuration.setLocalRepository( getLocalRepository() );
172         initRepoSession( configuration );
173 
174         return projectBuilder.build( pom, configuration ).getProject();
175     }
176 
177     protected void initRepoSession( ProjectBuildingRequest request )
178     {
179         File localRepo = new File( request.getLocalRepository().getBasedir() );
180         DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
181         session.setLocalRepositoryManager( new LegacyLocalRepositoryManager( localRepo ) );
182         request.setRepositorySession( session );
183     }
184 
185 }