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
95 @Override
96 public FTPFileEntryParser createFileEntryParser(final String key) {
97 if (key == null) {
98 throw new ParserInitializationException("Parser key cannot be null");
99 }
100 return createFileEntryParser(key, null);
101 }
102
103
104 private FTPFileEntryParser createFileEntryParser(final String key, final FTPClientConfig config) {
105 FTPFileEntryParser parser = null;
106
107
108 if (JAVA_QUALIFIED_NAME_PATTERN.matcher(key).matches()) {
109 try {
110 final Class<?> parserClass = Class.forName(key);
111 try {
112 parser = (FTPFileEntryParser) parserClass.getConstructor().newInstance();
113 } catch (final ClassCastException e) {
114 throw new ParserInitializationException(
115 parserClass.getName() + " does not implement the interface " + "org.apache.commons.net.ftp.FTPFileEntryParser.", e);
116 } catch (final Exception | ExceptionInInitializerError e) {
117 throw new ParserInitializationException("Error initializing parser", e);
118 }
119 } catch (final ClassNotFoundException e) {
120
121 }
122 }
123
124 if (parser == null) {
125 final String ukey = key.toUpperCase(java.util.Locale.ENGLISH);
126 if (ukey.contains(FTPClientConfig.SYST_UNIX_TRIM_LEADING)) {
127 parser = new UnixFTPEntryParser(config, true);
128 }
129
130 else if (ukey.contains(FTPClientConfig.SYST_UNIX)) {
131 parser = new UnixFTPEntryParser(config, false);
132 } else if (ukey.contains(FTPClientConfig.SYST_VMS)) {
133 parser = new VMSVersioningFTPEntryParser(config);
134 } else if (ukey.contains(FTPClientConfig.SYST_NT)) {
135 parser = createNTFTPEntryParser(config);
136 } else if (ukey.contains(FTPClientConfig.SYST_OS2)) {
137 parser = new OS2FTPEntryParser(config);
138 } else if (ukey.contains(FTPClientConfig.SYST_OS400) || ukey.contains(FTPClientConfig.SYST_AS400)) {
139 parser = createOS400FTPEntryParser(config);
140 } else if (ukey.contains(FTPClientConfig.SYST_MVS)) {
141 parser = new MVSFTPEntryParser();
142 } else if (ukey.contains(FTPClientConfig.SYST_NETWARE)) {
143 parser = new NetwareFTPEntryParser(config);
144 } else if (ukey.contains(FTPClientConfig.SYST_MACOS_PETER)) {
145 parser = new MacOsPeterFTPEntryParser(config);
146 } else if (ukey.contains(FTPClientConfig.SYST_L8)) {
147
148
149 parser = new UnixFTPEntryParser(config);
150 } else {
151 throw new ParserInitializationException("Unknown parser type: " + key);
152 }
153 }
154
155 if (parser instanceof Configurable) {
156 ((Configurable) parser).configure(config);
157 }
158 return parser;
159 }
160
161 public FTPFileEntryParser createMVSEntryParser() {
162 return new MVSFTPEntryParser();
163 }
164
165 public FTPFileEntryParser createNetwareFTPEntryParser() {
166 return new NetwareFTPEntryParser();
167 }
168
169 public FTPFileEntryParser createNTFTPEntryParser() {
170 return createNTFTPEntryParser(null);
171 }
172
173
174
175
176
177
178
179
180 private FTPFileEntryParser createNTFTPEntryParser(final FTPClientConfig config) {
181 if (config != null && FTPClientConfig.SYST_NT.equals(config.getServerSystemKey())) {
182 return new NTFTPEntryParser(config);
183 }
184
185 final FTPClientConfig config2 = config != null ? new FTPClientConfig(config) : null;
186 return new CompositeFileEntryParser(new FTPFileEntryParser[] { new NTFTPEntryParser(config),
187 new UnixFTPEntryParser(config2, config2 != null && FTPClientConfig.SYST_UNIX_TRIM_LEADING.equals(config2.getServerSystemKey())) });
188 }
189
190 public FTPFileEntryParser createOS2FTPEntryParser() {
191 return new OS2FTPEntryParser();
192 }
193
194 public FTPFileEntryParser createOS400FTPEntryParser() {
195 return createOS400FTPEntryParser(null);
196 }
197
198
199
200
201
202
203
204
205 private FTPFileEntryParser createOS400FTPEntryParser(final FTPClientConfig config) {
206 if (config != null && FTPClientConfig.SYST_OS400.equals(config.getServerSystemKey())) {
207 return new OS400FTPEntryParser(config);
208 }
209
210 final FTPClientConfig config2 = config != null ? new FTPClientConfig(config) : null;
211 return new CompositeFileEntryParser(new FTPFileEntryParser[] { new OS400FTPEntryParser(config),
212 new UnixFTPEntryParser(config2, config2 != null && FTPClientConfig.SYST_UNIX_TRIM_LEADING.equals(config2.getServerSystemKey())) });
213 }
214
215 public FTPFileEntryParser createUnixFTPEntryParser() {
216 return new UnixFTPEntryParser();
217 }
218
219 public FTPFileEntryParser createVMSVersioningFTPEntryParser() {
220 return new VMSVersioningFTPEntryParser();
221 }
222
223 }