1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.apache.commons.net.ftp.parser;
17
18 import org.apache.commons.net.ftp.FTPFile;
19 import org.apache.commons.net.ftp.FTPFileEntryParser;
20 import org.apache.commons.net.ftp.FTPFileEntryParserImpl;
21
22 /**
23 * This implementation allows to pack some FileEntryParsers together
24 * and handle the case where to returned dirstyle isnt clearly defined.
25 * The matching parser will be cached.
26 * If the cached parser wont match due to the server changed the dirstyle,
27 * a new matching parser will be searched.
28 *
29 * @author Mario Ivankovits <mario@ops.co.at>
30 */
31 public class CompositeFileEntryParser extends FTPFileEntryParserImpl
32 {
33 private final FTPFileEntryParser[] ftpFileEntryParsers;
34 private FTPFileEntryParser cachedFtpFileEntryParser;
35
36 public CompositeFileEntryParser(FTPFileEntryParser[] ftpFileEntryParsers)
37 {
38 super();
39
40 this.cachedFtpFileEntryParser = null;
41 this.ftpFileEntryParsers = ftpFileEntryParsers;
42 }
43
44 public FTPFile parseFTPEntry(String listEntry)
45 {
46 if (cachedFtpFileEntryParser != null)
47 {
48 FTPFile matched = cachedFtpFileEntryParser.parseFTPEntry(listEntry);
49 if (matched != null)
50 {
51 return matched;
52 }
53 }
54 else
55 {
56 for (int iterParser=0; iterParser < ftpFileEntryParsers.length; iterParser++)
57 {
58 FTPFileEntryParser ftpFileEntryParser = ftpFileEntryParsers[iterParser];
59
60 FTPFile matched = ftpFileEntryParser.parseFTPEntry(listEntry);
61 if (matched != null)
62 {
63 cachedFtpFileEntryParser = ftpFileEntryParser;
64 return matched;
65 }
66 }
67 }
68 return null;
69 }
70 }