extensions/net.sf.basedb.xfiles/trunk/src/net/sf/basedb/xfiles/ftp/FTPClientWrapper.java

Code
Comments
Other
Rev Date Author Line
2521 25 Jun 14 nicklas 1 package net.sf.basedb.xfiles.ftp;
2521 25 Jun 14 nicklas 2
2521 25 Jun 14 nicklas 3 import it.sauronsoftware.ftp4j.FTPClient;
2572 13 Aug 14 nicklas 4 import it.sauronsoftware.ftp4j.FTPFile;
2521 25 Jun 14 nicklas 5
2521 25 Jun 14 nicklas 6 import java.io.Closeable;
2521 25 Jun 14 nicklas 7 import java.io.IOException;
2572 13 Aug 14 nicklas 8 import java.io.InputStream;
2572 13 Aug 14 nicklas 9 import java.io.OutputStream;
2572 13 Aug 14 nicklas 10 import java.io.PipedInputStream;
2572 13 Aug 14 nicklas 11 import java.io.PipedOutputStream;
2572 13 Aug 14 nicklas 12 import java.net.URI;
2521 25 Jun 14 nicklas 13
2572 13 Aug 14 nicklas 14 import net.sf.basedb.util.FileUtil;
2572 13 Aug 14 nicklas 15 import net.sf.basedb.xfiles.ConnectionInfo;
2572 13 Aug 14 nicklas 16 import net.sf.basedb.xfiles.XFiles;
2572 13 Aug 14 nicklas 17
2521 25 Jun 14 nicklas 18 /**
2521 25 Jun 14 nicklas 19   Wrapper class around a FTPClient object that implements the 
2521 25 Jun 14 nicklas 20   {@link Closeable} interface. Calls {@link FTPClient#disconnect(boolean)}
2521 25 Jun 14 nicklas 21   when {@link #close()} is called.
2521 25 Jun 14 nicklas 22   
2521 25 Jun 14 nicklas 23   @author nicklas
2521 25 Jun 14 nicklas 24   @since 1.0
2521 25 Jun 14 nicklas 25 */
2572 13 Aug 14 nicklas 26 public class FTPClientWrapper 
2521 25 Jun 14 nicklas 27   implements Closeable 
2521 25 Jun 14 nicklas 28 {
2521 25 Jun 14 nicklas 29   
2572 13 Aug 14 nicklas 30   public final FTPClient ftp;
2572 13 Aug 14 nicklas 31   private int openFiles;
2572 13 Aug 14 nicklas 32   private boolean isCached;
2521 25 Jun 14 nicklas 33   
2572 13 Aug 14 nicklas 34   public FTPClientWrapper(FTPClient ftp, ConnectionInfo info)
2521 25 Jun 14 nicklas 35   {
2521 25 Jun 14 nicklas 36     this.ftp = ftp;
2572 13 Aug 14 nicklas 37     this.isCached = FtpConnectionManager.CONNECTION_CACHE.setClient(info, this);
2521 25 Jun 14 nicklas 38   }
2521 25 Jun 14 nicklas 39
2521 25 Jun 14 nicklas 40   @Override
2521 25 Jun 14 nicklas 41   public void close() 
2521 25 Jun 14 nicklas 42     throws IOException
2521 25 Jun 14 nicklas 43   {
2521 25 Jun 14 nicklas 44     if (ftp == null) return;
2572 13 Aug 14 nicklas 45     if (openFiles == 0 || !isCached)
2521 25 Jun 14 nicklas 46     {
2572 13 Aug 14 nicklas 47       try
2572 13 Aug 14 nicklas 48       {
2572 13 Aug 14 nicklas 49         ftp.disconnect(true);
2572 13 Aug 14 nicklas 50       }
2572 13 Aug 14 nicklas 51       catch (Exception ex)
2572 13 Aug 14 nicklas 52       {
2572 13 Aug 14 nicklas 53         throw new IOException(ex);
2572 13 Aug 14 nicklas 54       }
2521 25 Jun 14 nicklas 55     }
2572 13 Aug 14 nicklas 56     else
2521 25 Jun 14 nicklas 57     {
2572 13 Aug 14 nicklas 58       openFiles--;
2521 25 Jun 14 nicklas 59     }
2521 25 Jun 14 nicklas 60   }
2572 13 Aug 14 nicklas 61   
2572 13 Aug 14 nicklas 62   public FTPFile[] list(URI uri)
2572 13 Aug 14 nicklas 63     throws Exception
2572 13 Aug 14 nicklas 64   {
2572 13 Aug 14 nicklas 65     FTPFile[] files = ftp.list(uri.getPath());
2572 13 Aug 14 nicklas 66     openFiles++;
2572 13 Aug 14 nicklas 67     return files;
2572 13 Aug 14 nicklas 68   }
2521 25 Jun 14 nicklas 69
2572 13 Aug 14 nicklas 70   public InputStream download(final URI uri, final long offset)
2572 13 Aug 14 nicklas 71   {
2572 13 Aug 14 nicklas 72     final PipedInputStream in = new PipedInputStream(XFiles.DEFAULT_BUFFER_SIZE);
2572 13 Aug 14 nicklas 73     Thread download = new Thread(new Runnable() 
2572 13 Aug 14 nicklas 74     {  
2572 13 Aug 14 nicklas 75       @Override
2572 13 Aug 14 nicklas 76       public void run() 
2572 13 Aug 14 nicklas 77       {
2572 13 Aug 14 nicklas 78         OutputStream out = null;
2572 13 Aug 14 nicklas 79         try
2572 13 Aug 14 nicklas 80         {
2572 13 Aug 14 nicklas 81           out = new PipedOutputStream(in);
2572 13 Aug 14 nicklas 82           ftp.download(uri.getPath(), out, offset, null);
2572 13 Aug 14 nicklas 83         }
2572 13 Aug 14 nicklas 84         catch (Exception ex)
2572 13 Aug 14 nicklas 85         {
2572 13 Aug 14 nicklas 86           throw new RuntimeException(ex);
2572 13 Aug 14 nicklas 87         }
2572 13 Aug 14 nicklas 88         finally
2572 13 Aug 14 nicklas 89         {
2572 13 Aug 14 nicklas 90           FileUtil.close(out);
2572 13 Aug 14 nicklas 91         }
2572 13 Aug 14 nicklas 92       }
2572 13 Aug 14 nicklas 93     });
2572 13 Aug 14 nicklas 94     download.start();
2572 13 Aug 14 nicklas 95     openFiles++;
2572 13 Aug 14 nicklas 96     return in;
2572 13 Aug 14 nicklas 97   }
2572 13 Aug 14 nicklas 98   
2521 25 Jun 14 nicklas 99 }