FTPClientConfigpublic class FTPClientConfig extends Object
This class implements an alternate means of configuring the
{@link org.apache.commons.net.ftp.FTPClient FTPClient} object and
also subordinate objects which it uses. Any class implementing the
{@link org.apache.commons.net.ftp.Configurable Configurable }
interface can be configured by this object.
In particular this class was designed primarily to support configuration
of FTP servers which express file timestamps in formats and languages
other than those for the US locale, which although it is the most common
is not universal. Unfortunately, nothing in the FTP spec allows this to
be determined in an automated way, so manual configuration such as this
is necessary.
This functionality was designed to allow existing clients to work exactly
as before without requiring use of this component. This component should
only need to be explicitly invoked by the user of this package for problem
cases that previous implementations could not solve.
Examples of use of FTPClientConfig
Use cases:
You are trying to access a server that
- lists files with timestamps that use month names in languages other
than English
- lists files with timestamps that use date formats other
than the American English "standard"
MM dd yyyy
- is in different timezone and you need accurate timestamps for
dependency checking as in Ant
Unpaged (whole list) access on a UNIX server that uses French month names
but uses the "standard" MMM d yyyy date formatting
FTPClient f=FTPClient();
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
conf.setServerLanguageCode("fr");
f.configure(conf);
f.connect(server);
f.login(username, password);
FTPFile[] files = listFiles(directory);
Paged access on a UNIX server that uses Danish month names
and "European" date formatting in Denmark's time zone, when you
are in some other time zone.
FTPClient f=FTPClient();
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
conf.setServerLanguageCode("da");
conf.setDefaultDateFormat("d MMM yyyy");
conf.setRecentDateFormat("d MMM HH:mm");
conf.setTimeZoneId("Europe/Copenhagen");
f.configure(conf);
f.connect(server);
f.login(username, password);
FTPListParseEngine engine =
f.initiateListParsing("com.whatever.YourOwnParser", directory);
while (engine.hasNext()) {
FTPFile[] files = engine.getNext(25); // "page size" you want
//do whatever you want with these files, display them, etc.
//expensive FTPFile objects not created until needed.
}
Unpaged (whole list) access on a VMS server that uses month names
in a language not {@link #getSupportedLanguageCodes() supported} by the system.
but uses the "standard" MMM d yyyy date formatting
FTPClient f=FTPClient();
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_VMS);
conf.setShortMonthNames(
"jan|feb|mar|apr|ma\u00ED|j\u00FAn|j\u00FAl|\u00e1g\u00FA|sep|okt|n\u00F3v|des");
f.configure(conf);
f.connect(server);
f.login(username, password);
FTPFile[] files = listFiles(directory);
Unpaged (whole list) access on a Windows-NT server in a different time zone.
(Note, since the NT Format uses numeric date formatting, language issues
are irrelevant here).
FTPClient f=FTPClient();
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
conf.setTimeZoneId("America/Denver");
f.configure(conf);
f.connect(server);
f.login(username, password);
FTPFile[] files = listFiles(directory);
Unpaged (whole list) access on a Windows-NT server in a different time zone
but which has been configured to use a unix-style listing format.
FTPClient f=FTPClient();
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
conf.setTimeZoneId("America/Denver");
f.configure(conf);
f.connect(server);
f.login(username, password);
FTPFile[] files = listFiles(directory);
|
Fields Summary |
---|
public static final String | SYST_UNIXIdentifier by which a unix-based ftp server is known throughout
the commons-net ftp system. | public static final String | SYST_VMSIdentifier by which a vms-based ftp server is known throughout
the commons-net ftp system. | public static final String | SYST_NTIdentifier by which a WindowsNT-based ftp server is known throughout
the commons-net ftp system. | public static final String | SYST_OS2Identifier by which an OS/2-based ftp server is known throughout
the commons-net ftp system. | public static final String | SYST_OS400Identifier by which an OS/400-based ftp server is known throughout
the commons-net ftp system. | public static final String | SYST_MVSIdentifier by which an MVS-based ftp server is known throughout
the commons-net ftp system. | private final String | serverSystemKey | private String | defaultDateFormatStr | private String | recentDateFormatStr | private String | serverLanguageCode | private String | shortMonthNames | private String | serverTimeZoneId | private static Map | LANGUAGE_CODE_MAP |
Constructors Summary |
---|
public FTPClientConfig(String systemKey)The main constructor for an FTPClientConfig object
this.serverSystemKey = systemKey;
| public FTPClientConfig()Convenience constructor mainly for use in testing.
Constructs a UNIX configuration.
this(SYST_UNIX);
| public FTPClientConfig(String systemKey, String defaultDateFormatStr, String recentDateFormatStr, String serverLanguageCode, String shortMonthNames, String serverTimeZoneId)Constructor which allows setting of all member fields
this(systemKey);
this.defaultDateFormatStr = defaultDateFormatStr;
this.recentDateFormatStr = recentDateFormatStr;
this.serverLanguageCode = serverLanguageCode;
this.shortMonthNames = shortMonthNames;
this.serverTimeZoneId = serverTimeZoneId;
|
Methods Summary |
---|
public static java.text.DateFormatSymbols | getDateFormatSymbols(java.lang.String shortmonths)Returns a DateFormatSymbols object configured with short month names
as in the supplied string
String[] months = splitShortMonthString(shortmonths);
DateFormatSymbols dfs = new DateFormatSymbols(Locale.US);
dfs.setShortMonths(months);
return dfs;
| public java.lang.String | getDefaultDateFormatStr()getter for the {@link #setDefaultDateFormatStr(String) defaultDateFormatStr}
property.
return defaultDateFormatStr;
| public java.lang.String | getRecentDateFormatStr()getter for the {@link #setRecentDateFormatStr(String) recentDateFormatStr} property.
return recentDateFormatStr;
| public java.lang.String | getServerLanguageCode()
getter for the {@link #setServerLanguageCode(String) serverLanguageCode} property.
*
return serverLanguageCode;
| public java.lang.String | getServerSystemKey()Getter for the serverSystemKey property. This property
specifies the general type of server to which the client connects.
Should be either one of the FTPClientConfig.SYST_* codes
or else the fully qualified class name of a parser implementing both
the FTPFileEntryParser and Configurable
interfaces.
// if there are other commonly used month name encodings which
// correspond to particular locales, please add them here.
// many locales code short names for months as all three letters
// these we handle simply.
LANGUAGE_CODE_MAP.put("en", Locale.ENGLISH);
LANGUAGE_CODE_MAP.put("de",Locale.GERMAN);
LANGUAGE_CODE_MAP.put("it",Locale.ITALIAN);
LANGUAGE_CODE_MAP.put("es", new Locale("es", "", "")); // spanish
LANGUAGE_CODE_MAP.put("pt", new Locale("pt", "", "")); // portuguese
LANGUAGE_CODE_MAP.put("da", new Locale("da", "", "")); // danish
LANGUAGE_CODE_MAP.put("sv", new Locale("sv", "", "")); // swedish
LANGUAGE_CODE_MAP.put("no", new Locale("no", "", "")); // norwegian
LANGUAGE_CODE_MAP.put("nl", new Locale("nl", "", "")); // dutch
LANGUAGE_CODE_MAP.put("ro", new Locale("ro", "", "")); // romanian
LANGUAGE_CODE_MAP.put("sq", new Locale("sq", "", "")); // albanian
LANGUAGE_CODE_MAP.put("sh", new Locale("sh", "", "")); // serbo-croatian
LANGUAGE_CODE_MAP.put("sk", new Locale("sk", "", "")); // slovak
LANGUAGE_CODE_MAP.put("sl", new Locale("sl", "", "")); // slovenian
// some don't
LANGUAGE_CODE_MAP.put("fr",
"jan|f\u00e9v|mar|avr|mai|jun|jui|ao\u00fb|sep|oct|nov|d\u00e9c"); //french
return serverSystemKey;
| public java.lang.String | getServerTimeZoneId()getter for the {@link #setServerTimeZoneId(String) serverTimeZoneId} property.
return serverTimeZoneId;
| public java.lang.String | getShortMonthNames()
getter for the {@link #setShortMonthNames(String) shortMonthNames}
property.
return shortMonthNames;
| public static java.util.Collection | getSupportedLanguageCodes()Returns a Collection of all the language codes currently supported
by this class. See {@link #setServerLanguageCode(String) serverLanguageCode}
for a functional descrption of language codes within this system.
return LANGUAGE_CODE_MAP.keySet();
| public static java.text.DateFormatSymbols | lookupDateFormatSymbols(java.lang.String languageCode)Looks up the supplied language code in the internally maintained table of
language codes. Returns a DateFormatSymbols object configured with
short month names corresponding to the code. If there is no corresponding
entry in the table, the object returned will be that for
Locale.US
Object lang = LANGUAGE_CODE_MAP.get(languageCode);
if (lang != null) {
if (lang instanceof Locale) {
return new DateFormatSymbols((Locale) lang);
} else if (lang instanceof String){
return getDateFormatSymbols((String) lang);
}
}
return new DateFormatSymbols(Locale.US);
| public void | setDefaultDateFormatStr(java.lang.String defaultDateFormatStr)
setter for the defaultDateFormatStr property. This property
specifies the main date format that will be used by a parser configured
by this configuration to parse file timestamps. If this is not
specified, such a parser will use as a default value, the most commonly
used format which will be in as used in en_US locales.
This should be in the format described for
java.text.SimpleDateFormat .
property.
this.defaultDateFormatStr = defaultDateFormatStr;
| public void | setRecentDateFormatStr(java.lang.String recentDateFormatStr)
setter for the recentDateFormatStr property. This property
specifies a secondary date format that will be used by a parser
configured by this configuration to parse file timestamps, typically
those less than a year old. If this is not specified, such a parser
will not attempt to parse using an alternate format.
This is used primarily in unix-based systems.
This should be in the format described for
java.text.SimpleDateFormat .
this.recentDateFormatStr = recentDateFormatStr;
| public void | setServerLanguageCode(java.lang.String serverLanguageCode)
setter for the serverLanguageCode property. This property allows
user to specify a
two-letter ISO-639 language code that will be used to
configure the set of month names used by the file timestamp parser.
If neither this nor the {@link #setShortMonthNames(String) shortMonthNames}
is specified, parsing will assume English month names, which may or
may not be significant, depending on whether the date format(s)
specified via {@link #setDefaultDateFormatStr(String) defaultDateFormatStr}
and/or {@link #setRecentDateFormatStr(String) recentDateFormatStr} are using
numeric or alphabetic month names.
If the code supplied is not supported here, en_US
month names will be used. We are supporting here those language
codes which, when a java.util.Locale is constucted
using it, and a java.text.SimpleDateFormat is
constructed using that Locale, the array returned by the
SimpleDateFormat's getShortMonths() method consists
solely of three 8-bit ASCII character strings. Additionally,
languages which do not meet this requirement are included if a
common alternative set of short month names is known to be used.
This means that users who can tell us of additional such encodings
may get them added to the list of supported languages by contacting
the jakarta-commons-net team.
Please note that this attribute will NOT be used to determine a
locale-based date format for the language.
Experience has shown that many if not most FTP servers outside the
United States employ the standard en_US date format
orderings of MMM d yyyy and MMM d HH:mm
and attempting to deduce this automatically here would cause more
problems than it would solve. The date format must be changed
via the {@link #setDefaultDateFormatStr(String) defaultDateFormatStr} and/or
{@link #setRecentDateFormatStr(String) recentDateFormatStr} parameters.
this.serverLanguageCode = serverLanguageCode;
| public void | setServerTimeZoneId(java.lang.String serverTimeZoneId)
setter for the serverTimeZoneId property. This property
allows a time zone to be specified corresponding to that known to be
used by an FTP server in file listings. This might be particularly
useful to clients such as Ant that try to use these timestamps for
dependency checking.
This should be one of the identifiers used by
java.util.TimeZone to refer to time zones, for example,
America/Chicago or Asia/Rangoon .
this.serverTimeZoneId = serverTimeZoneId;
| public void | setShortMonthNames(java.lang.String shortMonthNames)
setter for the shortMonthNames property.
This property allows the user to specify a set of month names
used by the server that is different from those that may be
specified using the {@link #setServerLanguageCode(String) serverLanguageCode}
property.
This should be a string containing twelve strings each composed of
three characters, delimited by pipe (|) characters. Currently,
only 8-bit ASCII characters are known to be supported. For example,
a set of month names used by a hypothetical Icelandic FTP server might
conceivably be specified as
"jan|feb|mar|apr|maí|jún|júl|ágú|sep|okt|nóv|des" .
this.shortMonthNames = shortMonthNames;
| private static java.lang.String[] | splitShortMonthString(java.lang.String shortmonths)
StringTokenizer st = new StringTokenizer(shortmonths, "|");
int monthcnt = st.countTokens();
if (12 != monthcnt) {
throw new IllegalArgumentException(
"expecting a pipe-delimited string containing 12 tokens");
}
String[] months = new String[13];
int pos = 0;
while(st.hasMoreTokens()) {
months[pos++] = st.nextToken();
}
months[pos]="";
return months;
|
|