1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.apache.commons.net.ftp.parser;
17 import java.text.ParseException;
18
19 import org.apache.commons.net.ftp.FTPClientConfig;
20 import org.apache.commons.net.ftp.FTPFile;
21
22 /**
23 * Implementation of FTPFileEntryParser and FTPFileListParser for NT Systems.
24 *
25 * @author <a href="Winston.Ojeda@qg.com">Winston Ojeda</a>
26 * @author <a href="mailto:scohen@apache.org">Steve Cohen</a>
27 * @version $Id: NTFTPEntryParser.java 155429 2005-02-26 13:13:04Z dirkv $
28 * @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for usage instructions)
29 */
30 public class NTFTPEntryParser extends ConfigurableFTPFileEntryParserImpl
31 {
32
33 private static final String DEFAULT_DATE_FORMAT
34 = "MM-dd-yy hh:mma";
35
36
37 /**
38 * this is the regular expression used by this parser.
39 */
40 private static final String REGEX =
41 "(\\S+)\\s+(\\S+)\\s+"
42 + "(<DIR>)?\\s*"
43 + "([0-9]+)?\\s+"
44 + "(\\S.*)";
45
46 /**
47 * The sole constructor for an NTFTPEntryParser object.
48 *
49 * @exception IllegalArgumentException
50 * Thrown if the regular expression is unparseable. Should not be seen
51 * under normal conditions. It it is seen, this is a sign that
52 * <code>REGEX</code> is not a valid regular expression.
53 */
54 public NTFTPEntryParser()
55 {
56 this(null);
57 }
58
59 /**
60 * This constructor allows the creation of an NTFTPEntryParser object
61 * with something other than the default configuration.
62 *
63 * @param config The {@link FTPClientConfig configuration} object used to
64 * configure this parser.
65 * @exception IllegalArgumentException
66 * Thrown if the regular expression is unparseable. Should not be seen
67 * under normal conditions. It it is seen, this is a sign that
68 * <code>REGEX</code> is not a valid regular expression.
69 * @since 1.4
70 */
71 public NTFTPEntryParser(FTPClientConfig config)
72 {
73 super(REGEX);
74 configure(config);
75 }
76
77 /**
78 * Parses a line of an NT FTP server file listing and converts it into a
79 * usable format in the form of an <code> FTPFile </code> instance. If the
80 * file listing line doesn't describe a file, <code> null </code> is
81 * returned, otherwise a <code> FTPFile </code> instance representing the
82 * files in the directory is returned.
83 * <p>
84 * @param entry A line of text from the file listing
85 * @return An FTPFile instance corresponding to the supplied entry
86 */
87 public FTPFile parseFTPEntry(String entry)
88 {
89 FTPFile f = new FTPFile();
90 f.setRawListing(entry);
91
92 if (matches(entry))
93 {
94 String datestr = group(1)+" "+group(2);
95 String dirString = group(3);
96 String size = group(4);
97 String name = group(5);
98 try
99 {
100 f.setTimestamp(super.parseTimestamp(datestr));
101 }
102 catch (ParseException e)
103 {
104 return null;
105 }
106
107 if (null == name || name.equals(".") || name.equals(".."))
108 {
109 return (null);
110 }
111 f.setName(name);
112
113
114 if ("<DIR>".equals(dirString))
115 {
116 f.setType(FTPFile.DIRECTORY_TYPE);
117 f.setSize(0);
118 }
119 else
120 {
121 f.setType(FTPFile.FILE_TYPE);
122 if (null != size)
123 {
124 f.setSize(Long.parseLong(size));
125 }
126 }
127 return (f);
128 }
129 return null;
130 }
131
132 /**
133 * Defines a default configuration to be used when this class is
134 * instantiated without a {@link FTPClientConfig FTPClientConfig}
135 * parameter being specified.
136 * @return the default configuration for this parser.
137 */
138 public FTPClientConfig getDefaultConfiguration() {
139 return new FTPClientConfig(
140 FTPClientConfig.SYST_NT,
141 DEFAULT_DATE_FORMAT,
142 null, null, null, null);
143 }
144
145 }