You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by be...@apache.org on 2009/07/14 12:44:45 UTC

svn commit: r793844 - in /maven/components/trunk/maven-core/src: main/java/org/apache/maven/project/ test/java/org/apache/maven/project/ test/resources/org/apache/maven/project/

Author: bentmann
Date: Tue Jul 14 10:44:44 2009
New Revision: 793844

URL: http://svn.apache.org/viewvc?rev=793844&view=rev
Log:
o Introduced project realm to host build extensions

Added:
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultModelBuildingListener.java   (with props)
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java   (with props)
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingHelper.java   (with props)
    maven/components/trunk/maven-core/src/test/java/org/apache/maven/project/EmptyProjectBuildingHelper.java   (with props)
Modified:
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProject.java
    maven/components/trunk/maven-core/src/test/resources/org/apache/maven/project/PomConstructionTest.xml

Added: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultModelBuildingListener.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultModelBuildingListener.java?rev=793844&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultModelBuildingListener.java (added)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultModelBuildingListener.java Tue Jul 14 10:44:44 2009
@@ -0,0 +1,109 @@
+package org.apache.maven.project;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.List;
+
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.building.AbstractModelBuildingListener;
+import org.apache.maven.model.building.ModelBuildingEvent;
+import org.codehaus.plexus.classworlds.realm.ClassRealm;
+
+/**
+ * Processes events from the model builder.
+ * 
+ * @author Benjamin Bentmann
+ */
+class DefaultModelBuildingListener
+    extends AbstractModelBuildingListener
+{
+
+    private ProjectBuildingHelper projectBuildingHelper;
+
+    private ProjectBuildingRequest projectBuildingRequest;
+
+    private ClassRealm projectRealm;
+
+    private List<ArtifactRepository> remoteRepositories;
+
+    private List<ArtifactRepository> pluginRepositories;
+
+    public DefaultModelBuildingListener( ProjectBuildingHelper projectBuildingHelper,
+                                         ProjectBuildingRequest projectBuildingRequest )
+    {
+        if ( projectBuildingHelper == null )
+        {
+            throw new IllegalArgumentException( "project realm manager missing" );
+        }
+        this.projectBuildingHelper = projectBuildingHelper;
+
+        if ( projectBuildingRequest == null )
+        {
+            throw new IllegalArgumentException( "project building request missing" );
+        }
+        this.projectBuildingRequest = projectBuildingRequest;
+    }
+
+    public ClassRealm getProjectRealm()
+    {
+        return projectRealm;
+    }
+
+    public List<ArtifactRepository> getRemoteRepositories()
+    {
+        return remoteRepositories;
+    }
+
+    public List<ArtifactRepository> getPluginRepositories()
+    {
+        return pluginRepositories;
+    }
+
+    @Override
+    public void buildExtensionsAssembled( ModelBuildingEvent event )
+        throws Exception
+    {
+        Model model = event.getModel();
+
+        remoteRepositories = projectBuildingRequest.getRemoteRepositories();
+        remoteRepositories =
+            projectBuildingHelper.createArtifactRepositories( model.getRepositories(), remoteRepositories );
+
+        pluginRepositories = projectBuildingRequest.getPluginArtifactRepositories();
+        pluginRepositories =
+            projectBuildingHelper.createArtifactRepositories( model.getPluginRepositories(), pluginRepositories );
+
+        if ( event.getRequest().isProcessPlugins() )
+        {
+            projectRealm =
+                projectBuildingHelper.createProjectRealm( model, projectBuildingRequest.getLocalRepository(),
+                                                          pluginRepositories );
+
+            /*
+             * Update the context class loader so that the container will search the project realm when the model
+             * builder injects the lifecycle bindings from the packaging next. The class loader is reset by the project
+             * builder when the project is fully assembled.
+             */
+            Thread.currentThread().setContextClassLoader( projectRealm );
+        }
+    }
+
+}

Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultModelBuildingListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultModelBuildingListener.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java?rev=793844&r1=793843&r2=793844&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java Tue Jul 14 10:44:44 2009
@@ -17,6 +17,7 @@
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import org.apache.maven.artifact.Artifact;
@@ -61,6 +62,9 @@
     private ModelBuilder modelBuilder;
 
     @Requirement
+    private ProjectBuildingHelper projectBuildingHelper;
+
+    @Requirement
     private LifecycleExecutor lifecycle;
 
     @Requirement
@@ -86,81 +90,98 @@
     {
         ModelBuildingRequest request = getModelBuildingRequest( configuration );
 
-        ModelBuildingResult result;
+        DefaultModelBuildingListener listener = new DefaultModelBuildingListener( projectBuildingHelper, configuration );
+        request.setModelBuildingListeners( Arrays.asList( listener ) );
+
+        ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
+
         try
         {
-            if ( localProject )
+            ModelBuildingResult result;
+            try
             {
-                result = modelBuilder.build( pomFile, request );
+                if ( localProject )
+                {
+                    result = modelBuilder.build( pomFile, request );
+                }
+                else
+                {
+                    result = modelBuilder.build( new FileModelSource( pomFile ), request );
+                }
             }
-            else
+            catch ( ModelBuildingException e )
             {
-                result = modelBuilder.build( new FileModelSource( pomFile ), request );
+                throw new ProjectBuildingException( "[unknown]", "Failed to build project for " + pomFile, pomFile, e );
             }
-        }
-        catch ( ModelBuildingException e )
-        {
-            throw new ProjectBuildingException( "[unknown]", "Failed to build project for " + pomFile, pomFile, e );
-        }
-        
-        if ( localProject && !result.getProblems().isEmpty() && logger.isWarnEnabled() )
-        {
-            logger.warn( "" );
-            logger.warn( "One or more problems were encountered while building the effective model:" );
 
-            for ( ModelProblem problem : result.getProblems() )
+            if ( localProject && !result.getProblems().isEmpty() && logger.isWarnEnabled() )
             {
-                logger.warn( problem.getMessage() );
+                logger.warn( "" );
+                logger.warn( "One or more problems were encountered while building the project's effective model:" );
+
+                for ( ModelProblem problem : result.getProblems() )
+                {
+                    logger.warn( problem.getMessage() );
+                }
+
+                logger.warn( "" );
+                logger.warn( "It is highly recommended to fix these problems"
+                    + " because they threaten the stability of your build." );
+                logger.warn( "" );
+                logger.warn( "For this reason, future Maven versions will no"
+                    + " longer support building such malformed projects." );
+                logger.warn( "" );
             }
 
-            logger.warn( "" );
-            logger.warn( "It is highly recommended to fix these problems"
-                + " because they threaten the stability of your build." );
-            logger.warn( "" );
-            logger.warn( "For this reason, future Maven versions will no"
-                + " longer support building such malformed projects." );
-            logger.warn( "" );
-        }
+            Model model = result.getEffectiveModel();
 
-        Model model = result.getEffectiveModel();
+            File parentPomFile = result.getRawModel( result.getModelIds().get( 1 ) ).getPomFile();
+            MavenProject project = fromModelToMavenProject( model, parentPomFile, configuration, model.getPomFile() );
 
-        File parentPomFile = result.getRawModel( result.getModelIds().get( 1 ) ).getPomFile();
-        MavenProject project = fromModelToMavenProject( model, parentPomFile, configuration, model.getPomFile() );
+            project.setOriginalModel( result.getRawModel() );
 
-        project.setOriginalModel( result.getRawModel() );
-     
-        try
-        {
-            if ( configuration.isProcessPlugins() )
+            project.setRemoteArtifactRepositories( listener.getRemoteRepositories() );
+            project.setPluginArtifactRepositories( listener.getPluginRepositories() );
+
+            try
             {
-                lifecycle.populateDefaultConfigurationForPlugins( model.getBuild().getPlugins(), configuration.getLocalRepository(), project.getPluginArtifactRepositories() );
+                if ( configuration.isProcessPlugins() )
+                {
+                    lifecycle.populateDefaultConfigurationForPlugins( model.getBuild().getPlugins(),
+                                                                      configuration.getLocalRepository(),
+                                                                      project.getPluginArtifactRepositories() );
+                }
+            }
+            catch ( LifecycleExecutionException e )
+            {
+                throw new ProjectBuildingException( project.getId(), e.getMessage(), e );
             }
-        }
-        catch ( LifecycleExecutionException e )
-        {
-            throw new ProjectBuildingException( "", e.getMessage(), e );
-        }
 
-        Build build = project.getBuild();
-        // NOTE: setting this script-source root before path translation, because
-        // the plugin tools compose basedir and scriptSourceRoot into a single file.
-        project.addScriptSourceRoot( build.getScriptSourceDirectory() );
-        project.addCompileSourceRoot( build.getSourceDirectory() );
-        project.addTestCompileSourceRoot( build.getTestSourceDirectory() );
-        project.setFile( pomFile );
+            Build build = project.getBuild();
+            // NOTE: setting this script-source root before path translation, because
+            // the plugin tools compose basedir and scriptSourceRoot into a single file.
+            project.addScriptSourceRoot( build.getScriptSourceDirectory() );
+            project.addCompileSourceRoot( build.getSourceDirectory() );
+            project.addTestCompileSourceRoot( build.getTestSourceDirectory() );
+            project.setFile( pomFile );
+
+            List<Profile> activeProfiles = new ArrayList<Profile>();
+            activeProfiles.addAll( result.getActivePomProfiles( result.getModelIds().get( 0 ) ) );
+            activeProfiles.addAll( result.getActiveExternalProfiles() );
+            project.setActiveProfiles( activeProfiles );
 
-        List<Profile> activeProfiles = new ArrayList<Profile>();
-        activeProfiles.addAll( result.getActivePomProfiles( result.getModelIds().get( 0 ) ) );
-        activeProfiles.addAll( result.getActiveExternalProfiles() );
-        project.setActiveProfiles( activeProfiles );
+            project.setInjectedProfileIds( "external", getProfileIds( result.getActiveExternalProfiles() ) );
+            for ( String modelId : result.getModelIds() )
+            {
+                project.setInjectedProfileIds( modelId, getProfileIds( result.getActivePomProfiles( modelId ) ) );
+            }
 
-        project.setInjectedProfileIds( "external", getProfileIds( result.getActiveExternalProfiles() ) );
-        for ( String modelId : result.getModelIds() )
+            return project;
+        }
+        finally
         {
-            project.setInjectedProfileIds( modelId, getProfileIds( result.getActivePomProfiles( modelId ) ) );
+            Thread.currentThread().setContextClassLoader( oldContextClassLoader );
         }
-
-        return project;
     }
 
     private List<String> getProfileIds( List<Profile> profiles )
@@ -182,6 +203,7 @@
                                          configuration.getRemoteRepositories() );
 
         ModelBuildingRequest request = new DefaultModelBuildingRequest();
+
         request.setValidationLevel( configuration.getValidationLevel() );
         request.setProcessPlugins( configuration.isProcessPlugins() );
         request.setProfiles( configuration.getProfiles() );

Added: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java?rev=793844&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java (added)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java Tue Jul 14 10:44:44 2009
@@ -0,0 +1,214 @@
+package org.apache.maven.project;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.maven.ArtifactFilterManager;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.InvalidRepositoryException;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
+import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
+import org.apache.maven.artifact.resolver.ResolutionErrorHandler;
+import org.apache.maven.model.Build;
+import org.apache.maven.model.Extension;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.model.Repository;
+import org.apache.maven.repository.RepositorySystem;
+import org.codehaus.plexus.MutablePlexusContainer;
+import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.classworlds.ClassWorld;
+import org.codehaus.plexus.classworlds.realm.ClassRealm;
+import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.annotations.Requirement;
+import org.codehaus.plexus.logging.Logger;
+
+/**
+ * Assists the project builder.
+ * 
+ * @author Benjamin Bentmann
+ */
+@Component( role = ProjectBuildingHelper.class )
+public class DefaultProjectBuildingHelper
+    implements ProjectBuildingHelper
+{
+
+    @Requirement
+    private Logger logger;
+
+    @Requirement
+    private PlexusContainer container;
+
+    @Requirement
+    private RepositorySystem repositorySystem;
+
+    @Requirement
+    private ResolutionErrorHandler resolutionErrorHandler;
+
+    @Requirement
+    private ArtifactFilterManager artifactFilterManager;
+
+    public List<ArtifactRepository> createArtifactRepositories( List<Repository> pomRepositories,
+                                                                List<ArtifactRepository> externalRepositories )
+        throws InvalidRepositoryException
+    {
+        List<ArtifactRepository> artifactRepositories = new ArrayList<ArtifactRepository>();
+
+        for ( Repository repository : pomRepositories )
+        {
+            artifactRepositories.add( repositorySystem.buildArtifactRepository( repository ) );
+        }
+
+        artifactRepositories = repositorySystem.getMirrors( artifactRepositories );
+
+        if ( externalRepositories != null )
+        {
+            artifactRepositories.addAll( externalRepositories );
+        }
+
+        artifactRepositories = repositorySystem.getEffectiveRepositories( artifactRepositories );
+
+        return artifactRepositories;
+    }
+
+    public ClassRealm createProjectRealm( Model model, ArtifactRepository localRepository,
+                                          List<ArtifactRepository> remoteRepositories )
+        throws ArtifactResolutionException
+    {
+        Build build = model.getBuild();
+
+        if ( build == null )
+        {
+            return null;
+        }
+
+        List<Plugin> extensionPlugins = new ArrayList<Plugin>();
+
+        for ( Plugin plugin : build.getPlugins() )
+        {
+            if ( plugin.isExtensions() )
+            {
+                extensionPlugins.add( plugin );
+            }
+        }
+
+        if ( build.getExtensions().isEmpty() && extensionPlugins.isEmpty() )
+        {
+            return null;
+        }
+
+        String realmId = model.getGroupId() + ':' + model.getArtifactId() + ':' + model.getVersion();
+
+        if ( logger.isDebugEnabled() )
+        {
+            logger.debug( "Creating project realm " + realmId );
+        }
+
+        ClassWorld world = ( (MutablePlexusContainer) container ).getClassWorld();
+
+        ClassRealm projectRealm;
+
+        synchronized ( world )
+        {
+            projectRealm = world.getClassRealm( realmId );
+
+            if ( projectRealm == null )
+            {
+                try
+                {
+                    projectRealm = world.newRealm( realmId );
+                    projectRealm.setParentRealm( container.getContainerRealm() );
+                }
+                catch ( DuplicateRealmException e )
+                {
+                    throw new IllegalStateException( "Failed to create project realm " + realmId, e );
+                }
+            }
+        }
+
+        for ( Extension extension : build.getExtensions() )
+        {
+            Artifact artifact =
+                repositorySystem.createArtifact( extension.getGroupId(), extension.getArtifactId(),
+                                                 extension.getVersion(), "jar" );
+
+            populateRealm( projectRealm, artifact, localRepository, remoteRepositories );
+        }
+
+        for ( Plugin plugin : extensionPlugins )
+        {
+            Artifact artifact = repositorySystem.createPluginArtifact( plugin );
+
+            populateRealm( projectRealm, artifact, localRepository, remoteRepositories );
+        }
+
+        try
+        {
+            container.discoverComponents( projectRealm );
+        }
+        catch ( Exception e )
+        {
+            throw new IllegalStateException( "Failed to discover components in project realm " + realmId, e );
+        }
+
+        return projectRealm;
+    }
+
+    private void populateRealm( ClassRealm realm, Artifact artifact, ArtifactRepository localRepository,
+                                List<ArtifactRepository> remoteRepositories )
+        throws ArtifactResolutionException
+    {
+        ArtifactResolutionRequest request = new ArtifactResolutionRequest();
+        request.setArtifact( artifact );
+        request.setResolveTransitively( true );
+        request.setFilter( artifactFilterManager.getCoreArtifactFilter() );
+        request.setLocalRepository( localRepository );
+        request.setRemoteRepostories( remoteRepositories );
+
+        ArtifactResolutionResult result = repositorySystem.resolve( request );
+
+        resolutionErrorHandler.throwErrors( request, result );
+
+        for ( Artifact resultArtifact : result.getArtifacts() )
+        {
+            if ( logger.isDebugEnabled() )
+            {
+                logger.debug( "  " + resultArtifact.getFile() );
+            }
+
+            try
+            {
+                realm.addURL( resultArtifact.getFile().toURI().toURL() );
+            }
+            catch ( MalformedURLException e )
+            {
+                throw new IllegalStateException( "Failed to populate project realm " + realm.getId() + " with "
+                    + artifact.getFile(), e );
+            }
+        }
+    }
+
+}

Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProject.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProject.java?rev=793844&r1=793843&r2=793844&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProject.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProject.java Tue Jul 14 10:44:44 2009
@@ -239,13 +239,6 @@
         this.projectBuilderConfiguration = projectBuilderConfiguration;
         this.repositorySystem = repositorySystem;
         originalModel = model;
-        
-        remoteArtifactRepositories = projectBuilderConfiguration.getRemoteRepositories();
-        remoteArtifactRepositories = createArtifactRepositories( model.getRepositories(), remoteArtifactRepositories );
-
-        pluginArtifactRepositories = projectBuilderConfiguration.getPluginArtifactRepositories();
-        pluginArtifactRepositories =
-            createArtifactRepositories( model.getPluginRepositories(), pluginArtifactRepositories );
     }
 
     //TODO: need to integrate the effective scope and refactor it out of the MMS
@@ -268,35 +261,6 @@
 
         return artifacts;        
     }
-    
-    private List<ArtifactRepository> createArtifactRepositories( List<Repository> pomRepositories,
-                                                                 List<ArtifactRepository> externalRepositories )
-    {
-        List<ArtifactRepository> artifactRepositories = new ArrayList<ArtifactRepository>();
-
-        for ( Repository repository : pomRepositories )
-        {
-            try
-            {
-                artifactRepositories.add( repositorySystem.buildArtifactRepository( repository ) );
-            }
-            catch ( InvalidRepositoryException e )
-            {
-
-            }
-        }
-
-        artifactRepositories = repositorySystem.getMirrors( artifactRepositories );
-
-        if ( externalRepositories != null )
-        {
-            artifactRepositories.addAll( externalRepositories );
-        }
-
-        artifactRepositories = repositorySystem.getEffectiveRepositories( artifactRepositories );
-
-        return artifactRepositories;
-    }
 
     // TODO: Find a way to use <relativePath/> here...it's tricky, because the moduleProject
     // usually doesn't have a file associated with it yet.

Added: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingHelper.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingHelper.java?rev=793844&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingHelper.java (added)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingHelper.java Tue Jul 14 10:44:44 2009
@@ -0,0 +1,65 @@
+package org.apache.maven.project;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.List;
+
+import org.apache.maven.artifact.InvalidRepositoryException;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Repository;
+import org.codehaus.plexus.classworlds.realm.ClassRealm;
+
+/**
+ * Assists the project builder.
+ * 
+ * @author Benjamin Bentmann
+ */
+public interface ProjectBuildingHelper
+{
+
+    /**
+     * Creates the effective artifact repositories from the specified POM repositories.
+     * 
+     * @param pomRepositories The POM repositories to create the artifact repositories from, must not be {@code null}.
+     * @param externalRepositories The external (and already mirrored) repositories to merge into the result list, may
+     *            be {@code null}.
+     * @return The effective artifact repositories, never {@code null}.
+     * @throws InvalidRepositoryException
+     */
+    List<ArtifactRepository> createArtifactRepositories( List<Repository> pomRepositories,
+                                                         List<ArtifactRepository> externalRepositories )
+        throws InvalidRepositoryException;
+
+    /**
+     * Creates the project realm that hosts the build extensions of the specified model.
+     * 
+     * @param model The model to create the project realm for, must not be {@code null}
+     * @param localRepository The local repository to use for artifact resolution, must not be {@code null}.
+     * @param remoteRepositories The remote repositories to use for artifact resolution, must not be {@code null}.
+     * @return The project realm or {@code null} if no build extensions are present.
+     * @throws ArtifactResolutionException If any build extension could not be resolved.
+     */
+    ClassRealm createProjectRealm( Model model, ArtifactRepository localRepository,
+                                   List<ArtifactRepository> remoteRepositories )
+        throws ArtifactResolutionException;
+
+}

Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingHelper.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/components/trunk/maven-core/src/test/java/org/apache/maven/project/EmptyProjectBuildingHelper.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/java/org/apache/maven/project/EmptyProjectBuildingHelper.java?rev=793844&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/test/java/org/apache/maven/project/EmptyProjectBuildingHelper.java (added)
+++ maven/components/trunk/maven-core/src/test/java/org/apache/maven/project/EmptyProjectBuildingHelper.java Tue Jul 14 10:44:44 2009
@@ -0,0 +1,57 @@
+package org.apache.maven.project;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.maven.artifact.InvalidRepositoryException;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Repository;
+import org.codehaus.plexus.classworlds.realm.ClassRealm;
+import org.codehaus.plexus.component.annotations.Component;
+
+/**
+ * A stub implementation to bypass artifact resolution from repositories.
+ * 
+ * @author Benjamin Bentmann
+ */
+@Component( role = ProjectBuildingHelper.class )
+public class EmptyProjectBuildingHelper
+    implements ProjectBuildingHelper
+{
+
+    public List<ArtifactRepository> createArtifactRepositories( List<Repository> pomRepositories,
+                                                                List<ArtifactRepository> externalRepositories )
+        throws InvalidRepositoryException
+    {
+        return new ArrayList<ArtifactRepository>();
+    }
+
+    public ClassRealm createProjectRealm( Model model, ArtifactRepository localRepository,
+                                       List<ArtifactRepository> remoteRepositories )
+        throws ArtifactResolutionException
+    {
+        return null;
+    }
+
+}

Propchange: maven/components/trunk/maven-core/src/test/java/org/apache/maven/project/EmptyProjectBuildingHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/test/java/org/apache/maven/project/EmptyProjectBuildingHelper.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: maven/components/trunk/maven-core/src/test/resources/org/apache/maven/project/PomConstructionTest.xml
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/resources/org/apache/maven/project/PomConstructionTest.xml?rev=793844&r1=793843&r2=793844&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/test/resources/org/apache/maven/project/PomConstructionTest.xml (original)
+++ maven/components/trunk/maven-core/src/test/resources/org/apache/maven/project/PomConstructionTest.xml Tue Jul 14 10:44:44 2009
@@ -5,5 +5,9 @@
       <role>org.apache.maven.lifecycle.LifecycleExecutor</role>
       <implementation>org.apache.maven.project.EmptyLifecycleExecutor</implementation>
     </component>
+    <component>
+      <role>org.apache.maven.project.ProjectBuildingHelper</role>
+      <implementation>org.apache.maven.project.EmptyProjectBuildingHelper</implementation>
+    </component>
   </components>
 </plexus>