You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jd...@apache.org on 2006/11/11 01:40:23 UTC

svn commit: r473597 - in /maven/sandbox/maven-artifact-tools/src: main/java/org/apache/maven/shared/artifact/tools/components/ main/java/org/apache/maven/shared/artifact/tools/resolve/ test/java/org/apache/maven/shared/artifact/tools/components/ test/j...

Author: jdcasey
Date: Fri Nov 10 16:40:22 2006
New Revision: 473597

URL: http://svn.apache.org/viewvc?view=rev&rev=473597
Log:
Adding ability to retrieve available versions.

Added:
    maven/sandbox/maven-artifact-tools/src/main/java/org/apache/maven/shared/artifact/tools/resolve/ResolutionException.java   (with props)
    maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/resolve/testutils/
    maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/resolve/testutils/TestRepositorySource.java   (with props)
Modified:
    maven/sandbox/maven-artifact-tools/src/main/java/org/apache/maven/shared/artifact/tools/components/MavenComponentAccess.java
    maven/sandbox/maven-artifact-tools/src/main/java/org/apache/maven/shared/artifact/tools/resolve/ArtifactResolutionTool.java
    maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/components/MavenComponentAccessTest.java
    maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/resolve/ArtifactResolutionToolTest.java
    maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/testutils/MockedMavenComponentAccess.java

Modified: maven/sandbox/maven-artifact-tools/src/main/java/org/apache/maven/shared/artifact/tools/components/MavenComponentAccess.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-artifact-tools/src/main/java/org/apache/maven/shared/artifact/tools/components/MavenComponentAccess.java?view=diff&rev=473597&r1=473596&r2=473597
==============================================================================
--- maven/sandbox/maven-artifact-tools/src/main/java/org/apache/maven/shared/artifact/tools/components/MavenComponentAccess.java (original)
+++ maven/sandbox/maven-artifact-tools/src/main/java/org/apache/maven/shared/artifact/tools/components/MavenComponentAccess.java Fri Nov 10 16:40:22 2006
@@ -1,25 +1,26 @@
 package org.apache.maven.shared.artifact.tools.components;
 
-import java.util.Map;
-
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
 import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
+import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
 import org.apache.maven.artifact.resolver.ArtifactResolver;
 import org.apache.maven.project.MavenProjectBuilder;
 import org.apache.maven.settings.MavenSettingsBuilder;
 import org.apache.maven.shared.artifact.tools.InvalidConfigurationException;
+import org.codehaus.classworlds.ClassRealm;
+import org.codehaus.classworlds.NoSuchRealmException;
 import org.codehaus.plexus.PlexusConstants;
 import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.PlexusContainerException;
 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
-import org.codehaus.plexus.configuration.PlexusConfigurationResourceException;
 import org.codehaus.plexus.context.Context;
 import org.codehaus.plexus.context.ContextException;
 import org.codehaus.plexus.embed.Embedder;
-import org.codehaus.plexus.embed.PlexusEmbedder;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
 
+import java.util.Map;
+
 /**
  * @plexus.component role="org.apache.maven.shared.artifact.tools.components.MavenComponentAccess" role-hint="default"
  * 
@@ -55,6 +56,11 @@
      * @plexus.requirement
      */
     private MavenProjectBuilder mavenProjectBuilder;
+    
+    /**
+     * @plexus.requirement
+     */
+    private RepositoryMetadataManager repositoryMetadataManager;
 
     private PlexusContainer container;
 
@@ -62,6 +68,9 @@
 
     private static MavenComponentAccess selfContainedInstance;
 
+    // used with self-contained instance.
+    private static Embedder embedder;
+
     public MavenComponentAccess()
     {
         //used for Plexus-based initialization.
@@ -71,7 +80,9 @@
     public MavenComponentAccess( MavenSettingsBuilder settingsBuilder, ArtifactResolver artifactResolver,
                                  ArtifactHandlerManager artifactHandlerManager,
                                  ArtifactRepositoryFactory artifactRepositoryFactory,
-                                 MavenProjectBuilder mavenProjectBuilder, Map artifactRepositoryLayoutsById )
+                                 MavenProjectBuilder mavenProjectBuilder, 
+                                 RepositoryMetadataManager repositoryMetadataManager, 
+                                 Map artifactRepositoryLayoutsById )
     {
         this.settingsBuilder = settingsBuilder;
         this.artifactResolver = artifactResolver;
@@ -79,6 +90,27 @@
         this.artifactRepositoryFactory = artifactRepositoryFactory;
         this.mavenProjectBuilder = mavenProjectBuilder;
         this.artifactRepositoryLayoutsById = artifactRepositoryLayoutsById;
+        this.repositoryMetadataManager = repositoryMetadataManager;
+    }
+    
+    public static void shutdown()
+    {
+        if ( selfContainedInstance != null )
+        {
+            PlexusContainer container = embedder.getContainer();
+            ClassRealm containerRealm = container.getContainerRealm();
+            
+            embedder.stop();
+            container.dispose();
+            try
+            {
+                containerRealm.getWorld().disposeRealm( containerRealm.getId() );
+            }
+            catch ( NoSuchRealmException e )
+            {
+                // we're killing it anyway, so ignore this.
+            }
+        }
     }
 
     public static MavenComponentAccess createSelfContainedInstance()
@@ -86,24 +118,24 @@
     {
         if ( selfContainedInstance == null )
         {
-            PlexusEmbedder container = new Embedder();
+            embedder = new Embedder();
 
             try
             {
-                container.start();
+                embedder.start();
             }
             catch ( PlexusContainerException e )
             {
                 throw new ComponentAccessException( "Failed to start plexus container for maven artifact tooling.", e );
             }
-            catch ( PlexusConfigurationResourceException e )
-            {
-                throw new ComponentAccessException( "Failed to start plexus container for maven artifact tooling.", e );
-            }
+//            catch ( PlexusConfigurationResourceException e )
+//            {
+//                throw new ComponentAccessException( "Failed to start plexus container for maven artifact tooling.", e );
+//            }
 
             try
             {
-                selfContainedInstance = (MavenComponentAccess) container.lookup( ROLE );
+                selfContainedInstance = (MavenComponentAccess) embedder.lookup( ROLE );
             }
             catch ( ComponentLookupException e )
             {
@@ -220,6 +252,16 @@
     protected void setSettingsBuilder( MavenSettingsBuilder settingsBuilder )
     {
         this.settingsBuilder = settingsBuilder;
+    }
+
+    public RepositoryMetadataManager getRepositoryMetadataManager()
+    {
+        return repositoryMetadataManager;
+    }
+
+    public void setRepositoryMetadataManager( RepositoryMetadataManager repositoryMetadataManager )
+    {
+        this.repositoryMetadataManager = repositoryMetadataManager;
     }
 
 }

Modified: maven/sandbox/maven-artifact-tools/src/main/java/org/apache/maven/shared/artifact/tools/resolve/ArtifactResolutionTool.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-artifact-tools/src/main/java/org/apache/maven/shared/artifact/tools/resolve/ArtifactResolutionTool.java?view=diff&rev=473597&r1=473596&r2=473597
==============================================================================
--- maven/sandbox/maven-artifact-tools/src/main/java/org/apache/maven/shared/artifact/tools/resolve/ArtifactResolutionTool.java (original)
+++ maven/sandbox/maven-artifact-tools/src/main/java/org/apache/maven/shared/artifact/tools/resolve/ArtifactResolutionTool.java Fri Nov 10 16:40:22 2006
@@ -3,6 +3,12 @@
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
+import org.apache.maven.artifact.repository.metadata.Metadata;
+import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
+import org.apache.maven.artifact.repository.metadata.RepositoryMetadataResolutionException;
+import org.apache.maven.artifact.repository.metadata.Versioning;
+import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
 import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
 import org.apache.maven.artifact.resolver.ArtifactResolver;
@@ -12,9 +18,19 @@
 import org.apache.maven.shared.artifact.tools.InvalidConfigurationException;
 import org.apache.maven.shared.artifact.tools.components.MavenComponentAccess;
 import org.apache.maven.shared.artifact.tools.repository.ArtifactRepositorySource;
+import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Convenience API for resolving Artifacts and their associated POM metadata.
@@ -27,40 +43,154 @@
 
     private final MavenProjectBuilder mavenProjectBuilder;
 
+    private final RepositoryMetadataManager repositoryMetadataManager;
+
     public ArtifactResolutionTool( MavenComponentAccess componentAccess )
     {
         this.artifactResolver = componentAccess.getArtifactResolver();
         this.artifactHandlerManager = componentAccess.getArtifactHandlerManager();
         this.mavenProjectBuilder = componentAccess.getMavenProjectBuilder();
+        this.repositoryMetadataManager = componentAccess.getRepositoryMetadataManager();
     }
-    
+
     public ArtifactResolutionResult resolve( ArtifactQuery query, ArtifactRepositorySource repositorySource )
-        throws InvalidArtifactSpecificationException, ArtifactResolutionException, ArtifactNotFoundException,
-        InvalidConfigurationException, ProjectBuildingException
+        throws InvalidArtifactSpecificationException, InvalidConfigurationException, ResolutionException
     {
         Artifact artifact = query.createArtifact( artifactHandlerManager );
 
         ArtifactRepository localRepository = repositorySource.getLocalRepository();
 
         List repositories = repositorySource.getArtifactRepositories();
-        
-        artifactResolver.resolve( artifact, repositories, localRepository );
 
-        MavenProject project = mavenProjectBuilder.buildFromRepository( artifact, Collections.EMPTY_LIST,
-                                                                        localRepository );
+        try
+        {
+            artifactResolver.resolve( artifact, repositories, localRepository );
+        }
+        catch ( ArtifactResolutionException e )
+        {
+            throw new ResolutionException( artifact, "Failed to resolve: " + artifact.getId(), e );
+        }
+        catch ( ArtifactNotFoundException e )
+        {
+            throw new ResolutionException( artifact, "Artifact not found: " + artifact.getId(), e );
+        }
+
+        MavenProject project;
+        try
+        {
+            project = mavenProjectBuilder.buildFromRepository( artifact, Collections.EMPTY_LIST, localRepository );
+        }
+        catch ( ProjectBuildingException e )
+        {
+            throw new ResolutionException( artifact, "Failed to build POM metadata for: " + artifact.getId(), e );
+        }
 
         ArtifactResolutionResult result = new ArtifactResolutionResult( artifact, project );
 
         return result;
     }
 
-    public ArtifactResolutionResult resolveProjectMetadata( ArtifactQuery query, ArtifactRepositorySource repositorySource )
-        throws InvalidArtifactSpecificationException, ArtifactResolutionException, ArtifactNotFoundException,
-        InvalidConfigurationException, ProjectBuildingException
+    public ArtifactResolutionResult resolveProjectMetadata( ArtifactQuery query,
+                                                            ArtifactRepositorySource repositorySource )
+        throws InvalidArtifactSpecificationException, ResolutionException, InvalidConfigurationException
     {
         ArtifactQuery pomQuery = query.copy();
         pomQuery.setType( "pom" );
-        
+
         return resolve( pomQuery, repositorySource );
+    }
+
+    public List getAvailableVersions( String groupId, String artifactId, ArtifactRepositorySource repositorySource )
+        throws InvalidArtifactSpecificationException, InvalidConfigurationException, ResolutionException
+    {
+        ArtifactQuery query = new ArtifactQuery( groupId, artifactId );
+        query.setVersion( "not-used" );
+
+        Artifact artifact = query.createArtifact( artifactHandlerManager );
+
+        List remoteRepositories = repositorySource.getArtifactRepositories();
+        ArtifactRepository localRepository = repositorySource.getLocalRepository();
+
+        LinkedHashSet versions = new LinkedHashSet();
+        Map errors = new LinkedHashMap();
+        
+        readVersionsFromLocalRepository( artifact, localRepository, versions, errors );
+
+        readVersionsFromRemoteRepositories( artifact, localRepository, remoteRepositories, versions, errors );
+
+        if ( !errors.isEmpty() )
+        {
+            throw new ResolutionException( new ArtifactRepositoryMetadata( artifact ), errors );
+        }
+
+        List versionList = new ArrayList( versions );
+
+        Collections.sort( versionList );
+
+        return versionList;
+    }
+
+    private void readVersionsFromRemoteRepositories( Artifact artifact, ArtifactRepository localRepository, List remoteRepositories, LinkedHashSet versions, Map errors )
+    {
+        for ( Iterator it = remoteRepositories.iterator(); it.hasNext(); )
+        {
+            ArtifactRepository remoteRepository = (ArtifactRepository) it.next();
+
+            ArtifactRepositoryMetadata metadata = new ArtifactRepositoryMetadata( artifact );
+
+            try
+            {
+                repositoryMetadataManager.resolveAlways( metadata, localRepository, remoteRepository );
+            }
+            catch ( RepositoryMetadataResolutionException e )
+            {
+                errors.put( remoteRepository, e );
+                continue;
+            }
+
+            Metadata md = metadata.getMetadata();
+            Versioning versioning = md.getVersioning();
+
+            List availableVersions = versioning.getVersions();
+
+            versions.addAll( availableVersions );
+        }
+    }
+
+    private void readVersionsFromLocalRepository( Artifact artifact, ArtifactRepository localRepository, LinkedHashSet versions, Map errors )
+    {
+        FileReader reader = null;
+        
+        try
+        {
+            ArtifactRepositoryMetadata metadata = new ArtifactRepositoryMetadata( artifact );
+
+            File localOnly = new File( localRepository.getBasedir(), localRepository
+                .pathOfLocalRepositoryMetadata( metadata, localRepository ) );
+            
+            if ( localOnly.exists() && !localOnly.isDirectory() )
+            {
+                reader = new FileReader( localOnly );
+                Metadata md = new MetadataXpp3Reader().read( reader );
+                
+                if ( md != null )
+                {
+                    Versioning versioning = md.getVersioning();
+                    versions.addAll( versioning.getVersions() );
+                }
+            }
+        }
+        catch ( IOException e )
+        {
+            errors.put( localRepository, e );
+        }
+        catch ( XmlPullParserException e )
+        {
+            errors.put( localRepository, e );
+        }
+        finally
+        {
+            IOUtil.close( reader );
+        }
     }
 }

Added: maven/sandbox/maven-artifact-tools/src/main/java/org/apache/maven/shared/artifact/tools/resolve/ResolutionException.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-artifact-tools/src/main/java/org/apache/maven/shared/artifact/tools/resolve/ResolutionException.java?view=auto&rev=473597
==============================================================================
--- maven/sandbox/maven-artifact-tools/src/main/java/org/apache/maven/shared/artifact/tools/resolve/ResolutionException.java (added)
+++ maven/sandbox/maven-artifact-tools/src/main/java/org/apache/maven/shared/artifact/tools/resolve/ResolutionException.java Fri Nov 10 16:40:22 2006
@@ -0,0 +1,99 @@
+package org.apache.maven.shared.artifact.tools.resolve;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.metadata.ArtifactMetadata;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+
+import java.util.Iterator;
+import java.util.Map;
+
+public class ResolutionException
+    extends Exception
+{
+
+    public static final String TYPE_METADATA = "metadata";
+
+    public static final String TYPE_ARTIFACT = "artifact";
+
+    private static final long serialVersionUID = 1L;
+
+    private Map resolutionExceptionsByRepository;
+
+    private String type;
+
+    public ResolutionException( Artifact artifact, String message, Throwable cause )
+    {
+        super( "Failed to resolve: " + artifact.getId() + ". Reason: " + message, cause );
+        this.type = TYPE_ARTIFACT;
+    }
+
+    public ResolutionException( Artifact artifact, String message )
+    {
+        super( "Failed to resolve: " + artifact.getId() + ". Reason: " + message );
+        this.type = TYPE_ARTIFACT;
+    }
+
+    public ResolutionException( Artifact artifact, Map resolutionExceptionsByRepository )
+    {
+        super( "Failed to resolve: " + artifact.getId() + " from:\n  - "
+            + formatRepositories( resolutionExceptionsByRepository, "\n  - " ) + "\n" );
+
+        this.type = TYPE_ARTIFACT;
+        this.resolutionExceptionsByRepository = resolutionExceptionsByRepository;
+    }
+
+    public ResolutionException( ArtifactMetadata metadata, String message, Throwable cause )
+    {
+        super( "Failed to resolve: " + metadata.getClass().getName() + "[" + metadata.getGroupId() + ", "
+            + metadata.getArtifactId() + "]. Reason: " + message, cause );
+        this.type = TYPE_METADATA;
+    }
+
+    public ResolutionException( ArtifactMetadata metadata, String message )
+    {
+        super( "Failed to resolve: " + metadata.getClass().getName() + "[" + metadata.getGroupId() + ", "
+            + metadata.getArtifactId() + "]. Reason: " + message );
+        this.type = TYPE_METADATA;
+    }
+
+    public ResolutionException( ArtifactMetadata metadata, Map resolutionExceptionsByRepository )
+    {
+        super( "Failed to resolve: " + metadata.getClass().getName() + "[" + metadata.getGroupId() + ", "
+            + metadata.getArtifactId() + "] from:\n  - "
+            + formatRepositories( resolutionExceptionsByRepository, "\n  - " ) + "\n" );
+
+        this.type = TYPE_METADATA;
+        this.resolutionExceptionsByRepository = resolutionExceptionsByRepository;
+    }
+    
+    private static String formatRepositories( Map repositoryKeyedMap, String separator )
+    {
+        StringBuffer buffer = new StringBuffer();
+        for ( Iterator it = repositoryKeyedMap.keySet().iterator(); it.hasNext(); )
+        {
+            ArtifactRepository repo = (ArtifactRepository) it.next();
+            
+            buffer.append( separator );
+            buffer.append( repo.getId() ).append( " (" ).append( repo.getUrl() ).append( ')' );
+            
+        }
+        
+        return buffer.toString();
+    }
+
+    public boolean isMetadataError()
+    {
+        return TYPE_METADATA.equals( type );
+    }
+    
+    public boolean isArtifactError()
+    {
+        return TYPE_ARTIFACT.equals( type );
+    }
+    
+    public Map getResolutionExceptionsByRepository()
+    {
+        return resolutionExceptionsByRepository;
+    }
+
+}

Propchange: maven/sandbox/maven-artifact-tools/src/main/java/org/apache/maven/shared/artifact/tools/resolve/ResolutionException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-artifact-tools/src/main/java/org/apache/maven/shared/artifact/tools/resolve/ResolutionException.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Modified: maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/components/MavenComponentAccessTest.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/components/MavenComponentAccessTest.java?view=diff&rev=473597&r1=473596&r2=473597
==============================================================================
--- maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/components/MavenComponentAccessTest.java (original)
+++ maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/components/MavenComponentAccessTest.java Fri Nov 10 16:40:22 2006
@@ -66,7 +66,7 @@
 
         Map layouts = Collections.singletonMap( "test", arl );
 
-        MavenComponentAccess mca = new MavenComponentAccess( msb, ar, ahm, arf, mpb, layouts );
+        MavenComponentAccess mca = new MavenComponentAccess( msb, ar, ahm, arf, mpb, null, layouts );
 
         assertSame( arl, mca.getArtifactRepositoryLayout( "test" ) );
     }

Modified: maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/resolve/ArtifactResolutionToolTest.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/resolve/ArtifactResolutionToolTest.java?view=diff&rev=473597&r1=473596&r2=473597
==============================================================================
--- maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/resolve/ArtifactResolutionToolTest.java (original)
+++ maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/resolve/ArtifactResolutionToolTest.java Fri Nov 10 16:40:22 2006
@@ -2,17 +2,27 @@
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.repository.DefaultArtifactRepository;
+import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
+import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
+import org.apache.maven.artifact.repository.metadata.Metadata;
+import org.apache.maven.artifact.repository.metadata.Versioning;
+import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Writer;
 import org.apache.maven.model.Model;
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.ProjectBuildingException;
 import org.apache.maven.shared.artifact.tools.InvalidConfigurationException;
+import org.apache.maven.shared.artifact.tools.components.MavenComponentAccess;
 import org.apache.maven.shared.artifact.tools.repository.ArtifactRepositorySource;
+import org.apache.maven.shared.artifact.tools.resolve.testutils.TestRepositorySource;
 import org.apache.maven.shared.artifact.tools.testutils.MockedMavenComponentAccess;
 import org.apache.maven.shared.tools.easymock.MockManager;
+import org.apache.maven.shared.tools.easymock.TestFileManager;
+import org.codehaus.plexus.util.IOUtil;
 import org.easymock.MockControl;
 
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
 import java.util.Collections;
 import java.util.List;
 
@@ -22,36 +32,92 @@
     extends TestCase
 {
 
+    private TestFileManager fileManager = new TestFileManager( "ArtifactResolutionToolTest.", "" );
+
+    public void tearDown()
+        throws IOException
+    {
+        fileManager.cleanUp();
+    }
+
+    public void testGetAvailableVersions()
+        throws Exception
+    {
+        String groupId = "org.apache.maven";
+        String artifactId = "maven-artifact";
+
+        MockManager mm = new MockManager();
+
+        MavenComponentAccess componentAccess = buildComponentAccess( "jar", mm );
+
+        File dir = fileManager.createTempDir();
+
+        ArtifactRepositoryLayout layout = new DefaultRepositoryLayout();
+
+        ArtifactRepository repo = new DefaultArtifactRepository( "local", dir.toURL().toExternalForm(), layout, null,
+                                                                 null );
+
+        TestRepositorySource rs = new TestRepositorySource( repo, Collections.EMPTY_LIST );
+        
+        Metadata md = new Metadata();
+        md.setArtifactId( artifactId );
+        md.setGroupId( groupId );
+        
+        Versioning versioning = new Versioning();
+        versioning.addVersion( "2.0.4" );
+        
+        md.setVersioning( versioning );
+        
+        mm.replayAll();
+        
+        File mdFile = new File( dir, "org/apache/maven/maven-artifact/maven-metadata-local.xml" );
+        
+        mdFile.getParentFile().mkdirs();
+        
+        FileWriter writer = null;
+        
+        try
+        {
+            writer = new FileWriter( mdFile );
+            new MetadataXpp3Writer().write( writer, md );
+        }
+        finally
+        {
+            IOUtil.close( writer );
+        }
+
+        List versions = new ArtifactResolutionTool( componentAccess ).getAvailableVersions( groupId, artifactId, rs );
+
+        assertEquals( 1, versions.size() );
+        assertTrue( versions.contains( "2.0.4" ) );
+        
+        mm.verifyAll();
+    }
+
     public void testResolveArtifact()
-        throws InvalidArtifactSpecificationException, ArtifactResolutionException, ArtifactNotFoundException,
-        InvalidConfigurationException, ProjectBuildingException
+        throws ResolutionException, InvalidConfigurationException, InvalidArtifactSpecificationException
     {
         resolve( false );
     }
 
     public void testResolveProjectMetadata()
-        throws InvalidArtifactSpecificationException, ArtifactResolutionException, ArtifactNotFoundException,
-        InvalidConfigurationException, ProjectBuildingException
+        throws ResolutionException, InvalidConfigurationException, InvalidArtifactSpecificationException
     {
         resolve( true );
     }
 
     private void resolve( boolean resolveProjectOnly )
-        throws ArtifactResolutionException, ArtifactNotFoundException,
-        InvalidConfigurationException, ProjectBuildingException, InvalidArtifactSpecificationException
+        throws ResolutionException, InvalidConfigurationException, InvalidArtifactSpecificationException
     {
         String type = resolveProjectOnly ? "pom" : "jar";
 
         ArtifactQuery query = new ArtifactQuery( "group", "artifact" );
         query.setVersion( "1.0" );
 
-        MockedMavenComponentAccess componentAccess = new MockedMavenComponentAccess();
 
         MockManager mm = new MockManager();
 
-        componentAccess.expectGetArtifactResolver( mm );
-        componentAccess.expectGetArtifactHandlerManagerWithHandlerForTypeWithClassifier( mm, type, null );
-        componentAccess.expectGetProjectBuilder( mm );
+        MockedMavenComponentAccess componentAccess = buildComponentAccess( type, mm );
 
         List remoteRepos = Collections.EMPTY_LIST;
 
@@ -118,6 +184,18 @@
         assertSame( project, result.getProject() );
 
         mm.verifyAll();
+    }
+
+    private MockedMavenComponentAccess buildComponentAccess( String type, MockManager mm )
+    {
+        MockedMavenComponentAccess componentAccess = new MockedMavenComponentAccess();
+
+        componentAccess.expectGetArtifactResolver( mm );
+        componentAccess.expectGetArtifactHandlerManagerWithHandlerForTypeWithClassifier( mm, type, null );
+        componentAccess.expectGetProjectBuilder( mm );
+        componentAccess.expectGetRepositoryMetadataManager( mm );
+        
+        return componentAccess;
     }
 
 }

Added: maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/resolve/testutils/TestRepositorySource.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/resolve/testutils/TestRepositorySource.java?view=auto&rev=473597
==============================================================================
--- maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/resolve/testutils/TestRepositorySource.java (added)
+++ maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/resolve/testutils/TestRepositorySource.java Fri Nov 10 16:40:22 2006
@@ -0,0 +1,33 @@
+package org.apache.maven.shared.artifact.tools.resolve.testutils;
+
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.shared.artifact.tools.InvalidConfigurationException;
+import org.apache.maven.shared.artifact.tools.repository.ArtifactRepositorySource;
+
+import java.util.List;
+
+public class TestRepositorySource
+    implements ArtifactRepositorySource
+{
+    
+    private final ArtifactRepository localRepo;
+    private final List remoteRepos;
+
+    public TestRepositorySource( ArtifactRepository localRepo, List remoteRepos )
+    {
+        this.localRepo = localRepo;
+        this.remoteRepos = remoteRepos;
+    }
+
+    public List getArtifactRepositories()
+    {
+        return remoteRepos;
+    }
+
+    public ArtifactRepository getLocalRepository()
+        throws InvalidConfigurationException
+    {
+        return localRepo;
+    }
+
+}

Propchange: maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/resolve/testutils/TestRepositorySource.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/resolve/testutils/TestRepositorySource.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Modified: maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/testutils/MockedMavenComponentAccess.java
URL: http://svn.apache.org/viewvc/maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/testutils/MockedMavenComponentAccess.java?view=diff&rev=473597&r1=473596&r2=473597
==============================================================================
--- maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/testutils/MockedMavenComponentAccess.java (original)
+++ maven/sandbox/maven-artifact-tools/src/test/java/org/apache/maven/shared/artifact/tools/testutils/MockedMavenComponentAccess.java Fri Nov 10 16:40:22 2006
@@ -16,6 +16,7 @@
 import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
 import org.apache.maven.artifact.repository.DefaultArtifactRepository;
 import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
+import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
 import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
 import org.apache.maven.artifact.resolver.ArtifactResolver;
@@ -48,6 +49,8 @@
 
     private MockControl projectBuilderCtl;
 
+    private MockControl repositoryMetadataMgrCtl;
+
     public MockedMavenComponentAccess()
     {
     }
@@ -113,7 +116,7 @@
             throw new IllegalStateException( "Should never happen." );
         }
 
-        settingsBuilderCtl.setReturnValue( settings );
+        settingsBuilderCtl.setReturnValue( settings, MockControl.ZERO_OR_MORE );
     }
 
     public void expectGetArtifactRepositoryLayout( MockManager mockManager, String layoutId )
@@ -158,11 +161,11 @@
         ArtifactRepository repo = (ArtifactRepository) repoCtl.getMock();
 
         repo.getBasedir();
-        repoCtl.setReturnValue( basedir );
+        repoCtl.setReturnValue( basedir, MockControl.ZERO_OR_MORE );
 
         repoFactory.createArtifactRepository( null, null, null, null, null );
         repoFactoryCtl.setMatcher( MockControl.ALWAYS_MATCHER );
-        repoFactoryCtl.setReturnValue( repo );
+        repoFactoryCtl.setReturnValue( repo, MockControl.ZERO_OR_MORE );
     }
 
     public void expectCreateArtifactRepositoryWithUrl( MockManager mm, String url )
@@ -174,13 +177,13 @@
         ArtifactRepository repo = (ArtifactRepository) repoCtl.getMock();
 
         repo.getUrl();
-        repoCtl.setReturnValue( url );
+        repoCtl.setReturnValue( url, MockControl.ZERO_OR_MORE );
 
         mm.add( repoCtl );
 
         repoFactory.createArtifactRepository( null, null, null, null, null );
         repoFactoryCtl.setMatcher( MockControl.ALWAYS_MATCHER );
-        repoFactoryCtl.setReturnValue( repoCtl.getMock() );
+        repoFactoryCtl.setReturnValue( repoCtl.getMock(), MockControl.ZERO_OR_MORE );
     }
 
     public void expectCreateDefaultArtifactRepositoryWithIdNameLocationAndLayout( String id, String name,
@@ -195,7 +198,7 @@
         repoFactory.createArtifactRepository( null, null, null, null, null );
 
         repoFactoryCtl.setMatcher( MockControl.ALWAYS_MATCHER );
-        repoFactoryCtl.setReturnValue( repo );
+        repoFactoryCtl.setReturnValue( repo, MockControl.ZERO_OR_MORE );
     }
 
     public void expectCreateArtifactRepositoryWithIdUrlLayoutAndPolicies( MockManager mm, final String id,
@@ -233,7 +236,7 @@
 
         mm.add( repoCtl );
 
-        repoFactoryCtl.setReturnValue( repo );
+        repoFactoryCtl.setReturnValue( repo, MockControl.ZERO_OR_MORE );
     }
 
     public void expectGetArtifactResolver( MockManager mm )
@@ -263,10 +266,10 @@
         ArtifactHandler handler = (ArtifactHandler) handlerCtl.getMock();
 
         handler.getClassifier();
-        handlerCtl.setReturnValue( classifier );
+        handlerCtl.setReturnValue( classifier, MockControl.ZERO_OR_MORE );
 
         mgr.getArtifactHandler( type );
-        handlerManagerCtl.setReturnValue( handler );
+        handlerManagerCtl.setReturnValue( handler, MockControl.ZERO_OR_MORE );
     }
 
     public void expectGetProjectBuilder( MockManager mm )
@@ -381,12 +384,23 @@
 
             } );
             
-            projectBuilderCtl.setReturnValue( project );
+            projectBuilderCtl.setReturnValue( project, MockControl.ZERO_OR_MORE );
         }
         catch ( ProjectBuildingException e )
         {
             Assert.fail( "should not happen." );
         }
+    }
+
+    public void expectGetRepositoryMetadataManager( MockManager mm )
+    {
+        repositoryMetadataMgrCtl = MockControl.createControl( RepositoryMetadataManager.class );
+        
+        mm.add( repositoryMetadataMgrCtl );
+        
+        RepositoryMetadataManager rmm = (RepositoryMetadataManager) repositoryMetadataMgrCtl.getMock();
+        
+        setRepositoryMetadataManager( rmm );
     }
 
 }