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 |
Wrapper class around a FTPClient object that implements the |
2521 |
25 Jun 14 |
nicklas |
{@link Closeable} interface. Calls {@link FTPClient#disconnect(boolean)} |
2521 |
25 Jun 14 |
nicklas |
when {@link #close()} is called. |
2521 |
25 Jun 14 |
nicklas |
22 |
|
2521 |
25 Jun 14 |
nicklas |
@author nicklas |
2521 |
25 Jun 14 |
nicklas |
@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 |
} |