jvanzyl 2003/12/29 08:49:46
Modified: maven-project/src/java/org/apache/maven/project
DefaultProjectBuilder.java ProjectBuilder.java
maven-project/src/test/org/apache/maven/project
DefaultProjectBuilderTest.java
Log:
o adding a little project sorting for binary type builds where the projects
form a closed set. we throw away edges where both vertices aren't in the
set of projects.
Revision Changes Path
1.24 +67 -0
maven-components/maven-project/src/java/org/apache/maven/project/DefaultProjectBuilder.java
Index: DefaultProjectBuilder.java
===================================================================
RCS file:
/home/cvs/maven-components/maven-project/src/java/org/apache/maven/project/DefaultProjectBuilder.java,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- DefaultProjectBuilder.java 28 Dec 2003 23:59:14 -0000 1.23
+++ DefaultProjectBuilder.java 29 Dec 2003 16:49:46 -0000 1.24
@@ -4,9 +4,12 @@
import org.apache.maven.model.Model;
import org.apache.maven.model.ModelMarshaller;
import org.apache.maven.model.ModelUnmarshaller;
+import org.apache.maven.model.Dependency;
import org.apache.maven.util.CollectionUtils;
import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.dag.DAG;
+import org.codehaus.plexus.util.dag.TopologicalSorter;
import org.xmlpull.v1.XmlPullParserException;
import java.io.File;
@@ -19,6 +22,9 @@
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
+import java.util.List;
+import java.util.HashMap;
+import java.util.ArrayList;
/**
* @author <a href="mailto:[EMAIL PROTECTED]">Jason van Zyl</a>
@@ -39,6 +45,65 @@
// Protected methods to be used by the Maven facade.
// ----------------------------------------------------------------------
+ //
+ // 1. collect all the vertices for the projects that we want to build.
+ //
+ // 2. 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.
+ //
+ // 3. do a topo sort on the graph that remains.
+ //
+ public List getSortedProjects( List projects )
+ throws Exception
+ {
+ DAG dag = new DAG();
+
+ Map projectMap = new HashMap();
+
+ for ( Iterator i = projects.iterator(); i.hasNext(); )
+ {
+ Project project = (Project) i.next();
+
+ String artifactId = project.getArtifactId();
+
+ dag.addVertex( artifactId );
+
+ projectMap.put( artifactId, project );
+ }
+
+ for ( Iterator i = projects.iterator(); i.hasNext(); )
+ {
+ Project project = (Project) 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, dependency.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 Project build( File project )
throws Exception
{
@@ -69,6 +134,8 @@
}
catch ( XmlPullParserException e )
{
+ e.printStackTrace();
+
getLogger().error( "Error reading file: " + projectDescriptor, e );
throw e;
1.9 +4 -0
maven-components/maven-project/src/java/org/apache/maven/project/ProjectBuilder.java
Index: ProjectBuilder.java
===================================================================
RCS file:
/home/cvs/maven-components/maven-project/src/java/org/apache/maven/project/ProjectBuilder.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- ProjectBuilder.java 28 Dec 2003 15:44:48 -0000 1.8
+++ ProjectBuilder.java 29 Dec 2003 16:49:46 -0000 1.9
@@ -1,6 +1,7 @@
package org.apache.maven.project;
import java.io.File;
+import java.util.List;
public interface ProjectBuilder
{
@@ -15,6 +16,9 @@
throws Exception;
Project build( File project, boolean useParent )
+ throws Exception;
+
+ List getSortedProjects( List projects )
throws Exception;
}
1.24 +40 -0
maven-components/maven-project/src/test/org/apache/maven/project/DefaultProjectBuilderTest.java
Index: DefaultProjectBuilderTest.java
===================================================================
RCS file:
/home/cvs/maven-components/maven-project/src/test/org/apache/maven/project/DefaultProjectBuilderTest.java,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- DefaultProjectBuilderTest.java 28 Dec 2003 23:36:58 -0000 1.23
+++ DefaultProjectBuilderTest.java 29 Dec 2003 16:49:46 -0000 1.24
@@ -1,9 +1,14 @@
package org.apache.maven.project;
import org.codehaus.plexus.PlexusTestCase;
+import org.codehaus.plexus.util.DirectoryScanner;
+import org.codehaus.plexus.util.StringUtils;
import org.apache.maven.model.Dependency;
import java.io.File;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Iterator;
public class DefaultProjectBuilderTest
extends PlexusTestCase
@@ -243,5 +248,40 @@
assertNotNull( project.getParent().getParent().getParent() );
assertEquals( "ccc", project.getShortDescription() );
+ }
+
+ public void testProjectSorting()
+ throws Exception
+ {
+
+ File f = new File( basedir, "src/test-reactor" );
+
+ DirectoryScanner scanner = new DirectoryScanner();
+
+ scanner.setBasedir( f );
+
+ scanner.setIncludes( new String[] { "**/project.xml" } );
+
+ scanner.scan();
+
+ String[] files = scanner.getIncludedFiles();
+
+ List projects = new ArrayList();
+
+ for ( int i = 0; i < files.length; i++ )
+ {
+ projects.add( projectBuilder.build( new File( f, files[i] ) ) );
+ }
+
+ List sortedProjects = projectBuilder.getSortedProjects( projects );
+
+ assertNotNull( sortedProjects );
+
+ for ( Iterator i = sortedProjects.iterator(); i.hasNext(); )
+ {
+ Project p = (Project) i.next();
+
+ System.out.println( "p = " + p.getArtifactId() );
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]