UnixFTPEntryParserpublic class UnixFTPEntryParser extends ConfigurableFTPFileEntryParserImpl Implementation FTPFileEntryParser and FTPFileListParser for standard
Unix Systems.
This class is based on the logic of Daniel Savarese's
DefaultFTPListParser, but adapted to use regular expressions and to fit the
new FTPFileEntryParser interface. |
Fields Summary |
---|
private static final String | DEFAULT_MONTHSmonths abbreviations looked for by this parser. Also used
to determine which month is matched by the parser | static final String | DEFAULT_DATE_FORMAT | static final String | DEFAULT_RECENT_DATE_FORMAT | static final String | NUMERIC_DATE_FORMAT | public static final org.apache.commons.net.ftp.FTPClientConfig | NUMERIC_DATE_CONFIGSome Linux distributions are now shipping an FTP server which formats
file listing dates in an all-numeric format:
"yyyy-MM-dd HH:mm .
This is a very welcome development, and hopefully it will soon become
the standard. However, since it is so new, for now, and possibly
forever, we merely accomodate it, but do not make it the default.
For now end users may specify this format only via
UnixFTPEntryParser(FTPClientConfig) .
Steve Cohen - 2005-04-17 | private static final String | REGEXthis is the regular expression used by this parser.
Permissions:
r the file is readable
w the file is writable
x the file is executable
- the indicated permission is not granted
L mandatory locking occurs during access (the set-group-ID bit is
on and the group execution bit is off)
s the set-user-ID or set-group-ID bit is on, and the corresponding
user or group execution bit is also on
S undefined bit-state (the set-user-ID bit is on and the user
execution bit is off)
t the 1000 (octal) bit, or sticky bit, is on [see chmod(1)], and
execution is on
T the 1000 bit is turned on, and execution is off (undefined bit-
state) |
Constructors Summary |
---|
public UnixFTPEntryParser()The default constructor for a UnixFTPEntryParser object.
this(null);
| public UnixFTPEntryParser(org.apache.commons.net.ftp.FTPClientConfig config)This constructor allows the creation of a UnixFTPEntryParser object with
something other than the default configuration.
super(REGEX);
configure(config);
|
Methods Summary |
---|
protected org.apache.commons.net.ftp.FTPClientConfig | getDefaultConfiguration()Defines a default configuration to be used when this class is
instantiated without a {@link FTPClientConfig FTPClientConfig}
parameter being specified.
return new FTPClientConfig(
FTPClientConfig.SYST_UNIX,
DEFAULT_DATE_FORMAT,
DEFAULT_RECENT_DATE_FORMAT,
null, null, null);
| public org.apache.commons.net.ftp.FTPFile | parseFTPEntry(java.lang.String entry)Parses a line of a unix (standard) FTP server file listing and converts
it into a usable format in the form of an FTPFile
instance. If the file listing line doesn't describe a file,
null is returned, otherwise a FTPFile
instance representing the files in the directory is returned.
FTPFile file = new FTPFile();
file.setRawListing(entry);
int type;
boolean isDevice = false;
if (matches(entry))
{
String typeStr = group(1);
String hardLinkCount = group(15);
String usr = group(16);
String grp = group(17);
String filesize = group(18);
String datestr = group(19) + " " + group(20);
String name = group(21);
String endtoken = group(22);
try
{
file.setTimestamp(super.parseTimestamp(datestr));
}
catch (ParseException e)
{
return null; // this is a parsing failure too.
}
// bcdlfmpSs-
switch (typeStr.charAt(0))
{
case 'd":
type = FTPFile.DIRECTORY_TYPE;
break;
case 'l":
type = FTPFile.SYMBOLIC_LINK_TYPE;
break;
case 'b":
case 'c":
isDevice = true;
// break; - fall through
case 'f":
case '-":
type = FTPFile.FILE_TYPE;
break;
default:
type = FTPFile.UNKNOWN_TYPE;
}
file.setType(type);
int g = 4;
for (int access = 0; access < 3; access++, g += 4)
{
// Use != '-' to avoid having to check for suid and sticky bits
file.setPermission(access, FTPFile.READ_PERMISSION,
(!group(g).equals("-")));
file.setPermission(access, FTPFile.WRITE_PERMISSION,
(!group(g + 1).equals("-")));
String execPerm = group(g + 2);
if (!execPerm.equals("-") && !Character.isUpperCase(execPerm.charAt(0)))
{
file.setPermission(access, FTPFile.EXECUTE_PERMISSION, true);
}
else
{
file.setPermission(access, FTPFile.EXECUTE_PERMISSION, false);
}
}
if (!isDevice)
{
try
{
file.setHardLinkCount(Integer.parseInt(hardLinkCount));
}
catch (NumberFormatException e)
{
// intentionally do nothing
}
}
file.setUser(usr);
file.setGroup(grp);
try
{
file.setSize(Long.parseLong(filesize));
}
catch (NumberFormatException e)
{
// intentionally do nothing
}
if (null == endtoken)
{
file.setName(name);
}
else
{
// oddball cases like symbolic links, file names
// with spaces in them.
name += endtoken;
if (type == FTPFile.SYMBOLIC_LINK_TYPE)
{
int end = name.indexOf(" -> ");
// Give up if no link indicator is present
if (end == -1)
{
file.setName(name);
}
else
{
file.setName(name.substring(0, end));
file.setLink(name.substring(end + 4));
}
}
else
{
file.setName(name);
}
}
return file;
}
return null;
|
|