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}