Coverage Report - org.apache.maven.shared.io.download.DefaultDownloadManager
 
Classes in this File Line Coverage Branch Coverage Complexity
DefaultDownloadManager
95%
55/58
100%
6/6
6.75
 
 1  
 package org.apache.maven.shared.io.download;
 2  
 
 3  
 import java.io.File;
 4  
 import java.io.IOException;
 5  
 import java.net.MalformedURLException;
 6  
 import java.net.URL;
 7  
 import java.util.Collections;
 8  
 import java.util.HashMap;
 9  
 import java.util.Iterator;
 10  
 import java.util.List;
 11  
 import java.util.Map;
 12  
 
 13  
 import org.apache.maven.artifact.manager.WagonManager;
 14  
 import org.apache.maven.shared.io.logging.MessageHolder;
 15  
 import org.apache.maven.wagon.ConnectionException;
 16  
 import org.apache.maven.wagon.ResourceDoesNotExistException;
 17  
 import org.apache.maven.wagon.TransferFailedException;
 18  
 import org.apache.maven.wagon.UnsupportedProtocolException;
 19  
 import org.apache.maven.wagon.Wagon;
 20  
 import org.apache.maven.wagon.authentication.AuthenticationException;
 21  
 import org.apache.maven.wagon.authorization.AuthorizationException;
 22  
 import org.apache.maven.wagon.events.TransferListener;
 23  
 import org.apache.maven.wagon.repository.Repository;
 24  
 
 25  
 public class DefaultDownloadManager
 26  
     implements DownloadManager
 27  
 {
 28  
 
 29  
     public static final String ROLE_HINT = "default";
 30  
 
 31  
     private WagonManager wagonManager;
 32  
 
 33  14
     private Map cache = new HashMap();
 34  
 
 35  2
     public DefaultDownloadManager()
 36  
     {
 37  2
     }
 38  
 
 39  12
     public DefaultDownloadManager( WagonManager wagonManager )
 40  
     {
 41  12
         this.wagonManager = wagonManager;
 42  12
     }
 43  
 
 44  
     public File download( String url, MessageHolder messageHolder )
 45  
         throws DownloadFailedException
 46  
     {
 47  11
         return download( url, Collections.EMPTY_LIST, messageHolder );
 48  
     }
 49  
 
 50  
     public File download( String url, List transferListeners, MessageHolder messageHolder )
 51  
         throws DownloadFailedException
 52  
     {
 53  12
         File downloaded = (File) cache.get( url );
 54  
 
 55  12
         if ( downloaded != null && downloaded.exists() )
 56  
         {
 57  1
             messageHolder.addMessage( "Using cached download: " + downloaded.getAbsolutePath() );
 58  
 
 59  1
             return downloaded;
 60  
         }
 61  
 
 62  
         URL sourceUrl;
 63  
         try
 64  
         {
 65  11
             sourceUrl = new URL( url );
 66  
         }
 67  1
         catch ( MalformedURLException e )
 68  
         {
 69  1
             throw new DownloadFailedException( url, "Download failed due to invalid URL. Reason: " + e.getMessage(), e );
 70  
         }
 71  
 
 72  10
         Wagon wagon = null;
 73  
 
 74  
         // Retrieve the correct Wagon instance used to download the remote archive
 75  
         try
 76  
         {
 77  10
             wagon = wagonManager.getWagon( sourceUrl.getProtocol() );
 78  
         }
 79  1
         catch ( UnsupportedProtocolException e )
 80  
         {
 81  1
             throw new DownloadFailedException( url, "Download failed. Reason: " + e.getMessage(), e );
 82  
         }
 83  
 
 84  9
         messageHolder.addMessage( "Using wagon: " + wagon + " to download: " + url );
 85  
 
 86  
         try
 87  
         {
 88  
             // create the landing file in /tmp for the downloaded source archive
 89  9
             downloaded = File.createTempFile( "download-", null );
 90  
 
 91  
             // delete when the JVM exits, to avoid polluting the temp dir...
 92  9
             downloaded.deleteOnExit();
 93  
         }
 94  0
         catch ( IOException e )
 95  
         {
 96  0
             throw new DownloadFailedException( url, "Failed to create temporary file target for download. Reason: "
 97  0
                 + e.getMessage(), e );
 98  
         }
 99  
 
 100  9
         messageHolder.addMessage( "Download target is: " + downloaded.getAbsolutePath() );
 101  
 
 102  
         // split the download URL into base URL and remote path for connecting, then retrieving.
 103  9
         String remotePath = sourceUrl.getPath();
 104  9
         String baseUrl = url.substring( 0, url.length() - remotePath.length() );
 105  
 
 106  19
         for ( Iterator it = transferListeners.iterator(); it.hasNext(); )
 107  
         {
 108  1
             TransferListener listener = (TransferListener) it.next();
 109  1
             wagon.addTransferListener( listener );
 110  
         }
 111  
 
 112  
         // connect to the remote site, and retrieve the archive. Note the separate methods in which
 113  
         // base URL and remote path are used.
 114  9
         Repository repo = new Repository( sourceUrl.getHost(), baseUrl );
 115  
 
 116  9
         messageHolder.addMessage( "Connecting to: " + repo.getHost() + "(baseUrl: " + repo.getUrl() + ")" );
 117  
 
 118  
         try
 119  
         {
 120  18
             wagon.connect( repo, wagonManager.getAuthenticationInfo( repo.getId() ), wagonManager.getProxy( sourceUrl
 121  9
                 .getProtocol() ) );
 122  
         }
 123  1
         catch ( ConnectionException e )
 124  
         {
 125  1
             throw new DownloadFailedException( url, "Download failed. Reason: " + e.getMessage(), e );
 126  
         }
 127  1
         catch ( AuthenticationException e )
 128  
         {
 129  1
             throw new DownloadFailedException( url, "Download failed. Reason: " + e.getMessage(), e );
 130  
         }
 131  
 
 132  7
         messageHolder.addMessage( "Getting: " + remotePath );
 133  
 
 134  
         try
 135  
         {
 136  7
             wagon.get( remotePath, downloaded );
 137  
 
 138  
             // cache this for later download requests to the same instance...
 139  4
             cache.put( url, downloaded );
 140  
 
 141  4
             return downloaded;
 142  
         }
 143  1
         catch ( TransferFailedException e )
 144  
         {
 145  1
             throw new DownloadFailedException( url, "Download failed. Reason: " + e.getMessage(), e );
 146  
         }
 147  1
         catch ( ResourceDoesNotExistException e )
 148  
         {
 149  1
             throw new DownloadFailedException( url, "Download failed. Reason: " + e.getMessage(), e );
 150  
         }
 151  1
         catch ( AuthorizationException e )
 152  
         {
 153  1
             throw new DownloadFailedException( url, "Download failed. Reason: " + e.getMessage(), e );
 154  
         }
 155  
         finally
 156  10
         {
 157  
             // ensure the Wagon instance is closed out properly.
 158  7
             if ( wagon != null )
 159  
             {
 160  
                 try
 161  
                 {
 162  7
                     messageHolder.addMessage( "Disconnecting." );
 163  
 
 164  7
                     wagon.disconnect();
 165  
                 }
 166  1
                 catch ( ConnectionException e )
 167  
                 {
 168  1
                     messageHolder.addMessage( "Failed to disconnect wagon for: " + url, e );
 169  
                 }
 170  
 
 171  15
                 for ( Iterator it = transferListeners.iterator(); it.hasNext(); )
 172  
                 {
 173  1
                     TransferListener listener = (TransferListener) it.next();
 174  1
                     wagon.removeTransferListener( listener );
 175  
                 }
 176  
             }
 177  10
         }
 178  
     }
 179  
 
 180  
 }