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.PlexusTestCase; 033import org.eclipse.aether.DefaultRepositorySystemSession; 034 035/** 036 * @author Jason van Zyl 037 */ 038public abstract class AbstractMavenProjectTestCase 039 extends PlexusTestCase 040{ 041 protected ProjectBuilder projectBuilder; 042 043 protected RepositorySystem repositorySystem; 044 045 @Override 046 protected void customizeContainerConfiguration( ContainerConfiguration containerConfiguration ) 047 { 048 super.customizeContainerConfiguration( containerConfiguration ); 049 containerConfiguration.setAutoWiring( true ); 050 } 051 052 protected void setUp() 053 throws Exception 054 { 055 super.setUp(); 056 057 if ( getContainer().hasComponent( ProjectBuilder.class, "test" ) ) 058 { 059 projectBuilder = lookup( ProjectBuilder.class, "test" ); 060 } 061 else 062 { 063 // default over to the main project builder... 064 projectBuilder = lookup( ProjectBuilder.class ); 065 } 066 067 repositorySystem = lookup( RepositorySystem.class ); 068 } 069 070 @Override 071 protected void tearDown() 072 throws Exception 073 { 074 projectBuilder = null; 075 076 super.tearDown(); 077 } 078 079 protected ProjectBuilder getProjectBuilder() 080 { 081 return projectBuilder; 082 } 083 084 @Override 085 protected String getCustomConfigurationName() 086 { 087 String name = AbstractMavenProjectTestCase.class.getName().replace( '.', '/' ) + ".xml"; 088 System.out.println( name ); 089 return name; 090 } 091 092 // ---------------------------------------------------------------------- 093 // Local repository 094 // ---------------------------------------------------------------------- 095 096 protected File getLocalRepositoryPath() 097 throws FileNotFoundException, URISyntaxException 098 { 099 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 = new DefaultProjectBuildingRequest(); 137 configuration.setLocalRepository( getLocalRepository() ); 138 configuration.setRemoteRepositories( Arrays.asList( new ArtifactRepository[] {} ) ); 139 configuration.setProcessPlugins( false ); 140 configuration.setResolveDependencies( true ); 141 initRepoSession( configuration ); 142 143 try 144 { 145 return projectBuilder.build( pom, configuration ).getProject(); 146 } 147 catch ( Exception e ) 148 { 149 Throwable cause = e.getCause(); 150 if ( cause instanceof ModelBuildingException ) 151 { 152 String message = "In: " + pom + "\n\n"; 153 for ( ModelProblem problem : ( (ModelBuildingException) cause ).getProblems() ) 154 { 155 message += problem + "\n"; 156 } 157 System.out.println( message ); 158 fail( message ); 159 } 160 161 throw e; 162 } 163 } 164 165 protected MavenProject getProject( File pom ) 166 throws Exception 167 { 168 ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest(); 169 configuration.setLocalRepository( getLocalRepository() ); 170 initRepoSession( configuration ); 171 172 return projectBuilder.build( pom, configuration ).getProject(); 173 } 174 175 protected void initRepoSession( ProjectBuildingRequest request ) 176 { 177 File localRepo = new File( request.getLocalRepository().getBasedir() ); 178 DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); 179 session.setLocalRepositoryManager( new LegacyLocalRepositoryManager( localRepo ) ); 180 request.setRepositorySession( session ); 181 } 182 183}