001 /*
002 * Copyright 2001-2005 The Apache Software Foundation
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.apache.commons.net.ftp.parser;
017 import java.text.ParseException;
018
019 import org.apache.commons.net.ftp.FTPClientConfig;
020 import org.apache.commons.net.ftp.FTPFile;
021
022 /**
023 * Implementation of FTPFileEntryParser and FTPFileListParser for OS2 Systems.
024 *
025 * @author <a href="Winston.Ojeda@qg.com">Winston Ojeda</a>
026 * @author <a href="mailto:scohen@apache.org">Steve Cohen</a>
027 * @version $Id: OS2FTPEntryParser.java 155429 2005-02-26 13:13:04Z dirkv $
028 * @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for usage instructions)
029 */
030 public class OS2FTPEntryParser extends ConfigurableFTPFileEntryParserImpl
031
032 {
033
034 private static final String DEFAULT_DATE_FORMAT
035 = "MM-dd-yy HH:mm"; //11-09-01 12:30
036 /**
037 * this is the regular expression used by this parser.
038 */
039 private static final String REGEX =
040 "(\\s+|[0-9]+)\\s*"
041 + "(\\s+|[A-Z]+)\\s*"
042 + "(DIR|\\s+)\\s*"
043 + "(\\S+)\\s+(\\S+)\\s+" /* date stuff */
044 + "(\\S.*)";
045
046 /**
047 * The default constructor for a OS2FTPEntryParser object.
048 *
049 * @exception IllegalArgumentException
050 * Thrown if the regular expression is unparseable. Should not be seen
051 * under normal conditions. It it is seen, this is a sign that
052 * <code>REGEX</code> is not a valid regular expression.
053 */
054 public OS2FTPEntryParser()
055 {
056 this(null);
057 }
058
059 /**
060 * This constructor allows the creation of an OS2FTPEntryParser object
061 * with something other than the default configuration.
062 *
063 * @param config The {@link FTPClientConfig configuration} object used to
064 * configure this parser.
065 * @exception IllegalArgumentException
066 * Thrown if the regular expression is unparseable. Should not be seen
067 * under normal conditions. It it is seen, this is a sign that
068 * <code>REGEX</code> is not a valid regular expression.
069 * @since 1.4
070 */
071 public OS2FTPEntryParser(FTPClientConfig config)
072 {
073 super(REGEX);
074 configure(config);
075 }
076
077 /**
078 * Parses a line of an OS2 FTP server file listing and converts it into a
079 * usable format in the form of an <code> FTPFile </code> instance. If the
080 * file listing line doesn't describe a file, <code> null </code> is
081 * returned, otherwise a <code> FTPFile </code> instance representing the
082 * files in the directory is returned.
083 * <p>
084 * @param entry A line of text from the file listing
085 * @return An FTPFile instance corresponding to the supplied entry
086 */
087 public FTPFile parseFTPEntry(String entry)
088 {
089
090 FTPFile f = new FTPFile();
091 if (matches(entry))
092 {
093 String size = group(1);
094 String attrib = group(2);
095 String dirString = group(3);
096 String datestr = group(4)+" "+group(5);
097 String name = group(6);
098 try
099 {
100 f.setTimestamp(super.parseTimestamp(datestr));
101 }
102 catch (ParseException e)
103 {
104 return null; // this is a parsing failure too.
105 }
106
107
108 //is it a DIR or a file
109 if (dirString.trim().equals("DIR") || attrib.trim().equals("DIR"))
110 {
111 f.setType(FTPFile.DIRECTORY_TYPE);
112 }
113 else
114 {
115 f.setType(FTPFile.FILE_TYPE);
116 }
117
118
119 //set the name
120 f.setName(name.trim());
121
122 //set the size
123 f.setSize(Long.parseLong(size.trim()));
124
125 return (f);
126 }
127 return null;
128
129 }
130
131 /**
132 * Defines a default configuration to be used when this class is
133 * instantiated without a {@link FTPClientConfig FTPClientConfig}
134 * parameter being specified.
135 * @return the default configuration for this parser.
136 */
137 protected FTPClientConfig getDefaultConfiguration() {
138 return new FTPClientConfig(
139 FTPClientConfig.SYST_OS2,
140 DEFAULT_DATE_FORMAT,
141 null, null, null, null);
142 }
143
144 }