1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 package org.apache.commons.net.ftp.parser;
19 import java.util.Calendar;
20
21 import org.apache.commons.net.ftp.FTPFile;
22
23 /**
24 * Parser for the Connect Enterprise Unix FTP Server From Sterling Commerce.
25 * Here is a sample of the sort of output line this parser processes:
26 * "-C--E-----FTP B QUA1I1 18128 41 Aug 12 13:56 QUADTEST"
27 * <P><B>
28 * Note: EnterpriseUnixFTPEntryParser can only be instantiated through the
29 * DefaultFTPParserFactory by classname. It will not be chosen
30 * by the autodetection scheme.
31 * </B>
32 * @version $Id: EnterpriseUnixFTPEntryParser.java 658518 2008-05-21 01:04:30Z sebb $
33 * @author <a href="Winston.Ojeda@qg.com">Winston Ojeda</a>
34 * @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for usage instructions)
35 * @see org.apache.commons.net.ftp.parser.DefaultFTPFileEntryParserFactory
36 */
37 public class EnterpriseUnixFTPEntryParser extends RegexFTPFileEntryParserImpl
38 {
39
40 /**
41 * months abbreviations looked for by this parser. Also used
42 * to determine <b>which</b> month has been matched by the parser.
43 */
44 private static final String MONTHS =
45 "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)";
46
47 /**
48 * this is the regular expression used by this parser.
49 */
50 private static final String REGEX =
51 "(([\\-]|[A-Z])([\\-]|[A-Z])([\\-]|[A-Z])([\\-]|[A-Z])([\\-]|[A-Z])"
52 + "([\\-]|[A-Z])([\\-]|[A-Z])([\\-]|[A-Z])([\\-]|[A-Z])([\\-]|[A-Z]))"
53 + "(\\S*)\\s*"
54 + "(\\S+)\\s*"
55 + "(\\S*)\\s*"
56 + "(\\d*)\\s*"
57 + "(\\d*)\\s*"
58 + MONTHS
59 + "\\s*"
60 + "((?:[012]\\d*)|(?:3[01]))\\s*"
61 + "((\\d\\d\\d\\d)|((?:[01]\\d)|(?:2[0123])):([012345]\\d))\\s"
62 + "(\\S*)(\\s*.*)";
63
64 /**
65 * The sole constructor for a EnterpriseUnixFTPEntryParser object.
66 *
67 */
68 public EnterpriseUnixFTPEntryParser()
69 {
70 super(REGEX);
71 }
72
73 /**
74 * Parses a line of a unix FTP server file listing and converts it into a
75 * usable format in the form of an <code> FTPFile </code> instance. If
76 * the file listing line doesn't describe a file, <code> null </code> is
77 * returned, otherwise a <code> FTPFile </code> instance representing the
78 * files in the directory is returned.
79 *
80 * @param entry A line of text from the file listing
81 * @return An FTPFile instance corresponding to the supplied entry
82 */
83 public FTPFile parseFTPEntry(String entry)
84 {
85
86 FTPFile file = new FTPFile();
87 file.setRawListing(entry);
88
89 if (matches(entry))
90 {
91 String usr = group(14);
92 String grp = group(15);
93 String filesize = group(16);
94 String mo = group(17);
95 String da = group(18);
96 String yr = group(20);
97 String hr = group(21);
98 String min = group(22);
99 String name = group(23);
100
101 file.setType(FTPFile.FILE_TYPE);
102 file.setUser(usr);
103 file.setGroup(grp);
104 try
105 {
106 file.setSize(Long.parseLong(filesize));
107 }
108 catch (NumberFormatException e)
109 {
110 // intentionally do nothing
111 }
112
113 Calendar cal = Calendar.getInstance();
114 cal.set(Calendar.MILLISECOND, 0);
115 cal.set(Calendar.SECOND,
116 0);
117 cal.set(Calendar.MINUTE,
118 0);
119 cal.set(Calendar.HOUR_OF_DAY,
120 0);
121 try
122 {
123
124 int pos = MONTHS.indexOf(mo);
125 int month = pos / 4;
126 if (yr != null)
127 {
128 // it's a year
129 cal.set(Calendar.YEAR,
130 Integer.parseInt(yr));
131 }
132 else
133 {
134 // it must be hour/minute or we wouldn't have matched
135 int year = cal.get(Calendar.YEAR);
136
137 // if the month we're reading is greater than now, it must
138 // be last year
139 if (cal.get(Calendar.MONTH) < month)
140 {
141 year--;
142 }
143 cal.set(Calendar.YEAR,
144 year);
145 cal.set(Calendar.HOUR_OF_DAY,
146 Integer.parseInt(hr));
147 cal.set(Calendar.MINUTE,
148 Integer.parseInt(min));
149 }
150 cal.set(Calendar.MONTH,
151 month);
152 cal.set(Calendar.DATE,
153 Integer.parseInt(da));
154 file.setTimestamp(cal);
155 }
156 catch (NumberFormatException e)
157 {
158 // do nothing, date will be uninitialized
159 }
160 file.setName(name);
161
162 return file;
163 }
164 return null;
165 }
166 }