You are viewing a plain text version of this content. The canonical link for it is here.
Posted to wagon-commits@maven.apache.org by br...@apache.org on 2008/06/02 18:38:49 UTC

svn commit: r662483 - in /maven/wagon/trunk: wagon-provider-api/src/main/java/org/apache/maven/wagon/ wagon-provider-api/src/test/java/org/apache/maven/wagon/ wagon-providers/wagon-file/src/main/java/org/apache/maven/wagon/providers/file/ wagon-provide...

Author: brett
Date: Mon Jun  2 09:38:48 2008
New Revision: 662483

URL: http://svn.apache.org/viewvc?rev=662483&view=rev
Log:
[WAGON-101] streaming for http/webdav and import clean up

Removed:
    maven/wagon/trunk/wagon-providers/wagon-http-shared/src/main/java/org/apache/maven/wagon/shared/http/PutInputStream.java
    maven/wagon/trunk/wagon-providers/wagon-http-shared/src/test/java/org/apache/maven/wagon/shared/http/PutInputStreamTest.java
Modified:
    maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/AbstractWagon.java
    maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/StreamWagon.java
    maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/StreamingWagon.java
    maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/WagonUtils.java
    maven/wagon/trunk/wagon-provider-api/src/test/java/org/apache/maven/wagon/PermissionModeUtilsTest.java
    maven/wagon/trunk/wagon-provider-api/src/test/java/org/apache/maven/wagon/WagonMock.java
    maven/wagon/trunk/wagon-providers/wagon-file/src/main/java/org/apache/maven/wagon/providers/file/FileWagon.java
    maven/wagon/trunk/wagon-providers/wagon-file/src/test/java/org/apache/maven/wagon/providers/file/FileWagonTest.java
    maven/wagon/trunk/wagon-providers/wagon-http-lightweight/src/main/java/org/apache/maven/wagon/providers/http/LightweightHttpWagon.java
    maven/wagon/trunk/wagon-providers/wagon-http-shared/src/main/java/org/apache/maven/wagon/shared/http/AbstractHttpClientWagon.java
    maven/wagon/trunk/wagon-providers/wagon-http-shared/src/main/java/org/apache/maven/wagon/shared/http/HtmlFileListParser.java
    maven/wagon/trunk/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTest.java
    maven/wagon/trunk/wagon-providers/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/jsch/ScpWagon.java
    maven/wagon/trunk/wagon-providers/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/jsch/SftpWagon.java
    maven/wagon/trunk/wagon-providers/wagon-webdav-jackrabbit/src/main/java/org/apache/maven/wagon/providers/webdav/WebDavWagon.java
    maven/wagon/trunk/wagon-providers/wagon-webdav-jackrabbit/src/test/java/org/apache/maven/wagon/providers/webdav/WebDavWagonTest.java

Modified: maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/AbstractWagon.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/AbstractWagon.java?rev=662483&r1=662482&r2=662483&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/AbstractWagon.java (original)
+++ maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/AbstractWagon.java Mon Jun  2 09:38:48 2008
@@ -19,6 +19,14 @@
  * under the License.
  */
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+
 import org.apache.maven.wagon.authentication.AuthenticationException;
 import org.apache.maven.wagon.authentication.AuthenticationInfo;
 import org.apache.maven.wagon.authorization.AuthorizationException;
@@ -36,17 +44,6 @@
 import org.apache.maven.wagon.resource.Resource;
 import org.codehaus.plexus.util.IOUtil;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.List;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-
 /**
  * Implementation of common facilties for Wagon providers.
  *
@@ -312,6 +309,10 @@
             }
             throw e;
         }
+        finally
+        {
+            IOUtil.close( output );
+        }
 
         fireGetCompleted( resource, destination );
     }
@@ -322,6 +323,8 @@
         try
         {
             transfer( resource, input, output, TransferEvent.REQUEST_GET, maxSize );
+            
+            finishGetTransfer( resource, input, output );
         }
         catch ( IOException e )
         {
@@ -338,10 +341,19 @@
                 IOUtil.close( input );
             }
 
-            IOUtil.close( output );
+            cleanupGetTransfer( resource );
         }
     }
 
+    protected void finishGetTransfer( Resource resource, InputStream input, OutputStream output )
+        throws TransferFailedException
+    {
+    }
+
+    protected void cleanupGetTransfer( Resource resource )
+    {
+    }
+
     protected void putTransfer( Resource resource, File source, OutputStream output, boolean closeOutput )
         throws TransferFailedException, AuthorizationException, ResourceDoesNotExistException
     {
@@ -394,6 +406,8 @@
         try
         {
             transfer( resource, input, output, TransferEvent.REQUEST_PUT );
+            
+            finishPutTransfer( resource, input, output );
         }
         catch ( IOException e )
         {
@@ -409,9 +423,20 @@
             {
                 IOUtil.close( output );
             }
+            
+            cleanupPutTransfer( resource );
         }
     }
 
+    protected void cleanupPutTransfer( Resource resource )
+    {
+    }
+
+    protected void finishPutTransfer( Resource resource, InputStream input, OutputStream output )
+        throws TransferFailedException, AuthorizationException, ResourceDoesNotExistException
+    {
+    }
+
     /**
      * Write from {@link InputStream} to {@link OutputStream}.
      * Equivalent to {@link #transfer(Resource, InputStream, OutputStream, int, int)} with a maxSize equal to {@link Integer#MAX_VALUE}

Modified: maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/StreamWagon.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/StreamWagon.java?rev=662483&r1=662482&r2=662483&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/StreamWagon.java (original)
+++ maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/StreamWagon.java Mon Jun  2 09:38:48 2008
@@ -43,7 +43,7 @@
     // ----------------------------------------------------------------------
 
     public abstract void fillInputData( InputData inputData )
-        throws TransferFailedException, ResourceDoesNotExistException;
+        throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException;
 
     public abstract void fillOutputData( OutputData outputData )
         throws TransferFailedException;
@@ -83,6 +83,8 @@
 
         fireGetInitiated( resource, destination );
 
+        resource.setLastModified( timestamp );
+        
         InputStream is = getInputStream( resource );
 
         // always get if timestamp is 0 (ie, target doesn't exist), otherwise only if older than the remote file
@@ -92,8 +94,6 @@
 
             checkInputStream( is, resource );
 
-            createParentDirectories( destination );
-
             getTransfer( resource, destination, is );
         }
         else
@@ -105,7 +105,7 @@
     }
 
     protected InputStream getInputStream( Resource resource )
-        throws TransferFailedException, ResourceDoesNotExistException
+        throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
     {
         InputData inputData = new InputData();
 
@@ -125,6 +125,18 @@
             fireTransferError( resource, e, TransferEvent.REQUEST_GET );
             throw e;
         }
+        catch ( AuthorizationException e )
+        {
+            fireTransferError( resource, e, TransferEvent.REQUEST_GET );
+            throw e;
+        }
+        finally
+        {
+            if ( inputData.getInputStream() == null )
+            {
+                cleanupGetTransfer( resource );
+            }
+        }
 
         return inputData.getInputStream();
     }
@@ -178,12 +190,19 @@
 
             throw e;
         }
+        finally
+        {
+            if ( outputData.getOutputStream() == null )
+            {
+                cleanupPutTransfer( resource );
+            }
+        }
 
         return outputData.getOutputStream();
     }
 
     public boolean getIfNewerToStream( String resourceName, OutputStream stream, long timestamp )
-        throws ResourceDoesNotExistException, TransferFailedException
+        throws ResourceDoesNotExistException, TransferFailedException, AuthorizationException
     {
         boolean retValue = false;
 
@@ -215,7 +234,7 @@
     }
 
     public void getToStream( String resourceName, OutputStream stream )
-        throws ResourceDoesNotExistException, TransferFailedException
+        throws ResourceDoesNotExistException, TransferFailedException, AuthorizationException
     {
         getIfNewerToStream( resourceName, stream, 0 );
     }

Modified: maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/StreamingWagon.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/StreamingWagon.java?rev=662483&r1=662482&r2=662483&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/StreamingWagon.java (original)
+++ maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/StreamingWagon.java Mon Jun  2 09:38:48 2008
@@ -34,10 +34,11 @@
      * @param destination
      * @throws TransferFailedException
      * @throws ResourceDoesNotExistException
+     * @throws AuthorizationException 
      * @throws AuthorizationException
      */
     void getToStream( String resourceName, OutputStream stream )
-        throws ResourceDoesNotExistException, TransferFailedException;
+        throws ResourceDoesNotExistException, TransferFailedException, AuthorizationException;
 
     /**
      * Downloads specified resource from the repository if it was modified since specified date. The date is measured in
@@ -50,10 +51,11 @@
      *         repository is older or has the same age.
      * @throws TransferFailedException
      * @throws ResourceDoesNotExistException
+     * @throws AuthorizationException 
      * @throws AuthorizationException
      */
     boolean getIfNewerToStream( String resourceName, OutputStream stream, long timestamp )
-        throws ResourceDoesNotExistException, TransferFailedException;
+        throws ResourceDoesNotExistException, TransferFailedException, AuthorizationException;
 
     /**
      * Copy from a local input stream to remote.

Modified: maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/WagonUtils.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/WagonUtils.java?rev=662483&r1=662482&r2=662483&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/WagonUtils.java (original)
+++ maven/wagon/trunk/wagon-provider-api/src/main/java/org/apache/maven/wagon/WagonUtils.java Mon Jun  2 09:38:48 2008
@@ -19,14 +19,13 @@
  * under the License.
  */
 
-import org.apache.maven.wagon.authentication.AuthenticationInfo;
-import org.apache.maven.wagon.authorization.AuthorizationException;
-import org.codehaus.plexus.util.FileUtils;
-
 import java.io.File;
 import java.io.IOException;
 import java.util.LinkedList;
 
+import org.apache.maven.wagon.authorization.AuthorizationException;
+import org.codehaus.plexus.util.FileUtils;
+
 /**
  * @author <a href="mailto:mmaczka@interia.pl">Michal Maczka</a>
  * @version $Id$

Modified: maven/wagon/trunk/wagon-provider-api/src/test/java/org/apache/maven/wagon/PermissionModeUtilsTest.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-provider-api/src/test/java/org/apache/maven/wagon/PermissionModeUtilsTest.java?rev=662483&r1=662482&r2=662483&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-provider-api/src/test/java/org/apache/maven/wagon/PermissionModeUtilsTest.java (original)
+++ maven/wagon/trunk/wagon-provider-api/src/test/java/org/apache/maven/wagon/PermissionModeUtilsTest.java Mon Jun  2 09:38:48 2008
@@ -20,7 +20,6 @@
  */
 
 import junit.framework.TestCase;
-import org.apache.maven.wagon.PermissionModeUtils;
 
 /**
  * Unit test for PermissionModeUtils class

Modified: maven/wagon/trunk/wagon-provider-api/src/test/java/org/apache/maven/wagon/WagonMock.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-provider-api/src/test/java/org/apache/maven/wagon/WagonMock.java?rev=662483&r1=662482&r2=662483&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-provider-api/src/test/java/org/apache/maven/wagon/WagonMock.java (original)
+++ maven/wagon/trunk/wagon-provider-api/src/test/java/org/apache/maven/wagon/WagonMock.java Mon Jun  2 09:38:48 2008
@@ -21,7 +21,6 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.File;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.Collections;

Modified: maven/wagon/trunk/wagon-providers/wagon-file/src/main/java/org/apache/maven/wagon/providers/file/FileWagon.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-providers/wagon-file/src/main/java/org/apache/maven/wagon/providers/file/FileWagon.java?rev=662483&r1=662482&r2=662483&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-providers/wagon-file/src/main/java/org/apache/maven/wagon/providers/file/FileWagon.java (original)
+++ maven/wagon/trunk/wagon-providers/wagon-file/src/main/java/org/apache/maven/wagon/providers/file/FileWagon.java Mon Jun  2 09:38:48 2008
@@ -40,7 +40,6 @@
 import org.apache.maven.wagon.authorization.AuthorizationException;
 import org.apache.maven.wagon.resource.Resource;
 import org.codehaus.plexus.util.FileUtils;
-import org.codehaus.plexus.util.IOUtil;
 import org.codehaus.plexus.util.StringUtils;
 
 /**

Modified: maven/wagon/trunk/wagon-providers/wagon-file/src/test/java/org/apache/maven/wagon/providers/file/FileWagonTest.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-providers/wagon-file/src/test/java/org/apache/maven/wagon/providers/file/FileWagonTest.java?rev=662483&r1=662482&r2=662483&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-providers/wagon-file/src/test/java/org/apache/maven/wagon/providers/file/FileWagonTest.java (original)
+++ maven/wagon/trunk/wagon-providers/wagon-file/src/test/java/org/apache/maven/wagon/providers/file/FileWagonTest.java Mon Jun  2 09:38:48 2008
@@ -19,18 +19,17 @@
  * under the License.
  */
 
+import java.io.File;
+import java.io.IOException;
+
 import org.apache.maven.wagon.ConnectionException;
 import org.apache.maven.wagon.FileTestUtils;
 import org.apache.maven.wagon.StreamingWagonTestCase;
 import org.apache.maven.wagon.Wagon;
-import org.apache.maven.wagon.WagonTestCase;
 import org.apache.maven.wagon.authentication.AuthenticationException;
 import org.apache.maven.wagon.repository.Repository;
 import org.apache.maven.wagon.resource.Resource;
 
-import java.io.File;
-import java.io.IOException;
-
 /**
  * @author <a href="michal.maczka@dimatics.com">Michal Maczka</a>
  * @version $Id$

Modified: maven/wagon/trunk/wagon-providers/wagon-http-lightweight/src/main/java/org/apache/maven/wagon/providers/http/LightweightHttpWagon.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-providers/wagon-http-lightweight/src/main/java/org/apache/maven/wagon/providers/http/LightweightHttpWagon.java?rev=662483&r1=662482&r2=662483&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-providers/wagon-http-lightweight/src/main/java/org/apache/maven/wagon/providers/http/LightweightHttpWagon.java (original)
+++ maven/wagon/trunk/wagon-providers/wagon-http-lightweight/src/main/java/org/apache/maven/wagon/providers/http/LightweightHttpWagon.java Mon Jun  2 09:38:48 2008
@@ -170,11 +170,9 @@
         }
     }
 
-    protected void putTransfer( Resource resource, InputStream input, OutputStream output, boolean closeOutput )
+    protected void finishPutTransfer( Resource resource, InputStream input, OutputStream output )
         throws TransferFailedException, AuthorizationException, ResourceDoesNotExistException
     {
-        super.putTransfer( resource, input, output, closeOutput );
-
         try
         {
             int statusCode = putConnection.getResponseCode();

Modified: maven/wagon/trunk/wagon-providers/wagon-http-shared/src/main/java/org/apache/maven/wagon/shared/http/AbstractHttpClientWagon.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-providers/wagon-http-shared/src/main/java/org/apache/maven/wagon/shared/http/AbstractHttpClientWagon.java?rev=662483&r1=662482&r2=662483&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-providers/wagon-http-shared/src/main/java/org/apache/maven/wagon/shared/http/AbstractHttpClientWagon.java (original)
+++ maven/wagon/trunk/wagon-providers/wagon-http-shared/src/main/java/org/apache/maven/wagon/shared/http/AbstractHttpClientWagon.java Mon Jun  2 09:38:48 2008
@@ -20,9 +20,11 @@
  */
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
 import java.util.Date;
@@ -46,11 +48,16 @@
 import org.apache.commons.httpclient.methods.GetMethod;
 import org.apache.commons.httpclient.methods.HeadMethod;
 import org.apache.commons.httpclient.methods.PutMethod;
+import org.apache.commons.httpclient.methods.RequestEntity;
 import org.apache.commons.httpclient.util.DateParseException;
 import org.apache.commons.httpclient.util.DateParser;
-import org.apache.maven.wagon.AbstractWagon;
+import org.apache.maven.wagon.InputData;
+import org.apache.maven.wagon.OutputData;
+import org.apache.maven.wagon.PathUtils;
 import org.apache.maven.wagon.ResourceDoesNotExistException;
+import org.apache.maven.wagon.StreamWagon;
 import org.apache.maven.wagon.TransferFailedException;
+import org.apache.maven.wagon.Wagon;
 import org.apache.maven.wagon.authorization.AuthorizationException;
 import org.apache.maven.wagon.events.TransferEvent;
 import org.apache.maven.wagon.proxy.ProxyInfo;
@@ -63,8 +70,71 @@
  * @author <a href="michal.maczka@dimatics.com">Michal Maczka</a>
  * @author <a href="mailto:james@atlassian.com">James William Dumay</a>
  */
-public abstract class AbstractHttpClientWagon extends AbstractWagon
+public abstract class AbstractHttpClientWagon
+    extends StreamWagon
 {
+    private final class RequestEntityImplementation
+        implements RequestEntity
+    {
+        private final InputStream stream;
+        
+        private final Resource resource;
+
+        private final Wagon wagon;
+
+        private RequestEntityImplementation( InputStream stream, Resource resource, Wagon wagon )
+        {
+            this.stream = stream;
+            
+            this.resource = resource;
+            
+            this.wagon = wagon;
+        }
+
+        public long getContentLength()
+        {
+            return resource.getContentLength();
+        }
+
+        public String getContentType()
+        {
+            return null;
+        }
+
+        public boolean isRepeatable()
+        {
+            return false;
+        }
+
+        public void writeRequest( OutputStream output )
+            throws IOException
+        {
+            byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
+            
+            TransferEvent transferEvent =
+                new TransferEvent( wagon, resource, TransferEvent.TRANSFER_PROGRESS, TransferEvent.REQUEST_PUT );
+            transferEvent.setTimestamp( System.currentTimeMillis() );
+            
+            int remaining = Integer.MAX_VALUE;
+            while ( remaining > 0 )
+            {
+                int n = stream.read( buffer, 0, Math.min( buffer.length, remaining ) );
+            
+                if ( n == -1 )
+                {
+                    break;
+                }
+            
+                fireTransferProgress( transferEvent, buffer, n );
+            
+                output.write( buffer, 0, n );
+            
+                remaining -= n;
+            }
+            output.flush();
+        }
+    }
+
     protected static final int SC_NULL = -1;
 
     protected static final TimeZone GMT_TIME_ZONE = TimeZone.getTimeZone( "GMT" );
@@ -75,6 +145,8 @@
 
     private Properties httpHeaders;
 
+    private HttpMethod getMethod;
+
     public void openConnectionInternal()
     {
         repository.setUrl( getURL( repository ) );
@@ -142,218 +214,52 @@
     {
     }
 
-    public void get( String resourceName, File destination )
-        throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
-    {
-        get( resourceName, destination, 0 );
-    }
-
-    public boolean getIfNewer( String resourceName, File destination, long timestamp )
-        throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
-    {
-        return get( resourceName, destination, timestamp );
-    }
-
-    /**
-     * @param resourceName
-     * @param destination
-     * @param timestamp the timestamp to check against, only downloading if newer. If <code>0</code>, always download
-     * @return <code>true</code> if newer version was downloaded, <code>false</code> otherwise.
-     * @throws TransferFailedException
-     * @throws ResourceDoesNotExistException
-     * @throws AuthorizationException
-     */
-    public boolean get( String resourceName, File destination, long timestamp )
+    public void put( File source, String resourceName )
         throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
     {
         Resource resource = new Resource( resourceName );
-        fireGetInitiated( resource, destination );
-        boolean retValue = false;
-        String url = getRepository().getUrl() + "/" + resourceName;
-        GetMethod getMethod = new GetMethod( url );;
+        
+        firePutInitiated( resource, source );
+        
+        resource.setContentLength( source.length() );
+        
+        resource.setLastModified( source.lastModified() );
 
+        InputStream stream = null;
         try
         {
-            if ( timestamp > 0 )
-            {
-                SimpleDateFormat fmt = new SimpleDateFormat( "EEE, dd-MMM-yy HH:mm:ss zzz", Locale.US );
-                fmt.setTimeZone( GMT_TIME_ZONE );
-                Header hdr = new Header( "If-Modified-Since", fmt.format( new Date( timestamp ) ) );
-                fireTransferDebug( "sending ==> " + hdr + "(" + timestamp + ")" );
-                getMethod.addRequestHeader( hdr );
-            }
-
-            int statusCode;
-            try
-            {
-                statusCode = execute( getMethod );
-            }
-            catch ( IOException e )
-            {
-                fireTransferError( resource, e, TransferEvent.REQUEST_GET );
-
-                throw new TransferFailedException( e.getMessage(), e );
-            }
-
-            fireTransferDebug( url + " - Status code: " + statusCode );
-
-            // TODO [BP]: according to httpclient docs, really should swallow the output on error. verify if that is required
-            switch ( statusCode )
-            {
-                case HttpStatus.SC_OK:
-                    break;
-
-                case HttpStatus.SC_NOT_MODIFIED:
-                    return false;
-
-                case SC_NULL:
-                {
-                    TransferFailedException e = new TransferFailedException( "Failed to transfer file: " + url );
-                    fireTransferError( resource, e, TransferEvent.REQUEST_GET );
-                    throw e;
-                }
-
-                case HttpStatus.SC_FORBIDDEN:
-                    fireSessionConnectionRefused();
-                    throw new AuthorizationException( "Access denied to: " + url );
-
-                case HttpStatus.SC_UNAUTHORIZED:
-                    fireSessionConnectionRefused();
-                    throw new AuthorizationException( "Not authorized." );
-
-                case HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED:
-                    fireSessionConnectionRefused();
-                    throw new AuthorizationException( "Not authorized by proxy." );
-
-                case HttpStatus.SC_NOT_FOUND:
-                    throw new ResourceDoesNotExistException( "File: " + url + " does not exist" );
-
-                //add more entries here
-                default :
-                {
-                    TransferFailedException e =
-                            new TransferFailedException( "Failed to transfer file: " + url + ". Return code is: "
-                                + statusCode );
-                    fireTransferError( resource, e, TransferEvent.REQUEST_GET );
-                    throw e;
-                }
-            }
-
-            InputStream is = null;
-
-            Header contentLengthHeader = getMethod.getResponseHeader( "Content-Length" );
-
-            if ( contentLengthHeader != null )
-            {
-                try
-                {
-                    long contentLength = Integer.valueOf( contentLengthHeader.getValue() ).intValue();
-
-                    resource.setContentLength( contentLength );
-                }
-                catch ( NumberFormatException e )
-                {
-                    fireTransferDebug(
-                        "error parsing content length header '" + contentLengthHeader.getValue() + "' " + e );
-                }
-            }
-
-            Header lastModifiedHeader = getMethod.getResponseHeader( "Last-Modified" );
-
-            long lastModified = 0;
-
-            if ( lastModifiedHeader != null )
-            {
-                try
-                {
-                    lastModified = DateParser.parseDate( lastModifiedHeader.getValue() ).getTime();
-                    
-                    resource.setLastModified( lastModified );
-                }
-                catch ( DateParseException e )
-                {
-                    fireTransferDebug( "Unable to parse last modified header" );
-                }
-
-                fireTransferDebug( "last-modified = " + lastModifiedHeader.getValue() + " (" + lastModified + ")" );
-            }
-
-            // always get if timestamp is 0 (ie, target doesn't exist), otherwise only if older than the remote file
-            if ( timestamp == 0 || timestamp < lastModified )
-            {
-                retValue = true;
-
-                Header contentEncoding = getMethod.getResponseHeader( "Content-Encoding" );
-                boolean isGZipped = contentEncoding == null ? false : "gzip".equalsIgnoreCase(contentEncoding.getValue());
-
-                try
-                {
-                    is = getMethod.getResponseBodyAsStream();
-                    if (isGZipped)
-                    {
-                        is = new GZIPInputStream( is );
-                    }
-
-                    getTransfer( resource, destination, is );
-                }
-                catch ( IOException e )
-                {
-                    fireTransferError( resource, e, TransferEvent.REQUEST_GET );
-
-                    if ( destination.exists() )
-                    {
-                        boolean deleted = destination.delete();
-
-                        if ( !deleted )
-                        {
-                            destination.deleteOnExit();
-                        }
-                    }
-
-                    String msg = "Error occurred while deploying to remote repository:" + getRepository();
-
-                    throw new TransferFailedException( msg, e );
-                }
-                finally
-                {
-                    IOUtil.close( is );
-                }
-
-                if ( lastModified > 0 )
-                {
-                    resource.setLastModified( lastModified );
-                }
-            }
-            else
-            {
-                fireTransferDebug( "Local file is newer: not downloaded" );
-            }
+            stream = new FileInputStream( source );
+            put( stream, resource, source );
+        }
+        catch ( FileNotFoundException e )
+        {
+            fireTransferError( resource, e, TransferEvent.REQUEST_PUT );
 
-            return retValue;
+            throw new TransferFailedException( "Specified source file does not exist: " + source, e );
         }
         finally
         {
-            getMethod.releaseConnection();
+            IOUtil.close( stream );
         }
-    }    
-
-    public void put( File source, String resourceName )
+    }
+    
+    public void putFromStream( final InputStream stream, String destination, long contentLength, long lastModified )
         throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
     {
-        Resource resource = new Resource( resourceName );
+        Resource resource = new Resource( destination );
         
-        firePutInitiated( resource, source );
-
-        put(source, resource);
+        firePutInitiated( resource, null );
+        
+        resource.setContentLength( contentLength );
+        
+        resource.setLastModified( lastModified );
+        
+        put( stream, resource, null );
     }
 
-    protected void put( File source, Resource resource )
-        throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
+    private void put( final InputStream stream, Resource resource, File source )
+        throws TransferFailedException, AuthorizationException, ResourceDoesNotExistException
     {
-        resource.setContentLength( source.length() );
-        
-        resource.setLastModified( source.lastModified() );
-        
         String url = getRepository().getUrl();
         String[] parts = StringUtils.split( resource.getName(), "/" );
         for ( int i = 0; i < parts.length; i++ )
@@ -361,25 +267,24 @@
             url += "/" + URLEncoder.encode( parts[i] );
         }
 
-        PutMethod putMethod = new PutMethod( url );
-        InputStream is = null;
+        //Parent directories need to be created before posting
         try
         {
-            is = new PutInputStream( source, resource, this, getTransferEventSupport() );
+            mkdirs( PathUtils.dirname( resource.getName() ) );
         }
-        catch ( FileNotFoundException e )
+        catch ( IOException e )
         {
-            fireTransferError( resource, e, TransferEvent.REQUEST_PUT );
-
-            throw new ResourceDoesNotExistException( "Source file does not exist: " + source, e );
+            fireTransferError( resource, e, TransferEvent.REQUEST_GET );
         }
 
-        putMethod.setRequestBody( is );
+        PutMethod putMethod = new PutMethod( url );
+
+        putMethod.setRequestEntity( new RequestEntityImplementation( stream, resource, this ) );
 
+        firePutStarted( resource, source );
+                
         try
         {
-            firePutStarted( resource, source );
-            
             int statusCode;
             try
             {
@@ -433,11 +338,13 @@
         }
         finally
         {
-            IOUtil.close(is);
-            
             putMethod.releaseConnection();
         }
     }
+    
+    protected void mkdirs( String dirname ) throws HttpException, IOException
+    {
+    }
 
     public boolean resourceExists( String resourceName )
         throws TransferFailedException, AuthorizationException
@@ -546,4 +453,158 @@
     {
         this.httpHeaders = httpHeaders;
     }
+
+    public void fillInputData( InputData inputData )
+        throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
+    {
+        Resource resource = inputData.getResource();
+        
+        String url = getRepository().getUrl() + "/" + resource.getName();
+        getMethod = new GetMethod( url );
+        long timestamp = resource.getLastModified();
+        if ( timestamp > 0 )
+        {
+            SimpleDateFormat fmt = new SimpleDateFormat( "EEE, dd-MMM-yy HH:mm:ss zzz", Locale.US );
+            fmt.setTimeZone( GMT_TIME_ZONE );
+            Header hdr = new Header( "If-Modified-Since", fmt.format( new Date( timestamp ) ) );
+            fireTransferDebug( "sending ==> " + hdr + "(" + timestamp + ")" );
+            getMethod.addRequestHeader( hdr );
+        }
+
+        int statusCode;
+        try
+        {
+            statusCode = execute( getMethod );
+        }
+        catch ( IOException e )
+        {
+            fireTransferError( resource, e, TransferEvent.REQUEST_GET );
+
+            throw new TransferFailedException( e.getMessage(), e );
+        }
+
+        fireTransferDebug( url + " - Status code: " + statusCode );
+
+        // TODO [BP]: according to httpclient docs, really should swallow the output on error. verify if that is
+        // required
+        switch ( statusCode )
+        {
+            case HttpStatus.SC_OK:
+                break;
+
+            case HttpStatus.SC_NOT_MODIFIED:
+                // return, leaving last modified set to original value so getIfNewer should return unmodified
+                return;
+
+            case SC_NULL:
+            {
+                TransferFailedException e = new TransferFailedException( "Failed to transfer file: " + url );
+                fireTransferError( resource, e, TransferEvent.REQUEST_GET );
+                throw e;
+            }
+
+            case HttpStatus.SC_FORBIDDEN:
+                fireSessionConnectionRefused();
+                throw new AuthorizationException( "Access denied to: " + url );
+
+            case HttpStatus.SC_UNAUTHORIZED:
+                fireSessionConnectionRefused();
+                throw new AuthorizationException( "Not authorized." );
+
+            case HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED:
+                fireSessionConnectionRefused();
+                throw new AuthorizationException( "Not authorized by proxy." );
+
+            case HttpStatus.SC_NOT_FOUND:
+                throw new ResourceDoesNotExistException( "File: " + url + " does not exist" );
+
+                // add more entries here
+            default:
+            {
+                cleanupGetTransfer( resource );
+                TransferFailedException e =
+                    new TransferFailedException( "Failed to transfer file: " + url + ". Return code is: "
+                        + statusCode );
+                fireTransferError( resource, e, TransferEvent.REQUEST_GET );
+                throw e;
+            }
+        }
+
+        InputStream is = null;
+
+        Header contentLengthHeader = getMethod.getResponseHeader( "Content-Length" );
+
+        if ( contentLengthHeader != null )
+        {
+            try
+            {
+                long contentLength = Integer.valueOf( contentLengthHeader.getValue() ).intValue();
+
+                resource.setContentLength( contentLength );
+            }
+            catch ( NumberFormatException e )
+            {
+                fireTransferDebug( "error parsing content length header '" + contentLengthHeader.getValue() + "' "
+                    + e );
+            }
+        }
+
+        Header lastModifiedHeader = getMethod.getResponseHeader( "Last-Modified" );
+
+        long lastModified = 0;
+
+        if ( lastModifiedHeader != null )
+        {
+            try
+            {
+                lastModified = DateParser.parseDate( lastModifiedHeader.getValue() ).getTime();
+
+                resource.setLastModified( lastModified );
+            }
+            catch ( DateParseException e )
+            {
+                fireTransferDebug( "Unable to parse last modified header" );
+            }
+
+            fireTransferDebug( "last-modified = " + lastModifiedHeader.getValue() + " (" + lastModified + ")" );
+        }
+
+        Header contentEncoding = getMethod.getResponseHeader( "Content-Encoding" );
+        boolean isGZipped =
+            contentEncoding == null ? false : "gzip".equalsIgnoreCase( contentEncoding.getValue() );
+
+        try
+        {
+            is = getMethod.getResponseBodyAsStream();
+            if ( isGZipped )
+            {
+                is = new GZIPInputStream( is );
+            }
+        }
+        catch ( IOException e )
+        {
+            fireTransferError( resource, e, TransferEvent.REQUEST_GET );
+
+            String msg =
+                "Error occurred while retrieving from remote repository:" + getRepository() + ": " + e.getMessage();
+
+            throw new TransferFailedException( msg, e );
+        }
+        
+        inputData.setInputStream( is );
+    }
+
+    protected void cleanupGetTransfer( Resource resource )
+    {
+        if ( getMethod != null )
+        {
+            getMethod.releaseConnection();
+        }
+    }
+
+    public void fillOutputData( OutputData outputData )
+        throws TransferFailedException
+    {
+        throw new IllegalStateException( "Should not be using the streaming wagon for HTTP PUT" );        
+    }
 }

Modified: maven/wagon/trunk/wagon-providers/wagon-http-shared/src/main/java/org/apache/maven/wagon/shared/http/HtmlFileListParser.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-providers/wagon-http-shared/src/main/java/org/apache/maven/wagon/shared/http/HtmlFileListParser.java?rev=662483&r1=662482&r2=662483&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-providers/wagon-http-shared/src/main/java/org/apache/maven/wagon/shared/http/HtmlFileListParser.java (original)
+++ maven/wagon/trunk/wagon-providers/wagon-http-shared/src/main/java/org/apache/maven/wagon/shared/http/HtmlFileListParser.java Mon Jun  2 09:38:48 2008
@@ -27,7 +27,6 @@
 import java.net.URLDecoder;
 import java.util.ArrayList;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 import java.util.regex.Pattern;

Modified: maven/wagon/trunk/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTest.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTest.java?rev=662483&r1=662482&r2=662483&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTest.java (original)
+++ maven/wagon/trunk/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTest.java Mon Jun  2 09:38:48 2008
@@ -19,20 +19,20 @@
  * under the License.
  */
 
+import java.io.File;
+
 import org.apache.maven.wagon.FileTestUtils;
-import org.apache.maven.wagon.WagonTestCase;
+import org.apache.maven.wagon.StreamingWagonTestCase;
 import org.apache.maven.wagon.repository.Repository;
 import org.apache.maven.wagon.resource.Resource;
 import org.codehaus.plexus.jetty.Httpd;
 
-import java.io.File;
-
 /**
  * @author <a href="michal.maczka@dimatics.com">Michal Maczka</a>
  * @version $Id$
  */
 public class HttpWagonTest
-    extends WagonTestCase
+    extends StreamingWagonTestCase
 {
     private Httpd httpd;
 

Modified: maven/wagon/trunk/wagon-providers/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/jsch/ScpWagon.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-providers/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/jsch/ScpWagon.java?rev=662483&r1=662482&r2=662483&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-providers/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/jsch/ScpWagon.java (original)
+++ maven/wagon/trunk/wagon-providers/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/jsch/ScpWagon.java Mon Jun  2 09:38:48 2008
@@ -29,12 +29,10 @@
 import org.apache.maven.wagon.OutputData;
 import org.apache.maven.wagon.ResourceDoesNotExistException;
 import org.apache.maven.wagon.TransferFailedException;
-import org.apache.maven.wagon.authorization.AuthorizationException;
 import org.apache.maven.wagon.events.TransferEvent;
 import org.apache.maven.wagon.providers.ssh.ScpHelper;
 import org.apache.maven.wagon.repository.RepositoryPermissions;
 import org.apache.maven.wagon.resource.Resource;
-import org.codehaus.plexus.util.IOUtil;
 
 import com.jcraft.jsch.ChannelExec;
 import com.jcraft.jsch.JSchException;
@@ -83,13 +81,20 @@
         }
     }
 
-    protected void putTransfer( Resource resource, InputStream input, OutputStream output, boolean closeOutput )
-        throws TransferFailedException, AuthorizationException, ResourceDoesNotExistException
+    protected void cleanupPutTransfer( Resource resource )
     {
-        try
+        if ( channel != null )
         {
-            super.putTransfer( resource, input, output, false );
+            channel.disconnect();
+            channel = null;
+        }
+    }
 
+    protected void finishPutTransfer( Resource resource, InputStream input, OutputStream output )
+        throws TransferFailedException
+    {
+        try
+        {
             sendEom( output );
 
             checkAck( channelInputStream );
@@ -102,18 +107,6 @@
         {
             handleIOException( resource, e );
         }
-        finally
-        {
-            if ( closeOutput )
-            {
-                IOUtil.close( output );
-            }
-            
-            if ( channel != null )
-            {
-                channel.disconnect();
-            }
-        }        
 
         String basedir = getRepository().getBasedir();
         try
@@ -151,37 +144,37 @@
             throw new IOException( "SCP terminated with unknown error code" );
         }
     }    
-    
-    protected void getTransfer( Resource resource, OutputStream output, InputStream input, boolean closeInput,
-                                int maxSize )
+
+    protected void finishGetTransfer( Resource resource, InputStream input, OutputStream output )
         throws TransferFailedException
     {
         try
         {
-            super.getTransfer( resource, output, input, false, (int) resource.getContentLength() );
-
             checkAck( input );
-
+    
             sendEom( channelOutputStream );
         }
         catch ( IOException e )
         {
             handleGetException( resource, e );
         }
-        finally
+    }
+    
+    protected void cleanupGetTransfer( Resource resource )
+    {
+        if ( channel != null )
         {
-            if ( closeInput )
-            {
-                IOUtil.close( input );
-            }
-            
-            if ( channel != null )
-            {
-                channel.disconnect();
-            }
+            channel.disconnect();
         }
     }
-
+    
+    protected void getTransfer( Resource resource, OutputStream output, InputStream input, boolean closeInput,
+                                int maxSize )
+        throws TransferFailedException
+    {
+        super.getTransfer( resource, output, input, closeInput, (int) resource.getContentLength() );
+    }
+    
     protected String readLine( InputStream in )
         throws IOException
     {

Modified: maven/wagon/trunk/wagon-providers/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/jsch/SftpWagon.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-providers/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/jsch/SftpWagon.java?rev=662483&r1=662482&r2=662483&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-providers/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/jsch/SftpWagon.java (original)
+++ maven/wagon/trunk/wagon-providers/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/jsch/SftpWagon.java Mon Jun  2 09:38:48 2008
@@ -410,20 +410,19 @@
         }
     }
 
-    protected void getTransfer( Resource resource, OutputStream output, InputStream input, boolean closeInput,
-                                int maxSize )
-        throws TransferFailedException
+    protected void cleanupGetTransfer( Resource resource )
     {
-        super.getTransfer( resource, output, input, closeInput, maxSize );
-
         returnToParentDirectory( resource );
     }
     
-    protected void putTransfer( Resource resource, InputStream input, OutputStream output, boolean closeOutput )
-        throws TransferFailedException, AuthorizationException, ResourceDoesNotExistException
+    protected void cleanupPutTransfer( Resource resource )
     {
-        super.putTransfer( resource, input, output, closeOutput );
+        returnToParentDirectory( resource );
+    }
 
+    protected void finishPutTransfer( Resource resource, InputStream input, OutputStream output )
+        throws TransferFailedException
+    {
         RepositoryPermissions permissions = getRepository().getPermissions();
 
         String filename = ScpHelper.getResourceFilename( resource.getName() );
@@ -436,8 +435,6 @@
         {
             setFileMode( filename, permissions );
         }
-
-        returnToParentDirectory( resource );
     }
 
     public void fillInputData( InputData inputData )

Modified: maven/wagon/trunk/wagon-providers/wagon-webdav-jackrabbit/src/main/java/org/apache/maven/wagon/providers/webdav/WebDavWagon.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-providers/wagon-webdav-jackrabbit/src/main/java/org/apache/maven/wagon/providers/webdav/WebDavWagon.java?rev=662483&r1=662482&r2=662483&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-providers/wagon-webdav-jackrabbit/src/main/java/org/apache/maven/wagon/providers/webdav/WebDavWagon.java (original)
+++ maven/wagon/trunk/wagon-providers/wagon-webdav-jackrabbit/src/main/java/org/apache/maven/wagon/providers/webdav/WebDavWagon.java Mon Jun  2 09:38:48 2008
@@ -41,9 +41,7 @@
 import org.apache.maven.wagon.ResourceDoesNotExistException;
 import org.apache.maven.wagon.TransferFailedException;
 import org.apache.maven.wagon.authorization.AuthorizationException;
-import org.apache.maven.wagon.events.TransferEvent;
 import org.apache.maven.wagon.repository.Repository;
-import org.apache.maven.wagon.resource.Resource;
 import org.apache.maven.wagon.shared.http.AbstractHttpClientWagon;
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.StringUtils;
@@ -84,51 +82,6 @@
     };
     
     /**
-     * Puts a file into the remote repository
-     *
-     * @param source       the file to transfer
-     * @param resourceName the name of the resource
-     * @throws TransferFailedException
-     * @throws ResourceDoesNotExistException
-     * @throws AuthorizationException
-     */
-    public void put( File source, String resourceName )
-        throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
-    {
-        Repository repository = getRepository();
-
-        resourceName = StringUtils.replace( resourceName, "\\", "/" );
-        String dir = PathUtils.dirname( resourceName );
-        dir = StringUtils.replace( dir, "\\", "/" );
-
-        String dest = repository.getUrl();
-        Resource resource = new Resource( resourceName );
-
-        if ( dest.endsWith( "/" ) )
-        {
-            dest = dest + resource.getName();
-        }
-        else
-        {
-            dest = dest + "/" + resource.getName();
-        }
-
-        firePutInitiated( resource, source );
-
-        //Parent directories need to be created before posting
-        try
-        {
-            mkdirs( dir );
-        }
-        catch ( IOException e )
-        {
-            fireTransferError( resource, e, TransferEvent.REQUEST_GET );
-        }
-
-        super.put(source, resource);
-    }
-
-    /**
      * This wagon supports directory copying
      *
      * @return <code>true</code> always
@@ -147,7 +100,7 @@
      * @throws HttpException 
      * @throws TransferFailedException
      */
-    private void mkdirs( String dir ) throws HttpException, IOException
+    protected void mkdirs( String dir ) throws HttpException, IOException
     {
         Repository repository = getRepository();
         String basedir = repository.getBasedir();

Modified: maven/wagon/trunk/wagon-providers/wagon-webdav-jackrabbit/src/test/java/org/apache/maven/wagon/providers/webdav/WebDavWagonTest.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-providers/wagon-webdav-jackrabbit/src/test/java/org/apache/maven/wagon/providers/webdav/WebDavWagonTest.java?rev=662483&r1=662482&r2=662483&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-providers/wagon-webdav-jackrabbit/src/test/java/org/apache/maven/wagon/providers/webdav/WebDavWagonTest.java (original)
+++ maven/wagon/trunk/wagon-providers/wagon-webdav-jackrabbit/src/test/java/org/apache/maven/wagon/providers/webdav/WebDavWagonTest.java Mon Jun  2 09:38:48 2008
@@ -23,7 +23,7 @@
 import java.io.IOException;
 
 import org.apache.maven.wagon.FileTestUtils;
-import org.apache.maven.wagon.WagonTestCase;
+import org.apache.maven.wagon.StreamingWagonTestCase;
 import org.apache.maven.wagon.repository.Repository;
 import org.apache.maven.wagon.resource.Resource;
 
@@ -34,7 +34,7 @@
  * @author <a href="mailto:carlos@apache.org">Carlos Sanchez</a>
  */
 public class WebDavWagonTest
-    extends WagonTestCase
+    extends StreamingWagonTestCase
 {
     private ServletServer server;
 



---------------------------------------------------------------------
To unsubscribe, e-mail: wagon-commits-unsubscribe@maven.apache.org
For additional commands, e-mail: wagon-commits-help@maven.apache.org