blob: 661b1ccad4b3d0c439d4b10a054e45aeeec6f062 [file] [log] [blame]
package org.apache.sqoop.mapreduce.mainframe;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.parser.ConfigurableFTPFileEntryParserImpl;
public class MainframeFTPFileEntryParser extends ConfigurableFTPFileEntryParserImpl {
/* Volume Unit Referred Ext Used Recfm Lrecl BlkSz Dsorg Dsname
* xxx300 3390 2016/05/25 1 45 VB 2349 27998 PS UNLOAD.EDH.UNLOADED
* x31167 Tape UNLOAD.EDH.UNLOADT
* xxx305 3390 2016/05/23 1 45 VB 2349 27998 PS UNLOAD.EDH.UNLOAD1
*/
// match Unit and Dsname
private static String REGEX = "^\\S+\\s+(\\S+)\\s+.*?\\s+(\\S+)$";
// match Unit, BlkSz, Dsorg, DsName
private static String NON_TAPE_REGEX = "^\\S+\\s+(\\S+)\\s+.*?(\\d+)\\s+(\\S+)\\s+(\\S+)$";
static final String DEFAULT_DATE_FORMAT = "yyyy/MM/dd HH:mm";
//= "MMM d yyyy"; //Nov 9 2001
static final String DEFAULT_RECENT_DATE_FORMAT = "MMM d HH:mm"; //Nov 9 20:06
private static String tapeUnitString = "Tape";
private static String unitHeaderString = "Unit";
private static String dsNameHeaderString = "Dsname";
private static String dsOrgPDSString = "PO";
private static String dsOrgPDSExtendedString = "PO-E";
private static String dsOrgSeqString = "PS";
private static Pattern nonTapePattern = Pattern.compile(NON_TAPE_REGEX);
private static final Log LOG = LogFactory.getLog(MainframeFTPFileEntryParser.class.getName());
public MainframeFTPFileEntryParser() {
super(REGEX);
LOG.info("MainframeFTPFileEntryParser constructor");
}
public MainframeFTPFileEntryParser(String regex) {
super(REGEX);
}
public FTPFile parseFTPEntry(String entry) {
LOG.info("parseFTPEntry: "+entry);
if (matches(entry)) {
String unit = group(1);
String dsName = group(2);
LOG.info("parseFTPEntry match: "+group(1)+" "+group(2));
if (unit.equals(unitHeaderString) && dsName.equals(dsNameHeaderString)) {
return null;
}
FTPFile file = new FTPFile();
file.setRawListing(entry);
file.setName(dsName);
// match non tape values
if (!unit.equals("Tape")) {
Matcher m = nonTapePattern.matcher(entry);
// get sizes
if (m.matches()) {
// PO/PO-E = PDS = directory
// PS = Sequential data set = file
String size = m.group(2);
String dsOrg = m.group(3);
file.setSize(Long.parseLong(size));
LOG.info(String.format("Non tape match: %s, %s, %s", file.getName(), file.getSize(), dsOrg));
if (dsOrg.equals(dsOrgPDSString) || dsOrg.equals(dsOrgPDSExtendedString)) {
file.setType(FTPFile.DIRECTORY_TYPE);
}
if (dsOrg.equals(dsOrgSeqString)) {
file.setType(FTPFile.FILE_TYPE);
}
}
} else {
LOG.info(String.format("Tape match: %s, %s", file.getName(), unit));
file.setType(FTPFile.FILE_TYPE);
}
return file;
}
return null;
}
@Override
protected FTPClientConfig getDefaultConfiguration() {
return new FTPClientConfig(FTPClientConfig.SYST_MVS,
DEFAULT_DATE_FORMAT, null, null, null, null);
}
}