![JAR search and dependency download from the Maven repository](/logo.png)
panda.net.ftp.parser.VMSVersioningFTPEntryParser Maven / Gradle / Ivy
Show all versions of panda-core Show documentation
package panda.net.ftp.parser;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import panda.net.ftp.FTPClientConfig;
/**
* 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)"
* ,
*
*
* @version $Id: VMSVersioningFTPEntryParser.java 1697293 2015-08-24 01:01:00Z sebb $
* @see panda.net.ftp.FTPFileEntryParser FTPFileEntryParser (for usage instructions)
*/
public class VMSVersioningFTPEntryParser extends VMSFTPEntryParser {
private final Pattern _preparse_pattern_;
private static final String PRE_PARSE_REGEX = "(.*?);([0-9]+)\\s*.*";
/**
* Constructor for a VMSFTPEntryParser object.
*
* @exception IllegalArgumentException Thrown if the regular expression is unparseable. Should
* not be seen under normal conditions. It it is seen, this is a sign that
* REGEX
is not a valid regular expression.
*/
public VMSVersioningFTPEntryParser() {
this(null);
}
/**
* This constructor allows the creation of a VMSVersioningFTPEntryParser object with something
* other than the default configuration.
*
* @param config The {@link FTPClientConfig configuration} object used to configure this parser.
* @exception IllegalArgumentException Thrown if the regular expression is unparseable. Should
* not be seen under normal conditions. It it is seen, this is a sign that
* REGEX
is not a valid regular expression.
*/
public VMSVersioningFTPEntryParser(FTPClientConfig config) {
super();
configure(config);
try {
// _preparse_matcher_ = new Perl5Matcher();
_preparse_pattern_ = Pattern.compile(PRE_PARSE_REGEX);
}
catch (PatternSyntaxException pse) {
throw new IllegalArgumentException("Unparseable regex supplied: " + PRE_PARSE_REGEX);
}
}
/**
* Implement hook provided for those implementers (such as VMSVersioningFTPEntryParser, and
* possibly others) which return multiple files with the same name to remove the duplicates ..
*
* @param original Original list
* @return Original list purged of duplicates
*/
@Override
public List preParse(List original) {
HashMap existingEntries = new HashMap();
ListIterator iter = original.listIterator();
while (iter.hasNext()) {
String entry = iter.next().trim();
MatchResult result = null;
Matcher _preparse_matcher_ = _preparse_pattern_.matcher(entry);
if (_preparse_matcher_.matches()) {
result = _preparse_matcher_.toMatchResult();
String name = result.group(1);
String version = result.group(2);
Integer nv = Integer.valueOf(version);
Integer existing = existingEntries.get(name);
if (null != existing) {
if (nv.intValue() < existing.intValue()) {
iter.remove(); // removes older version 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 = iter.previous().trim();
MatchResult result = null;
Matcher _preparse_matcher_ = _preparse_pattern_.matcher(entry);
if (_preparse_matcher_.matches()) {
result = _preparse_matcher_.toMatchResult();
String name = result.group(1);
String version = result.group(2);
Integer nv = Integer.valueOf(version);
Integer existing = existingEntries.get(name);
if (null != existing) {
if (nv.intValue() < existing.intValue()) {
iter.remove(); // removes older version from original list.
}
}
}
}
return original;
}
@Override
protected boolean isVersioning() {
return true;
}
}
/*
* Emacs configuration Local variables: ** mode: java ** c-basic-offset: 4 ** indent-tabs-mode: nil
* ** End: **
*/