blob: 4caa994fc5480f31270cbf7974484636d83605b9 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.net.ftp.ftp2.parser;
import java.util.Calendar;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.ftp2.FTPFileEntryParser;
/**
* This Class uses the ListParser class to validate the input string.
* It also requires the NetComponents library version 1.3.7 or later
* and the OROMatcher library for the regualar expressions stuff.
*
*
* <P><B>USAGE:</B></P>
* <LI>Create an instance of OS2FTPEntryParser</LI>
* <dd>OS2FTPEntryParser parser = new OS2FTPEntryParser();
* <LI>Create an instance of FTPClient</LI>
* <dd>FTPClient FTPClientObj = new FTPClient();
* <LI>Connect to the NODE </LI>
* <dd>FTPClientObj.connect();
* <LI>Login to the NODE </LI>
* <dd>FTPClientObj.login(username,password);
* <LI>Switch directories if you have to</LI>
* <dd>FTPClientObj.changeWorkingDirectory(thePath);
* <LI>You might want to check if you are truly in a OS2 System</LI>
* <dd><B>String am_I_OS2 = FTPClientObj.getSystemName()</B>
* <dd>parse am_I_OS2 to find out
* <LI>Call listFiles passing the newly created parser and a filename or a mask
* to look for </LI>
* <dd>FTPClientObj.listFiles(parser,filename);
* <LI>You'll get back the list as an array of FTPFiles like this
* <dd>FTPFile[] myOS2Files = FTPClientObj.listFiles(parser,filename); (or)
* <dd>FTPFile[] myOS2Files = FTPClientObj.listFiles(parser);
* <P>
* That's all there is to it.
* <P>
* Each FTPFile object is populated just like any other FTPFile
* object. The only thing not implemented at this time is the file
* permissions, but I can do it if there is a real need for it.
* <P>
* !NOTE/WARNING!:Before you pass the parser to listFiles, make sure you are
* in the directory that you need to be. This parser will return the filtered
* files from the directory it is in. This becomes specially crucial if your
* goal is to delete the output of the parser.
* <P>
* @author <a href="Winston.Ojeda@qg.com">Winston Ojeda</a>
* @author <a href="mailto:scohen@apache.org">Steve Cohen</a>
* @version $Id$
* @see org.apache.commons.net.ftp.FTPFileListParser
*/
public class OS2FTPEntryParser
extends MatchApparatus implements FTPFileEntryParser
{
private static final String REGEX =
"(\\s+|[0-9]+)\\s*" +
"(\\s+|[A-Z]+)\\s*" +
"(DIR|\\s+)\\s*" +
"((?:0[1-9])|(?:1[0-2]))-" +
"((?:0[1-9])|(?:[1-2]\\d)|(?:3[0-1]))-" +
"(\\d\\d)\\s*" +
"(?:([0-1]\\d)|(?:2[0-3])):" +
"([0-5]\\d)\\s*" +
"(\\S.*)";
/**
* The sole constructor for a OS2FTPEntryParser 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
* <code>REGEX</code> is not a valid regular expression.
*/
public OS2FTPEntryParser()
{
super(REGEX);
}
/**
* Parses a line of an OS2 FTP server file listing and converts it into a
* usable format in the form of an <code> FTPFile </code> instance. If the
* file listing line doesn't describe a file, <code> null </code> is
* returned, otherwise a <code> FTPFile </code> instance representing the
* files in the directory is returned.
* <p>
* @param entry A line of text from the file listing
* @return An FTPFile instance corresponding to the supplied entry
*/
public FTPFile parseFTPEntry(String entry)
{
FTPFile f = new FTPFile();
if (matches(entry))
{
String size = group(1);
String attrib = group(2);
String dirString = group(3);
String mo = group(4);
String da = group(5);
String yr = group(6);
String hr = group(7);
String min = group(8);
String name = group(9);
//is it a DIR or a file
if (dirString.trim().equals("DIR") || attrib.trim().equals("DIR"))
{
f.setType(FTPFile.DIRECTORY_TYPE);
}
else
{
f.setType(FTPFile.FILE_TYPE);
}
Calendar cal = Calendar.getInstance();
//convert all the calendar stuff to ints
int month = new Integer(mo).intValue() - 1;
int day = new Integer(da).intValue();
int year = new Integer(yr).intValue() + 2000;
int hour = new Integer(hr).intValue();
int minutes = new Integer(min).intValue();
// Y2K stuff? this will break again in 2080 but I will
// be sooooo dead anyways who cares.
// SMC - IS OS2's directory date REALLY still not Y2K-compliant?
if (year > 2080)
{
year -= 100;
}
//set the calendar
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, minutes);
cal.set(Calendar.HOUR_OF_DAY, hour);
cal.set(Calendar.YEAR, year);
cal.set(Calendar.DATE, day);
cal.set(Calendar.MONTH, month);
f.setTimestamp(cal);
//set the name
f.setName(name.trim());
//set the size
Long theSize = new Long(size.trim());
theSize = new Long(String.valueOf(theSize.intValue()));
f.setSize(theSize.longValue());
return (f);
}
return null;
}
}