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.regex.Pattern;
21
22 import org.apache.commons.net.ftp.Configurable;
23 import org.apache.commons.net.ftp.FTPClientConfig;
24 import org.apache.commons.net.ftp.FTPFileEntryParser;
25
26
27
28
29
30
31
32
33 public class DefaultFTPFileEntryParserFactory implements FTPFileEntryParserFactory {
34
35
36 private static final String JAVA_IDENTIFIER = "\\p{javaJavaIdentifierStart}(\\p{javaJavaIdentifierPart})*";
37
38 private static final String JAVA_QUALIFIED_NAME = "(" + JAVA_IDENTIFIER + "\\.)+" + JAVA_IDENTIFIER;
39
40 private static final Pattern JAVA_QUALIFIED_NAME_PATTERN = Pattern.compile(JAVA_QUALIFIED_NAME);
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 @Override
60 public FTPFileEntryParser createFileEntryParser(final FTPClientConfig config) throws ParserInitializationException {
61 final String key = config.getServerSystemKey();
62 return createFileEntryParser(key, config);
63 }
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 @Override
95 public FTPFileEntryParser createFileEntryParser(final String key) {
96 if (key == null) {
97 throw new ParserInitializationException("Parser key cannot be null");
98 }
99 return createFileEntryParser(key, null);
100 }
101
102
103 private FTPFileEntryParser createFileEntryParser(final String key, final FTPClientConfig config) {
104 FTPFileEntryParser parser = null;
105
106
107 if (JAVA_QUALIFIED_NAME_PATTERN.matcher(key).matches()) {
108 try {
109 final Class<?> parserClass = Class.forName(key);
110 try {
111 parser = (FTPFileEntryParser) parserClass.newInstance();
112 } catch (final ClassCastException e) {
113 throw new ParserInitializationException(
114 parserClass.getName() + " does not implement the interface " + "org.apache.commons.net.ftp.FTPFileEntryParser.", e);
115 } catch (final Exception | ExceptionInInitializerError e) {
116 throw new ParserInitializationException("Error initializing parser", e);
117 }
118 } catch (final ClassNotFoundException e) {
119
120 }
121 }
122
123 if (parser == null) {
124 final String ukey = key.toUpperCase(java.util.Locale.ENGLISH);
125 if (ukey.contains(FTPClientConfig.SYST_UNIX_TRIM_LEADING)) {
126 parser = new UnixFTPEntryParser(config, true);
127 }
128
129 else if (ukey.contains(FTPClientConfig.SYST_UNIX)) {
130 parser = new UnixFTPEntryParser(config, false);
131 } else if (ukey.contains(FTPClientConfig.SYST_VMS)) {
132 parser = new VMSVersioningFTPEntryParser(config);
133 } else if (ukey.contains(FTPClientConfig.SYST_NT)) {
134 parser = createNTFTPEntryParser(config);
135 } else if (ukey.contains(FTPClientConfig.SYST_OS2)) {
136 parser = new OS2FTPEntryParser(config);
137 } else if (ukey.contains(FTPClientConfig.SYST_OS400) || ukey.contains(FTPClientConfig.SYST_AS400)) {
138 parser = createOS400FTPEntryParser(config);
139 } else if (ukey.contains(FTPClientConfig.SYST_MVS)) {
140 parser = new MVSFTPEntryParser();
141 } else if (ukey.contains(FTPClientConfig.SYST_NETWARE)) {
142 parser = new NetwareFTPEntryParser(config);
143 } else if (ukey.contains(FTPClientConfig.SYST_MACOS_PETER)) {
144 parser = new MacOsPeterFTPEntryParser(config);
145 } else if (ukey.contains(FTPClientConfig.SYST_L8)) {
146
147
148 parser = new UnixFTPEntryParser(config);
149 } else {
150 throw new ParserInitializationException("Unknown parser type: " + key);
151 }
152 }
153
154 if (parser instanceof Configurable) {
155 ((Configurable) parser).configure(config);
156 }
157 return parser;
158 }
159
160 public FTPFileEntryParser createMVSEntryParser() {
161 return new MVSFTPEntryParser();
162 }
163
164 public FTPFileEntryParser createNetwareFTPEntryParser() {
165 return new NetwareFTPEntryParser();
166 }
167
168 public FTPFileEntryParser createNTFTPEntryParser() {
169 return createNTFTPEntryParser(null);
170 }
171
172
173
174
175
176
177
178
179 private FTPFileEntryParser createNTFTPEntryParser(final FTPClientConfig config) {
180 if (config != null && FTPClientConfig.SYST_NT.equals(config.getServerSystemKey())) {
181 return new NTFTPEntryParser(config);
182 }
183
184 final FTPClientConfig config2 = config != null ? new FTPClientConfig(config) : null;
185 return new CompositeFileEntryParser(new FTPFileEntryParser[] { new NTFTPEntryParser(config),
186 new UnixFTPEntryParser(config2, config2 != null && FTPClientConfig.SYST_UNIX_TRIM_LEADING.equals(config2.getServerSystemKey())) });
187 }
188
189 public FTPFileEntryParser createOS2FTPEntryParser() {
190 return new OS2FTPEntryParser();
191 }
192
193 public FTPFileEntryParser createOS400FTPEntryParser() {
194 return createOS400FTPEntryParser(null);
195 }
196
197
198
199
200
201
202
203
204 private FTPFileEntryParser createOS400FTPEntryParser(final FTPClientConfig config) {
205 if (config != null && FTPClientConfig.SYST_OS400.equals(config.getServerSystemKey())) {
206 return new OS400FTPEntryParser(config);
207 }
208
209 final FTPClientConfig config2 = config != null ? new FTPClientConfig(config) : null;
210 return new CompositeFileEntryParser(new FTPFileEntryParser[] { new OS400FTPEntryParser(config),
211 new UnixFTPEntryParser(config2, config2 != null && FTPClientConfig.SYST_UNIX_TRIM_LEADING.equals(config2.getServerSystemKey())) });
212 }
213
214 public FTPFileEntryParser createUnixFTPEntryParser() {
215 return new UnixFTPEntryParser();
216 }
217
218 public FTPFileEntryParser createVMSVersioningFTPEntryParser() {
219 return new VMSVersioningFTPEntryParser();
220 }
221
222 }