1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.net.ftp.parser;
19
20 import java.util.Calendar;
21
22 import org.apache.commons.net.ftp.FTPFile;
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 public class EnterpriseUnixFTPEntryParser extends RegexFTPFileEntryParserImpl {
39
40
41
42
43 private static final String MONTHS = "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)";
44
45
46
47
48 private static final String REGEX = "(([\\-]|[A-Z])([\\-]|[A-Z])([\\-]|[A-Z])([\\-]|[A-Z])([\\-]|[A-Z])"
49 + "([\\-]|[A-Z])([\\-]|[A-Z])([\\-]|[A-Z])([\\-]|[A-Z])([\\-]|[A-Z]))" + "(\\S*)\\s*"
50 + "(\\S+)\\s*"
51 + "(\\S*)\\s*"
52 + "(\\d*)\\s*"
53 + "(\\d*)\\s*"
54 + MONTHS
55 + "\\s*"
56
57 + "((?:[012]\\d*)|(?:3[01]))\\s*"
58 + "((\\d\\d\\d\\d)|((?:[01]\\d)|(?:2[0123])):([012345]\\d))\\s"
59
60
61
62 + "(\\S*)(\\s*.*)";
63
64
65
66
67
68 public EnterpriseUnixFTPEntryParser() {
69 super(REGEX);
70 }
71
72
73
74
75
76
77
78
79
80 @Override
81 public FTPFile parseFTPEntry(final String entry) {
82
83 final FTPFile file = new FTPFile();
84 file.setRawListing(entry);
85
86 if (matches(entry)) {
87 final String usr = group(14);
88 final String grp = group(15);
89 final String filesize = group(16);
90 final String mo = group(17);
91 final String da = group(18);
92 final String yr = group(20);
93 final String hr = group(21);
94 final String min = group(22);
95 final String name = group(23);
96
97 file.setType(FTPFile.FILE_TYPE);
98 file.setUser(usr);
99 file.setGroup(grp);
100 try {
101 file.setSize(Long.parseLong(filesize));
102 } catch (final NumberFormatException e) {
103
104 }
105
106 final Calendar cal = Calendar.getInstance();
107 cal.set(Calendar.MILLISECOND, 0);
108 cal.set(Calendar.SECOND, 0);
109 cal.set(Calendar.MINUTE, 0);
110 cal.set(Calendar.HOUR_OF_DAY, 0);
111
112 final int pos = MONTHS.indexOf(mo);
113 final int month = pos / 4;
114 final int missingUnit;
115 try {
116
117 if (yr != null) {
118
119 cal.set(Calendar.YEAR, Integer.parseInt(yr));
120 missingUnit = Calendar.HOUR_OF_DAY;
121 } else {
122
123 missingUnit = Calendar.SECOND;
124 int year = cal.get(Calendar.YEAR);
125
126
127
128 if (cal.get(Calendar.MONTH) < month) {
129 year--;
130 }
131 cal.set(Calendar.YEAR, year);
132 cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hr));
133 cal.set(Calendar.MINUTE, Integer.parseInt(min));
134 }
135 cal.set(Calendar.MONTH, month);
136 cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(da));
137 cal.clear(missingUnit);
138 file.setTimestamp(cal);
139 } catch (final NumberFormatException e) {
140
141 }
142 file.setName(name);
143
144 return file;
145 }
146 return null;
147 }
148 }