001package org.apache.maven.project; 002 003/* 004 * Licensed to the Apache Software Foundation (ASF) under one or more contributor license 005 * agreements. See the NOTICE file distributed with this work for additional information regarding 006 * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance with the License. You may obtain a 008 * copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software distributed under the License 013 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 014 * or implied. See the License for the specific language governing permissions and limitations under 015 * the License. 016 */ 017 018import java.io.File; 019import java.io.FileNotFoundException; 020import java.net.URI; 021import java.net.URISyntaxException; 022import java.net.URL; 023import java.util.Arrays; 024 025import org.apache.maven.artifact.repository.ArtifactRepository; 026import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; 027import org.apache.maven.model.building.ModelBuildingException; 028import org.apache.maven.model.building.ModelProblem; 029import org.apache.maven.repository.RepositorySystem; 030import org.apache.maven.repository.internal.MavenRepositorySystemUtils; 031import org.codehaus.plexus.ContainerConfiguration; 032import org.codehaus.plexus.PlexusConstants; 033import org.codehaus.plexus.PlexusTestCase; 034import org.eclipse.aether.DefaultRepositorySystemSession; 035 036/** 037 * @author Jason van Zyl 038 */ 039public abstract class AbstractMavenProjectTestCase 040 extends PlexusTestCase 041{ 042 protected ProjectBuilder projectBuilder; 043 044 protected RepositorySystem repositorySystem; 045 046 @Override 047 protected void customizeContainerConfiguration( ContainerConfiguration containerConfiguration ) 048 { 049 super.customizeContainerConfiguration( containerConfiguration ); 050 containerConfiguration.setAutoWiring( true ); 051 containerConfiguration.setClassPathScanning( PlexusConstants.SCANNING_INDEX ); 052 } 053 054 protected void setUp() 055 throws Exception 056 { 057 super.setUp(); 058 059 if ( getContainer().hasComponent( ProjectBuilder.class, "test" ) ) 060 { 061 projectBuilder = lookup( ProjectBuilder.class, "test" ); 062 } 063 else 064 { 065 // default over to the main project builder... 066 projectBuilder = lookup( ProjectBuilder.class ); 067 } 068 069 repositorySystem = lookup( RepositorySystem.class ); 070 } 071 072 @Override 073 protected void tearDown() 074 throws Exception 075 { 076 projectBuilder = null; 077 078 super.tearDown(); 079 } 080 081 protected ProjectBuilder getProjectBuilder() 082 { 083 return projectBuilder; 084 } 085 086 @Override 087 protected String getCustomConfigurationName() 088 { 089 String name = AbstractMavenProjectTestCase.class.getName().replace( '.', '/' ) + ".xml"; 090 System.out.println( name ); 091 return name; 092 } 093 094 // ---------------------------------------------------------------------- 095 // Local repository 096 // ---------------------------------------------------------------------- 097 098 protected File getLocalRepositoryPath() 099 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}