001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.commons.net.ftp.parser;
019 import java.text.ParseException;
020
021 import org.apache.commons.net.ftp.Configurable;
022 import org.apache.commons.net.ftp.FTPClientConfig;
023 import org.apache.commons.net.ftp.FTPFile;
024
025 /**
026 * Implementation of FTPFileEntryParser and FTPFileListParser for NT Systems.
027 *
028 * @author <a href="Winston.Ojeda@qg.com">Winston Ojeda</a>
029 * @author <a href="mailto:scohen@apache.org">Steve Cohen</a>
030 * @version $Id: NTFTPEntryParser.java 1299238 2012-03-10 17:12:28Z sebb $
031 * @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for usage instructions)
032 */
033 public class NTFTPEntryParser extends ConfigurableFTPFileEntryParserImpl
034 {
035
036 private static final String DEFAULT_DATE_FORMAT
037 = "MM-dd-yy hh:mma"; //11-09-01 12:30PM
038
039 private static final String DEFAULT_DATE_FORMAT2
040 = "MM-dd-yy kk:mm"; //11-09-01 18:30
041
042 private FTPTimestampParser timestampParser;
043
044 /**
045 * this is the regular expression used by this parser.
046 */
047 private static final String REGEX =
048 "(\\S+)\\s+(\\S+)\\s+" // MM-dd-yy whitespace hh:mma|kk:mm; swallow trailing spaces
049 + "(?:(<DIR>)|([0-9]+))\\s+" // <DIR> or ddddd; swallow trailing spaces
050 + "(\\S.*)"; // First non-space followed by rest of line (name)
051
052 /**
053 * The sole constructor for an NTFTPEntryParser object.
054 *
055 * @exception IllegalArgumentException
056 * Thrown if the regular expression is unparseable. Should not be seen
057 * under normal conditions. It it is seen, this is a sign that
058 * <code>REGEX</code> is not a valid regular expression.
059 */
060 public NTFTPEntryParser()
061 {
062 this(null);
063 }
064
065 /**
066 * This constructor allows the creation of an NTFTPEntryParser object
067 * with something other than the default configuration.
068 *
069 * @param config The {@link FTPClientConfig configuration} object used to
070 * configure this parser.
071 * @exception IllegalArgumentException
072 * Thrown if the regular expression is unparseable. Should not be seen
073 * under normal conditions. It it is seen, this is a sign that
074 * <code>REGEX</code> is not a valid regular expression.
075 * @since 1.4
076 */
077 public NTFTPEntryParser(FTPClientConfig config)
078 {
079 super(REGEX);
080 configure(config);
081 FTPClientConfig config2 = new FTPClientConfig(
082 FTPClientConfig.SYST_NT,
083 DEFAULT_DATE_FORMAT2,
084 null, null, null, null);
085 config2.setDefaultDateFormatStr(DEFAULT_DATE_FORMAT2);
086 this.timestampParser = new FTPTimestampParserImpl();
087 ((Configurable)this.timestampParser).configure(config2);
088 }
089
090 /**
091 * Parses a line of an NT FTP server file listing and converts it into a
092 * usable format in the form of an <code> FTPFile </code> instance. If the
093 * file listing line doesn't describe a file, <code> null </code> is
094 * returned, otherwise a <code> FTPFile </code> instance representing the
095 * files in the directory is returned.
096 * <p>
097 * @param entry A line of text from the file listing
098 * @return An FTPFile instance corresponding to the supplied entry
099 */
100 public FTPFile parseFTPEntry(String entry)
101 {
102 FTPFile f = new FTPFile();
103 f.setRawListing(entry);
104
105 if (matches(entry))
106 {
107 String datestr = group(1)+" "+group(2);
108 String dirString = group(3);
109 String size = group(4);
110 String name = group(5);
111 try
112 {
113 f.setTimestamp(super.parseTimestamp(datestr));
114 }
115 catch (ParseException e)
116 {
117 // parsing fails, try the other date format
118 try
119 {
120 f.setTimestamp(timestampParser.parseTimestamp(datestr));
121 }
122 catch (ParseException e2)
123 {
124 // intentionally do nothing
125 }
126 }
127
128 if (null == name || name.equals(".") || name.equals(".."))
129 {
130 return (null);
131 }
132 f.setName(name);
133
134
135 if ("<DIR>".equals(dirString))
136 {
137 f.setType(FTPFile.DIRECTORY_TYPE);
138 f.setSize(0);
139 }
140 else
141 {
142 f.setType(FTPFile.FILE_TYPE);
143 if (null != size)
144 {
145 f.setSize(Long.parseLong(size));
146 }
147 }
148 return (f);
149 }
150 return null;
151 }
152
153 /**
154 * Defines a default configuration to be used when this class is
155 * instantiated without a {@link FTPClientConfig FTPClientConfig}
156 * parameter being specified.
157 * @return the default configuration for this parser.
158 */
159 @Override
160 public FTPClientConfig getDefaultConfiguration() {
161 return new FTPClientConfig(
162 FTPClientConfig.SYST_NT,
163 DEFAULT_DATE_FORMAT,
164 null, null, null, null);
165 }
166
167 }