mirror of https://github.com/apache/maven.git
factor out project sorter, and use whole ID
git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@163982 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
06ebdedc0c
commit
c1cea8cbb8
|
@ -32,6 +32,7 @@ import org.apache.maven.plugin.PluginManager;
|
||||||
import org.apache.maven.project.MavenProject;
|
import org.apache.maven.project.MavenProject;
|
||||||
import org.apache.maven.project.MavenProjectBuilder;
|
import org.apache.maven.project.MavenProjectBuilder;
|
||||||
import org.apache.maven.project.ProjectBuildingException;
|
import org.apache.maven.project.ProjectBuildingException;
|
||||||
|
import org.apache.maven.project.ProjectSorter;
|
||||||
import org.apache.maven.reactor.ReactorException;
|
import org.apache.maven.reactor.ReactorException;
|
||||||
import org.apache.maven.settings.Proxy;
|
import org.apache.maven.settings.Proxy;
|
||||||
import org.apache.maven.settings.Settings;
|
import org.apache.maven.settings.Settings;
|
||||||
|
@ -104,7 +105,7 @@ public class DefaultMaven
|
||||||
{
|
{
|
||||||
projects = collectProjects( request.getFiles(), request.getLocalRepository(), request.isRecursive() );
|
projects = collectProjects( request.getFiles(), request.getLocalRepository(), request.isRecursive() );
|
||||||
|
|
||||||
projects = MavenProject.getSortedProjects( projects );
|
projects = ProjectSorter.getSortedProjects( projects );
|
||||||
|
|
||||||
if ( projects.isEmpty() )
|
if ( projects.isEmpty() )
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,7 +24,6 @@ import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||||
import org.apache.maven.model.Build;
|
import org.apache.maven.model.Build;
|
||||||
import org.apache.maven.model.CiManagement;
|
import org.apache.maven.model.CiManagement;
|
||||||
import org.apache.maven.model.Contributor;
|
import org.apache.maven.model.Contributor;
|
||||||
import org.apache.maven.model.Dependency;
|
|
||||||
import org.apache.maven.model.DependencyManagement;
|
import org.apache.maven.model.DependencyManagement;
|
||||||
import org.apache.maven.model.Developer;
|
import org.apache.maven.model.Developer;
|
||||||
import org.apache.maven.model.DistributionManagement;
|
import org.apache.maven.model.DistributionManagement;
|
||||||
|
@ -39,9 +38,6 @@ import org.apache.maven.model.PluginManagement;
|
||||||
import org.apache.maven.model.Reports;
|
import org.apache.maven.model.Reports;
|
||||||
import org.apache.maven.model.Scm;
|
import org.apache.maven.model.Scm;
|
||||||
import org.apache.maven.util.Xpp3DomUtils;
|
import org.apache.maven.util.Xpp3DomUtils;
|
||||||
import org.codehaus.plexus.util.dag.CycleDetectedException;
|
|
||||||
import org.codehaus.plexus.util.dag.DAG;
|
|
||||||
import org.codehaus.plexus.util.dag.TopologicalSorter;
|
|
||||||
import org.codehaus.plexus.util.xml.Xpp3Dom;
|
import org.codehaus.plexus.util.xml.Xpp3Dom;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
@ -237,6 +233,8 @@ public class MavenProject
|
||||||
{
|
{
|
||||||
Artifact a = (Artifact) i.next();
|
Artifact a = (Artifact) i.next();
|
||||||
|
|
||||||
|
if ( isAddedToClasspath( a ) )
|
||||||
|
{
|
||||||
// TODO: let the scope handler deal with this
|
// TODO: let the scope handler deal with this
|
||||||
if ( Artifact.SCOPE_COMPILE.equals( a.getScope() ) )
|
if ( Artifact.SCOPE_COMPILE.equals( a.getScope() ) )
|
||||||
{
|
{
|
||||||
|
@ -248,6 +246,7 @@ public class MavenProject
|
||||||
list.add( file.getPath() );
|
list.add( file.getPath() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -628,75 +627,6 @@ public class MavenProject
|
||||||
this.collectedProjects = collectedProjects;
|
this.collectedProjects = collectedProjects;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Sort a list of projects.
|
|
||||||
* <ul>
|
|
||||||
* <li>collect all the vertices for the projects that we want to build.</li>
|
|
||||||
* <li>iterate through the deps of each project and if that dep is within
|
|
||||||
* the set of projects we want to build then add an edge, otherwise throw
|
|
||||||
* the edge away because that dependency is not within the set of projects
|
|
||||||
* we are trying to build. we assume a closed set.</li>
|
|
||||||
* <li>do a topo sort on the graph that remains.</li>
|
|
||||||
* </ul>
|
|
||||||
*/
|
|
||||||
public static List getSortedProjects( List projects )
|
|
||||||
throws CycleDetectedException
|
|
||||||
{
|
|
||||||
DAG dag = new DAG();
|
|
||||||
|
|
||||||
Map projectMap = new HashMap();
|
|
||||||
|
|
||||||
for ( Iterator i = projects.iterator(); i.hasNext(); )
|
|
||||||
{
|
|
||||||
MavenProject project = (MavenProject) i.next();
|
|
||||||
|
|
||||||
String artifactId = project.getArtifactId();
|
|
||||||
|
|
||||||
dag.addVertex( artifactId );
|
|
||||||
|
|
||||||
projectMap.put( artifactId, project );
|
|
||||||
}
|
|
||||||
|
|
||||||
for ( Iterator i = projects.iterator(); i.hasNext(); )
|
|
||||||
{
|
|
||||||
MavenProject project = (MavenProject) i.next();
|
|
||||||
|
|
||||||
String artifactId = project.getArtifactId();
|
|
||||||
|
|
||||||
for ( Iterator j = project.getDependencies().iterator(); j.hasNext(); )
|
|
||||||
{
|
|
||||||
Dependency dependency = (Dependency) j.next();
|
|
||||||
|
|
||||||
String dependencyArtifactId = dependency.getArtifactId();
|
|
||||||
|
|
||||||
if ( dag.getVertex( dependencyArtifactId ) != null )
|
|
||||||
{
|
|
||||||
dag.addEdge( artifactId, dependencyArtifactId );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MavenProject parent = project.getParent();
|
|
||||||
if ( parent != null )
|
|
||||||
{
|
|
||||||
if ( dag.getVertex( parent.getArtifactId() ) != null )
|
|
||||||
{
|
|
||||||
dag.addEdge( artifactId, parent.getArtifactId() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
List sortedProjects = new ArrayList();
|
|
||||||
|
|
||||||
for ( Iterator i = TopologicalSorter.sort( dag ).iterator(); i.hasNext(); )
|
|
||||||
{
|
|
||||||
String artifactId = (String) i.next();
|
|
||||||
|
|
||||||
sortedProjects.add( projectMap.get( artifactId ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
return sortedProjects;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addArtifacts( Collection newArtifacts )
|
public void addArtifacts( Collection newArtifacts )
|
||||||
{
|
{
|
||||||
// project.getArtifacts().addAll( result.getArtifacts().values() );
|
// project.getArtifacts().addAll( result.getArtifacts().values() );
|
||||||
|
|
|
@ -0,0 +1,122 @@
|
||||||
|
package org.apache.maven.project;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2001-2005 The Apache Software Foundation.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.maven.model.Dependency;
|
||||||
|
import org.codehaus.plexus.util.dag.CycleDetectedException;
|
||||||
|
import org.codehaus.plexus.util.dag.DAG;
|
||||||
|
import org.codehaus.plexus.util.dag.TopologicalSorter;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sort projects by dependencies.
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class ProjectSorter
|
||||||
|
{
|
||||||
|
private ProjectSorter()
|
||||||
|
{
|
||||||
|
// no touchy...
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sort a list of projects.
|
||||||
|
* <ul>
|
||||||
|
* <li>collect all the vertices for the projects that we want to build.</li>
|
||||||
|
* <li>iterate through the deps of each project and if that dep is within
|
||||||
|
* the set of projects we want to build then add an edge, otherwise throw
|
||||||
|
* the edge away because that dependency is not within the set of projects
|
||||||
|
* we are trying to build. we assume a closed set.</li>
|
||||||
|
* <li>do a topo sort on the graph that remains.</li>
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
|
public static List getSortedProjects( List projects )
|
||||||
|
throws CycleDetectedException
|
||||||
|
{
|
||||||
|
DAG dag = new DAG();
|
||||||
|
|
||||||
|
Map projectMap = new HashMap();
|
||||||
|
|
||||||
|
for ( Iterator i = projects.iterator(); i.hasNext(); )
|
||||||
|
{
|
||||||
|
MavenProject project = (MavenProject) i.next();
|
||||||
|
|
||||||
|
String id = getProjectId( project );
|
||||||
|
|
||||||
|
dag.addVertex( id );
|
||||||
|
|
||||||
|
projectMap.put( id, project );
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( Iterator i = projects.iterator(); i.hasNext(); )
|
||||||
|
{
|
||||||
|
MavenProject project = (MavenProject) i.next();
|
||||||
|
|
||||||
|
String id = getProjectId( project );
|
||||||
|
|
||||||
|
for ( Iterator j = project.getDependencies().iterator(); j.hasNext(); )
|
||||||
|
{
|
||||||
|
Dependency dependency = (Dependency) j.next();
|
||||||
|
|
||||||
|
String dependencyId = getDependencyId( dependency );
|
||||||
|
|
||||||
|
if ( dag.getVertex( dependencyId ) != null )
|
||||||
|
{
|
||||||
|
dag.addEdge( id, dependencyId );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MavenProject parent = project.getParent();
|
||||||
|
if ( parent != null )
|
||||||
|
{
|
||||||
|
String parentId = getProjectId( parent );
|
||||||
|
if ( dag.getVertex( parentId ) != null )
|
||||||
|
{
|
||||||
|
dag.addEdge( id, parentId );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List sortedProjects = new ArrayList();
|
||||||
|
|
||||||
|
for ( Iterator i = TopologicalSorter.sort( dag ).iterator(); i.hasNext(); )
|
||||||
|
{
|
||||||
|
String id = (String) i.next();
|
||||||
|
|
||||||
|
sortedProjects.add( projectMap.get( id ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return sortedProjects;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getDependencyId( Dependency dependency )
|
||||||
|
{
|
||||||
|
return dependency.getGroupId() + ":" + dependency.getArtifactId();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getProjectId( MavenProject project )
|
||||||
|
{
|
||||||
|
return project.getGroupId() + ":" + project.getArtifactId();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,85 @@
|
||||||
|
package org.apache.maven.project;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2001-2005 The Apache Software Foundation.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
import org.apache.maven.model.Dependency;
|
||||||
|
import org.apache.maven.model.Model;
|
||||||
|
import org.codehaus.plexus.util.dag.CycleDetectedException;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test sorting projects by dependencies.
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class ProjectSorterTest
|
||||||
|
extends TestCase
|
||||||
|
{
|
||||||
|
public void testMatchingArtifactIdsDifferentGroupIds()
|
||||||
|
throws CycleDetectedException
|
||||||
|
{
|
||||||
|
List projects = new ArrayList();
|
||||||
|
MavenProject project1 = createProject( "groupId1", "artifactId", "1.0" );
|
||||||
|
projects.add( project1 );
|
||||||
|
MavenProject project2 = createProject( "groupId2", "artifactId", "1.0" );
|
||||||
|
projects.add( project2 );
|
||||||
|
project1.getDependencies().add( createDependency( project2 ) );
|
||||||
|
|
||||||
|
projects = ProjectSorter.getSortedProjects( projects );
|
||||||
|
|
||||||
|
assertEquals( project2, projects.get( 0 ) );
|
||||||
|
assertEquals( project1, projects.get( 1 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testMatchingGroupIdsDifferentArtifactIds()
|
||||||
|
throws CycleDetectedException
|
||||||
|
{
|
||||||
|
List projects = new ArrayList();
|
||||||
|
MavenProject project1 = createProject( "groupId", "artifactId1", "1.0" );
|
||||||
|
projects.add( project1 );
|
||||||
|
MavenProject project2 = createProject( "groupId", "artifactId2", "1.0" );
|
||||||
|
projects.add( project2 );
|
||||||
|
project1.getDependencies().add( createDependency( project2 ) );
|
||||||
|
|
||||||
|
projects = ProjectSorter.getSortedProjects( projects );
|
||||||
|
|
||||||
|
assertEquals( project2, projects.get( 0 ) );
|
||||||
|
assertEquals( project1, projects.get( 1 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
private Dependency createDependency( MavenProject project )
|
||||||
|
{
|
||||||
|
Dependency depdendency = new Dependency();
|
||||||
|
depdendency.setArtifactId( project.getArtifactId() );
|
||||||
|
depdendency.setGroupId( project.getGroupId() );
|
||||||
|
depdendency.setVersion( project.getVersion() );
|
||||||
|
return depdendency;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static MavenProject createProject( String groupId, String artifactId, String version )
|
||||||
|
{
|
||||||
|
Model model = new Model();
|
||||||
|
model.setGroupId( groupId );
|
||||||
|
model.setArtifactId( artifactId );
|
||||||
|
model.setVersion( version );
|
||||||
|
return new MavenProject( model );
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue