in maven-project/src/main/java/org/apache/maven/project/ProjectSorter.java [78:236]
public ProjectSorter( List projects, List selectedProjectNames, String resumeFrom, boolean make, boolean makeDependents )
throws CycleDetectedException, DuplicateProjectException, MissingProjectException
{
dag = new DAG();
projectMap = new HashMap();
for ( Iterator i = projects.iterator(); i.hasNext(); )
{
MavenProject project = (MavenProject) i.next();
String id = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() );
if ( dag.getVertex( id ) != null )
{
throw new DuplicateProjectException( "Project '" + id + "' is duplicated in the reactor" );
}
dag.addVertex( id );
projectMap.put( id, project );
}
for ( Iterator i = projects.iterator(); i.hasNext(); )
{
MavenProject project = (MavenProject) i.next();
String id = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() );
for ( Iterator j = project.getDependencies().iterator(); j.hasNext(); )
{
Dependency dependency = (Dependency) j.next();
String dependencyId = ArtifactUtils
.versionlessKey( dependency.getGroupId(), dependency.getArtifactId() );
if ( dag.getVertex( dependencyId ) != null )
{
project.addProjectReference( (MavenProject) projectMap.get( dependencyId ) );
dag.addEdge( id, dependencyId );
}
}
MavenProject parent = project.getParent();
if ( parent != null )
{
String parentId = ArtifactUtils.versionlessKey( parent.getGroupId(), parent.getArtifactId() );
if ( dag.getVertex( parentId ) != null )
{
// Parent is added as an edge, but must not cause a cycle - so we remove any other edges it has in conflict
if ( dag.hasEdge( parentId, id ) )
{
dag.removeEdge( parentId, id );
}
dag.addEdge( id, parentId );
}
}
List buildPlugins = project.getBuildPlugins();
if ( buildPlugins != null )
{
for ( Iterator j = buildPlugins.iterator(); j.hasNext(); )
{
Plugin plugin = (Plugin) j.next();
String pluginId = ArtifactUtils.versionlessKey( plugin.getGroupId(), plugin.getArtifactId() );
if ( dag.getVertex( pluginId ) != null && !pluginId.equals( id ) )
{
addEdgeWithParentCheck( projectMap, pluginId, project, id );
}
if ( !pluginId.equals( id ) )
{
for ( Iterator k = plugin.getDependencies().iterator(); k.hasNext(); )
{
Dependency dependency = (Dependency) k.next();
String dependencyId = ArtifactUtils
.versionlessKey( dependency.getGroupId(), dependency.getArtifactId() );
if ( dag.getVertex( dependencyId ) != null )
{
// If the plugin in which this dependency is listed is actually used here,
// it will probably be stuck using an older version of this project that
// already exists in the local repository. If not yet installed, it is
// likely that we'll get an ArtifactNotFoundException when this plugin
// is executed to build this project.
//
// If the plugin is NOT actually used here, it may actually belong in the
// pluginManagement section.
if ( !id.equals( dependencyId ) )
{
project.addProjectReference( (MavenProject) projectMap.get( dependencyId ) );
addEdgeWithParentCheck( projectMap, dependencyId, project, id );
// TODO: Shouldn't we add an edge between the plugin and its dependency?
// Note that doing this may result in cycles...run
// ProjectSorterTest.testPluginDependenciesInfluenceSorting_DeclarationInParent()
// for more information, if you change this:
// dag.addEdge( pluginId, dependencyId );
}
}
}
}
}
}
List reportPlugins = project.getReportPlugins();
if ( reportPlugins != null )
{
for ( Iterator j = reportPlugins.iterator(); j.hasNext(); )
{
ReportPlugin plugin = (ReportPlugin) j.next();
String pluginId = ArtifactUtils.versionlessKey( plugin.getGroupId(), plugin.getArtifactId() );
if ( dag.getVertex( pluginId ) != null && !pluginId.equals( id ) )
{
addEdgeWithParentCheck( projectMap, pluginId, project, id );
}
}
}
for ( Iterator j = project.getBuildExtensions().iterator(); j.hasNext(); )
{
Extension extension = (Extension) j.next();
String extensionId = ArtifactUtils.versionlessKey( extension.getGroupId(), extension.getArtifactId() );
if ( dag.getVertex( extensionId ) != null )
{
addEdgeWithParentCheck( projectMap, extensionId, project, id );
}
}
}
List sortedProjects = new ArrayList();
for ( Iterator i = TopologicalSorter.sort( dag ).iterator(); i.hasNext(); )
{
String id = (String) i.next();
sortedProjects.add( projectMap.get( id ) );
}
// TODO: !![jc; 28-jul-2005] check this; if we're using '-r' and there are aggregator tasks, this will result in weirdness.
for ( Iterator i = sortedProjects.iterator(); i.hasNext() && topLevelProject == null; )
{
MavenProject project = (MavenProject) i.next();
if ( project.isExecutionRoot() )
{
topLevelProject = project;
}
}
sortedProjects = applyMakeFilter( sortedProjects, dag, projectMap, topLevelProject, selectedProjectNames, make, makeDependents );
resumeFrom( resumeFrom, sortedProjects, projectMap, topLevelProject );
this.sortedProjects = Collections.unmodifiableList( sortedProjects );
}