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]

Reply via email to