001 package 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 018 import java.io.File; 019 import java.io.FileNotFoundException; 020 import java.net.URI; 021 import java.net.URISyntaxException; 022 import java.net.URL; 023 import java.util.Arrays; 024 025 import org.apache.maven.artifact.repository.ArtifactRepository; 026 import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; 027 import org.apache.maven.model.building.ModelBuildingException; 028 import org.apache.maven.model.building.ModelProblem; 029 import org.apache.maven.repository.RepositorySystem; 030 import org.apache.maven.repository.internal.MavenRepositorySystemUtils; 031 import org.codehaus.plexus.ContainerConfiguration; 032 import org.codehaus.plexus.PlexusTestCase; 033 import org.eclipse.aether.DefaultRepositorySystemSession; 034 035 /** 036 * @author Jason van Zyl 037 */ 038 public 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 = 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 ProjectBuildingRequest newBuildingRequest() 171 throws Exception 172 { 173 ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest(); 174 configuration.setLocalRepository( getLocalRepository() ); 175 initRepoSession( configuration ); 176 return configuration; 177 } 178 179 protected void initRepoSession( ProjectBuildingRequest request ) 180 { 181 File localRepo = new File( request.getLocalRepository().getBasedir() ); 182 DefaultRepositorySystemSession repoSession = MavenRepositorySystemUtils.newSession(); 183 repoSession.setLocalRepositoryManager( new LegacyLocalRepositoryManager( localRepo ) ); 184 request.setRepositorySession( repoSession ); 185 } 186 187 }