Author: brett
Date: Sun Sep 25 22:52:36 2005
New Revision: 291563

URL: http://svn.apache.org/viewcvs?rev=291563&view=rev
Log:
PR: MNG-820
ensure only the right dependencies are used when two different versions have 
different deps.

Modified:
    
maven/components/trunk/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java
    
maven/components/trunk/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/ResolutionNode.java
    
maven/components/trunk/maven-artifact/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactCollectorTest.java

Modified: 
maven/components/trunk/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java
URL: 
http://svn.apache.org/viewcvs/maven/components/trunk/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java?rev=291563&r1=291562&r2=291563&view=diff
==============================================================================
--- 
maven/components/trunk/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java
 (original)
+++ 
maven/components/trunk/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java
 Sun Sep 25 22:52:36 2005
@@ -26,6 +26,7 @@
 import org.apache.maven.artifact.versioning.OverConstrainedVersionException;
 import org.apache.maven.artifact.versioning.VersionRange;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -72,17 +73,21 @@
 
             for ( Iterator i = resolvedArtifacts.values().iterator(); 
i.hasNext(); )
             {
-                ResolutionNode node = (ResolutionNode) i.next();
-                if ( !node.equals( root ) )
+                List nodes = (List) i.next();
+                for ( Iterator j = nodes.iterator(); j.hasNext(); )
                 {
-                    Artifact artifact = node.getArtifact();
-
-                    // If it was optional, we don't add it or its children, 
just allow the update of the version and scope
-                    if ( !node.getArtifact().isOptional() )
+                    ResolutionNode node = (ResolutionNode) j.next();
+                    if ( !node.equals( root ) && node.isActive() )
                     {
-                        artifact.setDependencyTrail( node.getDependencyTrail() 
);
+                        Artifact artifact = node.getArtifact();
+
+                        // If it was optional, we don't add it or its 
children, just allow the update of the version and scope
+                        if ( !node.getArtifact().isOptional() )
+                        {
+                            artifact.setDependencyTrail( 
node.getDependencyTrail() );
 
-                        set.add( node );
+                            set.add( node );
+                        }
                     }
                 }
             }
@@ -122,130 +127,156 @@
             }
         }
 
-        ResolutionNode previous = (ResolutionNode) resolvedArtifacts.get( key 
);
-        if ( previous != null )
+        List previousNodes = (List) resolvedArtifacts.get( key );
+        if ( previousNodes != null )
         {
-            // TODO: use as conflict resolver(s), chain and introduce version 
mediation
-            VersionRange previousRange = 
previous.getArtifact().getVersionRange();
-            VersionRange currentRange = node.getArtifact().getVersionRange();
-
-            if ( previousRange == null )
-            {
-                // version was already resolved
-                node.getArtifact().setVersion( 
previous.getArtifact().getVersion() );
-            }
-            else if ( currentRange == null )
+            for ( Iterator i = previousNodes.iterator(); i.hasNext(); )
             {
-                // version was already resolved
-                previous.getArtifact().setVersion( 
node.getArtifact().getVersion() );
-            }
-            else
-            {
-                // TODO: shouldn't need to double up on this work, only done 
for simplicity of handling recommended
-                // version but the restriction is identical
-                previous.getArtifact().setVersionRange( 
previousRange.restrict( currentRange ) );
-                node.getArtifact().setVersionRange( currentRange.restrict( 
previousRange ) );
-            }
+                ResolutionNode previous = (ResolutionNode) i.next();
 
-            // previous one is more dominant
-            if ( previous.getDepth() <= node.getDepth() )
-            {
-                checkScopeUpdate( node, previous, listeners );
-            }
-            else
-            {
-                checkScopeUpdate( previous, node, listeners );
-            }
+                if ( previous.isActive() )
+                {
+                    // Version mediation
+                    VersionRange previousRange = 
previous.getArtifact().getVersionRange();
+                    VersionRange currentRange = 
node.getArtifact().getVersionRange();
 
-            if ( previous.getDepth() <= node.getDepth() )
-            {
-                fireEvent( ResolutionListener.OMIT_FOR_NEARER, listeners, 
node, previous.getArtifact() );
-                return;
+                    // TODO: why do we force the version on it? what if they 
don't match?
+                    if ( previousRange == null )
+                    {
+                        // version was already resolved
+                        node.getArtifact().setVersion( 
previous.getArtifact().getVersion() );
+                    }
+                    else if ( currentRange == null )
+                    {
+                        // version was already resolved
+                        previous.getArtifact().setVersion( 
node.getArtifact().getVersion() );
+                    }
+                    else
+                    {
+                        // TODO: shouldn't need to double up on this work, 
only done for simplicity of handling recommended
+                        // version but the restriction is identical
+                        previous.getArtifact().setVersionRange( 
previousRange.restrict( currentRange ) );
+                        node.getArtifact().setVersionRange( 
currentRange.restrict( previousRange ) );
+                    }
+
+                    // Conflict Resolution
+                    // TODO: use as conflict resolver(s), chain
+
+                    // TODO: should this be part of mediation?
+                    // previous one is more dominant
+                    if ( previous.getDepth() <= node.getDepth() )
+                    {
+                        checkScopeUpdate( node, previous, listeners );
+                    }
+                    else
+                    {
+                        checkScopeUpdate( previous, node, listeners );
+                    }
+
+                    if ( previous.getDepth() <= node.getDepth() )
+                    {
+                        // previous was nearer
+                        fireEvent( ResolutionListener.OMIT_FOR_NEARER, 
listeners, node, previous.getArtifact() );
+                        node.disable();
+                    }
+                    else
+                    {
+                        previous.disable();
+                    }
+                }
             }
         }
-
-        resolvedArtifacts.put( key, node );
+        else
+        {
+            previousNodes = new ArrayList();
+            resolvedArtifacts.put( key, previousNodes );
+        }
+        previousNodes.add( node );
 
         fireEvent( ResolutionListener.INCLUDE_ARTIFACT, listeners, node );
 
-        fireEvent( ResolutionListener.PROCESS_CHILDREN, listeners, node );
-
-        for ( Iterator i = node.getChildrenIterator(); i.hasNext(); )
+        if ( node.isActive() )
         {
-            ResolutionNode child = (ResolutionNode) i.next();
-            // We leave in optional ones, but don't pick up its dependencies
-            if ( !child.isResolved() && !child.getArtifact().isOptional() )
+            fireEvent( ResolutionListener.PROCESS_CHILDREN, listeners, node );
+
+            for ( Iterator i = node.getChildrenIterator(); i.hasNext(); )
             {
-                Artifact artifact = child.getArtifact();
-                try
+                ResolutionNode child = (ResolutionNode) i.next();
+                // We leave in optional ones, but don't pick up its 
dependencies
+                if ( !child.isResolved() && !child.getArtifact().isOptional() )
                 {
-                    if ( artifact.getVersion() == null )
+                    Artifact artifact = child.getArtifact();
+                    try
                     {
-                        // set the recommended version
-                        VersionRange versionRange = artifact.getVersionRange();
-
-                        // TODO: maybe its better to just pass the range 
through to retrieval and use a transformation?
-                        ArtifactVersion version;
-                        if ( !versionRange.isSelectedVersionKnown() )
+                        if ( artifact.getVersion() == null )
                         {
-                            List versions = artifact.getAvailableVersions();
-                            if ( versions == null )
-                            {
-                                versions = source.retrieveAvailableVersions( 
artifact, localRepository,
-                                                                             
remoteRepositories );
-                                artifact.setAvailableVersions( versions );
-                            }
-
-                            version = versionRange.matchVersion( versions );
+                            // set the recommended version
+                            VersionRange versionRange = 
artifact.getVersionRange();
 
-                            if ( version == null )
+                            // TODO: maybe its better to just pass the range 
through to retrieval and use a transformation?
+                            ArtifactVersion version;
+                            if ( !versionRange.isSelectedVersionKnown() )
                             {
-                                if ( versions.isEmpty() )
+                                List versions = 
artifact.getAvailableVersions();
+                                if ( versions == null )
                                 {
-                                    throw new OverConstrainedVersionException(
-                                        "No versions are present in the 
repository for the artifact with a range " +
-                                            versionRange );
+                                    versions = 
source.retrieveAvailableVersions( artifact, localRepository,
+                                                                               
  remoteRepositories );
+                                    artifact.setAvailableVersions( versions );
                                 }
-                                else
+
+                                version = versionRange.matchVersion( versions 
);
+
+                                if ( version == null )
                                 {
-                                    throw new OverConstrainedVersionException(
-                                        "Couldn't find a version in " + 
versions + " to match range " + versionRange );
+                                    if ( versions.isEmpty() )
+                                    {
+                                        throw new 
OverConstrainedVersionException(
+                                            "No versions are present in the 
repository for the artifact with a range " +
+                                                versionRange );
+                                    }
+                                    else
+                                    {
+                                        throw new 
OverConstrainedVersionException( "Couldn't find a version in " +
+                                            versions + " to match range " + 
versionRange );
+                                    }
                                 }
                             }
-                        }
-                        else
-                        {
-                            version = versionRange.getSelectedVersion();
+                            else
+                            {
+                                version = versionRange.getSelectedVersion();
+                            }
+
+                            artifact.selectVersion( version.toString() );
+                            fireEvent( 
ResolutionListener.SELECT_VERSION_FROM_RANGE, listeners, child );
                         }
 
-                        artifact.selectVersion( version.toString() );
-                        fireEvent( 
ResolutionListener.SELECT_VERSION_FROM_RANGE, listeners, child );
+                        ResolutionGroup rGroup = source.retrieve( artifact, 
localRepository, remoteRepositories );
+                        child.addDependencies( rGroup.getArtifacts(), 
rGroup.getResolutionRepositories(), filter );
                     }
+                    catch ( CyclicDependencyException e )
+                    {
+                        // would like to throw this, but we have crappy stuff 
in the repo
+                        // no logger to use here either just now
 
-                    ResolutionGroup rGroup = source.retrieve( artifact, 
localRepository, remoteRepositories );
-                    child.addDependencies( rGroup.getArtifacts(), 
rGroup.getResolutionRepositories(), filter );
-                }
-                catch ( CyclicDependencyException e )
-                {
-                    // would like to throw this, but we have crappy stuff in 
the repo
-                    // no logger to use here either just now
+                        // TODO: should the remoteRepositories list be null 
here?!
+                        fireEvent( ResolutionListener.OMIT_FOR_CYCLE, 
listeners,
+                                   new ResolutionNode( e.getArtifact(), null, 
child ) );
+                    }
+                    catch ( ArtifactMetadataRetrievalException e )
+                    {
+                        artifact.setDependencyTrail( node.getDependencyTrail() 
);
+                        throw new TransitiveArtifactResolutionException( 
e.getMessage(), artifact, remoteRepositories,
+                                                                         e );
+                    }
 
-                    // TODO: should the remoteRepositories list be null here?!
-                    fireEvent( ResolutionListener.OMIT_FOR_CYCLE, listeners,
-                               new ResolutionNode( e.getArtifact(), null, 
child ) );
-                }
-                catch ( ArtifactMetadataRetrievalException e )
-                {
-                    artifact.setDependencyTrail( node.getDependencyTrail() );
-                    throw new TransitiveArtifactResolutionException( 
e.getMessage(), artifact, remoteRepositories, e );
+                    recurse( child, resolvedArtifacts, managedVersions, 
localRepository, remoteRepositories, source,
+                             filter, listeners );
                 }
-
-                recurse( child, resolvedArtifacts, managedVersions, 
localRepository, remoteRepositories, source, filter,
-                         listeners );
             }
-        }
 
-        fireEvent( ResolutionListener.FINISH_PROCESSING_CHILDREN, listeners, 
node );
+            fireEvent( ResolutionListener.FINISH_PROCESSING_CHILDREN, 
listeners, node );
+        }
     }
 
     private void checkScopeUpdate( ResolutionNode node, ResolutionNode 
previous, List listeners )

Modified: 
maven/components/trunk/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/ResolutionNode.java
URL: 
http://svn.apache.org/viewcvs/maven/components/trunk/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/ResolutionNode.java?rev=291563&r1=291562&r2=291563&view=diff
==============================================================================
--- 
maven/components/trunk/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/ResolutionNode.java
 (original)
+++ 
maven/components/trunk/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/ResolutionNode.java
 Sun Sep 25 22:52:36 2005
@@ -42,6 +42,8 @@
 
     private final List remoteRepositories;
 
+    private boolean active = true;
+
     public ResolutionNode( Artifact artifact, List remoteRepositories )
     {
         this.artifact = artifact;
@@ -144,4 +146,35 @@
         return remoteRepositories;
     }
 
+    public boolean isActive()
+    {
+        return active;
+    }
+
+    public void enable()
+    {
+        this.active = true;
+        // TODO: if it was null, we really need to go find them now... or is 
this taken care of by the ordering?
+        if ( children != null )
+        {
+            for ( Iterator i = children.iterator(); i.hasNext(); )
+            {
+                ResolutionNode node = (ResolutionNode) i.next();
+                node.enable();
+            }
+        }
+    }
+
+    public void disable()
+    {
+        this.active = false;
+        if ( children != null )
+        {
+            for ( Iterator i = children.iterator(); i.hasNext(); )
+            {
+                ResolutionNode node = (ResolutionNode) i.next();
+                node.disable();
+            }
+        }
+    }
 }

Modified: 
maven/components/trunk/maven-artifact/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactCollectorTest.java
URL: 
http://svn.apache.org/viewcvs/maven/components/trunk/maven-artifact/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactCollectorTest.java?rev=291563&r1=291562&r2=291563&view=diff
==============================================================================
--- 
maven/components/trunk/maven-artifact/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactCollectorTest.java
 (original)
+++ 
maven/components/trunk/maven-artifact/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactCollectorTest.java
 Sun Sep 25 22:52:36 2005
@@ -123,6 +123,66 @@
         assertEquals( "Check artifact list", createSet( new 
Object[]{a.artifact, c.artifact} ), res.getArtifacts() );
     }
 
+    public void 
testResolveCorrectDependenciesWhenDifferentDependenciesOnNearest()
+        throws ArtifactResolutionException, 
InvalidVersionSpecificationException
+    {
+        ArtifactSpec a = createArtifact( "a", "1.0" );
+        ArtifactSpec b = a.addDependency( "b", "1.0" );
+        ArtifactSpec c2 = b.addDependency( "c", "2.0" );
+        c2.addDependency( "d", "1.0" );
+
+        ArtifactSpec e = createArtifact( "e", "1.0" );
+        ArtifactSpec c1 = e.addDependency( "c", "1.0" );
+        ArtifactSpec f = c1.addDependency( "f", "1.0" );
+
+        ArtifactResolutionResult res = collect( createSet( new 
Object[]{a.artifact, e.artifact} ) );
+        assertEquals( "Check artifact list",
+                      createSet( new Object[]{a.artifact, b.artifact, 
e.artifact, c1.artifact, f.artifact} ),
+                      res.getArtifacts() );
+        assertEquals( "Check version", "1.0", getArtifact( "c", 
res.getArtifacts() ).getVersion() );
+    }
+
+    public void 
disabledtestResolveCorrectDependenciesWhenDifferentDependenciesOnNewest()
+        throws ArtifactResolutionException, 
InvalidVersionSpecificationException
+    {
+        // TODO: use newest conflict resolver
+        ArtifactSpec a = createArtifact( "a", "1.0" );
+        ArtifactSpec b = a.addDependency( "b", "1.0" );
+        ArtifactSpec c2 = b.addDependency( "c", "2.0" );
+        ArtifactSpec d = c2.addDependency( "d", "1.0" );
+
+        ArtifactSpec e = createArtifact( "e", "1.0" );
+        ArtifactSpec c1 = e.addDependency( "c", "1.0" );
+        c1.addDependency( "f", "1.0" );
+
+        ArtifactResolutionResult res = collect( createSet( new 
Object[]{a.artifact, e.artifact} ) );
+        assertEquals( "Check artifact list",
+                      createSet( new Object[]{a.artifact, b.artifact, 
e.artifact, c2.artifact, d.artifact} ),
+                      res.getArtifacts() );
+        assertEquals( "Check version", "2.0", getArtifact( "c", 
res.getArtifacts() ).getVersion() );
+    }
+
+    public void 
disabledtestResolveCorrectDependenciesWhenDifferentDependenciesOnNewestVersionReplaced()
+        throws ArtifactResolutionException, 
InvalidVersionSpecificationException
+    {
+        // TODO: use newest conflict resolver
+        ArtifactSpec a = createArtifact( "a", "1.0" );
+        ArtifactSpec b1 = a.addDependency( "b", "1.0" );
+        ArtifactSpec c = a.addDependency( "c", "1.0" );
+        ArtifactSpec d2 = b1.addDependency( "d", "2.0" );
+        d2.addDependency( "h", "1.0" );
+        ArtifactSpec d1 = c.addDependency( "d", "1.0" );
+        ArtifactSpec b2 = c.addDependency( "b", "2.0" );
+        ArtifactSpec e = b2.addDependency( "e", "1.0" );
+        ArtifactSpec g = d1.addDependency( "g", "1.0" );
+
+        ArtifactResolutionResult res = collect( createSet( new 
Object[]{a.artifact} ) );
+        Object[] artifacts = new Object[]{a.artifact, c.artifact, d1.artifact, 
b2.artifact, e.artifact, g.artifact};
+        assertEquals( "Check artifact list", createSet( artifacts ), 
res.getArtifacts() );
+        assertEquals( "Check version", "1.0", getArtifact( "d", 
res.getArtifacts() ).getVersion() );
+        assertEquals( "Check version", "2.0", getArtifact( "b", 
res.getArtifacts() ).getVersion() );
+    }
+
     public void testResolveNearestNewestIsNearest()
         throws ArtifactResolutionException, 
InvalidVersionSpecificationException
     {



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to