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