Author: jdcasey Date: Tue Apr 8 16:49:27 2008 New Revision: 646141 URL: http://svn.apache.org/viewvc?rev=646141&view=rev Log: Fixing MNG-2861 and MNG-2123 based on fixed in 2.0.x codebase.
Modified: maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/ResolutionNode.java Modified: maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java URL: http://svn.apache.org/viewvc/maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java?rev=646141&r1=646140&r2=646141&view=diff ============================================================================== --- maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java (original) +++ maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java Tue Apr 8 16:49:27 2008 @@ -31,6 +31,8 @@ import org.apache.maven.artifact.versioning.ManagedVersionMap; import org.apache.maven.artifact.versioning.OverConstrainedVersionException; import org.apache.maven.artifact.versioning.VersionRange; +import org.codehaus.plexus.logging.LogEnabled; +import org.codehaus.plexus.logging.Logger; import java.util.ArrayList; import java.util.Collections; @@ -53,13 +55,14 @@ * @plexus.component */ public class DefaultArtifactCollector - implements ArtifactCollector + implements ArtifactCollector, LogEnabled { /** * The conflict resolver to use when none is specified. - * @plexus.requirement role-hint="nearest" + * @plexus.requirement role-hint="nearest" */ private ConflictResolver defaultConflictResolver; + private Logger logger; public ArtifactResolutionResult collect( Set artifacts, Artifact originatingArtifact, @@ -97,9 +100,9 @@ List conflictResolvers ) { ArtifactResolutionResult result = new ArtifactResolutionResult(); - + result.ListOriginatingArtifact( originatingArtifact ); - + if ( conflictResolvers == null ) { // TODO: warn that we're using the default conflict resolver @@ -110,7 +113,7 @@ Map resolvedArtifacts = new LinkedHashMap(); ResolutionNode root = new ResolutionNode( originatingArtifact, remoteRepositories ); - + try { root.addDependencies( artifacts, remoteRepositories, filter ); @@ -130,8 +133,26 @@ ManagedVersionMap versionMap = getManagedVersionsMap( originatingArtifact, managedVersions ); - recurse( result, root, resolvedArtifacts, versionMap, localRepository, remoteRepositories, source, filter, - listeners, conflictResolvers ); + try + { + recurse( result, root, resolvedArtifacts, versionMap, localRepository, remoteRepositories, source, filter, + listeners, conflictResolvers ); + } + catch ( CyclicDependencyException e ) + { + logger.debug( "While recursing: " + e.getMessage(), e ); + result.addCircularDependencyException( e ); + } + catch ( OverConstrainedVersionException e ) + { + logger.debug( "While recursing: " + e.getMessage(), e ); + result.addVersionRangeViolation( e ); + } + catch ( ArtifactResolutionException e ) + { + logger.debug( "While recursing: " + e.getMessage(), e ); + result.addErrorArtifactException( e ); + } Set set = new LinkedHashSet(); @@ -221,7 +242,7 @@ ArtifactFilter filter, List listeners, List conflictResolvers ) - //throws ArtifactResolutionException + throws CyclicDependencyException, ArtifactResolutionException, OverConstrainedVersionException { fireEvent( ResolutionListener.TEST_ARTIFACT, listeners, node ); @@ -272,12 +293,46 @@ for ( int j = 0; j < 2; j++ ) { Artifact resetArtifact = resetNodes[j].getArtifact(); - if ( ( resetArtifact.getVersion() == null ) && ( resetArtifact.getVersionRange() != null ) && - ( resetArtifact.getAvailableVersions() != null ) ) + + //MNG-2123: if the previous node was not a range, then it wouldn't have any available + //versions. We just clobbered the selected version above. (why? i have no idea.) + //So since we are here and this is ranges we must go figure out the version (for a third time...) + if ( resetArtifact.getVersion() == null && resetArtifact.getVersionRange() != null ) { - resetArtifact.selectVersion( resetArtifact.getVersionRange().matchVersion( - resetArtifact.getAvailableVersions() ).toString() ); + // go find the version. This is a total hack. See previous comment. + List versions = resetArtifact.getAvailableVersions(); + if ( versions == null ) + { + try + { + versions = + source.retrieveAvailableVersions( resetArtifact, localRepository, + remoteRepositories ); + resetArtifact.setAvailableVersions( versions ); + } + catch ( ArtifactMetadataRetrievalException e ) + { + resetArtifact.setDependencyTrail( node.getDependencyTrail() ); + throw new ArtifactResolutionException( + "Unable to get dependency information: " + + e.getMessage(), resetArtifact, + remoteRepositories, e ); + } + } + //end hack + + //MNG-2861: match version can return null + ArtifactVersion selectedVersion = resetArtifact.getVersionRange().matchVersion( resetArtifact.getAvailableVersions() ); + if (selectedVersion != null) + { + resetArtifact.selectVersion( selectedVersion.toString() ); + } + else + { + throw new OverConstrainedVersionException(" Unable to find a version in "+ resetArtifact.getAvailableVersions()+" to match the range "+ resetArtifact.getVersionRange(), resetArtifact); + } + fireEvent( ResolutionListener.SELECT_VERSION_FROM_RANGE, listeners, resetNodes[j] ); } } @@ -689,6 +744,11 @@ throw new IllegalStateException( "Unknown event: " + event ); } } + } + + public void enableLogging( Logger logger ) + { + this.logger = logger; } } Modified: maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/ResolutionNode.java URL: http://svn.apache.org/viewvc/maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/ResolutionNode.java?rev=646141&r1=646140&r2=646141&view=diff ============================================================================== --- maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/ResolutionNode.java (original) +++ maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/ResolutionNode.java Tue Apr 8 16:49:27 2008 @@ -21,6 +21,7 @@ import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.resolver.filter.ArtifactFilter; +import org.apache.maven.artifact.versioning.ArtifactVersion; import org.apache.maven.artifact.versioning.OverConstrainedVersionException; import java.util.ArrayList; @@ -53,9 +54,9 @@ { this.artifact = artifact; this.remoteRepositories = remoteRepositories; - this.depth = 0; - this.parents = Collections.EMPTY_LIST; - this.parent = null; + depth = 0; + parents = Collections.EMPTY_LIST; + parent = null; } public ResolutionNode( Artifact artifact, @@ -64,13 +65,13 @@ { this.artifact = artifact; this.remoteRepositories = remoteRepositories; - this.depth = parent.depth + 1; - this.parents = new ArrayList(); - this.parents.addAll( parent.parents ); - this.parents.add( parent.getKey() ); + depth = parent.depth + 1; + parents = new ArrayList(); + parents.addAll( parent.parents ); + parents.add( parent.getKey() ); this.parent = parent; } - + public Artifact getArtifact() { return artifact; @@ -142,8 +143,17 @@ if ( artifact.getVersion() == null ) { // set the recommended version - String version = artifact.getSelectedVersion().toString(); - artifact.selectVersion( version ); + ArtifactVersion selected = artifact.getSelectedVersion(); + //MNG-2123: null is a valid response to getSelectedVersion, don't + //assume it won't ever be. + if (selected != null) + { + artifact.selectVersion( selected.toString() ); + } + else + { + throw new OverConstrainedVersionException("Unable to get a selected Version for "+ artifact.getArtifactId(),artifact); + } } ids.add( 0, artifact ); @@ -190,7 +200,7 @@ public void enable() { - this.active = true; + 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 ) { @@ -204,7 +214,7 @@ public void disable() { - this.active = false; + active = false; if ( children != null ) { for ( Iterator i = children.iterator(); i.hasNext(); ) @@ -233,6 +243,7 @@ return success; } + @Override public String toString() { return artifact.toString() + " (" + depth + "; " + ( active ? "enabled" : "disabled" ) + ")";