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

VMSFTPEntryParser

public class VMSFTPEntryParser extends ConfigurableFTPFileEntryParserImpl
Implementation FTPFileEntryParser and FTPFileListParser for VMS Systems. This is a sample of VMS LIST output "1-JUN.LIS;1 9/9 2-JUN-1998 07:32:04 [GROUP,OWNER] (RWED,RWED,RWED,RE)", "1-JUN.LIS;2 9/9 2-JUN-1998 07:32:04 [GROUP,OWNER] (RWED,RWED,RWED,RE)", "DATA.DIR;1 1/9 2-JUN-1998 07:32:04 [GROUP,OWNER] (RWED,RWED,RWED,RE)",

Note: VMSFTPEntryParser can only be instantiated through the DefaultFTPParserFactory by classname. It will not be chosen by the autodetection scheme.

author
Winston Ojeda
author
Steve Cohen
author
Stephane ESTE-GRACIAS
version
$Id: VMSFTPEntryParser.java 155429 2005-02-26 13:13:04Z dirkv $
see
org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for usage instructions)
see
org.apache.commons.net.ftp.parser.DefaultFTPFileEntryParserFactory

Fields Summary
private static final String
DEFAULT_DATE_FORMAT
private static final String
REGEX
this is the regular expression used by this parser.
Constructors Summary
public VMSFTPEntryParser()
Constructor for a VMSFTPEntryParser 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 VMSFTPEntryParser(org.apache.commons.net.ftp.FTPClientConfig config)
This constructor allows the creation of a VMSFTPEntryParser 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_VMS,
                DEFAULT_DATE_FORMAT,
                null, null, null, null);
    
protected booleanisVersioning()

        return false;
    
public org.apache.commons.net.ftp.FTPFileparseFTPEntry(java.lang.String entry)
Parses a line of a VMS 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

        //one block in VMS equals 512 bytes
        long longBlock = 512;

        if (matches(entry))
        {
            FTPFile f = new FTPFile();
            f.setRawListing(entry);
            String name = group(1);
            String size = group(2);
        	String datestr = group(3)+" "+group(4);
            String owner = group(5);
            try
            {
                f.setTimestamp(super.parseTimestamp(datestr));
            }
            catch (ParseException e)
            {
            	return null;  // this is a parsing failure too.
            }


            String grp;
            String user;
            StringTokenizer t = new StringTokenizer(owner, ",");
            switch (t.countTokens()) {
                case 1:
                    grp  = null;
                    user = t.nextToken();
                    break;
                case 2:
                    grp  = t.nextToken();
                    user = t.nextToken();
                    break;
                default:
                    grp  = null;
                    user = null;
            }

            if (name.lastIndexOf(".DIR") != -1)
            {
                f.setType(FTPFile.DIRECTORY_TYPE);
            }
            else
            {
                f.setType(FTPFile.FILE_TYPE);
            }
            //set FTPFile name
            //Check also for versions to be returned or not
            if (isVersioning())
            {
                f.setName(name);
            }
            else
            {
                name = name.substring(0, name.lastIndexOf(";"));
                f.setName(name);
            }
            //size is retreived in blocks and needs to be put in bytes
            //for us humans and added to the FTPFile array
            long sizeInBytes = Long.parseLong(size) * longBlock;
            f.setSize(sizeInBytes);

            f.setGroup(grp);
            f.setUser(user);
            //set group and owner
            //Since I don't need the persmissions on this file (RWED), I'll
            //leave that for further development. 'Cause it will be a bit
            //elaborate to do it right with VMSes World, Global and so forth.
            return f;
        }
        return null;
    
public org.apache.commons.net.ftp.FTPFile[]parseFileList(java.io.InputStream listStream)
Parses an FTP server file listing and converts it into a usable format in the form of an array of FTPFile instances. If the file list contains no files, null should be returned, otherwise an array of FTPFile instances representing the files in the directory is returned.

param
listStream The InputStream from which the file list should be read.
return
The list of file information contained in the given path. null if the list could not be obtained or if there are no files in the directory.
exception
IOException If an I/O error occurs reading the listStream.

        FTPListParseEngine engine = new FTPListParseEngine(this);
        engine.readServerList(listStream);
        return engine.getFiles();
    
public java.lang.StringreadNextEntry(java.io.BufferedReader reader)
Reads the next entry using the supplied BufferedReader object up to whatever delemits one entry from the next. This parser cannot use the default implementation of simply calling BufferedReader.readLine(), because one entry may span multiple lines.

param
reader The BufferedReader object from which entries are to be read.
return
A string representing the next ftp entry or null if none found.
exception
IOException thrown on any IO Error reading from the reader.

        String line = reader.readLine();
        StringBuffer entry = new StringBuffer();
        while (line != null)
        {
            if (line.startsWith("Directory") || line.startsWith("Total")) {
                line = reader.readLine();
                continue;
            }

            entry.append(line);
            if (line.trim().endsWith(")"))
            {
                break;
            }
            line = reader.readLine();
        }
        return (entry.length() == 0 ? null : entry.toString());