You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jd...@apache.org on 2007/10/18 20:38:11 UTC

svn commit: r586061 [1/2] - in /maven/components/trunk: maven-core/src/main/java/org/apache/maven/execution/ maven-core/src/main/java/org/apache/maven/extension/ maven-core/src/main/java/org/apache/maven/lifecycle/ maven-core/src/main/java/org/apache/m...

Author: jdcasey
Date: Thu Oct 18 11:38:06 2007
New Revision: 586061

URL: http://svn.apache.org/viewvc?rev=586061&view=rev
Log:
Fixing it0112 and it0115, and cleaning up extension isolation further. Also, adding a flag to tell whether an accompanying profiles.xml file is valid for any given POM file...when loaded from a repository (or stubbed), this flag should always be false.

Added:
    maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/
    maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/pom.xml   (with props)
    maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/repo.xml   (with props)
    maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/src/
    maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/src/main/
    maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/src/main/resources/
    maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/src/main/resources/META-INF/
    maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/src/main/resources/META-INF/plexus/
    maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/src/main/resources/META-INF/plexus/components.xml   (with props)
    maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/
    maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/
    maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.jar   (with props)
    maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom   (with props)
    maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.md5
    maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.sha1
Modified:
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenProjectSession.java
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultBuildExtensionScanner.java
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanner.java
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java
    maven/components/trunk/maven-core/src/test/java/org/apache/maven/extension/DefaultExtensionManagerTest.java
    maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/build/DefaultProfileAdvisor.java
    maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/build/ProfileAdvisor.java
    maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
    maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/DefaultModelLineage.java
    maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/DefaultModelLineageBuilder.java
    maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/ModelLineage.java
    maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/ModelLineageBuilder.java
    maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/build/model/AbstractModelLineageTest.java
    maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/build/model/DefaultModelLineageBuilderTest.java

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenProjectSession.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenProjectSession.java?rev=586061&r1=586060&r2=586061&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenProjectSession.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenProjectSession.java Thu Oct 18 11:38:06 2007
@@ -39,21 +39,22 @@
         return projectId;
     }
 
-    public static String createRealmId( Artifact realmArtifact )
+    private String createExtensionRealmId( Artifact realmArtifact )
     {
-        return ArtifactUtils.versionlessKey( realmArtifact );
+        return projectId + "/extensions/" + ArtifactUtils.versionlessKey( realmArtifact );
     }
 
-    public boolean containsRealm( Artifact extensionArtifact )
+    public boolean containsExtensionRealm( Artifact extensionArtifact )
     {
-        String id = createRealmId( extensionArtifact );
+        String id = createExtensionRealmId( extensionArtifact );
         return componentRealms.containsKey( id );
     }
 
     public boolean containsRealm( Plugin plugin )
     {
-        String id = createRealmId( plugin );
-        return componentRealms.containsKey( id );
+        String realmId = createPluginRealmId( ArtifactUtils.versionlessKey( plugin.getGroupId(), plugin.getArtifactId() ) );
+
+        return componentRealms.containsKey( realmId );
     }
 
     public ClassRealm getProjectRealm()
@@ -64,8 +65,8 @@
     public ClassRealm createExtensionRealm( Artifact extensionArtifact )
         throws DuplicateRealmException
     {
-        String realmId = MavenProjectSession.createRealmId( extensionArtifact );
-        ClassRealm extRealm = container.getContainerRealm().createChildRealm( projectId + "/" + realmId );
+        String realmId = createExtensionRealmId( extensionArtifact );
+        ClassRealm extRealm = container.getContainerRealm().createChildRealm( realmId );
 
         componentRealms.put( realmId, extRealm );
 
@@ -79,16 +80,20 @@
         return groupId + ":" + artifactId + ":" + version;
     }
 
-    public ClassRealm getComponentRealm( String key )
+    public ClassRealm getPluginRealm( Plugin plugin )
+        throws NoSuchRealmException
     {
-        return (ClassRealm) componentRealms.get( key );
+        String realmId = createPluginRealmId( ArtifactUtils.versionlessKey( plugin.getGroupId(), plugin.getArtifactId() ) );
+
+        return projectRealm.getWorld().getRealm( realmId );
     }
 
 
-    public ClassRealm createPluginRealm( Plugin projectPlugin )
+    public ClassRealm createPluginRealm( Plugin plugin )
         throws DuplicateRealmException
     {
-        String realmId = MavenProjectSession.createRealmId( projectPlugin );
+        String realmId = createPluginRealmId( ArtifactUtils.versionlessKey( plugin.getGroupId(), plugin.getArtifactId() ) );
+
         ClassRealm extRealm = projectRealm.createChildRealm( realmId );
 
         componentRealms.put( realmId, extRealm );
@@ -96,20 +101,16 @@
         return extRealm;
     }
 
-    public static String createRealmId( Plugin plugin )
+    private String createPluginRealmId( String baseId )
     {
-        return ArtifactUtils.versionlessKey( plugin.getGroupId(), plugin.getArtifactId() );
+        return projectId + "/plugins/" + baseId;
     }
 
-    public static String createRealmId( PluginDescriptor pd )
-    {
-        return ArtifactUtils.versionlessKey( pd.getGroupId(), pd.getArtifactId() );
-    }
-
-    public ClassRealm getPluginRealm( PluginDescriptor pluginDescriptor )
+    public ClassRealm getPluginRealm( PluginDescriptor pd )
         throws NoSuchRealmException
     {
-        String realmId = MavenProjectSession.createRealmId( pluginDescriptor );
+        String realmId = createPluginRealmId( ArtifactUtils.versionlessKey( pd.getGroupId(), pd.getArtifactId() ) );
+
         ClassRealm extRealm = projectRealm.getWorld().getRealm( realmId );
 
         componentRealms.put( realmId, extRealm );

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultBuildExtensionScanner.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultBuildExtensionScanner.java?rev=586061&r1=586060&r2=586061&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultBuildExtensionScanner.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultBuildExtensionScanner.java Thu Oct 18 11:38:06 2007
@@ -336,8 +336,12 @@
         {
             getLogger().debug( "Building model-lineage for: " + pom + " to pre-scan for extensions." );
 
+            // NOTE: We're assuming that this scan happens only for local filesystem POMs,
+            // not for POMs from the repository...otherwise, we would need to be more careful with
+            // the last parameter here and determine whether it's appropriate for the POM to have
+            // an accompanying profiles.xml file.
             lineage = modelLineageBuilder.buildModelLineage( pom, localRepository, originalRemoteRepositories,
-                                                             globalProfileManager, false );
+                                                             globalProfileManager, false, true );
         }
         catch ( ProjectBuildingException e )
         {

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java?rev=586061&r1=586060&r2=586061&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java Thu Oct 18 11:38:06 2007
@@ -45,6 +45,7 @@
 import org.codehaus.plexus.MutablePlexusContainer;
 import org.codehaus.plexus.PlexusConstants;
 import org.codehaus.plexus.PlexusContainerException;
+import org.codehaus.plexus.classworlds.ClassWorld;
 import org.codehaus.plexus.classworlds.realm.ClassRealm;
 import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
 import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
@@ -203,7 +204,7 @@
         }
 
         // if the extension is null, or if it's already been added to the current project-session, skip it.
-        if ( ( extensionArtifact != null ) && !projectSession.containsRealm( extensionArtifact ) )
+        if ( ( extensionArtifact != null ) && !projectSession.containsExtensionRealm( extensionArtifact ) )
         {
             ArtifactFilter filter =
                 new ProjectArtifactExceptionFilter( artifactFilterManager.getArtifactFilter(), projectArtifact );
@@ -276,45 +277,65 @@
                 }
             }
 
-            ComponentDiscoverer discoverer = new DefaultComponentDiscoverer();
-            discoverer.setManager( new DummyDiscovererManager() );
+            importLocalExtensionComponents( extensionRealm, projectSession, extensionArtifact );
+        }
+    }
 
-            ClassRealm projectRealm = projectSession.getProjectRealm();
-            try
+    private void importLocalExtensionComponents( ClassRealm extensionRealm,
+                                                 MavenProjectSession projectSession,
+                                                 Artifact extensionArtifact )
+        throws ExtensionManagerException
+    {
+        String projectId = projectSession.getProjectId();
+
+        ClassRealm discoveryRealm = new ClassRealm( new ClassWorld(), "discovery", Thread.currentThread().getContextClassLoader() );
+        try
+        {
+            discoveryRealm.addURL( extensionArtifact.getFile().toURL() );
+        }
+        catch ( MalformedURLException e )
+        {
+            throw new ExtensionManagerException( "Unable to generate URL from extension artifact for local-component discovery: " + extensionArtifact.getFile(), extensionArtifact, projectId, e );
+        }
+
+        ComponentDiscoverer discoverer = new DefaultComponentDiscoverer();
+        discoverer.setManager( new DummyDiscovererManager() );
+
+        ClassRealm projectRealm = projectSession.getProjectRealm();
+        try
+        {
+            List componentSetDescriptors = discoverer.findComponents( container.getContext(), discoveryRealm );
+            for ( Iterator it = componentSetDescriptors.iterator(); it.hasNext(); )
             {
-                List componentSetDescriptors = discoverer.findComponents( container.getContext(), extensionRealm );
-                for ( Iterator it = componentSetDescriptors.iterator(); it.hasNext(); )
+                ComponentSetDescriptor compSet = (ComponentSetDescriptor) it.next();
+                for ( Iterator compIt = compSet.getComponents().iterator(); compIt.hasNext(); )
                 {
-                    ComponentSetDescriptor compSet = (ComponentSetDescriptor) it.next();
-                    for ( Iterator compIt = compSet.getComponents().iterator(); compIt.hasNext(); )
+                    ComponentDescriptor comp = (ComponentDescriptor) compIt.next();
+                    String implementation = comp.getImplementation();
+
+                    try
                     {
-                        ComponentDescriptor comp = (ComponentDescriptor) compIt.next();
-                        String implementation = comp.getImplementation();
+                        getLogger().debug( "Importing: " + implementation + "\nwith role: " + comp.getRole() + "\nand hint: " + comp.getRoleHint() + "\nfrom extension realm: " + extensionRealm.getId() + "\nto project realm: " + projectRealm.getId() );
+
+                        projectRealm.importFrom( extensionRealm.getId(), implementation );
 
-                        try
-                        {
-                            getLogger().debug( "Importing: " + implementation + "\nwith role: " + comp.getRole() + "\nand hint: " + comp.getRoleHint() + "\nfrom extension realm: " + extensionRealm.getId() + "\nto project realm: " + projectRealm.getId() );
-
-                            projectRealm.importFrom( extensionRealm.getId(), implementation );
-
-                            comp.setRealmId( projectRealm.getId() );
-                            container.addComponentDescriptor( comp );
-                        }
-                        catch ( NoSuchRealmException e )
-                        {
-                            throw new ExtensionManagerException( "Failed to create import for component: " + implementation + " from extension realm: " + extensionRealm.getId() + " to project realm: " + projectRealm.getId(), extensionArtifact, projectId, e );
-                        }
+                        comp.setRealmId( projectRealm.getId() );
+                        container.addComponentDescriptor( comp );
+                    }
+                    catch ( NoSuchRealmException e )
+                    {
+                        throw new ExtensionManagerException( "Failed to create import for component: " + implementation + " from extension realm: " + extensionRealm.getId() + " to project realm: " + projectRealm.getId(), extensionArtifact, projectId, e );
                     }
                 }
             }
-            catch ( PlexusConfigurationException e )
-            {
-                throw new ExtensionManagerException( "Unable to discover extension components.", extensionArtifact, projectId, e );
-            }
-            catch ( ComponentRepositoryException e )
-            {
-                throw new ExtensionManagerException( "Unable to discover extension components from imports added to project-session realm.", extensionArtifact, projectId, e );
-            }
+        }
+        catch ( PlexusConfigurationException e )
+        {
+            throw new ExtensionManagerException( "Unable to discover extension components.", extensionArtifact, projectId, e );
+        }
+        catch ( ComponentRepositoryException e )
+        {
+            throw new ExtensionManagerException( "Unable to discover extension components from imports added to project-session realm.", extensionArtifact, projectId, e );
         }
     }
 

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java?rev=586061&r1=586060&r2=586061&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java Thu Oct 18 11:38:06 2007
@@ -28,6 +28,7 @@
 import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
 import org.apache.maven.context.BuildContextManager;
+import org.apache.maven.execution.MavenProjectSession;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.execution.ReactorManager;
 import org.apache.maven.lifecycle.binding.MojoBindingFactory;
@@ -54,8 +55,14 @@
 import org.apache.maven.plugin.version.PluginVersionResolutionException;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.artifact.InvalidDependencyVersionException;
+import org.codehaus.plexus.PlexusConstants;
+import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.classworlds.realm.ClassRealm;
 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.codehaus.plexus.context.Context;
+import org.codehaus.plexus.context.ContextException;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
 import org.codehaus.plexus.util.xml.Xpp3Dom;
 
 import java.util.ArrayList;
@@ -75,7 +82,7 @@
  */
 public class DefaultLifecycleExecutor
     extends AbstractLogEnabled
-    implements LifecycleExecutor
+    implements LifecycleExecutor, Contextualizable
 {
     // ----------------------------------------------------------------------
     // Components
@@ -93,6 +100,9 @@
 
     private BuildContextManager buildContextManager;
 
+    // this is needed for setting the lookup realm before we start building a project.
+    private PlexusContainer container;
+
     // ----------------------------------------------------------------------
     //
     // ----------------------------------------------------------------------
@@ -195,53 +205,63 @@
                         event,
                         target );
 
-                    // NEW: To support forked execution under the new lifecycle architecture, the current project
-                    // is stored in a build-context managed data type. This context type holds the current project
-                    // for the fork being executed, plus a stack of projects used in the ancestor execution contexts.
-                    LifecycleExecutionContext ctx = new LifecycleExecutionContext( rootProject );
-                    ctx.store( buildContextManager );
-
-                    // NEW: Build up the execution plan, including configuration.
-                    List mojoBindings = getLifecycleBindings(
-                        segment.getTasks(),
-                        rootProject,
-                        target );
+                    ClassRealm oldLookupRealm = setProjectLookupRealm( session, rootProject );
 
-                    // NEW: Then, iterate over each binding in that plan, and execute the associated mojo.
-                    // only call once, with the top-level project (assumed to be provided as a parameter)...
-                    for ( Iterator mojoIterator = mojoBindings.iterator(); mojoIterator.hasNext(); )
+                    try
                     {
-                        MojoBinding binding = (MojoBinding) mojoIterator.next();
+                        // NEW: To support forked execution under the new lifecycle architecture, the current project
+                        // is stored in a build-context managed data type. This context type holds the current project
+                        // for the fork being executed, plus a stack of projects used in the ancestor execution contexts.
+                        LifecycleExecutionContext ctx = new LifecycleExecutionContext( rootProject );
+                        ctx.store( buildContextManager );
 
-                        try
-                        {
-                            executeGoalAndHandleFailures(
-                                binding,
-                                session,
-                                dispatcher,
-                                event,
-                                reactorManager,
-                                buildStartTime,
-                                target );
-                        }
-                        catch ( MojoFailureException e )
-                        {
-                            AggregatedBuildFailureException error = new AggregatedBuildFailureException(
-                                                                                                         session.getExecutionRootDirectory(),
-                                                                                                         binding,
-                                                                                                         e );
+                        // NEW: Build up the execution plan, including configuration.
+                        List mojoBindings = getLifecycleBindings(
+                            segment.getTasks(),
+                            rootProject,
+                            target );
 
-                            dispatcher.dispatchError( event, target, error );
+                        // NEW: Then, iterate over each binding in that plan, and execute the associated mojo.
+                        // only call once, with the top-level project (assumed to be provided as a parameter)...
+                        for ( Iterator mojoIterator = mojoBindings.iterator(); mojoIterator.hasNext(); )
+                        {
+                            MojoBinding binding = (MojoBinding) mojoIterator.next();
 
-                            if ( handleExecutionFailure( reactorManager, rootProject, error, binding, buildStartTime ) )
+                            try
                             {
-                                throw error;
+                                executeGoalAndHandleFailures(
+                                    binding,
+                                    session,
+                                    dispatcher,
+                                    event,
+                                    reactorManager,
+                                    buildStartTime,
+                                    target );
+                            }
+                            catch ( MojoFailureException e )
+                            {
+                                AggregatedBuildFailureException error = new AggregatedBuildFailureException(
+                                                                                                             session.getExecutionRootDirectory(),
+                                                                                                             binding,
+                                                                                                             e );
+
+                                dispatcher.dispatchError( event, target, error );
+
+                                if ( handleExecutionFailure( reactorManager, rootProject, error, binding, buildStartTime ) )
+                                {
+                                    throw error;
+                                }
                             }
                         }
                     }
+                    finally
+                    {
+                        // clean up the execution context, so we don't pollute for future project-executions.
+                        LifecycleExecutionContext.delete( buildContextManager );
+
+                        restoreLookupRealm( oldLookupRealm );
+                    }
 
-                    // clean up the execution context, so we don't pollute for future project-executions.
-                    LifecycleExecutionContext.delete( buildContextManager );
 
                     reactorManager.registerBuildSuccess(
                         rootProject,
@@ -295,45 +315,54 @@
                             event,
                             target );
 
-                        LifecycleExecutionContext ctx = new LifecycleExecutionContext( currentProject );
-                        ctx.store( buildContextManager );
+                        ClassRealm oldLookupRealm = setProjectLookupRealm( session, currentProject );
 
-                        List mojoBindings = getLifecycleBindings(
-                            segment.getTasks(),
-                            currentProject,
-                            target );
-
-                        for ( Iterator mojoIterator = mojoBindings.iterator(); mojoIterator.hasNext(); )
+                        try
                         {
-                            MojoBinding binding = (MojoBinding) mojoIterator.next();
+                            LifecycleExecutionContext ctx = new LifecycleExecutionContext( currentProject );
+                            ctx.store( buildContextManager );
 
-                            getLogger().debug(
-                                "Mojo: " + binding.getGoal() + " has config:\n"
-                                    + binding.getConfiguration() );
+                            List mojoBindings = getLifecycleBindings(
+                                segment.getTasks(),
+                                currentProject,
+                                target );
 
-                            try
+                            for ( Iterator mojoIterator = mojoBindings.iterator(); mojoIterator.hasNext(); )
                             {
-                                executeGoalAndHandleFailures( binding, session, dispatcher,
-                                                              event, reactorManager,
-                                                              buildStartTime, target );
-                            }
-                            catch ( MojoFailureException e )
-                            {
-                                ProjectBuildFailureException error = new ProjectBuildFailureException(
-                                                                                                       currentProject.getId(),
-                                                                                                       binding,
-                                                                                                       e );
+                                MojoBinding binding = (MojoBinding) mojoIterator.next();
 
-                                dispatcher.dispatchError( event, target, error );
+                                getLogger().debug(
+                                    "Mojo: " + binding.getGoal() + " has config:\n"
+                                        + binding.getConfiguration() );
 
-                                if ( handleExecutionFailure( reactorManager, currentProject, error, binding, buildStartTime ) )
+                                try
                                 {
-                                    throw error;
+                                    executeGoalAndHandleFailures( binding, session, dispatcher,
+                                                                  event, reactorManager,
+                                                                  buildStartTime, target );
+                                }
+                                catch ( MojoFailureException e )
+                                {
+                                    ProjectBuildFailureException error = new ProjectBuildFailureException(
+                                                                                                           currentProject.getId(),
+                                                                                                           binding,
+                                                                                                           e );
+
+                                    dispatcher.dispatchError( event, target, error );
+
+                                    if ( handleExecutionFailure( reactorManager, currentProject, error, binding, buildStartTime ) )
+                                    {
+                                        throw error;
+                                    }
                                 }
                             }
                         }
+                        finally
+                        {
+                            LifecycleExecutionContext.delete( buildContextManager );
 
-                        LifecycleExecutionContext.delete( buildContextManager );
+                            restoreLookupRealm( oldLookupRealm );
+                        }
 
                         reactorManager.registerBuildSuccess(
                             currentProject,
@@ -361,6 +390,28 @@
         }
     }
 
+    private void restoreLookupRealm( ClassRealm oldLookupRealm )
+    {
+        if ( oldLookupRealm != null )
+        {
+            container.setLookupRealm( oldLookupRealm );
+        }
+    }
+
+    private ClassRealm setProjectLookupRealm( MavenSession session,
+                                              MavenProject rootProject )
+    {
+        MavenProjectSession projectSession = session.getProjectSession( rootProject );
+        if ( projectSession != null )
+        {
+            return container.setLookupRealm( projectSession.getProjectRealm() );
+        }
+        else
+        {
+            return null;
+        }
+    }
+
     /**
      * Retrieves the build plan for the current project, given the specified list of tasks. This build plan will consist
      * of MojoBindings, each fully configured to execute, which enables us to enumerate the full build plan to the debug
@@ -429,7 +480,8 @@
             {
                 if ( mojoBinding.isOptional() )
                 {
-                    getLogger().debug( "Skipping optional mojo execution: " + MojoBindingUtils.toString( mojoBinding ) );
+                    getLogger().debug( "Skipping optional mojo execution: " + MojoBindingUtils.toString( mojoBinding ), e );
+                    return;
                 }
                 else
                 {
@@ -894,5 +946,11 @@
         {
             return tasks;
         }
+    }
+
+    public void contextualize( Context context )
+        throws ContextException
+    {
+        container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
     }
 }

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanner.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanner.java?rev=586061&r1=586060&r2=586061&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanner.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanner.java Thu Oct 18 11:38:06 2007
@@ -11,9 +11,9 @@
  * MojoBinding instances that carry all the information necessary to execute a mojo, including configuration from the
  * POM and other sources. NOTE: the build plan may be constructed of a main lifecycle binding-set, plus any number of
  * lifecycle modifiers and direct-invocation modifiers, to handle cases of forked execution.
- * 
+ *
  * @author jdcasey
- * 
+ *
  */
 public interface BuildPlanner
 {

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java?rev=586061&r1=586060&r2=586061&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java Thu Oct 18 11:38:06 2007
@@ -345,14 +345,21 @@
 
         String key = projectPlugin.getKey();
 
-        ClassRealm pluginRealm;
+        ClassRealm pluginRealm = null;
 
         // if we have a project session, it must mean we have extensions...
         // which in turn may alter the execution of a plugin.
         MavenProjectSession projectSession = session.getProjectSession( project );
         if ( projectSession != null )
         {
-            pluginRealm = projectSession.getComponentRealm( key );
+            try
+            {
+                pluginRealm = projectSession.getPluginRealm( projectPlugin );
+            }
+            catch ( NoSuchRealmException e )
+            {
+                getLogger().debug( "Plugin realm is missing for: " + projectPlugin.getKey() + ". New realm will be created." );
+            }
         }
         else
         {
@@ -373,21 +380,21 @@
         // Realm creation for a plugin
         // ----------------------------------------------------------------------------
 
-        ClassRealm componentRealm = null;
+        getLogger().debug( "Creating a ClassRealm instance for plugin: " + projectPlugin.getKey() + " for project: " + project.getId() );
 
         try
         {
             if ( projectSession != null )
             {
-                componentRealm = projectSession.createPluginRealm( projectPlugin );
+                pluginRealm = projectSession.createPluginRealm( projectPlugin );
 
                 try
                 {
-                    componentRealm.addURL( pluginArtifact.getFile().toURI().toURL() );
+                    pluginRealm.addURL( pluginArtifact.getFile().toURI().toURL() );
                 }
                 catch ( MalformedURLException e )
                 {
-                    throw new PluginContainerException( plugin, componentRealm, "Error rendering plugin artifact: " + pluginArtifact.getId() + " as URL.", e );
+                    throw new PluginContainerException( plugin, pluginRealm, "Error rendering plugin artifact: " + pluginArtifact.getId() + " as URL.", e );
                 }
 
                 for ( Iterator i = artifacts.iterator(); i.hasNext(); )
@@ -397,26 +404,26 @@
                     try
                     {
                         getLogger().debug( "Adding: " + artifact.getId() + " to plugin class-realm: " + key + " in project-session: " + project.getId() );
-                        componentRealm.addURL( artifact.getFile().toURI().toURL() );
+                        pluginRealm.addURL( artifact.getFile().toURI().toURL() );
                     }
                     catch ( MalformedURLException e )
                     {
-                        throw new PluginContainerException( plugin, componentRealm, "Error rendering plugin artifact: " + artifact.getId() + " as URL.", e );
+                        throw new PluginContainerException( plugin, pluginRealm, "Error rendering plugin artifact: " + artifact.getId() + " as URL.", e );
                     }
                 }
 
                 try
                 {
-                    getLogger().debug( "Discovering components in realm: " + componentRealm );
-                    container.discoverComponents( componentRealm, false );
+                    getLogger().debug( "Discovering components in realm: " + pluginRealm );
+                    container.discoverComponents( pluginRealm, false );
                 }
                 catch ( PlexusConfigurationException e )
                 {
-                    throw new PluginContainerException( plugin, componentRealm, "Error re-scanning project realm for components.", e );
+                    throw new PluginContainerException( plugin, pluginRealm, "Error re-scanning project realm for components.", e );
                 }
                 catch ( ComponentRepositoryException e )
                 {
-                    throw new PluginContainerException( plugin, componentRealm, "Error re-scanning project realm for components.", e );
+                    throw new PluginContainerException( plugin, pluginRealm, "Error re-scanning project realm for components.", e );
                 }
             }
             else
@@ -433,18 +440,18 @@
                 jars.add( pluginArtifact.getFile() );
 
                 // Now here we need the artifact coreArtifactFilter stuff
-                componentRealm = container.createComponentRealm( key, jars );
+                pluginRealm = container.createComponentRealm( key, jars );
             }
 
         }
         catch ( PlexusContainerException e )
         {
-            throw new PluginContainerException( plugin, componentRealm, "Failed to create realm for plugin '" + projectPlugin
+            throw new PluginContainerException( plugin, pluginRealm, "Failed to create realm for plugin '" + projectPlugin
                                               + ".", e );
         }
         catch ( DuplicateRealmException e )
         {
-            throw new PluginContainerException( plugin, componentRealm, "Failed to create project-specific realm for plugin '" + projectPlugin
+            throw new PluginContainerException( plugin, pluginRealm, "Failed to create project-specific realm for plugin '" + projectPlugin
                                                 + " in project: " + project.getId(), e );
         }
 
@@ -454,8 +461,8 @@
 
             // adding for MNG-3012 to try to work around problems with Xpp3Dom (from plexus-utils)
             // spawning a ClassCastException when a mojo calls plugin.getConfiguration() from maven-model...
-            componentRealm.importFrom( parentRealmId, Xpp3Dom.class.getName() );
-            componentRealm.importFrom( parentRealmId, "org.codehaus.plexus.util.xml.pull" );
+            pluginRealm.importFrom( parentRealmId, Xpp3Dom.class.getName() );
+            pluginRealm.importFrom( parentRealmId, "org.codehaus.plexus.util.xml.pull" );
 
             // Adding for MNG-2878, since maven-reporting-impl was removed from the
             // internal list of artifacts managed by maven, the classloader is different
@@ -463,11 +470,11 @@
             // is not available from the AbstractMavenReport since it uses:
             // getClass().getResourceAsStream( "/default-report.xml" )
             // (maven-reporting-impl version 2.0; line 134; affects: checkstyle plugin, and probably others)
-            componentRealm.importFrom( parentRealmId, "/default-report.xml" );
+            pluginRealm.importFrom( parentRealmId, "/default-report.xml" );
         }
         catch ( NoSuchRealmException e )
         {
-            throw new PluginContainerException( plugin, componentRealm,
+            throw new PluginContainerException( plugin, pluginRealm,
                                               "Failed to import Xpp3Dom from core realm for plugin: '"
                                                               + projectPlugin + ".", e );
         }
@@ -499,9 +506,9 @@
 
         pluginDescriptor.setArtifacts( new ArrayList( artifacts ) );
 
-        getLogger().debug( "Realm for plugin: " + plugin.getKey() + ":\n" + componentRealm );
+        getLogger().debug( "Realm for plugin: " + plugin.getKey() + ":\n" + pluginRealm );
 
-        pluginDescriptor.setClassRealm( componentRealm );
+        pluginDescriptor.setClassRealm( pluginRealm );
     }
 
     private Set getPluginArtifacts( Artifact pluginArtifact,

Modified: maven/components/trunk/maven-core/src/test/java/org/apache/maven/extension/DefaultExtensionManagerTest.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/java/org/apache/maven/extension/DefaultExtensionManagerTest.java?rev=586061&r1=586060&r2=586061&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/test/java/org/apache/maven/extension/DefaultExtensionManagerTest.java (original)
+++ maven/components/trunk/maven-core/src/test/java/org/apache/maven/extension/DefaultExtensionManagerTest.java Thu Oct 18 11:38:06 2007
@@ -2,6 +2,7 @@
 
 import org.apache.maven.ArtifactFilterManager;
 import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.handler.ArtifactHandler;
 import org.apache.maven.artifact.manager.WagonManager;
 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
 import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
@@ -9,6 +10,7 @@
 import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
 import org.apache.maven.artifact.resolver.ArtifactResolver;
 import org.apache.maven.execution.MavenProjectSession;
+import org.apache.maven.lifecycle.mapping.LifecycleMapping;
 import org.apache.maven.model.Build;
 import org.apache.maven.model.Extension;
 import org.apache.maven.model.Model;
@@ -102,7 +104,10 @@
                                                                       null,
                                                                       null ) );
 
-        DefaultArtifactRepository localRepository = new DefaultArtifactRepository("local", localRepo.getAbsolutePath(), new DefaultRepositoryLayout() );
+        DefaultArtifactRepository localRepository = new DefaultArtifactRepository(
+                                                                                   "local",
+                                                                                   localRepo.getAbsolutePath(),
+                                                                                   new DefaultRepositoryLayout() );
         localRepository.setBasedir( localRepo.getAbsolutePath() );
 
         ExtensionManager mgr = newDefaultExtensionManager();
@@ -115,7 +120,8 @@
                                                                                                                              model.getArtifactId(),
                                                                                                                              model.getVersion() ) );
 
-        List compList = getContainer().getComponentDescriptorList( ArtifactFactory.ROLE, projectSession.getProjectRealm() );
+        List compList = getContainer().getComponentDescriptorList( ArtifactFactory.ROLE,
+                                                                   projectSession.getProjectRealm() );
 
         System.out.println( "Got: " + compList );
 
@@ -127,12 +133,69 @@
         getContainer().setLookupRealm( oldRealm );
     }
 
+    public void test_addExtension_usingModel_ShouldLoadCustomLifecycleMappingAndArtifactHandler()
+        throws Exception
+    {
+        File remoteRepoDir = findRemoteRepositoryDirectory();
+        File localRepo = createTempDir();
+
+        Model model = createModel( "org.test", "artifact-name", "1" );
+        Extension ext = addExtension( model, "org.apache.maven.core.test", "test-lifecycle-and-artifactHandler", "1" );
+
+        List remoteRepositories = new ArrayList();
+        remoteRepositories.add( repoFactory.createArtifactRepository( "central",
+                                                                      remoteRepoDir.toURI()
+                                                                                   .toURL()
+                                                                                   .toExternalForm(),
+                                                                      "default",
+                                                                      null,
+                                                                      null ) );
+
+        DefaultArtifactRepository localRepository = new DefaultArtifactRepository(
+                                                                                   "local",
+                                                                                   localRepo.getAbsolutePath(),
+                                                                                   new DefaultRepositoryLayout() );
+        localRepository.setBasedir( localRepo.getAbsolutePath() );
+
+        ExtensionManager mgr = newDefaultExtensionManager();
+
+        Map projectSessions = new HashMap();
+
+        mgr.addExtension( ext, model, remoteRepositories, localRepository, projectSessions );
+
+        MavenProjectSession projectSession = (MavenProjectSession) projectSessions.get( MavenProjectSession.createProjectId( model.getGroupId(),
+                                                                                                                             model.getArtifactId(),
+                                                                                                                             model.getVersion() ) );
+
+        List lcCompList = getContainer().getComponentDescriptorList( LifecycleMapping.ROLE,
+                                                                   projectSession.getProjectRealm() );
+
+        System.out.println( "Got lifecyle mappings: " + lcCompList );
+
+        List ahCompList = getContainer().getComponentDescriptorList( ArtifactHandler.ROLE,
+                                                                   projectSession.getProjectRealm() );
+
+        System.out.println( "Got artifact handlers: " + ahCompList );
+
+        ClassRealm oldRealm = getContainer().setLookupRealm( projectSession.getProjectRealm() );
+
+        LifecycleMapping lcResult = (LifecycleMapping) lookup( LifecycleMapping.ROLE, "test" );
+        assertNotNull( lcResult );
+
+        ArtifactHandler ahResult = (ArtifactHandler) lookup( ArtifactHandler.ROLE, "test" );
+        assertNotNull( ahResult );
+
+        getContainer().setLookupRealm( oldRealm );
+    }
+
     private ExtensionManager newDefaultExtensionManager()
     {
-        DefaultExtensionManager mgr = new DefaultExtensionManager( factory, resolver, metadataSource,
-                                                            container, filterManager, wagonManager );
+        DefaultExtensionManager mgr = new DefaultExtensionManager( factory, resolver,
+                                                                   metadataSource, container,
+                                                                   filterManager, wagonManager );
 
-        Logger logger = getContainer().getLoggerManager().getLoggerForComponent( DefaultExtensionManager.class.getName() );
+        Logger logger = getContainer().getLoggerManager()
+                                      .getLoggerForComponent( DefaultExtensionManager.class.getName() );
 
         mgr.enableLogging( logger );
 

Added: maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/pom.xml
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/pom.xml?rev=586061&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/pom.xml (added)
+++ maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/pom.xml Thu Oct 18 11:38:06 2007
@@ -0,0 +1,44 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.maven.core.test</groupId>
+  <artifactId>test-lifecycle-and-artifactHandler</artifactId>
+  <packaging>jar</packaging>
+  <version>1</version>
+  <name>test-lifecycle-and-artifactHandler</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <version>2.2-beta-2-SNAPSHOT</version>
+        <executions>
+          <execution>
+            <id>repo-assembly</id>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+            <configuration>
+              <descriptors>
+                <descriptor>repo.xml</descriptor>
+              </descriptors>
+              <finalName>test-extension</finalName>
+              <appendAssemblyId>true</appendAssemblyId>
+              <outputDirectory>${pom.basedir}/../../resources/org/apache/maven/extension</outputDirectory>
+              <ignoreDirFormatExtensions>true</ignoreDirFormatExtensions>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+  
+  <distributionManagement>
+    <repository>
+      <id>dummy</id>
+      <url>file:///tmp/dummy-repo</url>
+    </repository>
+  </distributionManagement>
+  
+</project>

Propchange: maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/pom.xml
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/repo.xml
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/repo.xml?rev=586061&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/repo.xml (added)
+++ maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/repo.xml Thu Oct 18 11:38:06 2007
@@ -0,0 +1,22 @@
+<assembly>
+  <id>repo</id>
+  <formats>
+    <format>dir</format>
+  </formats>
+  <includeBaseDirectory>false</includeBaseDirectory>
+  <repositories>
+    <repository>
+      <scope>runtime</scope>
+      <outputDirectory>/</outputDirectory>
+    </repository>
+  </repositories>
+  <fileSets>
+    <fileSet>
+      <directory>target</directory>
+      <outputDirectory>/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1</outputDirectory>
+      <includes>
+        <include>test-lifecycle-and-artifactHandler*</include>
+      </includes>
+    </fileSet>
+  </fileSets>
+</assembly>
\ No newline at end of file

Propchange: maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/repo.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/repo.xml
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/src/main/resources/META-INF/plexus/components.xml
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/src/main/resources/META-INF/plexus/components.xml?rev=586061&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/src/main/resources/META-INF/plexus/components.xml (added)
+++ maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/src/main/resources/META-INF/plexus/components.xml Thu Oct 18 11:38:06 2007
@@ -0,0 +1,31 @@
+<component-set>
+  <components>
+    <component>
+      <role>org.apache.maven.artifact.handler.ArtifactHandler</role>
+      <role-hint>test</role-hint>
+      <implementation>org.apache.maven.artifact.handler.DefaultArtifactHandler</implementation>
+      <configuration>
+        <type>test</type>
+        <extension>jar</extension>
+        <language>java</language>
+        <addedToClasspath>true</addedToClasspath>
+      </configuration>
+    </component>
+    <component>
+      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
+      <role-hint>test</role-hint>
+      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
+      <configuration>
+        <lifecycles>
+          <lifecycle>
+            <id>default</id>
+            <phases>
+              <install>org.apache.maven.plugins:maven-install-plugin:install</install>
+              <deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy>
+            </phases>
+          </lifecycle>
+        </lifecycles>
+      </configuration>
+    </component>
+  </components>
+</component-set>

Propchange: maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/src/main/resources/META-INF/plexus/components.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/test/repository-projects/test-lifecycle-and-artifactHandler/src/main/resources/META-INF/plexus/components.xml
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.jar
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.jar?rev=586061&view=auto
==============================================================================
Binary file - no diff available.

Propchange: maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom?rev=586061&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom (added)
+++ maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom Thu Oct 18 11:38:06 2007
@@ -0,0 +1,44 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.maven.core.test</groupId>
+  <artifactId>test-lifecycle-and-artifactHandler</artifactId>
+  <packaging>jar</packaging>
+  <version>1</version>
+  <name>test-lifecycle-and-artifactHandler</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <version>2.2-beta-2-SNAPSHOT</version>
+        <executions>
+          <execution>
+            <id>repo-assembly</id>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+            <configuration>
+              <descriptors>
+                <descriptor>repo.xml</descriptor>
+              </descriptors>
+              <finalName>test-extension</finalName>
+              <appendAssemblyId>true</appendAssemblyId>
+              <outputDirectory>${pom.basedir}/../../resources/org/apache/maven/extension</outputDirectory>
+              <ignoreDirFormatExtensions>true</ignoreDirFormatExtensions>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+  
+  <distributionManagement>
+    <repository>
+      <id>dummy</id>
+      <url>file:///tmp/dummy-repo</url>
+    </repository>
+  </distributionManagement>
+  
+</project>

Propchange: maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.md5
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.md5?rev=586061&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.md5 (added)
+++ maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.md5 Thu Oct 18 11:38:06 2007
@@ -0,0 +1 @@
+7f10427af029d20cbea57c21d1aec65e
\ No newline at end of file

Added: maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.sha1
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.sha1?rev=586061&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.sha1 (added)
+++ maven/components/trunk/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.sha1 Thu Oct 18 11:38:06 2007
@@ -0,0 +1 @@
+ed98c808239aefb0ec51a8b9e96f191da7fd92e6
\ No newline at end of file

Modified: maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/build/DefaultProfileAdvisor.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/build/DefaultProfileAdvisor.java?rev=586061&r1=586060&r2=586061&view=diff
==============================================================================
--- maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/build/DefaultProfileAdvisor.java (original)
+++ maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/build/DefaultProfileAdvisor.java Thu Oct 18 11:38:06 2007
@@ -66,11 +66,11 @@
 
     private Logger logger;
 
-    public List applyActivatedProfiles( Model model, File pomFile, List explicitlyActiveIds, List explicitlyInactiveIds )
+    public List applyActivatedProfiles( Model model, File pomFile, List explicitlyActiveIds, List explicitlyInactiveIds, boolean useProfilesXml )
         throws ProjectBuildingException
     {
         logger.debug( "Building profile manager for model: " + model.getId() + " with pom file: " + pomFile );
-        ProfileManager profileManager = buildProfileManager( model, pomFile, explicitlyActiveIds, explicitlyInactiveIds );
+        ProfileManager profileManager = buildProfileManager( model, pomFile, explicitlyActiveIds, explicitlyInactiveIds, useProfilesXml );
 
         return applyActivatedProfiles( model, pomFile, profileManager );
     }
@@ -127,7 +127,7 @@
         return activeProfiles;
     }
 
-    private ProfileManager buildProfileManager( Model model, File pomFile, List explicitlyActiveIds, List explicitlyInactiveIds )
+    private ProfileManager buildProfileManager( Model model, File pomFile, List explicitlyActiveIds, List explicitlyInactiveIds, boolean useProfilesXml )
         throws ProjectBuildingException
     {
         ProfileManager profileManager = new DefaultProfileManager( container );
@@ -138,7 +138,7 @@
 
         profileManager.addProfiles( model.getProfiles() );
 
-        if ( pomFile != null )
+        if ( useProfilesXml && ( pomFile != null ) )
         {
             loadExternalProjectProfiles( profileManager, model, pomFile );
         }
@@ -198,10 +198,11 @@
     }
 
     public LinkedHashSet getArtifactRepositoriesFromActiveProfiles( Model model, File pomFile,
-                                                                    List explicitlyActiveIds, List explicitlyInactiveIds )
+                                                                    List explicitlyActiveIds, List explicitlyInactiveIds,
+                                                                    boolean useProfilesXml )
         throws ProjectBuildingException
     {
-        ProfileManager profileManager = buildProfileManager( model, pomFile, explicitlyActiveIds, explicitlyInactiveIds );
+        ProfileManager profileManager = buildProfileManager( model, pomFile, explicitlyActiveIds, explicitlyInactiveIds, useProfilesXml );
 
         return getArtifactRepositoriesFromActiveProfiles( profileManager, pomFile, model.getId() );
     }

Modified: maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/build/ProfileAdvisor.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/build/ProfileAdvisor.java?rev=586061&r1=586060&r2=586061&view=diff
==============================================================================
--- maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/build/ProfileAdvisor.java (original)
+++ maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/build/ProfileAdvisor.java Thu Oct 18 11:38:06 2007
@@ -37,16 +37,28 @@
 
     String ROLE = ProfileAdvisor.class.getName();
 
-    LinkedHashSet getArtifactRepositoriesFromActiveProfiles( ProfileManager profileManager, File pomFile, String modelId )
+    LinkedHashSet getArtifactRepositoriesFromActiveProfiles( ProfileManager profileManager,
+                                                             File pomFile,
+                                                             String modelId )
         throws ProjectBuildingException;
 
-    LinkedHashSet getArtifactRepositoriesFromActiveProfiles( Model model, File pomFile, List explicitlyActiveIds, List explicitlyInactiveIds )
+    LinkedHashSet getArtifactRepositoriesFromActiveProfiles( Model model,
+                                                             File pomFile,
+                                                             List explicitlyActiveIds,
+                                                             List explicitlyInactiveIds,
+                                                             boolean useProfilesXml )
         throws ProjectBuildingException;
 
-    List applyActivatedProfiles( Model model, File pomFile, List explicitlyActiveIds, List explicitlyInactiveIds )
+    List applyActivatedProfiles( Model model,
+                                 File pomFile,
+                                 List explicitlyActiveIds,
+                                 List explicitlyInactiveIds,
+                                 boolean useProfilesXml )
         throws ProjectBuildingException;
 
-    List applyActivatedExternalProfiles( Model model, File pomFile, ProfileManager externalProfileManager )
+    List applyActivatedExternalProfiles( Model model,
+                                         File pomFile,
+                                         ProfileManager externalProfileManager )
         throws ProjectBuildingException;
 
 }

Modified: maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java?rev=586061&r1=586060&r2=586061&view=diff
==============================================================================
--- maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java (original)
+++ maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java Thu Oct 18 11:38:06 2007
@@ -209,7 +209,7 @@
 
         Model model = findModelFromRepository( artifact, remoteArtifactRepositories, localRepository );
 
-        return buildInternal( "Artifact [" + artifact + "]", model, localRepository, remoteArtifactRepositories, null, null, false );
+        return buildInternal( "Artifact [" + artifact + "]", model, localRepository, remoteArtifactRepositories, null, null, false, false );
     }
 
     private MavenProject superProject;
@@ -403,7 +403,8 @@
             buildArtifactRepositories( getSuperModel() ),
             projectDescriptor,
             profileManager,
-            STRICT_MODEL_PARSING );
+            STRICT_MODEL_PARSING,
+            true );
 
         return project;
     }
@@ -531,7 +532,7 @@
                                         List parentSearchRepositories,
                                         File projectDescriptor,
                                         ProfileManager externalProfileManager,
-                                        boolean strict )
+                                        boolean strict, boolean validProfilesXmlLocation )
         throws ProjectBuildingException
     {
         Model superModel = getSuperModel();
@@ -567,7 +568,7 @@
             explicitlyInactive = Collections.EMPTY_LIST;
         }
 
-        superProject.setActiveProfiles( profileAdvisor.applyActivatedProfiles( superModel, projectDescriptor, explicitlyActive, explicitlyInactive ) );
+        superProject.setActiveProfiles( profileAdvisor.applyActivatedProfiles( superModel, projectDescriptor, explicitlyActive, explicitlyInactive, validProfilesXmlLocation ) );
 
         //noinspection CollectionDeclaredAsConcreteClass
         LinkedList lineage = new LinkedList();
@@ -575,7 +576,8 @@
         LinkedHashSet aggregatedRemoteWagonRepositories = collectInitialRepositories( model, superModel,
             parentSearchRepositories,
             projectDescriptor, explicitlyActive,
-            explicitlyInactive );
+            explicitlyInactive,
+            validProfilesXmlLocation );
 
         Model originalModel = ModelUtils.cloneModel( model );
 
@@ -583,7 +585,7 @@
 
         try
         {
-            project = assembleLineage( model, lineage, localRepository, projectDescriptor, aggregatedRemoteWagonRepositories, externalProfileManager, strict );
+            project = assembleLineage( model, lineage, localRepository, projectDescriptor, aggregatedRemoteWagonRepositories, externalProfileManager, strict, validProfilesXmlLocation );
         }
         catch ( InvalidRepositoryException e )
         {
@@ -704,14 +706,15 @@
                                                       List parentSearchRepositories,
                                                       File pomFile,
                                                       List explicitlyActive,
-                                                      List explicitlyInactive )
+                                                      List explicitlyInactive,
+                                                      boolean validProfilesXmlLocation )
         throws ProjectBuildingException
     {
         LinkedHashSet collected = new LinkedHashSet();
 
-        collectInitialRepositoriesFromModel( collected, model, pomFile, explicitlyActive, explicitlyInactive );
+        collectInitialRepositoriesFromModel( collected, model, pomFile, explicitlyActive, explicitlyInactive, validProfilesXmlLocation );
 
-        collectInitialRepositoriesFromModel( collected, superModel, null, explicitlyActive, explicitlyInactive );
+        collectInitialRepositoriesFromModel( collected, superModel, null, explicitlyActive, explicitlyInactive, validProfilesXmlLocation );
 
         if ( ( parentSearchRepositories != null ) && !parentSearchRepositories.isEmpty() )
         {
@@ -725,10 +728,11 @@
                                                       Model model,
                                                       File pomFile,
                                                       List explicitlyActive,
-                                                      List explicitlyInactive )
+                                                      List explicitlyInactive,
+                                                      boolean validProfilesXmlLocation )
         throws ProjectBuildingException
     {
-        Set reposFromProfiles = profileAdvisor.getArtifactRepositoriesFromActiveProfiles( model, pomFile, explicitlyActive, explicitlyInactive );
+        Set reposFromProfiles = profileAdvisor.getArtifactRepositoriesFromActiveProfiles( model, pomFile, explicitlyActive, explicitlyInactive, validProfilesXmlLocation );
 
         if ( ( reposFromProfiles != null ) && !reposFromProfiles.isEmpty() )
         {
@@ -896,6 +900,7 @@
     }
 
     /**
+     * @param validProfilesXmlLocation
      * @noinspection CollectionDeclaredAsConcreteClass
      * @todo We need to find an effective way to unit test parts of this method!
      * @todo Refactor this into smaller methods with discrete purposes.
@@ -906,12 +911,12 @@
                                           File pomFile,
                                           Set aggregatedRemoteWagonRepositories,
                                           ProfileManager externalProfileManager,
-                                          boolean strict )
+                                          boolean strict, boolean validProfilesXmlLocation )
         throws ProjectBuildingException, InvalidRepositoryException
     {
         ModelLineage modelLineage = new DefaultModelLineage();
 
-        modelLineage.setOrigin( model, pomFile, new ArrayList( aggregatedRemoteWagonRepositories ) );
+        modelLineage.setOrigin( model, pomFile, new ArrayList( aggregatedRemoteWagonRepositories ), validProfilesXmlLocation );
 
         modelLineageBuilder.resumeBuildingModelLineage( modelLineage, localRepository, externalProfileManager, !strict );
 
@@ -951,7 +956,7 @@
             projectContext.store( buildContextManager );
 
             project.setActiveProfiles( profileAdvisor.applyActivatedProfiles( currentModel, currentPom, explicitlyActive,
-                explicitlyInactive ) );
+                explicitlyInactive, validProfilesXmlLocation ) );
 
             if ( lastProject != null )
             {

Modified: maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/DefaultModelLineage.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/DefaultModelLineage.java?rev=586061&r1=586060&r2=586061&view=diff
==============================================================================
--- maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/DefaultModelLineage.java (original)
+++ maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/DefaultModelLineage.java Thu Oct 18 11:38:06 2007
@@ -39,14 +39,14 @@
     /**
      * @see org.apache.maven.project.build.model.ModelLineage#addParent(org.apache.maven.model.Model, java.io.File, java.util.List)
      */
-    public void addParent( Model model, File pomFile, List artifactRepositories )
+    public void addParent( Model model, File pomFile, List artifactRepositories, boolean validProfilesXmlLocation )
     {
         if ( tuples.isEmpty() )
         {
             throw new IllegalStateException( "You must call setOrigin(..) before adding a parent to the lineage." );
         }
 
-        tuples.add( new ModelLineageTuple( model, pomFile, artifactRepositories ) );
+        tuples.add( new ModelLineageTuple( model, pomFile, artifactRepositories, validProfilesXmlLocation ) );
     }
 
     /**
@@ -264,6 +264,18 @@
         return tuple.model;
     }
 
+    public boolean isDeepestAncestorUsingProfilesXml()
+    {
+        if ( tuples.isEmpty() )
+        {
+            return false;
+        }
+
+        ModelLineageTuple tuple = (ModelLineageTuple) tuples.get( tuples.size() - 1 );
+
+        return tuple.validProfilesXmlLocation;
+    }
+
     /**
      * @see org.apache.maven.project.build.model.ModelLineage#modelIterator()
      */
@@ -292,14 +304,14 @@
         };
     }
 
-    public void setOrigin( Model model, File pomFile, List artifactRepositories )
+    public void setOrigin( Model model, File pomFile, List artifactRepositories, boolean validProfilesXmlLocation )
     {
         if ( !tuples.isEmpty() )
         {
             throw new IllegalStateException( "Origin already set; you must use addParent(..) for successive additions to the lineage." );
         }
 
-        tuples.add( new ModelLineageTuple( model, pomFile, artifactRepositories ) );
+        tuples.add( new ModelLineageTuple( model, pomFile, artifactRepositories, validProfilesXmlLocation ) );
     }
 
     /**
@@ -318,16 +330,20 @@
 
         private List remoteRepositories;
 
+        private final boolean validProfilesXmlLocation;
+
         private ModelLineageTuple( Model model )
         {
             this.model = model;
+            validProfilesXmlLocation = false;
         }
 
-        private ModelLineageTuple( Model model, File file, List remoteRepositories )
+        private ModelLineageTuple( Model model, File file, List remoteRepositories, boolean validProfilesXmlLocation )
         {
             this.model = model;
             this.file = file;
             this.remoteRepositories = remoteRepositories;
+            this.validProfilesXmlLocation = validProfilesXmlLocation;
         }
 
         public boolean equals( Object other )

Modified: maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/DefaultModelLineageBuilder.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/DefaultModelLineageBuilder.java?rev=586061&r1=586060&r2=586061&view=diff
==============================================================================
--- maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/DefaultModelLineageBuilder.java (original)
+++ maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/DefaultModelLineageBuilder.java Thu Oct 18 11:38:06 2007
@@ -88,7 +88,7 @@
      * @see org.apache.maven.project.build.model.ModelLineageBuilder#buildModelLineage(java.io.File, org.apache.maven.artifact.repository.ArtifactRepository, java.util.List)
      */
     public ModelLineage buildModelLineage( File pom, ArtifactRepository localRepository, List remoteRepositories,
-                                           ProfileManager profileManager, boolean allowStubs )
+                                           ProfileManager profileManager, boolean allowStubs, boolean validProfilesXmlLocation )
         throws ProjectBuildingException
     {
         ProjectBuildCache projectBuildCache = ProjectBuildCache.read( buildContextManager );
@@ -98,20 +98,20 @@
         List currentRemoteRepositories = remoteRepositories == null ? new ArrayList()
                                                                    : new ArrayList( remoteRepositories );
 
-        ModelAndFile current = new ModelAndFile( readModel( pom, projectBuildCache ), pom );
+        ModelAndFile current = new ModelAndFile( readModel( pom, projectBuildCache ), pom, validProfilesXmlLocation );
 
         do
         {
             if ( lineage.size() == 0 )
             {
-                lineage.setOrigin( current.model, current.file, currentRemoteRepositories );
+                lineage.setOrigin( current.model, current.file, currentRemoteRepositories, current.validProfilesXmlLocation );
             }
             else
             {
-                lineage.addParent( current.model, current.file, currentRemoteRepositories );
+                lineage.addParent( current.model, current.file, currentRemoteRepositories, current.validProfilesXmlLocation );
             }
 
-            currentRemoteRepositories = updateRepositorySet( current.model, currentRemoteRepositories, current.file, profileManager );
+            currentRemoteRepositories = updateRepositorySet( current.model, currentRemoteRepositories, current.file, profileManager, current.validProfilesXmlLocation );
 
             current = resolveParentPom( current, currentRemoteRepositories, localRepository, projectBuildCache, allowStubs );
         }
@@ -138,16 +138,16 @@
             currentRemoteRepositories = new ArrayList();
         }
 
-        ModelAndFile current = new ModelAndFile( lineage.getDeepestAncestorModel(), lineage.getDeepestAncestorFile() );
+        ModelAndFile current = new ModelAndFile( lineage.getDeepestAncestorModel(), lineage.getDeepestAncestorFile(), lineage.isDeepestAncestorUsingProfilesXml() );
 
         // use the above information to re-bootstrap the resolution chain...
         current = resolveParentPom( current, currentRemoteRepositories, localRepository, projectBuildCache, allowStubs );
 
         while ( current != null )
         {
-            lineage.addParent( current.model, current.file, currentRemoteRepositories );
+            lineage.addParent( current.model, current.file, currentRemoteRepositories, current.validProfilesXmlLocation );
 
-            currentRemoteRepositories = updateRepositorySet( current.model, currentRemoteRepositories, current.file, profileManager );
+            currentRemoteRepositories = updateRepositorySet( current.model, currentRemoteRepositories, current.file, profileManager, current.validProfilesXmlLocation );
 
             current = resolveParentPom( current, currentRemoteRepositories, localRepository, projectBuildCache, allowStubs );
         }
@@ -225,7 +225,7 @@
      * @param profileManager
      */
     private List updateRepositorySet( Model model, List oldArtifactRepositories, File pomFile,
-                                      ProfileManager externalProfileManager )
+                                      ProfileManager externalProfileManager, boolean useProfilesXml )
         throws ProjectBuildingException
     {
         List repositories = model.getRepositories();
@@ -241,7 +241,7 @@
                 List lastRemoteRepos = oldArtifactRepositories;
                 List remoteRepos = mavenTools.buildArtifactRepositories( repositories );
 
-                loadActiveProfileRepositories( remoteRepos, model, externalProfileManager, projectDir );
+                loadActiveProfileRepositories( remoteRepos, model, externalProfileManager, projectDir, useProfilesXml );
 
                 artifactRepositories = new LinkedHashSet( remoteRepos.size() + oldArtifactRepositories.size() );
 
@@ -259,7 +259,7 @@
     }
 
     private void loadActiveProfileRepositories( List repositories, Model model, ProfileManager profileManager,
-                                                File pomFile )
+                                                File pomFile, boolean useProfilesXml )
         throws ProjectBuildingException
     {
         List explicitlyActive;
@@ -280,7 +280,8 @@
 
         profileRepos.addAll( profileAdvisor.getArtifactRepositoriesFromActiveProfiles( model, pomFile,
                                                                                                explicitlyActive,
-                                                                                               explicitlyInactive ) );
+                                                                                               explicitlyInactive,
+                                                                                               useProfilesXml ) );
 
         if ( !profileRepos.isEmpty() )
         {
@@ -316,11 +317,14 @@
                 parentPomFile = resolveParentWithRelativePath( modelParent, modelPomFile );
             }
 
+            boolean isResolved = false;
+
             if ( parentPomFile == null )
             {
                 try
                 {
                     parentPomFile = resolveParentFromRepositories( modelParent, localRepository, remoteRepositories, model.getId() );
+                    isResolved = true;
                 }
                 catch( ProjectBuildingException e )
                 {
@@ -348,7 +352,10 @@
                     parent.setArtifactId( modelParent.getArtifactId() );
                     parent.setVersion( modelParent.getVersion() );
 
-                    result = new ModelAndFile( parent, parentPomFile );
+                    // we act as if the POM was resolved from the repository,
+                    // for the purposes of external profiles.xml files...
+                    // that's what the last parameter is about.
+                    result = new ModelAndFile( parent, parentPomFile, false );
                 }
                 else
                 {
@@ -358,7 +365,7 @@
             else
             {
                 Model parent = readModel( parentPomFile );
-                result = new ModelAndFile( parent, parentPomFile );
+                result = new ModelAndFile( parent, parentPomFile, !isResolved );
             }
         }
 
@@ -477,11 +484,13 @@
     {
         private final Model model;
         private final File file;
+        private final boolean validProfilesXmlLocation;
 
-        ModelAndFile( Model model, File file )
+        ModelAndFile( Model model, File file, boolean validProfilesXmlLocation )
         {
             this.model = model;
             this.file = file;
+            this.validProfilesXmlLocation = validProfilesXmlLocation;
         }
     }
 

Modified: maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/ModelLineage.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/ModelLineage.java?rev=586061&r1=586060&r2=586061&view=diff
==============================================================================
--- maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/ModelLineage.java (original)
+++ maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/ModelLineage.java Thu Oct 18 11:38:06 2007
@@ -42,6 +42,12 @@
     Model getDeepestAncestorModel();
 
     /**
+     * Retrieve the flag telling whether discovery of a profiles.xml file is appropriate
+     * for the deepest model in this lineage.
+     */
+    boolean isDeepestAncestorUsingProfilesXml();
+
+    /**
      * Retrieve the POM file for the deepest ancestor which has been resolved so far in this
      * lineage.
      */
@@ -80,7 +86,7 @@
      *
      * @throws IllegalStateException When the originating POM information has already been set.
      */
-    void setOrigin( Model model, File pomFile, List artifactRepositories );
+    void setOrigin( Model model, File pomFile, List artifactRepositories, boolean validProfilesXmlLocation );
 
     /**
      * Add a parent model, along with its file and the repositories used to resolve it.
@@ -88,7 +94,7 @@
      *
      * @throws IllegalStateException When the originating POM information has not yet been set.
      */
-    void addParent( Model model, File pomFile, List artifactRepositories );
+    void addParent( Model model, File pomFile, List artifactRepositories, boolean validProfilesXmlLocation );
 
     /**
      * Retrieve the models in this lineage, with the deepest parent at the zero index, and the current

Modified: maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/ModelLineageBuilder.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/ModelLineageBuilder.java?rev=586061&r1=586060&r2=586061&view=diff
==============================================================================
--- maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/ModelLineageBuilder.java (original)
+++ maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/build/model/ModelLineageBuilder.java Thu Oct 18 11:38:06 2007
@@ -54,7 +54,7 @@
      *   a parent-POM cannot be resolved.
      */
     ModelLineage buildModelLineage( File pom, ArtifactRepository localRepository, List remoteRepositories,
-                                    ProfileManager profileManager, boolean allowStubs )
+                                    ProfileManager profileManager, boolean allowStubs, boolean validProfilesXmlLocation )
         throws ProjectBuildingException;
 
     /**