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 public EnterpriseUnixFTPEntryParser() {
68 super(REGEX);
69 }
70
71
72
73
74
75
76
77
78
79 @Override
80 public FTPFile parseFTPEntry(final String entry) {
81
82 final FTPFile file = new FTPFile();
83 file.setRawListing(entry);
84
85 if (matches(entry)) {
86 final String usr = group(14);
87 final String grp = group(15);
88 final String filesize = group(16);
89 final String mo = group(17);
90 final String da = group(18);
91 final String yr = group(20);
92 final String hr = group(21);
93 final String min = group(22);
94 final String name = group(23);
95
96 file.setType(FTPFile.FILE_TYPE);
97 file.setUser(usr);
98 file.setGroup(grp);
99 try {
100 file.setSize(Long.parseLong(filesize));
101 } catch (final NumberFormatException e) {
102
103 }
104
105 final Calendar cal = Calendar.getInstance();
106 cal.set(Calendar.MILLISECOND, 0);
107 cal.set(Calendar.SECOND, 0);
108 cal.set(Calendar.MINUTE, 0);
109 cal.set(Calendar.HOUR_OF_DAY, 0);
110
111 final int pos = MONTHS.indexOf(mo);
112 final int month = pos / 4;
113 final int missingUnit;
114 try {
115
116 if (yr != null) {
117
118 cal.set(Calendar.YEAR, Integer.parseInt(yr));
119 missingUnit = Calendar.HOUR_OF_DAY;
120 } else {
121
122 missingUnit = Calendar.SECOND;
123 int year = cal.get(Calendar.YEAR);
124
125
126
127 if (cal.get(Calendar.MONTH) < month) {
128 year--;
129 }
130 cal.set(Calendar.YEAR, year);
131 cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hr));
132 cal.set(Calendar.MINUTE, Integer.parseInt(min));
133 }
134 cal.set(Calendar.MONTH, month);
135 cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(da));
136 cal.clear(missingUnit);
137 file.setTimestamp(cal);
138 } catch (final NumberFormatException e) {
139
140 }
141 file.setName(name);
142
143 return file;
144 }
145 return null;
146 }
147 }