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/06/07 01:13:58 UTC

svn commit: r412235 - in /maven/shared/trunk/maven-shared-io: ./ src/main/java/org/apache/maven/shared/io/ src/main/java/org/apache/maven/shared/io/download/ src/main/java/org/apache/maven/shared/io/location/ src/main/java/org/apache/maven/shared/io/lo...

Author: jdcasey
Date: Tue Jun  6 16:13:56 2006
New Revision: 412235

URL: http://svn.apache.org/viewvc?rev=412235&view=rev
Log:
Added locator reimplementation which is based on configurable stack of strategies...they are about halfway tested as of now (will continue testing tomorrow). Also, moved the DownloadManager functionality to .download package, for consistency.

Added:
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DefaultDownloadManager.java   (with props)
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DownloadFailedException.java   (with props)
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DownloadManager.java   (with props)
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ArtifactBasedLocatorStrategy.java   (with props)
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ArtifactLocation.java   (with props)
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategy.java   (with props)
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/FileBasedLocation.java   (with props)
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/FileLocatorStrategy.java   (with props)
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/Location.java   (with props)
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/Locator.java   (with props)
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/LocatorStrategy.java   (with props)
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/URLLocation.java   (with props)
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/UrlBasedLocatorStrategy.java   (with props)
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/logging/
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/logging/DefaultMessageHolder.java   (with props)
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/logging/MessageHolder.java   (with props)
    maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/
    maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/AbstractLocationTest.java   (with props)
    maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/ArtifactLocationTest.java   (with props)
    maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/FileBasedLocationTest.java   (with props)
    maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/FileLocatorStrategyTest.java   (with props)
    maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/LocatorTest.java   (with props)
    maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/URLLocationTest.java   (with props)
    maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/logging/
    maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/logging/DefaultMessageHolderTest.java   (with props)
Removed:
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/DefaultDownloadManager.java
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/DownloadFailedException.java
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/DownloadManager.java
    maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/Locator.java
    maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/LocatorTest.java
Modified:
    maven/shared/trunk/maven-shared-io/pom.xml

Modified: maven/shared/trunk/maven-shared-io/pom.xml
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/pom.xml?rev=412235&r1=412234&r2=412235&view=diff
==============================================================================
--- maven/shared/trunk/maven-shared-io/pom.xml (original)
+++ maven/shared/trunk/maven-shared-io/pom.xml Tue Jun  6 16:13:56 2006
@@ -26,18 +26,32 @@
   <dependencies>
     <dependency>
       <groupId>org.apache.maven</groupId>
+      <artifactId>maven-artifact</artifactId>
+      <version>[2.0,)</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
       <artifactId>maven-artifact-manager</artifactId>
-      <version>2.0</version>
+      <version>[2.0,)</version>
     </dependency>
     <dependency>
       <groupId>org.apache.maven.wagon</groupId>
       <artifactId>wagon-provider-api</artifactId>
-      <version>1.0-alpha-6</version>
+      <version>[1.0-alpha-6,1.0]</version>
     </dependency>
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-utils</artifactId>
-      <version>1.0.4</version>
+      <version>[1.0.4,1.2]</version>
     </dependency>
   </dependencies>
+
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>cobertura-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </reporting>
 </project>

Added: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DefaultDownloadManager.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DefaultDownloadManager.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DefaultDownloadManager.java (added)
+++ maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DefaultDownloadManager.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,136 @@
+package org.apache.maven.shared.io.download;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.maven.artifact.manager.WagonManager;
+import org.apache.maven.wagon.ConnectionException;
+import org.apache.maven.wagon.ResourceDoesNotExistException;
+import org.apache.maven.wagon.TransferFailedException;
+import org.apache.maven.wagon.UnsupportedProtocolException;
+import org.apache.maven.wagon.Wagon;
+import org.apache.maven.wagon.authentication.AuthenticationException;
+import org.apache.maven.wagon.authorization.AuthorizationException;
+import org.apache.maven.wagon.events.TransferListener;
+import org.apache.maven.wagon.repository.Repository;
+
+public class DefaultDownloadManager implements DownloadManager
+{
+    
+    private WagonManager wagonManager;
+    
+    public DefaultDownloadManager()
+    {
+    }
+    
+    public DefaultDownloadManager( WagonManager wagonManager )
+    {
+        this.wagonManager = wagonManager;
+    }
+    
+    public File download( String url ) throws DownloadFailedException
+    {
+        return download( url, Collections.EMPTY_LIST );
+    }
+    
+    public File download( String url, List transferListeners ) throws DownloadFailedException
+    {
+        URL sourceUrl;
+        try
+        {
+            sourceUrl = new URL( url );
+        }
+        catch ( MalformedURLException e )
+        {
+            throw new DownloadFailedException( url, "Download failed due to invalid URL. Reason: " + e.getMessage(), e );
+        }
+
+        Wagon wagon = null;
+
+        try
+        {
+            // Retrieve the correct Wagon instance used to download the remote archive
+            wagon = wagonManager.getWagon( sourceUrl.getProtocol() );
+
+            // create the landing file in /tmp for the downloaded source archive
+            File downloaded = File.createTempFile( "source-archive-", null );
+            downloaded.deleteOnExit();
+
+            // split the download URL into base URL and remote path for connecting, then retrieving.
+            String remotePath = sourceUrl.getPath();
+            String baseUrl = url.substring( 0, url.length() - remotePath.length() );
+
+            for ( Iterator it = transferListeners.iterator(); it.hasNext(); )
+            {
+                TransferListener listener = (TransferListener) it.next();
+                wagon.addTransferListener( listener );
+            }
+
+            // connect to the remote site, and retrieve the archive. Note the separate methods in which
+            // base URL and remote path are used.
+            Repository repo = new Repository( sourceUrl.getHost(), baseUrl );
+            
+            wagon.connect( repo, wagonManager.getAuthenticationInfo( repo.getId() ), wagonManager.getProxy( sourceUrl
+                .getProtocol() ) );
+            
+            wagon.get( remotePath, downloaded );
+            
+            return downloaded;
+        }
+        catch ( UnsupportedProtocolException e )
+        {
+            throw new DownloadFailedException( url, "Download failed. Reason: " + e.getMessage(), e );
+        }
+        catch ( IOException e )
+        {
+            throw new DownloadFailedException( url, "Download failed. Reason: " + e.getMessage(), e );
+        }
+        catch ( TransferFailedException e )
+        {
+            throw new DownloadFailedException( url, "Download failed. Reason: " + e.getMessage(), e );
+        }
+        catch ( ResourceDoesNotExistException e )
+        {
+            throw new DownloadFailedException( url, "Download failed. Reason: " + e.getMessage(), e );
+        }
+        catch ( AuthorizationException e )
+        {
+            throw new DownloadFailedException( url, "Download failed. Reason: " + e.getMessage(), e );
+        }
+        catch ( ConnectionException e )
+        {
+            throw new DownloadFailedException( url, "Download failed. Reason: " + e.getMessage(), e );
+        }
+        catch ( AuthenticationException e )
+        {
+            throw new DownloadFailedException( url, "Download failed. Reason: " + e.getMessage(), e );
+        }
+        finally
+        {
+            // ensure the Wagon instance is closed out properly.
+            if ( wagon != null )
+            {
+                try
+                {
+                    wagon.disconnect();
+                }
+                catch ( ConnectionException e )
+                {
+//                    getLog().debug( "Failed to disconnect wagon for: " + url, e );
+                }
+
+                for ( Iterator it = transferListeners.iterator(); it.hasNext(); )
+                {
+                    TransferListener listener = (TransferListener) it.next();
+                    wagon.removeTransferListener( listener );
+                }
+            }
+        }
+    }
+
+}

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DefaultDownloadManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DefaultDownloadManager.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DownloadFailedException.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DownloadFailedException.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DownloadFailedException.java (added)
+++ maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DownloadFailedException.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,28 @@
+package org.apache.maven.shared.io.download;
+
+public class DownloadFailedException
+    extends Exception
+{
+    
+    private static final long serialVersionUID = 1L;
+    
+    private String url;
+
+    public DownloadFailedException( String url, String message, Throwable cause )
+    {
+        super( message, cause );
+        this.url = url;
+    }
+
+    public DownloadFailedException( String url, String message )
+    {
+        super( message );
+        this.url = url;
+    }
+    
+    public String getUrl()
+    {
+        return url;
+    }
+
+}

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DownloadFailedException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DownloadFailedException.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DownloadManager.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DownloadManager.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DownloadManager.java (added)
+++ maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DownloadManager.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,15 @@
+package org.apache.maven.shared.io.download;
+
+import java.io.File;
+import java.util.List;
+
+public interface DownloadManager
+{
+
+    File download( String url )
+        throws DownloadFailedException;
+
+    File download( String url, List transferListeners )
+        throws DownloadFailedException;
+
+}
\ No newline at end of file

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DownloadManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/download/DownloadManager.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ArtifactBasedLocatorStrategy.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ArtifactBasedLocatorStrategy.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ArtifactBasedLocatorStrategy.java (added)
+++ maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ArtifactBasedLocatorStrategy.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,103 @@
+package org.apache.maven.shared.io.location;
+
+import java.util.List;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+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.resolver.ArtifactResolver;
+import org.apache.maven.shared.io.logging.MessageHolder;
+
+public class ArtifactBasedLocatorStrategy
+    implements LocatorStrategy
+{
+    private final ArtifactFactory factory;
+
+    private final ArtifactResolver resolver;
+
+    private String defaultArtifactType = "jar";
+
+    private final ArtifactRepository localRepository;
+
+    private final List remoteRepositories;
+
+    public ArtifactBasedLocatorStrategy( ArtifactFactory factory, ArtifactResolver resolver,
+                                         ArtifactRepository localRepository, List remoteRepositories )
+    {
+        this.factory = factory;
+        this.resolver = resolver;
+        this.localRepository = localRepository;
+        this.remoteRepositories = remoteRepositories;
+    }
+
+    public ArtifactBasedLocatorStrategy( ArtifactFactory factory, ArtifactResolver resolver,
+                                         ArtifactRepository localRepository, List remoteRepositories,
+                                         String defaultArtifactType )
+    {
+        this.factory = factory;
+        this.resolver = resolver;
+        this.localRepository = localRepository;
+        this.remoteRepositories = remoteRepositories;
+        this.defaultArtifactType = defaultArtifactType;
+    }
+
+    public Location resolve( String locationSpecification, MessageHolder messageHolder )
+    {
+        String[] parts = locationSpecification.split( ":" );
+
+        Location location = null;
+
+        if ( parts.length > 2 )
+        {
+            String groupId = parts[0];
+            String artifactId = parts[1];
+            String version = parts[2];
+
+            String type = defaultArtifactType;
+            if ( parts.length > 3 )
+            {
+                type = parts[3];
+            }
+
+            String classifier = null;
+            if ( parts.length > 4 )
+            {
+                classifier = parts[4];
+            }
+
+            Artifact artifact;
+            if ( classifier == null )
+            {
+                artifact = factory.createArtifact( groupId, artifactId, version, null, type );
+            }
+            else
+            {
+                artifact = factory.createArtifactWithClassifier( groupId, artifactId, version, type, classifier );
+            }
+
+            messageHolder.append( "Resolving artifact: " + artifact.getId() );
+            try
+            {
+                resolver.resolve( artifact, remoteRepositories, localRepository );
+                
+                if ( artifact.getFile() != null )
+                {
+                    location = new ArtifactLocation( artifact, locationSpecification );
+                }
+            }
+            catch ( ArtifactResolutionException e )
+            {
+                messageHolder.append( e );
+            }
+            catch ( ArtifactNotFoundException e )
+            {
+                messageHolder.append( e );
+            }
+        }
+
+        return location;
+    }
+
+}

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ArtifactBasedLocatorStrategy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ArtifactBasedLocatorStrategy.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ArtifactLocation.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ArtifactLocation.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ArtifactLocation.java (added)
+++ maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ArtifactLocation.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,15 @@
+package org.apache.maven.shared.io.location;
+
+import org.apache.maven.artifact.Artifact;
+
+public class ArtifactLocation
+    extends FileBasedLocation
+{
+
+    public ArtifactLocation( Artifact artifact, String specification )
+    {
+        super( specification );
+        setFile( artifact.getFile() );
+    }
+
+}

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ArtifactLocation.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ArtifactLocation.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategy.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategy.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategy.java (added)
+++ maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategy.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,48 @@
+package org.apache.maven.shared.io.location;
+
+import java.net.URL;
+
+import org.apache.maven.shared.io.logging.MessageHolder;
+
+public class ClasspathResourceLocatorStrategy
+    implements LocatorStrategy
+{
+
+    private String tempFilePrefix = "location.";
+
+    private String tempFileSuffix = ".cpurl";
+
+    private boolean tempFileDeleteOnExit = true;
+
+    public ClasspathResourceLocatorStrategy()
+    {
+    }
+
+    public ClasspathResourceLocatorStrategy( String tempFilePrefix, String tempFileSuffix, boolean tempFileDeleteOnExit )
+    {
+        this.tempFilePrefix = tempFilePrefix;
+        this.tempFileSuffix = tempFileSuffix;
+        this.tempFileDeleteOnExit = tempFileDeleteOnExit;
+    }
+
+    public Location resolve( String locationSpecification, MessageHolder messageHolder )
+    {
+        ClassLoader cloader = Thread.currentThread().getContextClassLoader();
+
+        URL resource = cloader.getResource( locationSpecification );
+
+        messageHolder.addMessage( "Resolved url: " + resource + " from classloader: " + cloader + " for location: "
+            + locationSpecification );
+        
+        Location location = null;
+
+        if ( resource != null )
+        {
+            location = new URLLocation( resource, locationSpecification, tempFilePrefix, tempFileSuffix,
+                                        tempFileDeleteOnExit );
+        }
+
+        return location;
+    }
+
+}

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/ClasspathResourceLocatorStrategy.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/FileBasedLocation.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/FileBasedLocation.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/FileBasedLocation.java (added)
+++ maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/FileBasedLocation.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,102 @@
+package org.apache.maven.shared.io.location;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+
+
+public class FileBasedLocation
+    implements Location
+{
+
+    private File file;
+    private FileChannel channel;
+    private final String specification;
+    
+    public FileBasedLocation( File file, String specification )
+    {
+        this.file = file;
+        this.specification = specification;
+    }
+    
+    protected FileBasedLocation( String specification )
+    {
+        this.specification = specification;
+    }
+
+    public void close()
+    {
+        if ( channel != null && channel.isOpen() )
+        {
+            try
+            {
+                channel.close();
+            }
+            catch ( IOException e )
+            {
+                //swallow it.
+            }
+        }        
+    }
+
+    public File getFile()
+        throws IOException
+    {
+        initFile();
+        
+        return unsafeGetFile();
+    }
+    
+    protected File unsafeGetFile()
+    {
+        return file;
+    }
+
+    protected void initFile()
+        throws IOException
+    {
+        // TODO: Log this in the debug log-level...
+        if ( file == null )
+        {
+            file = new File( specification );
+        }
+    }
+    
+    protected void setFile( File file )
+    {
+        if ( channel != null )
+        {
+            throw new IllegalStateException( "Location is already open; cannot setFile(..)." ); 
+        }
+        
+        this.file = file;
+    }
+
+    public String getSpecification()
+    {
+        return specification;
+    }
+
+    public void open()
+        throws IOException
+    {
+        initFile();
+        
+        channel = new FileInputStream( file ).getChannel();
+    }
+
+    public int read( ByteBuffer buffer )
+        throws IOException
+    {
+        return channel.read( buffer );
+    }
+
+    public int read( byte[] buffer )
+        throws IOException
+    {
+        return channel.read( ByteBuffer.wrap( buffer ) );
+    }
+
+}

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/FileBasedLocation.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/FileBasedLocation.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/FileLocatorStrategy.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/FileLocatorStrategy.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/FileLocatorStrategy.java (added)
+++ maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/FileLocatorStrategy.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,40 @@
+package org.apache.maven.shared.io.location;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.maven.shared.io.logging.MessageHolder;
+
+public class FileLocatorStrategy
+    implements LocatorStrategy
+{
+
+    public Location resolve( String locationSpecification, MessageHolder messageHolder )
+    {
+        File file = new File( locationSpecification );
+        
+        try
+        {
+            File canFile = file.getCanonicalFile();
+            file = canFile;
+        }
+        catch ( IOException e )
+        {
+            messageHolder.addMessage( "Failed to canonicalize: " + file.getAbsolutePath(), e );
+        }
+        
+        Location location = null;
+        
+        if ( file.exists() )
+        {
+            location = new FileBasedLocation( file, locationSpecification );
+        }
+        else
+        {
+            messageHolder.addMessage( "File: " + file.getAbsolutePath() + " does not exist." );
+        }
+        
+        return location;
+    }
+
+}

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/FileLocatorStrategy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/FileLocatorStrategy.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/Location.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/Location.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/Location.java (added)
+++ maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/Location.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,22 @@
+package org.apache.maven.shared.io.location;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public interface Location
+{
+    
+    File getFile() throws IOException;
+    
+    void open() throws IOException;
+    
+    void close();
+    
+    int read( ByteBuffer buffer ) throws IOException;
+    
+    int read( byte[] buffer ) throws IOException;
+    
+    String getSpecification();
+
+}

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/Location.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/Location.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/Locator.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/Locator.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/Locator.java (added)
+++ maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/Locator.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,63 @@
+package org.apache.maven.shared.io.location;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.maven.shared.io.logging.DefaultMessageHolder;
+import org.apache.maven.shared.io.logging.MessageHolder;
+
+public final class Locator
+{
+    
+    private List strategies;
+    private final MessageHolder messageHolder;
+    
+    public Locator( List strategies, MessageHolder messageHolder )
+    {
+        this.messageHolder = messageHolder;
+        this.strategies = new ArrayList( strategies );
+    }
+    
+    public Locator()
+    {
+        this.messageHolder = new DefaultMessageHolder();
+        this.strategies = new ArrayList();
+    }
+    
+    public void addStrategy( LocatorStrategy strategy )
+    {
+        this.strategies.add( strategy );
+    }
+
+    public void removeStrategy( LocatorStrategy strategy )
+    {
+        this.strategies.remove( strategy );
+    }
+    
+    public void setStrategies( List strategies )
+    {
+        this.strategies.clear();
+        this.strategies.addAll( strategies );
+    }
+
+    public List getStrategies()
+    {
+        return strategies;
+    }
+    
+    public Location resolve( String locationSpecification )
+    {
+        Location location = null;
+        
+        for ( Iterator it = strategies.iterator(); location == null && it.hasNext(); )
+        {
+            LocatorStrategy strategy = (LocatorStrategy) it.next();
+            
+            location = strategy.resolve( locationSpecification, messageHolder );
+        }
+        
+        return location;
+    }
+    
+}

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/Locator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/Locator.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/LocatorStrategy.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/LocatorStrategy.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/LocatorStrategy.java (added)
+++ maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/LocatorStrategy.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,10 @@
+package org.apache.maven.shared.io.location;
+
+import org.apache.maven.shared.io.logging.MessageHolder;
+
+public interface LocatorStrategy
+{
+    
+    Location resolve( String locationSpecification, MessageHolder messageHolder );
+
+}

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/LocatorStrategy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/LocatorStrategy.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/URLLocation.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/URLLocation.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/URLLocation.java (added)
+++ maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/URLLocation.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,51 @@
+package org.apache.maven.shared.io.location;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+import org.codehaus.plexus.util.FileUtils;
+
+public class URLLocation
+    extends FileBasedLocation
+{
+
+    private final URL url;
+
+    private final String tempFilePrefix;
+
+    private final String tempFileSuffix;
+
+    private final boolean tempFileDeleteOnExit;
+
+    public URLLocation( URL url, String specification, String tempFilePrefix, String tempFileSuffix,
+                        boolean tempFileDeleteOnExit )
+    {
+        super( specification );
+
+        this.url = url;
+        this.tempFilePrefix = tempFilePrefix;
+        this.tempFileSuffix = tempFileSuffix;
+        this.tempFileDeleteOnExit = tempFileDeleteOnExit;
+    }
+
+    protected void initFile()
+        throws IOException
+    {
+        // TODO: Log this in the debug log-level...
+        if ( unsafeGetFile() == null )
+        {
+            File tempFile = File.createTempFile( tempFilePrefix, tempFileSuffix );
+
+            if ( tempFileDeleteOnExit )
+            {
+                tempFile.deleteOnExit();
+            }
+
+            FileUtils.copyURLToFile( url, tempFile );
+            
+            setFile( tempFile );
+        }
+    }
+
+}

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/URLLocation.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/URLLocation.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/UrlBasedLocatorStrategy.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/UrlBasedLocatorStrategy.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/UrlBasedLocatorStrategy.java (added)
+++ maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/UrlBasedLocatorStrategy.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,49 @@
+package org.apache.maven.shared.io.location;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.apache.maven.shared.io.logging.MessageHolder;
+
+public class UrlBasedLocatorStrategy
+    implements LocatorStrategy
+{
+
+    private String tempFilePrefix = "location.";
+
+    private String tempFileSuffix = ".url";
+
+    private boolean tempFileDeleteOnExit = true;
+
+    public UrlBasedLocatorStrategy()
+    {
+    }
+
+    public UrlBasedLocatorStrategy( String tempFilePrefix, String tempFileSuffix, boolean tempFileDeleteOnExit )
+    {
+        this.tempFilePrefix = tempFilePrefix;
+        this.tempFileSuffix = tempFileSuffix;
+        this.tempFileDeleteOnExit = tempFileDeleteOnExit;
+    }
+
+    public Location resolve( String locationSpecification, MessageHolder messageHolder )
+    {
+        Location location = null;
+
+        messageHolder.append( "Building URL from location: " + locationSpecification );
+        try
+        {
+            URL url = new URL( locationSpecification );
+
+            location = new URLLocation( url, locationSpecification, tempFilePrefix, tempFileSuffix,
+                                        tempFileDeleteOnExit );
+        }
+        catch ( MalformedURLException e )
+        {
+            messageHolder.append( e );
+        }
+
+        return location;
+    }
+
+}

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/UrlBasedLocatorStrategy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/location/UrlBasedLocatorStrategy.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/logging/DefaultMessageHolder.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/logging/DefaultMessageHolder.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/logging/DefaultMessageHolder.java (added)
+++ maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/logging/DefaultMessageHolder.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,156 @@
+package org.apache.maven.shared.io.logging;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+
+public class DefaultMessageHolder
+    implements MessageHolder
+{
+    
+    private List messages = new ArrayList();
+    private Message currentMessage;
+
+    public MessageHolder addMessage( CharSequence messagePart, Throwable error )
+    {
+        newMessage();
+        append( messagePart );
+        append( error );
+        
+        return this;
+    }
+
+    public MessageHolder addMessage( CharSequence messagePart )
+    {
+        newMessage();
+        append( messagePart );
+        
+        return this;
+    }
+
+    public MessageHolder addMessage( Throwable error )
+    {
+        newMessage();
+        append( error );
+        
+        return this;
+    }
+
+    public MessageHolder append( CharSequence messagePart )
+    {
+        if ( currentMessage == null )
+        {
+            newMessage();
+        }        
+        
+        currentMessage.append( messagePart );
+        
+        return this;
+    }
+
+    public MessageHolder append( Throwable error )
+    {
+        if ( currentMessage == null )
+        {
+            newMessage();
+        }        
+        
+        currentMessage.setError( error );
+        
+        return this;
+    }
+
+    public boolean isEmpty()
+    {
+        return messages.isEmpty();
+    }
+
+    public MessageHolder newMessage()
+    {
+        currentMessage = new Message();
+        messages.add( currentMessage );
+        
+        return this;
+    }
+
+    public String render()
+    {
+        StringBuffer buffer = new StringBuffer();
+        
+        int counter = 1;
+        for ( Iterator it = messages.iterator(); it.hasNext(); )
+        {
+            Message message = (Message) it.next();
+            
+            CharSequence content = message.render();
+            
+            if ( content.length() > 0 )
+            {
+                buffer.append( '[' ).append( counter++ ).append( "] " );
+                buffer.append( content );
+                
+                if ( it.hasNext() )
+                {
+                    buffer.append( "\n\n" );
+                }
+            }
+        }
+        
+        return buffer.toString();
+    }
+
+    public int size()
+    {
+        return messages.size();
+    }
+    
+    private static final class Message
+    {
+        private StringBuffer message = new StringBuffer();
+        private Throwable error;
+        
+        public Message setError( Throwable error )
+        {
+            this.error = error;
+            return this;
+        }
+        
+        public Message append( CharSequence message )
+        {
+            this.message.append( message );
+            return this;
+        }
+        
+        public CharSequence render()
+        {
+            StringBuffer buffer = new StringBuffer();
+            
+            if ( message != null && message.length() > 0 )
+            {
+                buffer.append( message );
+                
+                if ( error != null )
+                {
+                    buffer.append( '\n' );
+                }
+            }
+            
+            if ( error != null )
+            {
+                buffer.append( "Error:\n" );
+                
+                StringWriter sw = new StringWriter();
+                PrintWriter pw = new PrintWriter( sw );
+                error.printStackTrace( pw );
+                
+                buffer.append( sw.toString() );
+            }
+            
+            return buffer;
+        }
+    }
+
+}

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/logging/DefaultMessageHolder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/logging/DefaultMessageHolder.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/logging/MessageHolder.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/logging/MessageHolder.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/logging/MessageHolder.java (added)
+++ maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/logging/MessageHolder.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,24 @@
+package org.apache.maven.shared.io.logging;
+
+public interface MessageHolder
+{
+    
+    MessageHolder newMessage();
+    
+    MessageHolder append( CharSequence messagePart );
+
+    MessageHolder append( Throwable error );
+    
+    MessageHolder addMessage( CharSequence messagePart, Throwable error );
+    
+    MessageHolder addMessage( CharSequence messagePart );
+
+    MessageHolder addMessage( Throwable error );
+    
+    int size();
+    
+    boolean isEmpty();
+    
+    String render();
+
+}

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/logging/MessageHolder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/main/java/org/apache/maven/shared/io/logging/MessageHolder.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/AbstractLocationTest.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/AbstractLocationTest.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/AbstractLocationTest.java (added)
+++ maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/AbstractLocationTest.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,35 @@
+package org.apache.maven.shared.io.location;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import org.codehaus.plexus.util.IOUtil;
+
+import junit.framework.TestCase;
+
+public class AbstractLocationTest
+    extends TestCase
+{
+
+    public AbstractLocationTest()
+    {
+        super();
+    }
+
+    protected void writeToFile( File file, String testStr )
+        throws IOException
+    {
+        FileWriter fw = null;
+        try
+        {
+            fw = new FileWriter( file );
+            fw.write( testStr );
+        }
+        finally
+        {
+            IOUtil.close( fw );
+        }        
+    }
+
+}
\ No newline at end of file

Propchange: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/AbstractLocationTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/AbstractLocationTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/ArtifactLocationTest.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/ArtifactLocationTest.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/ArtifactLocationTest.java (added)
+++ maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/ArtifactLocationTest.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,57 @@
+package org.apache.maven.shared.io.location;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.artifact.handler.DefaultArtifactHandler;
+import org.apache.maven.artifact.versioning.VersionRange;
+
+public class ArtifactLocationTest
+    extends AbstractLocationTest
+{
+    
+    public void testShouldConstructFromTempFileSpecification()
+        throws IOException
+    {
+        File f = File.createTempFile( "artifact-location.", ".test" );
+
+        Artifact a = new DefaultArtifact( "group", "artifact", VersionRange.createFromVersion( "1" ), null, "jar",
+                                          null, new DefaultArtifactHandler() );
+        
+        a.setFile( f );
+        
+        ArtifactLocation location = new ArtifactLocation( a, f.getAbsolutePath() );
+        
+        assertSame( f, location.getFile() );
+    }
+
+    public void testShouldRead()
+        throws IOException
+    {
+        File f = File.createTempFile( "url-location.", ".test" );
+
+        String testStr = "This is a test";
+
+        writeToFile( f, testStr );
+
+        Artifact a = new DefaultArtifact( "group", "artifact", VersionRange.createFromVersion( "1" ), null, "jar",
+                                          null, new DefaultArtifactHandler() );
+        
+        a.setFile( f );
+        
+        ArtifactLocation location = new ArtifactLocation( a, f.getAbsolutePath() );
+
+        location.open();
+
+        byte[] buffer = new byte[testStr.length()];
+
+        int read = location.read( buffer );
+
+        assertEquals( testStr.length(), read );
+
+        assertEquals( testStr, new String( buffer ) );
+    }
+
+}

Propchange: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/ArtifactLocationTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/ArtifactLocationTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/FileBasedLocationTest.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/FileBasedLocationTest.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/FileBasedLocationTest.java (added)
+++ maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/FileBasedLocationTest.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,133 @@
+package org.apache.maven.shared.io.location;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public class FileBasedLocationTest
+    extends AbstractLocationTest
+{
+    
+    public void testShouldConstructWithFileThenRetrieveSameFile() throws IOException
+    {
+        File file = File.createTempFile( "test.", ".file-location" );
+        file.deleteOnExit();
+        
+        FileBasedLocation location = new FileBasedLocation( file, file.getAbsolutePath() );
+        
+        assertSame( file, location.getFile() );
+        assertEquals( file.getAbsolutePath(), location.getSpecification() );
+    }
+    
+    public void testShouldReadFileContentsUsingByteBuffer() throws IOException
+    {
+        File file = File.createTempFile( "test.", ".file-location" );
+        file.deleteOnExit();
+        
+        String testStr = "This is a test";
+        
+        writeToFile( file, testStr );
+        
+        FileBasedLocation location = new FileBasedLocation( file, file.getAbsolutePath() );
+        
+        location.open();
+        
+        ByteBuffer buffer = ByteBuffer.allocate( testStr.length() );
+        location.read( buffer );
+        
+        assertEquals( testStr, new String( buffer.array() ) );
+    }
+    
+    public void testShouldReadFileContentsUsingByteArray() throws IOException
+    {
+        File file = File.createTempFile( "test.", ".file-location" );
+        file.deleteOnExit();
+        
+        String testStr = "This is a test";
+        
+        writeToFile( file, testStr );
+        
+        FileBasedLocation location = new FileBasedLocation( file, file.getAbsolutePath() );
+        
+        location.open();
+        
+        byte[] buffer = new byte[ testStr.length() ];
+        location.read( buffer );
+        
+        assertEquals( testStr, new String( buffer ) );
+    }
+    
+    public void testShouldReadThenClose() throws IOException
+    {
+        File file = File.createTempFile( "test.", ".file-location" );
+        file.deleteOnExit();
+        
+        String testStr = "This is a test";
+        
+        writeToFile( file, testStr );
+        
+        FileBasedLocation location = new FileBasedLocation( file, file.getAbsolutePath() );
+        
+        location.open();
+        
+        byte[] buffer = new byte[ testStr.length() ];
+        location.read( buffer );
+        
+        assertEquals( testStr, new String( buffer ) );
+        
+        location.close();
+    }
+    
+    public void testShouldOpenThenFailToSetFile() throws IOException
+    {
+        File file = File.createTempFile( "test.", ".file-location" );
+        file.deleteOnExit();
+        
+        TestFileLocation location = new TestFileLocation( file.getAbsolutePath() );
+        
+        location.open();
+        
+        try
+        {
+            location.setFile( file );
+            
+            fail( "should not succeed." );
+        }
+        catch( IllegalStateException e )
+        {
+        }
+    }
+    
+    public void testShouldConstructWithoutFileThenSetFileThenOpen() throws IOException
+    {
+        File file = File.createTempFile( "test.", ".file-location" );
+        file.deleteOnExit();
+        
+        TestFileLocation location = new TestFileLocation( file.getAbsolutePath() );
+        
+        location.setFile( file );
+        location.open();
+    }
+    
+    public void testShouldConstructWithLocationThenRetrieveEquivalentFile() throws IOException
+    {
+        File file = File.createTempFile( "test.", ".file-location" );
+        file.deleteOnExit();
+        
+        Location location = new TestFileLocation( file.getAbsolutePath() );
+        
+        assertEquals( file, location.getFile() );
+        assertEquals( file.getAbsolutePath(), location.getSpecification() );
+    }
+    
+    private static final class TestFileLocation extends FileBasedLocation
+    {
+
+        TestFileLocation( String specification )
+        {
+            super( specification );
+        }
+        
+    }
+
+}

Propchange: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/FileBasedLocationTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/FileBasedLocationTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/FileLocatorStrategyTest.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/FileLocatorStrategyTest.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/FileLocatorStrategyTest.java (added)
+++ maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/FileLocatorStrategyTest.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,57 @@
+package org.apache.maven.shared.io.location;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.maven.shared.io.logging.DefaultMessageHolder;
+import org.apache.maven.shared.io.logging.MessageHolder;
+
+import junit.framework.TestCase;
+
+/*
+ * NOTE: Coverage reporting shows that this strategy is a bit on the low side.
+ * However, looking deeper it becomes apparent that the reason for this is the 
+ * try/catch when trying to canonicalize the file...and I haven't been able to 
+ * find a reliable way to break canonicalization. Either way, it will only change
+ * the message output, not the resulting location's reachability...so this is
+ * non-critical.
+ */
+public class FileLocatorStrategyTest
+    extends TestCase
+{
+    
+    public void testShouldResolveExistingTempFileLocation() throws IOException
+    {
+        File f = File.createTempFile( "file-locator.", ".test" );
+        f.deleteOnExit();
+        
+        FileLocatorStrategy fls = new FileLocatorStrategy();
+        
+        MessageHolder mh = new DefaultMessageHolder();
+        
+        Location location = fls.resolve( f.getAbsolutePath(), mh );
+        
+        assertNotNull( location );
+        
+        assertTrue( mh.isEmpty() );
+        
+        assertEquals( f, location.getFile() );
+    }
+
+    public void testShouldFailToResolveNonExistentFileLocation() throws IOException
+    {
+        File f = File.createTempFile( "file-locator.", ".test" );
+        f.delete();
+        
+        FileLocatorStrategy fls = new FileLocatorStrategy();
+        
+        MessageHolder mh = new DefaultMessageHolder();
+        
+        Location location = fls.resolve( f.getAbsolutePath(), mh );
+        
+        assertNull( location );
+        
+        assertEquals( 1, mh.size() );
+    }
+
+}

Propchange: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/FileLocatorStrategyTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/FileLocatorStrategyTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/LocatorTest.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/LocatorTest.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/LocatorTest.java (added)
+++ maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/LocatorTest.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,17 @@
+package org.apache.maven.shared.io.location;
+
+import junit.framework.TestCase;
+
+public class LocatorTest
+    extends TestCase
+{
+    
+    public void testClasspathResource()
+    {
+        String url = getClass().getName().replace( '.', '/' ) + ".class";
+        
+        Locator locator = new Locator();
+        locator.resolve( url );
+    }
+
+}

Propchange: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/LocatorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/LocatorTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/URLLocationTest.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/URLLocationTest.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/URLLocationTest.java (added)
+++ maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/URLLocationTest.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,55 @@
+package org.apache.maven.shared.io.location;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+public class URLLocationTest
+    extends AbstractLocationTest
+{
+    
+    public void testShouldConstructFromUrlAndTempFileSpecifications() throws IOException
+    {
+        File f = File.createTempFile( "url-location.", ".test" );
+        
+        URL url = f.toURL();
+        
+        new URLLocation( url, f.getAbsolutePath(), "prefix.", ".suffix", true );
+    }
+    
+    public void testShouldTransferFromTempFile() throws IOException
+    {
+        File f = File.createTempFile( "url-location.", ".test" );
+        
+        URL url = f.toURL();
+        
+        URLLocation location = new URLLocation( url, f.getAbsolutePath(), "prefix.", ".suffix", true );
+        
+        assertNotNull( location.getFile() );
+        assertFalse( f.equals( location.getFile() ) );
+    }
+
+    public void testShouldTransferFromTempFileThenRead() throws IOException
+    {
+        File f = File.createTempFile( "url-location.", ".test" );
+        
+        String testStr = "This is a test";
+        
+        writeToFile( f, testStr );
+        
+        URL url = f.toURL();
+        
+        URLLocation location = new URLLocation( url, f.getAbsolutePath(), "prefix.", ".suffix", true );
+        
+        location.open();
+        
+        byte[] buffer = new byte[ testStr.length() ];
+        
+        int read = location.read( buffer );
+        
+        assertEquals( testStr.length(), read );
+        
+        assertEquals( testStr, new String( buffer ) );
+    }
+
+}

Propchange: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/URLLocationTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/location/URLLocationTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/logging/DefaultMessageHolderTest.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/logging/DefaultMessageHolderTest.java?rev=412235&view=auto
==============================================================================
--- maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/logging/DefaultMessageHolderTest.java (added)
+++ maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/logging/DefaultMessageHolderTest.java Tue Jun  6 16:13:56 2006
@@ -0,0 +1,277 @@
+package org.apache.maven.shared.io.logging;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import junit.framework.TestCase;
+
+public class DefaultMessageHolderTest
+    extends TestCase
+{
+
+    // MessageHolder newMessage();
+    // int size();
+    // String render();
+    public void testNewMessageIncrementsSizeWhenEmpty()
+    {
+        MessageHolder mh = new DefaultMessageHolder();
+
+        assertEquals( 0, mh.size() );
+
+        MessageHolder test = mh.newMessage();
+        
+        assertSame( mh, test );
+
+        assertEquals( 1, mh.size() );
+
+        assertEquals( "", mh.render() );
+    }
+
+    // MessageHolder append( CharSequence messagePart );
+    // int size();
+    // String render();
+    public void testAppendCreatesNewMessageIfNoneCurrent()
+    {
+        MessageHolder mh = new DefaultMessageHolder();
+
+        assertEquals( 0, mh.size() );
+
+        MessageHolder test = mh.append( "test" );
+        
+        assertSame( mh, test );
+
+        assertEquals( 1, mh.size() );
+
+        assertEquals( "[1] test", mh.render() );
+    }
+
+    // MessageHolder append( Throwable error );
+    // int size();
+    // String render();
+    public void testAppendErrorCreatesNewMessageIfNoneCurrent()
+    {
+        MessageHolder mh = new DefaultMessageHolder();
+
+        assertEquals( 0, mh.size() );
+
+        NullPointerException npe = new NullPointerException();
+        
+        MessageHolder test = mh.append( npe );
+        
+        assertSame( mh, test );
+        
+        assertEquals( 1, mh.size() );
+        
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter( sw );
+        
+        npe.printStackTrace( pw );
+
+        assertEquals( "[1] Error:\n" + sw.toString(), mh.render() );
+    }
+
+    // MessageHolder newMessage();
+    // MessageHolder append( CharSequence messagePart );
+    // int size();
+    // String render();
+    public void testNewMessageThenAppendOnlyIncrementsSizeByOne()
+    {
+        MessageHolder mh = new DefaultMessageHolder();
+
+        assertEquals( 0, mh.size() );
+
+        MessageHolder test = mh.newMessage();
+        
+        assertSame( mh, test );
+        
+        test = mh.append( "test" );
+        
+        assertSame( mh, test );
+
+        assertEquals( 1, mh.size() );
+
+        assertEquals( "[1] test", mh.render() );
+    }
+
+    // MessageHolder newMessage();
+    // MessageHolder append( CharSequence messagePart );
+    // MessageHolder append( CharSequence messagePart );
+    // int size();
+    // String render();
+    public void testNewMessageThenAppendTwiceOnlyIncrementsSizeByOne()
+    {
+        MessageHolder mh = new DefaultMessageHolder();
+
+        assertEquals( 0, mh.size() );
+
+        MessageHolder test = mh.newMessage();
+        
+        assertSame( mh, test );
+        
+        test = mh.append( "test" );
+        
+        assertSame( mh, test );
+        
+        test = mh.append( " again" );
+        
+        assertSame( mh, test );
+
+        assertEquals( 1, mh.size() );
+
+        assertEquals( "[1] test again", mh.render() );
+    }
+
+    // MessageHolder newMessage();
+    // MessageHolder append( CharSequence messagePart );
+    // MessageHolder append( Throwable error );
+    // int size();
+    // String render();
+    public void testNewMessageThenAppendBothMessageAndErrorOnlyIncrementsSizeByOne()
+    {
+        MessageHolder mh = new DefaultMessageHolder();
+
+        assertEquals( 0, mh.size() );
+
+        MessageHolder test = mh.newMessage();
+        
+        assertSame( mh, test );
+        
+        test = mh.append( "test" );
+        
+        assertSame( mh, test );
+        
+        NullPointerException npe = new NullPointerException();
+        
+        test = mh.append( npe );
+        
+        assertSame( mh, test );
+
+        assertEquals( 1, mh.size() );
+        
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter( sw );
+        
+        npe.printStackTrace( pw );
+
+        assertEquals( "[1] test\nError:\n" + sw.toString(), mh.render() );
+    }
+    
+    // MessageHolder addMessage( CharSequence messagePart );
+    // int size();
+    // String render();
+    public void testAddMessageIncrementsSizeByOne()
+    {
+        MessageHolder mh = new DefaultMessageHolder();
+        MessageHolder check = mh.addMessage( "test" );
+        
+        assertSame( mh, check );
+        
+        assertEquals( 1, mh.size() );
+        assertEquals( "[1] test", mh.render() );
+    }
+    
+    // MessageHolder addMessage( CharSequence messagePart );
+    // int size();
+    // String render();
+    public void testAddMessageTwiceIncrementsSizeByTwo()
+    {
+        MessageHolder mh = new DefaultMessageHolder();
+        MessageHolder check = mh.addMessage( "test" );
+        
+        assertSame( mh, check );
+        
+        check = mh.addMessage( "test2" );
+        
+        assertSame( mh, check );
+        
+        assertEquals( 2, mh.size() );
+        assertEquals( "[1] test\n\n[2] test2", mh.render() );
+    }
+    
+    // MessageHolder addMessage( CharSequence messagePart, Throwable error );
+    // int size();
+    // String render();
+    public void testAddMessageWithErrorIncrementsSizeByOne()
+    {
+        MessageHolder mh = new DefaultMessageHolder();
+        
+        NullPointerException npe = new NullPointerException();
+        
+        MessageHolder check = mh.addMessage( "test", npe );
+        
+        assertSame( mh, check );
+        
+        assertEquals( 1, mh.size() );
+        
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter( sw );
+        
+        npe.printStackTrace( pw );
+
+        assertEquals( "[1] test\nError:\n" + sw.toString(), mh.render() );
+    }
+    
+    // MessageHolder addMessage( CharSequence messagePart, Throwable error );
+    // MessageHolder addMessage( CharSequence messagePart );
+    // int size();
+    // String render();
+    public void testAddMessageWithErrorThenWithJustMessageIncrementsSizeByTwo()
+    {
+        MessageHolder mh = new DefaultMessageHolder();
+        
+        NullPointerException npe = new NullPointerException();
+        
+        MessageHolder check = mh.addMessage( "test", npe );
+        
+        assertSame( mh, check );
+        
+        check = mh.addMessage( "test2" );
+        
+        assertSame( mh, check );
+        
+        assertEquals( 2, mh.size() );
+        
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter( sw );
+        
+        npe.printStackTrace( pw );
+
+        assertEquals( "[1] test\nError:\n" + sw.toString() + "\n\n[2] test2", mh.render() );
+    }
+    
+    // MessageHolder addMessage( Throwable error );
+    // int size();
+    // String render();
+    public void testAddMessageWithJustErrorIncrementsSizeByOne()
+    {
+        MessageHolder mh = new DefaultMessageHolder();
+        
+        NullPointerException npe = new NullPointerException();
+        
+        MessageHolder check = mh.addMessage( npe );
+        
+        assertSame( mh, check );
+        
+        assertEquals( 1, mh.size() );
+        
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter( sw );
+        
+        npe.printStackTrace( pw );
+
+        assertEquals( "[1] Error:\n" + sw.toString(), mh.render() );
+    }
+    
+    // boolean isEmpty();
+    public void testIsEmptyAfterConstruction()
+    {
+        assertTrue( new DefaultMessageHolder().isEmpty() );
+    }
+
+    // boolean isEmpty();
+    public void testIsNotEmptyAfterConstructionAndNewMessageCall()
+    {
+        assertFalse( new DefaultMessageHolder().newMessage().isEmpty() );
+    }
+    
+}

Propchange: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/logging/DefaultMessageHolderTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/shared/trunk/maven-shared-io/src/test/java/org/apache/maven/shared/io/logging/DefaultMessageHolderTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"