[MNG-4347] Create a session-specific instance of MavenMetadataSource to be used during project-building, which passes the global profile manager throughout the build

git-svn-id: https://svn.apache.org/repos/asf/maven/maven-2/branches/maven-2.2.x-MNG-4347@813112 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
index 697ca77..9cc9960 100644
--- a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
+++ b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
@@ -63,6 +63,7 @@
 import org.apache.maven.project.MavenProjectBuilder;
 import org.apache.maven.project.MissingProjectException;
 import org.apache.maven.project.ProjectBuildingException;
+import org.apache.maven.project.artifact.MavenMetadataSource;
 import org.apache.maven.reactor.MavenExecutionException;
 import org.apache.maven.settings.Mirror;
 import org.apache.maven.settings.Proxy;
@@ -107,6 +108,8 @@
     protected ErrorDiagnostics errorDiagnostics;
 
     protected RuntimeInformation runtimeInformation;
+    
+    protected MavenMetadataSource mavenMetadataSource;
 
     private static final long MB = 1024 * 1024;
 
@@ -267,6 +270,9 @@
         globalProfileManager.loadSettingsProfiles( request.getSettings() );
 
         getLogger().info( "Scanning for projects..." );
+        
+        request.getProjectBuilderConfiguration()
+               .setMetadataSource( new MavenMetadataSource( mavenMetadataSource, request.getProjectBuilderConfiguration() ) );
 
         boolean foundProjects = true;
         List projects = getProjects( request );
@@ -616,9 +622,7 @@
     protected MavenSession createSession( MavenExecutionRequest request,
                                           ReactorManager rpm )
     {
-        return new MavenSession( container, request.getSettings(), request.getLocalRepository(),
-                                 request.getEventDispatcher(), rpm, request.getGoals(), request.getBaseDirectory(),
-                                 request.getExecutionProperties(), request.getUserProperties(), request.getStartTime() );
+        return new MavenSession( container, request, rpm );
     }
 
     /**
diff --git a/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java b/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java
index 6360e79..bb63976 100644
--- a/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java
+++ b/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java
@@ -25,6 +25,7 @@
 import org.apache.maven.project.DefaultProjectBuilderConfiguration;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.ProjectBuilderConfiguration;
+import org.apache.maven.project.artifact.MavenMetadataSource;
 import org.apache.maven.settings.Settings;
 import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
@@ -44,7 +45,7 @@
 
     private ArtifactRepository localRepository;
 
-    private List goals;
+    private List<String> goals;
 
     private EventDispatcher eventDispatcher;
 
@@ -65,15 +66,17 @@
 
     private MavenProject currentProject;
 
+    private ProjectBuilderConfiguration projectBuilderConfig;
+
     public MavenSession( PlexusContainer container, Settings settings, ArtifactRepository localRepository,
-                         EventDispatcher eventDispatcher, ReactorManager reactorManager, List goals,
+                         EventDispatcher eventDispatcher, ReactorManager reactorManager, List<String> goals,
                          String executionRootDir, Properties executionProperties, Date startTime )
     {
         this( container, settings, localRepository, eventDispatcher, reactorManager, goals, executionRootDir, executionProperties, null, startTime );
     }
 
     public MavenSession( PlexusContainer container, Settings settings, ArtifactRepository localRepository,
-                         EventDispatcher eventDispatcher, ReactorManager reactorManager, List goals,
+                         EventDispatcher eventDispatcher, ReactorManager reactorManager, List<String> goals,
                          String executionRootDir, Properties executionProperties, Properties userProperties, Date startTime )
     {
         this.container = container;
@@ -97,6 +100,21 @@
         this.startTime = startTime;
     }
 
+    public MavenSession( PlexusContainer container, MavenExecutionRequest request, ReactorManager rpm )
+    {
+        this.container = container;
+        this.settings = request.getSettings();
+        this.localRepository = request.getLocalRepository();
+        this.eventDispatcher = request.getEventDispatcher();
+        this.reactorManager = rpm;
+        this.goals = request.getGoals();
+        this.executionRootDir = request.getBaseDirectory();
+        this.executionProperties = request.getExecutionProperties();
+        this.userProperties = request.getUserProperties();
+        this.startTime = request.getStartTime();
+        this.projectBuilderConfig = request.getProjectBuilderConfiguration();
+    }
+    
     public Map getPluginContext( PluginDescriptor pluginDescriptor, MavenProject project )
     {
         return reactorManager.getPluginContext( pluginDescriptor, project );
@@ -112,7 +130,7 @@
         return localRepository;
     }
 
-    public List getGoals()
+    public List<String> getGoals()
     {
         return goals;
     }
@@ -138,13 +156,13 @@
         return container.lookup( role, roleHint );
     }
 
-    public List lookupList( String role )
+    public List<?> lookupList( String role )
         throws ComponentLookupException
     {
         return container.lookupList( role );
     }
 
-    public Map lookupMap( String role )
+    public Map<String, ?> lookupMap( String role )
         throws ComponentLookupException
     {
         return container.lookupMap( role );
@@ -209,18 +227,19 @@
         this.userProperties = userProperties;
     }
 
-    /**
-     * NOTE: This varies from {@link DefaultMavenExecutionRequest#getProjectBuilderConfiguration()} in that
-     * it doesn't supply a global profile manager.
-     */
     public ProjectBuilderConfiguration getProjectBuilderConfiguration()
     {
-        ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration();
-        config.setLocalRepository( getLocalRepository() )
-              .setExecutionProperties( getExecutionProperties() )
-              .setUserProperties( getUserProperties() )
-              .setBuildStartTime( getStartTime() );
+        if ( projectBuilderConfig == null )
+        {
+            ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration();
+            config.setLocalRepository( getLocalRepository() )
+                  .setExecutionProperties( getExecutionProperties() )
+                  .setUserProperties( getUserProperties() )
+                  .setBuildStartTime( getStartTime() );
+            
+            this.projectBuilderConfig = config;
+        }
 
-        return config;
+        return projectBuilderConfig;
     }
 }
\ No newline at end of file
diff --git a/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java b/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java
index 9949513..b0bd04c 100644
--- a/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java
+++ b/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java
@@ -21,7 +21,7 @@
 
 import static org.apache.maven.container.ContainerUtils.findChildComponentHints;
 
-import org.apache.maven.MavenArtifactFilterManager; 
+import org.apache.maven.MavenArtifactFilterManager;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.artifact.factory.ArtifactFactory;
@@ -38,7 +38,9 @@
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
 import org.apache.maven.model.Extension;
 import org.apache.maven.plugin.DefaultPluginManager;
+import org.apache.maven.project.DefaultProjectBuilderConfiguration;
 import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.ProjectBuilderConfiguration;
 import org.apache.maven.wagon.Wagon;
 import org.codehaus.classworlds.ClassRealm;
 import org.codehaus.classworlds.ClassWorld;
@@ -61,7 +63,6 @@
 import java.io.InputStreamReader;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
@@ -99,6 +100,14 @@
                               ArtifactRepository localRepository )
         throws ArtifactResolutionException, PlexusContainerException, ArtifactNotFoundException
     {
+        addExtension( extension, project, new DefaultProjectBuilderConfiguration().setLocalRepository( localRepository ) );
+    }
+    
+    public void addExtension( Extension extension,
+                              MavenProject project,
+                              ProjectBuilderConfiguration builderConfig )
+        throws ArtifactResolutionException, PlexusContainerException, ArtifactNotFoundException
+    {
         String extensionId = ArtifactUtils.versionlessKey( extension.getGroupId(), extension.getArtifactId() );
 
         getLogger().debug( "Initialising extension: " + extensionId );
@@ -108,11 +117,17 @@
         if ( artifact != null )
         {
             ArtifactFilter filter = new ProjectArtifactExceptionFilter( artifactFilter, project.getArtifact() );
+            
+            ArtifactMetadataSource metadataSource = builderConfig.getMetadataSource();
+            if ( metadataSource == null )
+            {
+                metadataSource = artifactMetadataSource;
+            }
 
             ResolutionGroup resolutionGroup;
             try
             {
-                resolutionGroup = artifactMetadataSource.retrieve( artifact, localRepository,
+                resolutionGroup = metadataSource.retrieve( artifact, builderConfig.getLocalRepository(),
                                                                    project.getRemoteArtifactRepositories() );
             }
             catch ( ArtifactMetadataRetrievalException e )
@@ -123,10 +138,10 @@
 
             // We use the same hack here to make sure that plexus 1.1 is available for extensions that do
             // not declare plexus-utils but need it. MNG-2900
-            Set rgArtifacts = resolutionGroup.getArtifacts();
+            Set<Artifact> rgArtifacts = resolutionGroup.getArtifacts();
             rgArtifacts = DefaultPluginManager.checkPlexusUtils( rgArtifacts, artifactFactory );
 
-            Set dependencies = new LinkedHashSet();
+            Set<Artifact> dependencies = new LinkedHashSet<Artifact>();
             dependencies.add( artifact );
             dependencies.addAll( rgArtifacts );
 
@@ -136,16 +151,16 @@
             ArtifactResolutionResult result = artifactResolver.resolveTransitively( dependencies, project.getArtifact(),
                                                                                     Collections.EMPTY_MAP,
                                                                                     //project.getManagedVersionMap(),
-                                                                                    localRepository,
+                                                                                    builderConfig.getLocalRepository(),
                                                                                     project.getRemoteArtifactRepositories(),
-                                                                                    artifactMetadataSource, filter );
+                                                                                    metadataSource, filter );
 
             // gross hack for some backwards compat (MNG-2749)
             // if it is a lone artifact, then we assume it to be a resource package, and put it in the main container
             // as before. If it has dependencies, that's when we risk conflict and exile to the child container
             // jvz: we have to make this 2 because plexus is always added now.
 
-            Set artifacts = result.getArtifacts();
+            Set<Artifact> artifacts = result.getArtifacts();
 
             // Lifecycles are loaded by the Lifecycle executor by looking up lifecycle definitions from the
             // core container. So we need to look if an extension has a lifecycle mapping and use the container
@@ -153,10 +168,8 @@
 
             if ( extensionContainsLifeycle( artifact.getFile() ) )
             {
-                for ( Iterator i = artifacts.iterator(); i.hasNext(); )
+                for ( Artifact a : artifacts )
                 {
-                    Artifact a = (Artifact) i.next();
-
                     if ( artifactFilter.include( a ) )
                     {
                         getLogger().debug( "Adding extension to core container: " + a.getFile() );
@@ -167,10 +180,8 @@
             }
             else if ( artifacts.size() == 2 )
             {
-                for ( Iterator i = artifacts.iterator(); i.hasNext(); )
+                for ( Artifact a : artifacts )
                 {
-                    Artifact a = (Artifact) i.next();
-
                     if ( !a.getArtifactId().equals( "plexus-utils" ) )
                     {
                         a = project.replaceWithActiveArtifact( a );
@@ -191,10 +202,8 @@
                     extensionContainer = createContainer();
                 }
 
-                for ( Iterator i = result.getArtifacts().iterator(); i.hasNext(); )
+                for ( Artifact a : (Set<Artifact>) result.getArtifacts() )
                 {
-                    Artifact a = (Artifact) i.next();
-
                     a = project.replaceWithActiveArtifact( a );
 
                     getLogger().debug( "Adding to extension classpath: " + a.getFile() );
diff --git a/maven-core/src/main/java/org/apache/maven/extension/ExtensionManager.java b/maven-core/src/main/java/org/apache/maven/extension/ExtensionManager.java
index 4667a90..61b1b59 100644
--- a/maven-core/src/main/java/org/apache/maven/extension/ExtensionManager.java
+++ b/maven-core/src/main/java/org/apache/maven/extension/ExtensionManager.java
@@ -25,6 +25,7 @@
 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
 import org.apache.maven.model.Extension;
 import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.ProjectBuilderConfiguration;
 import org.codehaus.plexus.PlexusContainerException;
 
 import java.util.Map;
@@ -43,4 +44,7 @@
     void registerWagons();
 
     Map<String, ArtifactHandler> getArtifactTypeHandlers();
+
+    void addExtension( Extension extension, MavenProject project, ProjectBuilderConfiguration builderConfig )
+        throws ArtifactResolutionException, PlexusContainerException, ArtifactNotFoundException;
 }
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java b/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
index 024b3b7..d9b13eb 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
@@ -193,7 +193,7 @@
                 try
                 {
                     getLogger().debug( "Adding extension: " + extension );
-                    extensionManager.addExtension( extension, project, session.getLocalRepository() );
+                    extensionManager.addExtension( extension, project, session.getProjectBuilderConfiguration() );
                 }
                 catch ( PlexusContainerException e )
                 {
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java b/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java
index 696b607..a11e02a 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java
@@ -740,10 +740,16 @@
 
             ArtifactRepository localRepository = session.getLocalRepository();
 
+            ArtifactMetadataSource metadataSource = session.getProjectBuilderConfiguration().getMetadataSource();
+            if ( metadataSource == null )
+            {
+                 metadataSource = artifactMetadataSource;
+            }
+            
             ResolutionGroup resolutionGroup;
             try
             {
-                resolutionGroup = artifactMetadataSource.retrieve( pluginArtifact, localRepository,
+                resolutionGroup = metadataSource.retrieve( pluginArtifact, localRepository,
                                                                    project.getPluginArtifactRepositories() );
             }
             catch ( ArtifactMetadataRetrievalException e )
@@ -835,7 +841,7 @@
             ArtifactResolutionResult result = artifactResolver.resolveTransitively( dependencies, pluginArtifact,
                                                                                     pluginManagedDependencies,
                                                                                     localRepository, repositories,
-                                                                                    artifactMetadataSource,
+                                                                                    metadataSource,
                                                                                     artifactFilter );
 
             Set resolved = result.getArtifacts();
diff --git a/maven-core/src/main/resources/META-INF/plexus/components.xml b/maven-core/src/main/resources/META-INF/plexus/components.xml
index 2bd2d63..a3ab50c 100644
--- a/maven-core/src/main/resources/META-INF/plexus/components.xml
+++ b/maven-core/src/main/resources/META-INF/plexus/components.xml
@@ -108,6 +108,11 @@
         <requirement>
           <role>org.apache.maven.execution.RuntimeInformation</role>
         </requirement>
+        <requirement>
+          <role>org.apache.maven.artifact.metadata.ArtifactMetadataSource</role>
+          <role-hint>maven</role-hint>
+          <field-name>mavenMetadataSource</field-name>
+        </requirement>
       </requirements>
     </component>
 
diff --git a/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java b/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
index 878b33b..c8f24e3 100644
--- a/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
+++ b/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
@@ -239,6 +239,17 @@
                                              boolean allowStubModel )
         throws ProjectBuildingException
     {
+        ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration().setLocalRepository( localRepository );
+        
+        return buildFromRepository( artifact, remoteArtifactRepositories, config, allowStubModel );
+    }
+
+    public MavenProject buildFromRepository( Artifact artifact,
+                                             List remoteArtifactRepositories,
+                                             ProjectBuilderConfiguration config,
+                                             boolean allowStubModel )
+        throws ProjectBuildingException
+    {
         String cacheKey = createCacheKey( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion() );
 
         MavenProject project = (MavenProject) processedProjectCache.get( cacheKey );
@@ -248,9 +259,7 @@
             return project;
         }
 
-        Model model = findModelFromRepository( artifact, remoteArtifactRepositories, localRepository, allowStubModel );
-
-        ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration().setLocalRepository( localRepository );
+        Model model = findModelFromRepository( artifact, remoteArtifactRepositories, config, allowStubModel );
 
         return buildInternal( "Artifact [" + artifact + "]", model, config, remoteArtifactRepositories,
                               null, false );
@@ -526,7 +535,7 @@
 
     private Model findModelFromRepository( Artifact artifact,
                                            List remoteArtifactRepositories,
-                                           ArtifactRepository localRepository,
+                                           ProjectBuilderConfiguration config,
                                            boolean allowStubModel )
         throws ProjectBuildingException
     {
@@ -555,7 +564,7 @@
 
         try
         {
-            artifactResolver.resolve( projectArtifact, remoteArtifactRepositories, localRepository );
+            artifactResolver.resolve( projectArtifact, remoteArtifactRepositories, config.getLocalRepository() );
 
             File file = projectArtifact.getFile();
 
@@ -574,7 +583,7 @@
                 status = ArtifactStatus.valueOf( distributionManagement.getStatus() );
             }
 
-            checkStatusAndUpdate( projectArtifact, status, file, remoteArtifactRepositories, localRepository );
+            checkStatusAndUpdate( projectArtifact, status, file, remoteArtifactRepositories, config.getLocalRepository() );
 
             // TODO: this is gross. Would like to give it the whole model, but maven-artifact shouldn't depend on that
             // Can a maven-core implementation of the Artifact interface store it, and be used in the exceptions?
@@ -859,6 +868,7 @@
 
         // only add the super repository if it wasn't overridden by a profile or project
         List repositories = new ArrayList( aggregatedRemoteWagonRepositories );
+        repositories.addAll( parentSearchRepositories );
 
         List superRepositories = buildArtifactRepositories( superModel );
 
@@ -996,7 +1006,7 @@
         // MNG-3482: Make sure depMgmt is interpolated before merging.
         if ( !isSuperPom )
         {
-            mergeManagedDependencies( model, config.getLocalRepository(), remoteRepositories );
+            mergeManagedDependencies( model, config, remoteRepositories );
         }
 
         // interpolation is before injection, because interpolation is off-limits in the injected variables
@@ -1389,7 +1399,7 @@
 
                 try
                 {
-                    model = findModelFromRepository( parentArtifact, remoteRepositories, config.getLocalRepository(), false );
+                    model = findModelFromRepository( parentArtifact, remoteRepositories, config, false );
                 }
                 catch ( ProjectBuildingException e )
                 {
@@ -1422,7 +1432,7 @@
         return project;
     }
 
-    private void mergeManagedDependencies(Model model, ArtifactRepository localRepository, List parentSearchRepositories)
+    private void mergeManagedDependencies(Model model, ProjectBuilderConfiguration config, List parentSearchRepositories)
         throws ProjectBuildingException
     {
         DependencyManagement modelDepMgmt = model.getDependencyManagement();
@@ -1453,7 +1463,7 @@
                     {
                         Artifact artifact = artifactFactory.createProjectArtifact( dep.getGroupId(), dep.getArtifactId(),
                                                                                   dep.getVersion(), dep.getScope() );
-                        MavenProject project = buildFromRepository(artifact, parentSearchRepositories, localRepository, false);
+                        MavenProject project = buildFromRepository(artifact, parentSearchRepositories, config, false);
 
                         DependencyManagement depMgmt = project.getDependencyManagement();
 
diff --git a/maven-project/src/main/java/org/apache/maven/project/DefaultProjectBuilderConfiguration.java b/maven-project/src/main/java/org/apache/maven/project/DefaultProjectBuilderConfiguration.java
index 77fb4b7..6940b01 100644
--- a/maven-project/src/main/java/org/apache/maven/project/DefaultProjectBuilderConfiguration.java
+++ b/maven-project/src/main/java/org/apache/maven/project/DefaultProjectBuilderConfiguration.java
@@ -1,5 +1,6 @@
 package org.apache.maven.project;
 
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.profiles.ProfileManager;
 
@@ -20,6 +21,8 @@
 
     private Date buildStartTime;
 
+    private ArtifactMetadataSource metadataSource;
+
     public DefaultProjectBuilderConfiguration()
     {
     }
@@ -84,4 +87,15 @@
         return this;
     }
 
+    public ProjectBuilderConfiguration setMetadataSource( ArtifactMetadataSource metadataSource )
+    {
+        this.metadataSource = metadataSource;
+        return this;
+    }
+    
+    public ArtifactMetadataSource getMetadataSource()
+    {
+        return metadataSource;
+    }
+
 }
diff --git a/maven-project/src/main/java/org/apache/maven/project/MavenProjectBuilder.java b/maven-project/src/main/java/org/apache/maven/project/MavenProjectBuilder.java
index e398ae9..bb29b17 100644
--- a/maven-project/src/main/java/org/apache/maven/project/MavenProjectBuilder.java
+++ b/maven-project/src/main/java/org/apache/maven/project/MavenProjectBuilder.java
@@ -91,6 +91,22 @@
         throws ProjectBuildingException;
 
     /**
+     * Build the artifact using the local repository and profile manager from the project-builder 
+     * configuration, resolving it if necessary.
+     *
+     * @param artifact the artifact description
+     * @param configuration The {@link ProjectBuilderConfiguration} instance containing local 
+     *                      repository, profile manager, etc.
+     * @param remoteArtifactRepositories the remote repository list
+     * @param allowStubModel return a stub if the POM is not found
+     * @return the built project
+     * @throws ProjectBuildingException
+     */
+    MavenProject buildFromRepository( Artifact artifact, List remoteArtifactRepositories,
+                                      ProjectBuilderConfiguration configuration, boolean allowStubModel )
+        throws ProjectBuildingException;
+
+    /**
      * @deprecated Use {@link MavenProjectBuilder#buildStandaloneSuperProject(ProjectBuilderConfiguration)} instead.
      */
     MavenProject buildStandaloneSuperProject( ArtifactRepository localRepository )
diff --git a/maven-project/src/main/java/org/apache/maven/project/ProjectBuilderConfiguration.java b/maven-project/src/main/java/org/apache/maven/project/ProjectBuilderConfiguration.java
index f8ce413..f190ad7 100644
--- a/maven-project/src/main/java/org/apache/maven/project/ProjectBuilderConfiguration.java
+++ b/maven-project/src/main/java/org/apache/maven/project/ProjectBuilderConfiguration.java
@@ -1,5 +1,6 @@
 package org.apache.maven.project;
 
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.profiles.ProfileManager;
 
@@ -29,4 +30,8 @@
 
     ProjectBuilderConfiguration setBuildStartTime( Date buildStartTime );
 
+    ProjectBuilderConfiguration setMetadataSource( ArtifactMetadataSource mms );
+    
+    ArtifactMetadataSource getMetadataSource();
+
 }
diff --git a/maven-project/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java b/maven-project/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
index f765795..4ab0f07 100644
--- a/maven-project/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
+++ b/maven-project/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
@@ -53,6 +53,7 @@
 import org.apache.maven.project.InvalidProjectModelException;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectBuilder;
+import org.apache.maven.project.ProjectBuilderConfiguration;
 import org.apache.maven.project.ProjectBuildingException;
 import org.apache.maven.project.validation.ModelValidationResult;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
@@ -78,8 +79,29 @@
     // lazily instantiated and cached.
     private MavenProject superProject;
     
-    private Set warnedPoms = new HashSet();
-
+    // cache
+    private final Set<String> warnedPoms;
+    
+    // per-session information
+    private ProjectBuilderConfiguration projectBuilderConfig;
+    
+    public MavenMetadataSource()
+    {
+        warnedPoms = new HashSet<String>();
+    }
+    
+    public MavenMetadataSource( MavenMetadataSource mms, ProjectBuilderConfiguration configuration )
+    {
+        mavenProjectBuilder = mms.mavenProjectBuilder;
+        artifactFactory = mms.artifactFactory;
+        repositoryMetadataManager = mms.repositoryMetadataManager;
+        superProject = mms.superProject;
+        warnedPoms = mms.warnedPoms;
+        
+        projectBuilderConfig = configuration;
+        projectBuilderConfig.setMetadataSource( this );
+    }
+    
     /**
      * Resolve all relocations in the POM for this artifact, and return the new artifact coordinate.
      */
@@ -143,6 +165,12 @@
         throws ArtifactMetadataRetrievalException
     {
         MavenProject project = null;
+        
+        ProjectBuilderConfiguration config = projectBuilderConfig;
+        if ( config == null )
+        {
+            config = new DefaultProjectBuilderConfiguration().setLocalRepository( localRepository );
+        }
 
         Artifact pomArtifact;
         boolean done = false;
@@ -160,7 +188,7 @@
             {
                 try
                 {
-                    project = mavenProjectBuilder.buildFromRepository( pomArtifact, remoteRepositories, localRepository,
+                    project = mavenProjectBuilder.buildFromRepository( pomArtifact, remoteRepositories, config,
                                                                        true );
                 }
                 catch ( InvalidProjectModelException e )
@@ -352,11 +380,17 @@
     private List aggregateRepositoryLists( List remoteRepositories, List remoteArtifactRepositories )
         throws ArtifactMetadataRetrievalException
     {
+        ProjectBuilderConfiguration config = projectBuilderConfig;
+        if ( config == null )
+        {
+            config = new DefaultProjectBuilderConfiguration();
+        }
+        
         if ( superProject == null )
         {
             try
             {
-                superProject = mavenProjectBuilder.buildStandaloneSuperProject( new DefaultProjectBuilderConfiguration() );
+                superProject = mavenProjectBuilder.buildStandaloneSuperProject( config );
             }
             catch ( ProjectBuildingException e )
             {