diff options
author | Olivier Lamy <olamy@apache.org> | 2013-11-07 05:22:45 +0000 |
---|---|---|
committer | Olivier Lamy <olamy@apache.org> | 2013-11-07 05:22:45 +0000 |
commit | db38728d1211c76cc3444c3daf12206d2ae2e10c (patch) | |
tree | ce8b12b4c3aab2bbf8f9aa9d1f98718569bd0fae /archiva-modules/archiva-scheduler | |
parent | 99aa5b753564254bf88cb6b468372e3babafb632 (diff) | |
download | archiva-db38728d1211c76cc3444c3daf12206d2ae2e10c.tar.gz archiva-db38728d1211c76cc3444c3daf12206d2ae2e10c.zip |
add listener for downloading
git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1539523 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'archiva-modules/archiva-scheduler')
-rw-r--r-- | archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/DownloadRemoteIndexTask.java | 155 |
1 files changed, 123 insertions, 32 deletions
diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/DownloadRemoteIndexTask.java b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/DownloadRemoteIndexTask.java index 08c22f443..949263b61 100644 --- a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/DownloadRemoteIndexTask.java +++ b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/DownloadRemoteIndexTask.java @@ -26,6 +26,7 @@ import org.apache.archiva.proxy.common.WagonFactory; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.time.StopWatch; +import org.apache.http.HttpEntity; import org.apache.http.HttpException; import org.apache.http.HttpHost; import org.apache.http.HttpRequest; @@ -39,6 +40,7 @@ import org.apache.http.entity.ContentType; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; +import org.apache.http.impl.nio.codecs.LengthDelimitedDecoder; import org.apache.http.nio.ContentDecoder; import org.apache.http.nio.ContentEncoder; import org.apache.http.nio.IOControl; @@ -49,8 +51,6 @@ import org.apache.maven.index.context.IndexingContext; import org.apache.maven.index.updater.IndexUpdateRequest; import org.apache.maven.index.updater.IndexUpdater; import org.apache.maven.index.updater.ResourceFetcher; -import org.apache.maven.wagon.events.TransferEvent; -import org.apache.maven.wagon.events.TransferListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,6 +59,7 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.Field; import java.net.MalformedURLException; import java.net.URL; import java.util.List; @@ -138,6 +139,9 @@ public class DownloadRemoteIndexTask tempIndexDirectory.mkdirs(); tempIndexDirectory.deleteOnExit(); String baseIndexUrl = indexingContext.getIndexUpdateUrl(); + + URL indexUrl = new URL( baseIndexUrl ); + /* String wagonProtocol = new URL( this.remoteRepository.getUrl() ).getProtocol(); @@ -183,19 +187,34 @@ public class DownloadRemoteIndexTask HttpAsyncClientBuilder builder = HttpAsyncClientBuilder.create(); + BasicCredentialsProvider basicCredentialsProvider = new BasicCredentialsProvider(); + if ( this.networkProxy != null ) { HttpHost httpHost = new HttpHost( this.networkProxy.getHost(), this.networkProxy.getPort() ); builder = builder.setProxy( httpHost ); + + if ( this.networkProxy.getUsername() != null ) + { + basicCredentialsProvider.setCredentials( + new AuthScope( this.networkProxy.getHost(), this.networkProxy.getPort(), null, null ), + new UsernamePasswordCredentials( this.networkProxy.getUsername(), + this.networkProxy.getPassword() ) ); + } + } if ( this.remoteRepository.getUserName() != null ) { - BasicCredentialsProvider basicCredentialsProvider = new BasicCredentialsProvider(); - basicCredentialsProvider.setCredentials( AuthScope.ANY, new UsernamePasswordCredentials( - this.remoteRepository.getUserName(), this.remoteRepository.getPassword() ) ); + basicCredentialsProvider.setCredentials( + new AuthScope( indexUrl.getHost(), indexUrl.getPort(), null, null ), + new UsernamePasswordCredentials( this.remoteRepository.getUserName(), + this.remoteRepository.getPassword() ) ); + } + builder = builder.setDefaultCredentialsProvider( basicCredentialsProvider ); + File indexDirectory = indexingContext.getIndexDirectoryFile(); if ( !indexDirectory.exists() ) { @@ -259,7 +278,7 @@ public class DownloadRemoteIndexTask } } - + /* private static final class DownloadListener implements TransferListener { @@ -310,6 +329,96 @@ public class DownloadRemoteIndexTask log.debug( "transfer debug {}", message ); } } + */ + + private static class ZeroCopyConsumerListener + extends ZeroCopyConsumer + { + private Logger log = LoggerFactory.getLogger( getClass() ); + + private String resourceName; + + private long startTime; + + private long totalLength = 0; + + //private long currentLength = 0; + + private ZeroCopyConsumerListener( File file, String resourceName ) + throws FileNotFoundException + { + super( file ); + this.resourceName = resourceName; + } + + @Override + protected File process( final HttpResponse response, final File file, final ContentType contentType ) + throws Exception + { + if ( response.getStatusLine().getStatusCode() != HttpStatus.SC_OK ) + { + throw new ClientProtocolException( "Upload failed: " + response.getStatusLine() ); + } + long endTime = System.currentTimeMillis(); + log.info( "end of transfer file {} {} kb: {}s", resourceName, this.totalLength / 1024, + ( endTime - startTime ) / 1000 ); + return file; + } + + @Override + protected void onContentReceived( ContentDecoder decoder, IOControl ioControl ) + throws IOException + { + if ( decoder instanceof LengthDelimitedDecoder ) + { + LengthDelimitedDecoder ldl = LengthDelimitedDecoder.class.cast( decoder ); + long len = getLen( ldl ); + if ( len > -1 ) + { + log.debug( "transfer of {} : {}/{}", resourceName, len / 1024, this.totalLength / 1024 ); + } + } + + super.onContentReceived( decoder, ioControl ); + } + + @Override + protected void onResponseReceived( HttpResponse response ) + { + this.startTime = System.currentTimeMillis(); + super.onResponseReceived( response ); + this.totalLength = response.getEntity().getContentLength(); + log.info( "start transfer of {}, contentLength: {}", resourceName, this.totalLength ); + } + + @Override + protected void onEntityEnclosed( HttpEntity entity, ContentType contentType ) + throws IOException + { + super.onEntityEnclosed( entity, contentType ); + } + + private long getLen( LengthDelimitedDecoder ldl ) + { + try + { + Field lenField = LengthDelimitedDecoder.class.getDeclaredField( "len" ); + lenField.setAccessible( true ); + long len = (Long) lenField.get( ldl ); + return len; + } + catch ( NoSuchFieldException e ) + { + log.debug( e.getMessage(), e ); + return -1; + } + catch ( IllegalAccessException e ) + { + log.debug( e.getMessage(), e ); + return -1; + } + } + } private static class ZeroCopyResourceFetcher implements ResourceFetcher @@ -348,7 +457,7 @@ public class DownloadRemoteIndexTask } public InputStream retrieve( final String name ) - throws IOException, FileNotFoundException + throws IOException { log.info( "index update retrieve file, name:{}", name ); @@ -359,29 +468,9 @@ public class DownloadRemoteIndexTask } file.deleteOnExit(); - ZeroCopyConsumer<File> consumer = new ZeroCopyConsumer<File>( file ) - { - - @Override - protected File process( final HttpResponse response, final File file, final ContentType contentType ) - throws Exception - { - if ( response.getStatusLine().getStatusCode() != HttpStatus.SC_OK ) - { - throw new ClientProtocolException( "Upload failed: " + response.getStatusLine() ); - } - return file; - } + ZeroCopyConsumer<File> consumer = new ZeroCopyConsumerListener( file, name ); - @Override - protected void onContentReceived( ContentDecoder decoder, IOControl ioctrl ) - throws IOException - { - log.debug( "onContentReceived" ); - super.onContentReceived( decoder, ioctrl ); - } - }; - URL targetUrl = new URL( this.remoteRepository.getUrl() ); + URL targetUrl = new URL( this.baseIndexUrl ); final HttpHost targetHost = new HttpHost( targetUrl.getHost(), targetUrl.getPort() ); Future<File> httpResponseFuture = httpclient.execute( new HttpAsyncRequestProducer() @@ -415,7 +504,7 @@ public class DownloadRemoteIndexTask @Override public void requestCompleted( HttpContext context ) { - // no op + log.debug( "requestCompleted" ); } @Override @@ -427,6 +516,7 @@ public class DownloadRemoteIndexTask @Override public boolean isRepeatable() { + log.debug( "isRepeatable" ); return true; } @@ -434,15 +524,16 @@ public class DownloadRemoteIndexTask public void resetRequest() throws IOException { - // no op + log.debug( "resetRequest" ); } @Override public void close() throws IOException { - // no op + log.debug( "close" ); } + }, consumer, null ); try { |