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.

git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@586061 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
John Dennis Casey 2007-10-18 18:38:06 +00:00
parent 3979ed47d3
commit 2ba9bbfd23
23 changed files with 578 additions and 232 deletions

View File

@ -39,21 +39,22 @@ public class MavenProjectSession
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 class MavenProjectSession
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 @@ public class MavenProjectSession
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 @@ public class MavenProjectSession
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 );

View File

@ -336,8 +336,12 @@ public class DefaultBuildExtensionScanner
{
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 )
{

View File

@ -45,6 +45,7 @@ import org.apache.maven.project.MavenProject;
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 @@ public class DefaultExtensionManager
}
// 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 @@ public class DefaultExtensionManager
}
}
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() );
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 );
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 );
}
}

View File

@ -28,6 +28,7 @@ import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
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.PluginVersionNotFoundException;
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 @@ import java.util.Stack;
*/
public class DefaultLifecycleExecutor
extends AbstractLogEnabled
implements LifecycleExecutor
implements LifecycleExecutor, Contextualizable
{
// ----------------------------------------------------------------------
// Components
@ -93,6 +100,9 @@ public class DefaultLifecycleExecutor
private BuildContextManager buildContextManager;
// this is needed for setting the lookup realm before we start building a project.
private PlexusContainer container;
// ----------------------------------------------------------------------
//
// ----------------------------------------------------------------------
@ -195,53 +205,63 @@ public class DefaultLifecycleExecutor
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 );
ClassRealm oldLookupRealm = setProjectLookupRealm( session, rootProject );
// NEW: Build up the execution plan, including configuration.
List mojoBindings = getLifecycleBindings(
segment.getTasks(),
rootProject,
target );
// 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
// NEW: Build up the execution plan, including configuration.
List mojoBindings = getLifecycleBindings(
segment.getTasks(),
rootProject,
target );
// 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(); )
{
executeGoalAndHandleFailures(
binding,
session,
dispatcher,
event,
reactorManager,
buildStartTime,
target );
}
catch ( MojoFailureException e )
{
AggregatedBuildFailureException error = new AggregatedBuildFailureException(
session.getExecutionRootDirectory(),
binding,
e );
MojoBinding binding = (MojoBinding) mojoIterator.next();
dispatcher.dispatchError( event, target, error );
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 @@ public class DefaultLifecycleExecutor
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 @@ public class DefaultLifecycleExecutor
}
}
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 @@ public class DefaultLifecycleExecutor
{
if ( mojoBinding.isOptional() )
{
getLogger().debug( "Skipping optional mojo execution: " + MojoBindingUtils.toString( mojoBinding ) );
getLogger().debug( "Skipping optional mojo execution: " + MojoBindingUtils.toString( mojoBinding ), e );
return;
}
else
{
@ -895,4 +947,10 @@ public class DefaultLifecycleExecutor
return tasks;
}
}
public void contextualize( Context context )
throws ContextException
{
container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
}
}

View File

@ -345,14 +345,21 @@ public class DefaultPluginManager
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 @@ public class DefaultPluginManager
// 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 @@ public class DefaultPluginManager
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 @@ public class DefaultPluginManager
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 @@ public class DefaultPluginManager
// 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 @@ public class DefaultPluginManager
// 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 @@ public class DefaultPluginManager
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,

View File

@ -2,6 +2,7 @@ package org.apache.maven.extension;
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.DefaultArtifactRepository;
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 @@ public class DefaultExtensionManagerTest
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 @@ public class DefaultExtensionManagerTest
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 @@ public class DefaultExtensionManagerTest
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 );

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -66,11 +66,11 @@ public class DefaultProfileAdvisor
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 @@ public class DefaultProfileAdvisor
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 @@ public class DefaultProfileAdvisor
profileManager.addProfiles( model.getProfiles() );
if ( pomFile != null )
if ( useProfilesXml && ( pomFile != null ) )
{
loadExternalProjectProfiles( profileManager, model, pomFile );
}
@ -198,10 +198,11 @@ public class DefaultProfileAdvisor
}
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() );
}

View File

@ -37,16 +37,28 @@ public interface ProfileAdvisor
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;
}

View File

@ -209,7 +209,7 @@ public class DefaultMavenProjectBuilder
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 @@ public class DefaultMavenProjectBuilder
buildArtifactRepositories( getSuperModel() ),
projectDescriptor,
profileManager,
STRICT_MODEL_PARSING );
STRICT_MODEL_PARSING,
true );
return project;
}
@ -531,7 +532,7 @@ public class DefaultMavenProjectBuilder
List parentSearchRepositories,
File projectDescriptor,
ProfileManager externalProfileManager,
boolean strict )
boolean strict, boolean validProfilesXmlLocation )
throws ProjectBuildingException
{
Model superModel = getSuperModel();
@ -567,7 +568,7 @@ public class DefaultMavenProjectBuilder
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 @@ public class DefaultMavenProjectBuilder
LinkedHashSet aggregatedRemoteWagonRepositories = collectInitialRepositories( model, superModel,
parentSearchRepositories,
projectDescriptor, explicitlyActive,
explicitlyInactive );
explicitlyInactive,
validProfilesXmlLocation );
Model originalModel = ModelUtils.cloneModel( model );
@ -583,7 +585,7 @@ public class DefaultMavenProjectBuilder
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 @@ public class DefaultMavenProjectBuilder
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 @@ public class DefaultMavenProjectBuilder
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 @@ public class DefaultMavenProjectBuilder
}
/**
* @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 @@ public class DefaultMavenProjectBuilder
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 @@ public class DefaultMavenProjectBuilder
projectContext.store( buildContextManager );
project.setActiveProfiles( profileAdvisor.applyActivatedProfiles( currentModel, currentPom, explicitlyActive,
explicitlyInactive ) );
explicitlyInactive, validProfilesXmlLocation ) );
if ( lastProject != null )
{

View File

@ -39,14 +39,14 @@ public class DefaultModelLineage
/**
* @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 @@ public class DefaultModelLineage
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 class DefaultModelLineage
};
}
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 @@ public class DefaultModelLineage
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 )

View File

@ -88,7 +88,7 @@ public class DefaultModelLineageBuilder
* @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 @@ public class DefaultModelLineageBuilder
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 @@ public class DefaultModelLineageBuilder
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 @@ public class DefaultModelLineageBuilder
* @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 @@ public class DefaultModelLineageBuilder
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 @@ public class DefaultModelLineageBuilder
}
private void loadActiveProfileRepositories( List repositories, Model model, ProfileManager profileManager,
File pomFile )
File pomFile, boolean useProfilesXml )
throws ProjectBuildingException
{
List explicitlyActive;
@ -280,7 +280,8 @@ public class DefaultModelLineageBuilder
profileRepos.addAll( profileAdvisor.getArtifactRepositoriesFromActiveProfiles( model, pomFile,
explicitlyActive,
explicitlyInactive ) );
explicitlyInactive,
useProfilesXml ) );
if ( !profileRepos.isEmpty() )
{
@ -316,11 +317,14 @@ public class DefaultModelLineageBuilder
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 @@ public class DefaultModelLineageBuilder
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 @@ public class DefaultModelLineageBuilder
else
{
Model parent = readModel( parentPomFile );
result = new ModelAndFile( parent, parentPomFile );
result = new ModelAndFile( parent, parentPomFile, !isResolved );
}
}
@ -477,11 +484,13 @@ public class DefaultModelLineageBuilder
{
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;
}
}

View File

@ -41,6 +41,12 @@ public interface ModelLineage
*/
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 @@ public interface ModelLineage
*
* @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 @@ public interface ModelLineage
*
* @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

View File

@ -54,7 +54,7 @@ public interface ModelLineageBuilder
* 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;
/**

View File

@ -45,7 +45,7 @@ public abstract class AbstractModelLineageTest
try
{
ml.addParent( new Model(), null, null );
ml.addParent( new Model(), null, null, false );
fail( "Should throw IllegalStateException when setOrigin(..) is not called first." );
}
@ -61,13 +61,13 @@ public abstract class AbstractModelLineageTest
assertEquals( 0, ml.size() );
ml.setOrigin( new Model(), null, null );
ml.setOrigin( new Model(), null, null, false );
assertEquals( 1, ml.size() );
try
{
ml.setOrigin( new Model(), null, null );
ml.setOrigin( new Model(), null, null, false );
fail( "Should throw IllegalStateException when setOrigin(..) called multiple times." );
}
@ -83,7 +83,7 @@ public abstract class AbstractModelLineageTest
assertEquals( 0, ml.size() );
ml.setOrigin( new Model(), null, null );
ml.setOrigin( new Model(), null, null, false );
assertEquals( 1, ml.size() );
}
@ -106,7 +106,7 @@ public abstract class AbstractModelLineageTest
File fOne = File.createTempFile( "ModelLineageTest.modelLineageIterator-test.", "" );
fOne.deleteOnExit();
ml.setOrigin( mOne, fOne, null );
ml.setOrigin( mOne, fOne, null, false );
String gTwo = "group2";
String aTwo = "artifact2";
@ -121,7 +121,7 @@ public abstract class AbstractModelLineageTest
File fTwo = File.createTempFile( "ModelLineageTest.fileIterator-test.", "" );
fTwo.deleteOnExit();
ml.addParent( mTwo, fTwo, null );
ml.addParent( mTwo, fTwo, null, false );
ModelLineageIterator it = ml.lineageIterator();
@ -150,7 +150,7 @@ public abstract class AbstractModelLineageTest
mOne.setArtifactId( aOne );
mOne.setVersion( vOne );
ml.setOrigin( mOne, null, null );
ml.setOrigin( mOne, null, null, false );
String gTwo = "group2";
String aTwo = "artifact2";
@ -162,7 +162,7 @@ public abstract class AbstractModelLineageTest
mOne.setArtifactId( aTwo );
mOne.setVersion( vTwo );
ml.addParent( mTwo, null, null );
ml.addParent( mTwo, null, null, false );
Iterator it = ml.modelIterator();
@ -181,20 +181,20 @@ public abstract class AbstractModelLineageTest
File fOne = File.createTempFile( "ModelLineageTest.fileIterator-test.", "" );
fOne.deleteOnExit();
ml.setOrigin( new Model(), fOne, null );
ml.setOrigin( new Model(), fOne, null, false );
File fTwo = File.createTempFile( "ModelLineageTest.fileIterator-test.", "" );
fTwo.deleteOnExit();
ml.addParent( new Model(), fTwo, null );
ml.addParent( new Model(), fTwo, null, false );
Iterator it = ml.fileIterator();
assertTrue( it.hasNext() );
assertEquals( fOne, (File) it.next() );
assertEquals( fOne, it.next() );
assertTrue( it.hasNext() );
assertEquals( fTwo, (File) it.next() );
assertEquals( fTwo, it.next() );
}
public void testArtifactRepositoryListIterator_ShouldAddTwoParentsAndIterateInFIFOOrder()
@ -205,11 +205,11 @@ public abstract class AbstractModelLineageTest
ArtifactRepository arOne = new DefaultArtifactRepository( "", "", layout );
ml.setOrigin( new Model(), null, Collections.singletonList( arOne ) );
ml.setOrigin( new Model(), null, Collections.singletonList( arOne ), false );
ArtifactRepository arTwo = new DefaultArtifactRepository( "", "", layout );
ml.addParent( new Model(), null, Collections.singletonList( arTwo ) );
ml.addParent( new Model(), null, Collections.singletonList( arTwo ), false );
Iterator it = ml.artifactRepositoryListIterator();
@ -238,12 +238,12 @@ public abstract class AbstractModelLineageTest
mOne.setArtifactId( aOne );
mOne.setVersion( vOne );
ml.setOrigin( mOne, fOne, null );
ml.setOrigin( mOne, fOne, null, false );
File fTwo = File.createTempFile( "ModelLineageTest.fileIterator-test.", "" );
fTwo.deleteOnExit();
ml.addParent( new Model(), fTwo, null );
ml.addParent( new Model(), fTwo, null, false );
Model retriever = new Model();
@ -273,11 +273,11 @@ public abstract class AbstractModelLineageTest
ArtifactRepository arOne = new DefaultArtifactRepository( "", "", layout );
ml.setOrigin( mOne, null, Collections.singletonList( arOne ) );
ml.setOrigin( mOne, null, Collections.singletonList( arOne ), false );
ArtifactRepository arTwo = new DefaultArtifactRepository( "", "", layout );
ml.addParent( new Model(), null, Collections.singletonList( arTwo ) );
ml.addParent( new Model(), null, Collections.singletonList( arTwo ), false );
Model retriever = new Model();
@ -285,7 +285,7 @@ public abstract class AbstractModelLineageTest
retriever.setArtifactId( aOne );
retriever.setVersion( vOne );
assertSame( arOne, ( (List) ml.getArtifactRepositories( retriever ) ).get( 0 ) );
assertSame( arOne, ( ml.getArtifactRepositories( retriever ) ).get( 0 ) );
}
public void testSetOriginAndGetOriginatingModel()
@ -297,7 +297,7 @@ public abstract class AbstractModelLineageTest
ModelLineage ml = newModelLineage();
ml.setOrigin( model, null, null );
ml.setOrigin( model, null, null, false );
assertEquals( model.getId(), ml.getOriginatingModel().getId() );
}
@ -310,7 +310,7 @@ public abstract class AbstractModelLineageTest
File pomFile = File.createTempFile( "ModelLineage.test.", ".pom" );
pomFile.deleteOnExit();
ml.setOrigin( null, pomFile, null );
ml.setOrigin( null, pomFile, null, false );
assertEquals( pomFile, ml.getOriginatingPOMFile() );
}
@ -333,7 +333,7 @@ public abstract class AbstractModelLineageTest
ArtifactRepository arOne = new DefaultArtifactRepository( "", "", layout );
ml.setOrigin( mOne, null, Collections.singletonList( arOne ) );
ml.setOrigin( mOne, null, Collections.singletonList( arOne ), false );
assertSame( arOne, ml.getOriginatingArtifactRepositoryList().get( 0 ) );
}
@ -352,7 +352,7 @@ public abstract class AbstractModelLineageTest
mOne.setArtifactId( aOne );
mOne.setVersion( vOne );
ml.setOrigin( mOne, null, null );
ml.setOrigin( mOne, null, null, false );
String gTwo = "group2";
String aTwo = "artifact2";
@ -364,7 +364,7 @@ public abstract class AbstractModelLineageTest
mOne.setArtifactId( aTwo );
mOne.setVersion( vTwo );
ml.addParent( mTwo, null, null );
ml.addParent( mTwo, null, null, false );
Iterator it = ml.getModelsInDescendingOrder().iterator();
@ -383,20 +383,20 @@ public abstract class AbstractModelLineageTest
File fOne = File.createTempFile( "ModelLineageTest.fileIterator-test.", "" );
fOne.deleteOnExit();
ml.setOrigin( new Model(), fOne, null );
ml.setOrigin( new Model(), fOne, null, false );
File fTwo = File.createTempFile( "ModelLineageTest.fileIterator-test.", "" );
fTwo.deleteOnExit();
ml.addParent( new Model(), fTwo, null );
ml.addParent( new Model(), fTwo, null, false );
Iterator it = ml.getFilesInDescendingOrder().iterator();
assertTrue( it.hasNext() );
assertEquals( fTwo, (File) it.next() );
assertEquals( fTwo, it.next() );
assertTrue( it.hasNext() );
assertEquals( fOne, (File) it.next() );
assertEquals( fOne, it.next() );
}
public void testGetArtifactRepositoryListsInDescendingOrder_ShouldAddTwoAndRetrieveInLIFOOrder()
@ -407,11 +407,11 @@ public abstract class AbstractModelLineageTest
ArtifactRepository arOne = new DefaultArtifactRepository( "", "", layout );
ml.setOrigin( new Model(), null, Collections.singletonList( arOne ) );
ml.setOrigin( new Model(), null, Collections.singletonList( arOne ), false );
ArtifactRepository arTwo = new DefaultArtifactRepository( "", "", layout );
ml.addParent( new Model(), null, Collections.singletonList( arTwo ) );
ml.addParent( new Model(), null, Collections.singletonList( arTwo ), false );
Iterator it = ml.getArtifactRepositoryListsInDescendingOrder().iterator();

View File

@ -117,7 +117,7 @@ public class DefaultModelLineageBuilderTest
}
ModelLineage lineage = modelLineageBuilder.buildModelLineage( pomFile, null, null, null,
false );
false, true );
assertEquals( 1, lineage.size() );
@ -181,7 +181,7 @@ public class DefaultModelLineageBuilderTest
ModelLineage lineage = modelLineageBuilder.buildModelLineage( currentPOM, localRepository,
Collections.EMPTY_LIST, null,
false );
false, true );
assertEquals( 3, lineage.size() );
@ -230,7 +230,7 @@ public class DefaultModelLineageBuilderTest
ModelLineage lineage = modelLineageBuilder.buildModelLineage( currentPOM, localRepository,
Collections.EMPTY_LIST, null,
true );
true, true );
assertEquals( 2, lineage.size() );
@ -318,7 +318,7 @@ public class DefaultModelLineageBuilderTest
currentPOM,
localRepository,
Collections.singletonList( remoteRepository ),
null, false );
null, false, true );
assertEquals( 3, lineage.size() );
@ -379,7 +379,7 @@ public class DefaultModelLineageBuilderTest
ModelLineage lineage = modelLineageBuilder.buildModelLineage( currentPOM, localRepository,
Collections.EMPTY_LIST, null,
false );
false, true );
assertEquals( 2, lineage.size() );
@ -445,7 +445,7 @@ public class DefaultModelLineageBuilderTest
ModelLineage lineage = modelLineageBuilder.buildModelLineage( currentPOM, localRepository,
Collections.EMPTY_LIST, profileManager,
false );
false, true );
assertEquals( 2, lineage.size() );
@ -535,7 +535,7 @@ public class DefaultModelLineageBuilderTest
// 7. build the lineage.
ModelLineage lineage = modelLineageBuilder.buildModelLineage( currentPOM, null,
Collections.EMPTY_LIST, null,
false );
false, true );
assertEquals( 2, lineage.size() );