FileDocCategorySizeDatePackage
UnixFTPEntryParser.javaAPI DocApache Commons NET 1.4.1 API9961Sat Dec 03 10:05:48 GMT 2005org.apache.commons.net.ftp.parser

UnixFTPEntryParser

public 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.
version
$Id: UnixFTPEntryParser.java 161712 2005-04-18 02:57:04Z scohen $
see
org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for usage instructions)

Fields Summary
private static final String
DEFAULT_MONTHS
months 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_CONFIG
Some 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
REGEX
this 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.

exception
IllegalArgumentException Thrown if the regular expression is unparseable. Should not be seen under normal conditions. It it is seen, this is a sign that REGEX is not a valid regular expression.



                                                   
     
    
        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.

param
config The {@link FTPClientConfig configuration} object used to configure this parser.
exception
IllegalArgumentException Thrown if the regular expression is unparseable. Should not be seen under normal conditions. It it is seen, this is a sign that REGEX is not a valid regular expression.
since
1.4

        super(REGEX);
        configure(config);
    
Methods Summary
protected org.apache.commons.net.ftp.FTPClientConfiggetDefaultConfiguration()
Defines a default configuration to be used when this class is instantiated without a {@link FTPClientConfig FTPClientConfig} parameter being specified.

return
the default configuration for this parser.

        return new FTPClientConfig(
                FTPClientConfig.SYST_UNIX,
                DEFAULT_DATE_FORMAT,
                DEFAULT_RECENT_DATE_FORMAT,
                null, null, null);
    
public org.apache.commons.net.ftp.FTPFileparseFTPEntry(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.

param
entry A line of text from the file listing
return
An FTPFile instance corresponding to the supplied entry

        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;