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 1417442 2012-12-05 14:32:02Z 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 @Override
84 public FTPFile parseFTPEntry(String entry)
85 {
86
87 FTPFile file = new FTPFile();
88 file.setRawListing(entry);
89
90 if (matches(entry))
91 {
92 String usr = group(14);
93 String grp = group(15);
94 String filesize = group(16);
95 String mo = group(17);
96 String da = group(18);
97 String yr = group(20);
98 String hr = group(21);
99 String min = group(22);
100 String name = group(23);
101
102 file.setType(FTPFile.FILE_TYPE);
103 file.setUser(usr);
104 file.setGroup(grp);
105 try
106 {
107 file.setSize(Long.parseLong(filesize));
108 }
109 catch (NumberFormatException e)
110 {
111 // intentionally do nothing
112 }
113
114 Calendar cal = Calendar.getInstance();
115 cal.set(Calendar.MILLISECOND, 0);
116 cal.set(Calendar.SECOND,
117 0);
118 cal.set(Calendar.MINUTE,
119 0);
120 cal.set(Calendar.HOUR_OF_DAY,
121 0);
122 try
123 {
124
125 int pos = MONTHS.indexOf(mo);
126 int month = pos / 4;
127 if (yr != null)
128 {
129 // it's a year
130 cal.set(Calendar.YEAR,
131 Integer.parseInt(yr));
132 }
133 else
134 {
135 // it must be hour/minute or we wouldn't have matched
136 int year = cal.get(Calendar.YEAR);
137
138 // if the month we're reading is greater than now, it must
139 // be last year
140 if (cal.get(Calendar.MONTH) < month)
141 {
142 year--;
143 }
144 cal.set(Calendar.YEAR,
145 year);
146 cal.set(Calendar.HOUR_OF_DAY,
147 Integer.parseInt(hr));
148 cal.set(Calendar.MINUTE,
149 Integer.parseInt(min));
150 }
151 cal.set(Calendar.MONTH,
152 month);
153 cal.set(Calendar.DATE,
154 Integer.parseInt(da));
155 file.setTimestamp(cal);
156 }
157 catch (NumberFormatException e)
158 {
159 // do nothing, date will be uninitialized
160 }
161 file.setName(name);
162
163 return file;
164 }
165 return null;
166 }
167 }