michal 2004/05/18 12:39:46 Modified: maven-project/src/main/java/org/apache/maven/artifact/collector DefaultArtifactCollector.java ArtifactCollectionResult.java maven-project/src/main/java/org/apache/maven/project MavenProjectBuilder.java DefaultMavenProjectBuilder.java maven-project/src/test/java/org/apache/maven/artifact/collector DefaultArtifactCollectorTest.java Removed: maven-project/src/main/java/org/apache/maven/artifact/collector ArtifactCollectionResultEntry.java Log: Reverting to simpler version of ArtifactCollector Revision Changes Path 1.5 +108 -44 maven-components/maven-project/src/main/java/org/apache/maven/artifact/collector/DefaultArtifactCollector.java Index: DefaultArtifactCollector.java =================================================================== RCS file: /home/cvs/maven-components/maven-project/src/main/java/org/apache/maven/artifact/collector/DefaultArtifactCollector.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- DefaultArtifactCollector.java 17 May 2004 21:11:33 -0000 1.4 +++ DefaultArtifactCollector.java 18 May 2004 19:39:46 -0000 1.5 @@ -1,23 +1,25 @@ package org.apache.maven.artifact.collector; -import java.io.File; +import java.util.ArrayList; import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; import org.apache.maven.artifact.MavenArtifact; +import org.apache.maven.artifact.collector.ArtifactCollectionResult; +import org.apache.maven.artifact.collector.ArtifactCollector; import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.model.Dependency; import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProjectBuilder; import org.apache.maven.project.ProjectBuildingException; -import org.codehaus.plexus.logging.AbstractLogEnabled; - /** * * @author <a href="mailto:[EMAIL PROTECTED]">Michal Maczka</a> * @version $Id$ */ -public class DefaultArtifactCollector extends AbstractLogEnabled implements ArtifactCollector +public class DefaultArtifactCollector implements ArtifactCollector { /** @@ -25,41 +27,107 @@ */ private ArtifactResolver artifactResolver; + /** * @see org.apache.maven.artifact.collector.ArtifactCollector#getArtifacts(org.apache.maven.project.MavenProject) */ - public ArtifactCollectionResult collect( MavenProject project, MavenProjectBuilder projectBuilder ) throws Exception + public ArtifactCollectionResult collect( MavenProject project, MavenProjectBuilder projectBuilder ) + throws Exception { ArtifactCollectionResult retValue = new ArtifactCollectionResult(); - for ( Iterator i = project.getArtifacts().iterator(); i.hasNext(); ) - { - MavenArtifact artifact = ( MavenArtifact ) i.next(); - - Dependency dependency = artifact.getDependency(); - - String id = dependency.getId(); - - retValue.addArtifact( artifact, project ); + List queue = new LinkedList(); - MavenProject referencedProject = getProject( dependency, project, projectBuilder ); + queue.add( project ); + + while ( !queue.isEmpty() ) + { - if ( referencedProject != null ) + MavenProject currentProject = ( MavenProject ) queue.remove( 0 ); + + + for ( Iterator i = currentProject.getArtifacts().iterator(); i.hasNext(); ) { - retValue.merge( referencedProject ); - } + MavenArtifact newArtifact = ( MavenArtifact ) i.next(); - else - { - getLogger().debug( "POM for " + dependency.getId() + ":" + dependency.getVersion() + " not found" ); - - retValue.addArtifactWithoutPom( artifact.getDependency().getId() ); - } + String id = newArtifact.getDependency().getId(); + + if ( retValue.getArtifacts().containsKey( id ) ) + { + MavenArtifact knownArtifact = ( MavenArtifact ) retValue.getArtifacts().get( id ); + + String newVersion = newArtifact.getDependency().getVersion(); + + String knownVersion = knownArtifact.getDependency().getVersion(); + + if ( newVersion.equals( knownVersion ) ) + { + continue; + } + else + { + // WE HAVE A VERSION CONFLICT!! + + // will check if this artifact is in the top level project + // if it is - version at the top level project wins + //if ( project.getDependency( key ) != null ) + //{ + // continue; + //} + + List list; + + if ( retValue.getConflicts().containsKey( id ) ) + { + list = ( List ) retValue.getConflicts().get( id ); + } + else + { + list = new ArrayList(); + + list.add( knownArtifact ); + + retValue.getConflicts().put( id, list ); + } + + + list.add( newArtifact ); + } + } + else + { + //It's the first time we have encountered this artifact + + // Add the dependency itself + retValue.getArtifacts().put( id, newArtifact ); + + MavenProject referencedProject = getProject( newArtifact.getDependency(), currentProject, projectBuilder ); + + + if ( referencedProject == null ) + { + // the pom for this artifact is not present in local repository. + // we will note this fact + retValue.getArtifactsWithoutPoms().put( id, newArtifact ); + + continue; + } + else + { + //@hack for testing I need to propagate the location of mavenRepoLocal + //this shows that some settings should be detached from project. + + referencedProject.setLocalRepository( currentProject.getLocalRepository() ); + + // the pom for given dependency exisit we will add it to the queue + queue.add( referencedProject ); + + } + } + } } - - project.setArtifactCollectionResult( retValue ); return retValue; @@ -69,31 +137,27 @@ * @param pomArtifact * @return */ - private MavenProject getProject( Dependency dependency, - MavenProject project, MavenProjectBuilder projectBuilder ) + private MavenProject getProject( Dependency dependency, MavenProject project, MavenProjectBuilder projectBuilder ) throws Exception { - + MavenProject retValue = null; - + MavenArtifact pomArtifact = artifactResolver.getPomArtifact( dependency, project ); - + if ( pomArtifact != null ) { - try - { - - File f = pomArtifact.getFile(); - - retValue = projectBuilder.build( f ); - } - catch ( ProjectBuildingException e ) - { - throw new Exception( "POM for dependency: " + dependency.getId() - + " exists in local repository but cannot be parsed", e ); - } + try + { + retValue = projectBuilder.build( pomArtifact.getFile( ), true, false ); + } + catch ( ProjectBuildingException e ) + { + throw new Exception( "POM for dependency: " + dependency + + " exists in local repository but cannot be parsed", e ); + } } - + return retValue; } 1.5 +16 -133 maven-components/maven-project/src/main/java/org/apache/maven/artifact/collector/ArtifactCollectionResult.java Index: ArtifactCollectionResult.java =================================================================== RCS file: /home/cvs/maven-components/maven-project/src/main/java/org/apache/maven/artifact/collector/ArtifactCollectionResult.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- ArtifactCollectionResult.java 17 May 2004 21:11:33 -0000 1.4 +++ ArtifactCollectionResult.java 18 May 2004 19:39:46 -0000 1.5 @@ -1,13 +1,7 @@ package org.apache.maven.artifact.collector; -import java.util.HashSet; -import java.util.Iterator; import java.util.Map; import java.util.HashMap; -import java.util.Set; - -import org.apache.maven.artifact.MavenArtifact; -import org.apache.maven.project.MavenProject; /** * @author <a href="mailto:[EMAIL PROTECTED]">Jason van Zyl</a> @@ -15,152 +9,41 @@ */ public class ArtifactCollectionResult { - //We will keep artifacts in two data structures: - - /** Set<MavenArtifact> */ - private Set artifacts; - - /** Set<String> */ - private Set artifactsWithoutPoms; + /** Map<String,MavenArtifact> */ + private Map artifacts; + /** - * Map<String,ArtifactCollectionResultEntry> + * Map<String, List<MavenArtifact>> * */ - private Map entries; + private Map conflicts; - private boolean conflict; + /** Map<String,MavenArtifact> */ + private Map artifactsWithoutPoms; + public ArtifactCollectionResult() { - artifacts = new HashSet(); + artifacts = new HashMap(); - artifactsWithoutPoms = new HashSet(); - - entries = new HashMap(); - - + conflicts = new HashMap(); + artifactsWithoutPoms = new HashMap(); } - public Set getArtifacts() + public Map getArtifacts() { return artifacts; } - public Map getEntries() + public Map getConflicts() { - return entries; + return conflicts; } - public void addArtifact( MavenArtifact artifact, MavenProject project ) - { - - String id = artifact.getDependency().getId(); - - ArtifactCollectionResultEntry entry; - - if ( entries.containsKey( id ) ) - { - entry = ( ArtifactCollectionResultEntry ) entries.get( id ); - - entry.add( artifact, project ); - - } - - else - { - artifacts.add( artifact ); - - entry = new ArtifactCollectionResultEntry( artifact, project ); - - entries.put( id , entry ); - } - - conflict = conflict && entry.isConflict(); - - } - - public void addArtifactWithoutPom( String id ) - { - artifactsWithoutPoms.add( id ); - } - - public Set getArtifactsWithoutPoms() + public Map getArtifactsWithoutPoms() { return artifactsWithoutPoms; } - - public boolean isConflict() - { - return conflict; - } - - /** - * @todo this is still not opimal but I prefer simpler code at the moment - */ - public void merge( MavenProject project ) - { - ArtifactCollectionResult other = project.getArtifactCollectionResult(); - - Set artifactSet = other.getArtifacts(); - - for ( Iterator iter = artifactSet.iterator(); iter.hasNext(); ) - { - MavenArtifact artifact = ( MavenArtifact ) iter.next(); - - - String id = artifact.getDependency().getId(); - - addArtifact( artifact, project ); - - ArtifactCollectionResultEntry entry = ( ArtifactCollectionResultEntry ) entries.get( id ); - - ArtifactCollectionResultEntry otherEntry = ( ArtifactCollectionResultEntry ) other.entries.get( id ); - - entry.merge( otherEntry ); - - - - } - - artifactsWithoutPoms.addAll( other.getArtifactsWithoutPoms() ); - - } - - public boolean hasArtifact( String id ) - { - boolean retValue = false; - - for ( Iterator iter = artifacts.iterator(); iter.hasNext(); ) - { - MavenArtifact artifact = ( MavenArtifact ) iter.next(); - - if ( id.equals( artifact.getDependency().getId() ) ) - { - retValue = true; - - break; - } - - } - - return retValue; - } - - public boolean hasArtifactWithoutPom( String id ) - { - boolean retValue = artifactsWithoutPoms.contains( id ); - - return retValue; - } - - public ArtifactCollectionResultEntry getEntry( String id ) - { - ArtifactCollectionResultEntry retValue = ( ArtifactCollectionResultEntry ) entries.get( id ); - - return retValue; - - } - -} \ No newline at end of file +} 1.5 +1 -1 maven-components/maven-project/src/main/java/org/apache/maven/project/MavenProjectBuilder.java Index: MavenProjectBuilder.java =================================================================== RCS file: /home/cvs/maven-components/maven-project/src/main/java/org/apache/maven/project/MavenProjectBuilder.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- MavenProjectBuilder.java 4 Apr 2004 17:09:03 -0000 1.4 +++ MavenProjectBuilder.java 18 May 2004 19:39:46 -0000 1.5 @@ -32,7 +32,7 @@ MavenProject build( File project ) throws ProjectBuildingException; - MavenProject build( File project, boolean useParent ) + MavenProject build( File project, boolean useParentPom, boolean followTransitiveDeps ) throws ProjectBuildingException; // ---------------------------------------------------------------------- 1.14 +7 -3 maven-components/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java Index: DefaultMavenProjectBuilder.java =================================================================== RCS file: /home/cvs/maven-components/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- DefaultMavenProjectBuilder.java 17 May 2004 21:11:34 -0000 1.13 +++ DefaultMavenProjectBuilder.java 18 May 2004 19:39:46 -0000 1.14 @@ -80,10 +80,10 @@ public MavenProject build( File project ) throws ProjectBuildingException { - return build( project, true ); + return build( project, true, true ); } - public MavenProject build( File projectDescriptor, boolean useParentPom ) + public MavenProject build( File projectDescriptor, boolean useParentPom, boolean followTransitiveDeps ) throws ProjectBuildingException { try @@ -105,7 +105,11 @@ setupMavenFinalName( project ); - artifactCollector.collect( project, this ); + + if ( followTransitiveDeps ) + { + artifactCollector.collect( project, this ); + } project.initialize(); 1.4 +23 -22 maven-components/maven-project/src/test/java/org/apache/maven/artifact/collector/DefaultArtifactCollectorTest.java Index: DefaultArtifactCollectorTest.java =================================================================== RCS file: /home/cvs/maven-components/maven-project/src/test/java/org/apache/maven/artifact/collector/DefaultArtifactCollectorTest.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- DefaultArtifactCollectorTest.java 17 May 2004 21:11:34 -0000 1.3 +++ DefaultArtifactCollectorTest.java 18 May 2004 19:39:46 -0000 1.4 @@ -17,8 +17,10 @@ */ import java.io.File; -import java.util.Set; +import java.util.List; +import java.util.Map; +import org.apache.maven.artifact.MavenArtifact; import org.apache.maven.project.AbstractProjectTestCase; import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProjectBuilder; @@ -35,6 +37,7 @@ private ArtifactCollector artifactCollector; + private MavenProjectBuilder projectBuilder; public DefaultArtifactCollectorTest( String testName ) @@ -49,13 +52,10 @@ artifactCollector = ( ArtifactCollector ) lookup( ArtifactCollector.ROLE ); - projectBuilder = ( MavenProjectBuilder ) lookup( MavenProjectBuilder.ROLE ); - assertNotNull( "Test artifactCollector can't be null!", artifactCollector ); - System.setProperty( "maven.repo.local", getLocalRepository() ); + projectBuilder = ( MavenProjectBuilder ) lookup( MavenProjectBuilder.ROLE ); - System.out.println( "local repo:" + getLocalRepository() ); } @@ -77,10 +77,12 @@ project.setLocalRepository( getLocalRepository() ); ArtifactCollectionResult result = artifactCollector.collect( project, projectBuilder ); - - Set artifacts = result.getArtifacts(); - Set artifactsWithoutPoms = result.getArtifactsWithoutPoms(); + Map artifacts = result.getArtifacts(); + + Map conflicts = result.getConflicts(); + + Map artifactsWithoutPoms = result.getArtifactsWithoutPoms(); // [d 1.1] // | @@ -88,33 +90,32 @@ // | | // |---------------------- > [z] (no pom) - assertEquals( 4, artifacts.size() ); + assertTrue( artifacts.containsKey( "maven-test:maven-test-b" ) ); - assertTrue( result.hasArtifact( "maven-test:maven-test-b" ) ); + assertTrue( artifacts.containsKey( "maven-test:maven-test-c" ) ); - assertTrue( result.hasArtifact( "maven-test:maven-test-c" ) ); + assertTrue( artifacts.containsKey( "maven-test:maven-test-d" ) ); - assertTrue( result.hasArtifact( "maven-test:maven-test-d" ) ); + assertTrue( artifacts.containsKey( "maven-test:maven-test-z" ) ); - assertTrue( result.hasArtifact( "maven-test:maven-test-z" ) ); + assertTrue( artifactsWithoutPoms.containsKey( "maven-test:maven-test-z" ) ); - //assertTrue( result.isConflict() ); - - //assertEquals( 1, conflicts.size() ); - ArtifactCollectionResultEntry entryD = result.getEntry( "maven-test:maven-test-d" ); + assertEquals( 1, conflicts.size() ); - assertNotNull( entryD ); + assertTrue( conflicts.containsKey( "maven-test:maven-test-d" ) ); - assertEquals( 2, entryD.getVersions().size() ); + List conflictsForD = ( List ) conflicts.get( "maven-test:maven-test-d" ); - assertTrue( entryD.isConflict() ); + assertEquals( 2,conflictsForD.size() ); - assertTrue( entryD.getVersions().contains( "1.2" ) ); + MavenArtifact d_1_1 = ( MavenArtifact ) conflictsForD.get( 0 ); - assertTrue( entryD.getVersions().contains( "1.1" ) ); + MavenArtifact d_1_2 = ( MavenArtifact ) conflictsForD.get( 1 ); + assertEquals( "1.1", d_1_1.getDependency().getVersion() ); + assertEquals( "1.2", d_1_2.getDependency().getVersion() ); } catch ( Exception e ) {
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]