VMSVersioningFTPEntryParserpublic class VMSVersioningFTPEntryParser extends VMSFTPEntryParser Special implementation VMSFTPEntryParser with versioning turned on.
This parser removes all duplicates and only leaves the version with the highest
version number for each filename.
This is a sample of VMS LIST output
"1-JUN.LIS;1 9/9 2-JUN-1998 07:32:04 [GROUP,OWNER] (RWED,RWED,RWED,RE)",
"1-JUN.LIS;2 9/9 2-JUN-1998 07:32:04 [GROUP,OWNER] (RWED,RWED,RWED,RE)",
"DATA.DIR;1 1/9 2-JUN-1998 07:32:04 [GROUP,OWNER] (RWED,RWED,RWED,RE)",
|
Fields Summary |
---|
private org.apache.oro.text.regex.Perl5Matcher | _preparse_matcher_ | private org.apache.oro.text.regex.Pattern | _preparse_pattern_ | private static final String | PRE_PARSE_REGEX |
Constructors Summary |
---|
public VMSVersioningFTPEntryParser()Constructor for a VMSFTPEntryParser object. Sets the versioning member
to the supplied value.
this(null);
| public VMSVersioningFTPEntryParser(org.apache.commons.net.ftp.FTPClientConfig config)This constructor allows the creation of a VMSVersioningFTPEntryParser
object with something other than the default configuration.
super();
configure(config);
try
{
_preparse_matcher_ = new Perl5Matcher();
_preparse_pattern_ = new Perl5Compiler().compile(PRE_PARSE_REGEX);
}
catch (MalformedPatternException e)
{
throw new IllegalArgumentException (
"Unparseable regex supplied: " + PRE_PARSE_REGEX);
}
|
Methods Summary |
---|
protected boolean | isVersioning()
return true;
| public java.util.List | preParse(java.util.List original)Implement hook provided for those implementers (such as
VMSVersioningFTPEntryParser, and possibly others) which return
multiple files with the same name to remove the duplicates ..
original = super.preParse(original);
HashMap existingEntries = new HashMap();
ListIterator iter = original.listIterator();
while (iter.hasNext()) {
String entry = ((String)iter.next()).trim();
MatchResult result = null;
if (_preparse_matcher_.matches(entry, _preparse_pattern_)) {
result = _preparse_matcher_.getMatch();
String name = result.group(1);
String version = result.group(2);
NameVersion nv = new NameVersion(name, version);
NameVersion existing = (NameVersion) existingEntries.get(name);
if (null != existing) {
if (nv.versionNumber < existing.versionNumber) {
iter.remove(); // removal removes from original list.
continue;
}
}
existingEntries.put(name, nv);
}
}
// we've now removed all entries less than with less than the largest
// version number for each name that were listed after the largest.
// we now must remove those with smaller than the largest version number
// for each name that were found before the largest
while (iter.hasPrevious()) {
String entry = ((String)iter.previous()).trim();
MatchResult result = null;
if (_preparse_matcher_.matches(entry, _preparse_pattern_)) {
result = _preparse_matcher_.getMatch();
String name = result.group(1);
String version = result.group(2);
NameVersion nv = new NameVersion(name, version);
NameVersion existing = (NameVersion) existingEntries.get(name);
if (null != existing) {
if (nv.versionNumber < existing.versionNumber) {
iter.remove(); // removal removes from original list.
}
}
}
}
return original;
|
|