1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.vfs.provider.ftp;
18
19 import org.apache.commons.net.ftp.FTP;
20 import org.apache.commons.net.ftp.FTPClient;
21 import org.apache.commons.net.ftp.FTPClientConfig;
22 import org.apache.commons.net.ftp.FTPReply;
23 import org.apache.commons.net.ftp.parser.FTPFileEntryParserFactory;
24 import org.apache.commons.vfs.FileSystemException;
25 import org.apache.commons.vfs.FileSystemOptions;
26 import org.apache.commons.vfs.util.UserAuthenticatorUtils;
27
28 import java.io.IOException;
29
30 /***
31 * Create a FtpClient instance
32 *
33 * @author <a href="mailto:imario@apache.org">Mario Ivankovits</a>
34 * @version $Revision: 480428 $ $Date: 2006-11-29 07:15:24 +0100 (Mi, 29 Nov 2006) $
35 */
36 public class FtpClientFactory
37 {
38 private FtpClientFactory()
39 {
40 }
41
42 /***
43 * Creates a new connection to the server.
44 */
45 public static FTPClient createConnection(String hostname, int port, char[] username, char[] password, String workingDirectory, FileSystemOptions fileSystemOptions) throws FileSystemException
46 {
47
48 if (username == null)
49 {
50 username = "anonymous".toCharArray();
51 }
52
53 if (password == null)
54 {
55 password = "anonymous".toCharArray();
56 }
57
58 try
59 {
60 final FTPClient client = new FTPClient();
61
62 String key = FtpFileSystemConfigBuilder.getInstance().getEntryParser(fileSystemOptions);
63 if (key != null)
64 {
65 FTPClientConfig config = new FTPClientConfig(key);
66
67 String serverLanguageCode = FtpFileSystemConfigBuilder.getInstance().getServerLanguageCode(fileSystemOptions);
68 if (serverLanguageCode != null)
69 {
70 config.setServerLanguageCode(serverLanguageCode);
71 }
72 String defaultDateFormat = FtpFileSystemConfigBuilder.getInstance().getDefaultDateFormat(fileSystemOptions);
73 if (defaultDateFormat != null)
74 {
75 config.setDefaultDateFormatStr(defaultDateFormat);
76 }
77 String recentDateFormat = FtpFileSystemConfigBuilder.getInstance().getRecentDateFormat(fileSystemOptions);
78 if (recentDateFormat != null)
79 {
80 config.setRecentDateFormatStr(recentDateFormat);
81 }
82 String serverTimeZoneId = FtpFileSystemConfigBuilder.getInstance().getServerTimeZoneId(fileSystemOptions);
83 if (serverTimeZoneId != null)
84 {
85 config.setServerTimeZoneId(serverTimeZoneId);
86 }
87 String[] shortMonthNames = FtpFileSystemConfigBuilder.getInstance().getShortMonthNames(fileSystemOptions);
88 if (shortMonthNames != null)
89 {
90 StringBuffer shortMonthNamesStr = new StringBuffer(40);
91 for (int i = 0; i<shortMonthNames.length; i++)
92 {
93 if (shortMonthNamesStr.length()>0)
94 {
95 shortMonthNamesStr.append("|");
96 }
97 shortMonthNamesStr.append(shortMonthNames[i]);
98 }
99 config.setShortMonthNames(shortMonthNamesStr.toString());
100 }
101
102 client.configure(config);
103 }
104
105 FTPFileEntryParserFactory myFactory = FtpFileSystemConfigBuilder.getInstance().getEntryParserFactory(fileSystemOptions);
106 if (myFactory != null)
107 {
108 client.setParserFactory(myFactory);
109 }
110
111 try
112 {
113 client.connect(hostname, port);
114
115 int reply = client.getReplyCode();
116 if (!FTPReply.isPositiveCompletion(reply))
117 {
118 throw new FileSystemException("vfs.provider.ftp/connect-rejected.error", hostname);
119 }
120
121
122 if (!client.login(
123 UserAuthenticatorUtils.toString(username),
124 UserAuthenticatorUtils.toString(password)))
125 {
126 throw new FileSystemException("vfs.provider.ftp/login.error", new Object[]{hostname, UserAuthenticatorUtils.toString(username)}, null);
127 }
128
129
130 if (!client.setFileType(FTP.BINARY_FILE_TYPE))
131 {
132 throw new FileSystemException("vfs.provider.ftp/set-binary.error", hostname);
133 }
134
135
136 Integer dataTimeout = FtpFileSystemConfigBuilder.getInstance().getDataTimeout(fileSystemOptions);
137 if (dataTimeout != null)
138 {
139 client.setDataTimeout(dataTimeout.intValue());
140 }
141
142
143
144
145
146 Boolean userDirIsRoot = FtpFileSystemConfigBuilder.getInstance().getUserDirIsRoot(fileSystemOptions);
147 if (workingDirectory != null && (userDirIsRoot == null || !userDirIsRoot.booleanValue()))
148 {
149 if (!client.changeWorkingDirectory(workingDirectory))
150 {
151 throw new FileSystemException("vfs.provider.ftp/change-work-directory.error", workingDirectory);
152 }
153 }
154
155 Boolean passiveMode = FtpFileSystemConfigBuilder.getInstance().getPassiveMode(fileSystemOptions);
156 if (passiveMode != null && passiveMode.booleanValue())
157 {
158 client.enterLocalPassiveMode();
159 }
160 }
161 catch (final IOException e)
162 {
163 if (client.isConnected())
164 {
165 client.disconnect();
166 }
167 throw e;
168 }
169
170 return client;
171 }
172 catch (final Exception exc)
173 {
174 throw new FileSystemException("vfs.provider.ftp/connect.error", new Object[]{hostname}, exc);
175 }
176 }
177 }