You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by rw...@apache.org on 2006/09/02 15:44:53 UTC

svn commit: r439598 - in /jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src: main/java/examples/FTPSExample.java main/java/org/apache/commons/net/ftp/parser/MVSFTPEntryParser.java test/java/org/apache/commons/net/ftp/parser/MVSFTPEntryParserTest.java

Author: rwinston
Date: Sat Sep  2 06:44:52 2006
New Revision: 439598

URL: http://svn.apache.org/viewvc?rev=439598&view=rev
Log:
Added new MVSFTPEntryParser.java 

Modified:
    jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/examples/FTPSExample.java
    jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/parser/MVSFTPEntryParser.java
    jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/test/java/org/apache/commons/net/ftp/parser/MVSFTPEntryParserTest.java

Modified: jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/examples/FTPSExample.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/examples/FTPSExample.java?rev=439598&r1=439597&r2=439598&view=diff
==============================================================================
--- jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/examples/FTPSExample.java (original)
+++ jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/examples/FTPSExample.java Sat Sep  2 06:44:52 2006
@@ -53,6 +53,7 @@
     	int base = 0;
         boolean storeFile = false, binaryTransfer = false, error = false;
         String server, username, password, remote, local;
+        String protocol = "SSL";	// SSL/TLS
         FTPSClient ftps;
         
         for (base = 0; base < args.length; base++)
@@ -77,7 +78,7 @@
         remote = args[base++];
         local = args[base];
 
-        ftps = new FTPSClient();
+        ftps = new FTPSClient(protocol);
        
         ftps.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
 

Modified: jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/parser/MVSFTPEntryParser.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/parser/MVSFTPEntryParser.java?rev=439598&r1=439597&r2=439598&view=diff
==============================================================================
--- jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/parser/MVSFTPEntryParser.java (original)
+++ jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/parser/MVSFTPEntryParser.java Sat Sep  2 06:44:52 2006
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005 The Apache Software Foundation
+ * Copyright 2001-2006 The Apache Software Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,221 +22,215 @@
 import org.apache.commons.net.ftp.FTPFile;
 
 /**
- * Implementation of FTPFileEntryParser and FTPFileListParser for IBM zOS/MVS Systems.
- *
- * @author <a href="henrik.sorensen@balcab.ch">Henrik Sorensen</a>
+ * Implementation of FTPFileEntryParser and FTPFileListParser for IBM zOS/MVS
+ * Systems.
  * 
- * wagely based on earlier work done by:
+ * @author <a href="henrik.sorensen@balcab.ch">Henrik Sorensen</a>
  * @author <a href="jnadler@srcginc.com">Jeff Nadler</a>
  * @author <a href="wnoto@openfinance.com">William Noto</a>
-
+ * 
  * @version $Id$
- * @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for usage instructions)
+ * @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for
+ *      usage instructions)
  */
 public class MVSFTPEntryParser extends ConfigurableFTPFileEntryParserImpl {
-	private static final boolean DEBUG_PARSER = true; // false;
 
-	public static final int UNKNOWN_LIST_TYPE = -1;
-	public static final int FILE_LIST_TYPE = 0;
-	public static final int MEMBER_LIST_TYPE = 1;
-	public static final int UNIX_LIST_TYPE = 2;
-	public static final int JES_LEVEL1_LIST_TYPE = 3;
-	public static final int JES_LEVEL2_LIST_TYPE = 4;
+	static final int UNKNOWN_LIST_TYPE = -1;
+	static final int FILE_LIST_TYPE = 0;
+	static final int MEMBER_LIST_TYPE = 1;
+	static final int UNIX_LIST_TYPE = 2;
+	static final int JES_LEVEL_1_LIST_TYPE = 3;
+	static final int JES_LEVEL_2_LIST_TYPE = 4;
+
 	private int isType = UNKNOWN_LIST_TYPE;
 
+	/**
+	 * Fallback parser for Unix-style listings
+	 */
 	private UnixFTPEntryParser unixFTPEntryParser;
 
 	/**
-	 * Dates are ignored for file lists, but are used for member 
-	 * lists where possible
+	 * Dates are ignored for file lists, but are used for member lists where
+	 * possible
 	 */
-	static final String DEFAULT_DATE_FORMAT = "yyyy/MM/dd HH:mm"; // 2001/09/18 13:52
+	static final String DEFAULT_DATE_FORMAT = "yyyy/MM/dd HH:mm"; // 2001/09/18
+																	// 13:52
 
 	/**
-	 * Matches these entries:
-	 *	Volume Unit    Referred Ext Used Recfm Lrecl BlkSz Dsorg Dsname
-	 *	B10142 3390   2006/03/20  2   31  F       80    80  PS   MDI.OKL.WORK
-	 * 
-	 */
-	/*public static final String REGEX_FILELIST = "\\S+\\s+" + //volume ignored
-	"\\S+\\s+" + //unit - ignored
-	"\\S+\\s+" + //access date - ignored
-	"\\S+\\s+" + //extents -ignored
-	"\\S+\\s+" + //used - ignored
-	"[FV]\\S*\\s+" + //recfm - must start with F or V
-	"\\S+\\s+" + //logical record length -ignored
-	"\\S+\\s+" + //block size - ignored
-	"(PS|PO|PO-E)\\s+" + // Dataset organisation. Many exist 
-	//but only support: PS, PO, PO-E
-	"(\\S+)\\s*"; // Dataset Name (file name)*/
-	public static final String REGEX_FILELIST = "(.*)\\s+([^\\s]+)\\s*";
-
-	/**
-	 * Matches these entries: 
-	 *   Name      VV.MM   Created       Changed      Size  Init   Mod   Id
-	 *   TBSHELF   01.03 2002/09/12 2002/10/11 09:37    11    11     0 KIL001
-	 */
-	private static final String REGEX_MEMBERLIST = "(\\S+)\\s+" + //name
-	"\\S+\\s+" + //version, modification (ignored)
-	"\\S+\\s+" + //create date (ignored)
-	"(\\S+)\\s+" + // modification date
-	"(\\S+)\\s+" + // modification time
-	"\\S+\\s+" + //size in lines (ignored)
-	"\\S+\\s+" + //size in lines at creation(ignored)
-	"\\S+\\s+" + //lines modified (ignored)
-	"\\S+\\s*"; // id of user who modified (ignored)
-
-	/**
-	 * Matches these entries, note: no header: 
-	 *   IBMUSER1  JOB01906  OUTPUT    3 Spool Files
-	 *   012345678901234567890123456789012345678901234
-	 *             1         2         3         4
-	 */
-	private static final String REGEX_JESLEVEL1LIST = "(\\S+)\\s+" + //job name ignored
-	"(\\S+)\\s+" + //job number 
-	"(\\S+)\\s+" + //job status (OUTPUT,INPUT,ACTIVE)
-	"(\\S+)\\s+" + //number of spool files
-	"(\\S+)\\s+" + //Text "Spool" ignored
-	"(\\S+)\\s*" //Text "Files" ignored
+	 * Matches these entries: Volume Unit Referred Ext Used Recfm Lrecl BlkSz
+	 * Dsorg Dsname B10142 3390 2006/03/20 2 31 F 80 80 PS MDI.OKL.WORK
+	 * 
+	 */
+	static final String FILE_LIST_REGEX = "\\S+\\s+" + // volume
+																// ignored
+			"\\S+\\s+" + // unit - ignored
+			"\\S+\\s+" + // access date - ignored
+			"\\S+\\s+" + // extents -ignored
+			"\\S+\\s+" + // used - ignored
+			"[FV]\\S*\\s+" + // recfm - must start with F or V
+			"\\S+\\s+" + // logical record length -ignored
+			"\\S+\\s+" + // block size - ignored
+			"(PS|PO|PO-E)\\s+" + // Dataset organisation. Many exist
+			// but only support: PS, PO, PO-E
+			"(\\S+)\\s*"; // Dataset Name (file name)
+
+	/**
+	 * Matches these entries: Name VV.MM Created Changed Size Init Mod Id
+	 * TBSHELF 01.03 2002/09/12 2002/10/11 09:37 11 11 0 KIL001
+	 */
+	static final String MEMBER_LIST_REGEX = "(\\S+)\\s+" + // name
+			"\\S+\\s+" + // version, modification (ignored)
+			"\\S+\\s+" + // create date (ignored)
+			"(\\S+)\\s+" + // modification date
+			"(\\S+)\\s+" + // modification time
+			"\\S+\\s+" + // size in lines (ignored)
+			"\\S+\\s+" + // size in lines at creation(ignored)
+			"\\S+\\s+" + // lines modified (ignored)
+			"\\S+\\s*"; // id of user who modified (ignored)
+
+	/**
+	 * Matches these entries, note: no header: IBMUSER1 JOB01906 OUTPUT 3 Spool
+	 * Files 012345678901234567890123456789012345678901234 1 2 3 4
+	 */
+	static final String JES_LEVEL_1_LIST_REGEX = "(\\S+)\\s+" + // job
+																		// name
+																		// ignored
+			"(\\S+)\\s+" + // job number
+			"(\\S+)\\s+" + // job status (OUTPUT,INPUT,ACTIVE)
+			"(\\S+)\\s+" + // number of spool files
+			"(\\S+)\\s+" + // Text "Spool" ignored
+			"(\\S+)\\s*" // Text "Files" ignored
 	;
 
 	/**
-	 * TODO: the JES INTERFACE LEVEL 2 parser is still work in progress. 
-	 * Matches these entries:
-	 *            1         2         3         4
-	 *  012345678901234567890123456789012345678901234567890
-	 *ftp> quote site filetype=jes
-	 200 SITE command was accepted
-	 ftp> ls
-	 200 Port request OK.
-	 125 List started OK for JESJOBNAME=IBMUSER*, JESSTATUS=ALL and JESOWNER=IBMUSER
-	 JOBNAME  JOBID    OWNER    STATUS CLASS
-	 IBMUSER1 JOB01906 IBMUSER  OUTPUT A        RC=0000 3 spool files
-	 IBMUSER  TSU01830 IBMUSER  OUTPUT TSU      ABEND=522 3 spool files
-	 250 List completed successfully.
-	 ftp> ls job01906
-	 200 Port request OK.
-	 125 List started OK for JESJOBNAME=IBMUSER*, JESSTATUS=ALL and JESOWNER=IBMUSER
-	 JOBNAME  JOBID    OWNER    STATUS CLASS
-	 IBMUSER1 JOB01906 IBMUSER  OUTPUT A        RC=0000
-	 --------
-	 ID  STEPNAME PROCSTEP C DDNAME   BYTE-COUNT
-	 001 JES2              A JESMSGLG       858
-	 002 JES2              A JESJCL         128
-	 003 JES2              A JESYSMSG       443
-	 3 spool files
-	 250 List completed successfully.
-	 */
-
-	private static final String REGEX_JESLEVEL2LIST = "(\\S+)\\s+" + //job name ignored
-	"(\\S+)\\s+" + //job number 
-	"(\\S+)\\s+" + //job status (OUTPUT,INPUT,ACTIVE)
-	"(\\S+)\\s+" + //number of spool files
-	"(\\S+)\\s+" + //Text "Spool" ignored
-	"(\\S+)\\s*" //Text "Files" ignored
+	 * JES INTERFACE LEVEL 2 parser Matches these entries: JOBNAME JOBID OWNER
+	 * STATUS CLASS IBMUSER1 JOB01906 IBMUSER OUTPUT A RC=0000 3 spool files
+	 * IBMUSER TSU01830 IBMUSER OUTPUT TSU ABEND=522 3 spool files
+	 * 012345678901234567890123456789012345678901234 1 2 3 4
+	 * 012345678901234567890123456789012345678901234567890
+	 */
+
+	static final String JES_LEVEL_2_LIST_REGEX = "(\\S+)\\s+" + // job
+																		// name
+																		// ignored
+			"(\\S+)\\s+" + // job number
+			"(\\S+)\\s+" + // owner ignored
+			"(\\S+)\\s+" + // job status (OUTPUT,INPUT,ACTIVE) ignored
+			"(\\S+)\\s+" + // job class ignored
+			"(\\S+).*" // rest ignored
 	;
 
-	/* ---------------------------------------------------------------------
-	 * Very brief and incomplete description of the zOS/MVS-filesystem. 
-	 * (Note: "zOS" is the operating system on the mainframe, 
-	 *        and is the new name for MVS)
-	 *         
-	 * The filesystem on the mainframe does not have hierarchal structure as 
-	 * for example the unix filesystem.
-	 * For a more comprehensive description, please refer to the IBM manuals
+	/*
+	 * ---------------------------------------------------------------------
+	 * Very brief and incomplete description of the zOS/MVS-filesystem. (Note:
+	 * "zOS" is the operating system on the mainframe, and is the new name for
+	 * MVS)
+	 * 
+	 * The filesystem on the mainframe does not have hierarchal structure as for
+	 * example the unix filesystem. For a more comprehensive description, please
+	 * refer to the IBM manuals
 	 * 
-	 * @LINK: http://publibfp.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/dgt2d440/CONTENTS
+	 * @LINK:
+	 * http://publibfp.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/dgt2d440/CONTENTS
 	 * 
 	 * 
-	 * Dataset names
-	 * =============
+	 * Dataset names =============
 	 * 
-	 * A dataset name consist of a number of qualifiers separated by '.',
-	 * each qualifier can be at most 8 characters, and the total length
-	 * of a dataset can be max 44 characters including the dots.
+	 * A dataset name consist of a number of qualifiers separated by '.', each
+	 * qualifier can be at most 8 characters, and the total length of a dataset
+	 * can be max 44 characters including the dots.
 	 * 
 	 * 
-	 * Dataset organisation
-	 * ====================
+	 * Dataset organisation ====================
 	 * 
-	 * A dataset represents a piece of storage allocated on one or more disks. 
-	 * The structure of the storage is described with the field dataset organinsation (DSORG).
-	 * There are a number of dataset organisations, but only two are usable for FTP transfer.
+	 * A dataset represents a piece of storage allocated on one or more disks.
+	 * The structure of the storage is described with the field dataset
+	 * organinsation (DSORG). There are a number of dataset organisations, but
+	 * only two are usable for FTP transfer.
 	 * 
-	 * DSORG:
-	 * PS: sequential, or flat file
-	 * PO: partitioned dataset
-	 * PO-E: extended partitioned dataset
+	 * DSORG: PS: sequential, or flat file PO: partitioned dataset PO-E:
+	 * extended partitioned dataset
 	 * 
-	 * The PS file is just a flat file, as you would find it on the unix
-	 * file system.
+	 * The PS file is just a flat file, as you would find it on the unix file
+	 * system.
 	 * 
-	 * The PO and PO-E files, can be compared to a single level directory structure.
-	 * A PO file consist of a number of dataset members, or files if you
-	 * will. It is possible to CD into the file, and to retrieve the 
+	 * The PO and PO-E files, can be compared to a single level directory
+	 * structure. A PO file consist of a number of dataset members, or files if
+	 * you will. It is possible to CD into the file, and to retrieve the
 	 * individual members.
 	 * 
 	 * 
-	 * Dataset record format
-	 * =====================
+	 * Dataset record format =====================
 	 * 
 	 * The physical layout of the dataset is described on the dataset itself.
-	 * There are a number of record formats (RECFM), but just a few is relavant for 
-	 * the FTP transfer.
+	 * There are a number of record formats (RECFM), but just a few is relavant
+	 * for the FTP transfer.
+	 * 
+	 * Any one beginning with either F or V can safely used by FTP transfer. All
+	 * others should only be used with great care, so this version will just
+	 * ignore the other record formats. F means a fixed number of records per
+	 * allocated storage, and V means a variable number of records.
 	 * 
-	 * Any one beginning with either F or V can safely used by FTP transfer.
-	 * All others should only be used with great care, so this version will just
-	 * ignore the other record formats.
-	 * F means a fixed number of records per allocated storage, and V means a variable 
-	 * number of records.
-	 * 
-	 * 
-	 * Other notes
-	 * ===========
-	 *
-	 * The file system supports automatically backup and retrieval of datasets. If a 
-	 * file is backed up, the ftp LIST command will return:
-	 *	ARCIVE Not Direct Access Device                          KJ.IOP998.ERROR.PL.UNITTEST
-	 *
-	 *
-	 * Implementation notes
-	 * ====================
-	 *
-	 * Only datasets that have dsorg PS, PO or PO-E and have recfm 
-	 * beginning with F or V, is fully parsed.
-	 * 
-	 * The following fields in FTPFile is used:
-	 * FTPFile.Rawlisting: Always set.
-	 * FTPFile.Type: DIRECTORY_TYPE or FILE_TYPE or UNKNOWN
-	 * FTPFile.Name: name
+	 * 
+	 * Other notes ===========
+	 * 
+	 * The file system supports automatically backup and retrieval of datasets.
+	 * If a file is backed up, the ftp LIST command will return: ARCIVE Not
+	 * Direct Access Device KJ.IOP998.ERROR.PL.UNITTEST
+	 * 
+	 * 
+	 * Implementation notes ====================
+	 * 
+	 * Only datasets that have dsorg PS, PO or PO-E and have recfm beginning
+	 * with F or V, is fully parsed.
+	 * 
+	 * The following fields in FTPFile is used: FTPFile.Rawlisting: Always set.
+	 * FTPFile.Type: DIRECTORY_TYPE or FILE_TYPE or UNKNOWN FTPFile.Name: name
 	 * FTPFile.Timestamp: change time or null
 	 * 
+	 * 
+	 * 
+	 * Additional information ======================
+	 * 
+	 * The MVS ftp server supports a number of features via the FTP interface.
+	 * The features are controlled with the FTP command quote site filetype=<SEQ|JES|DB2>
+	 * SEQ is the default and used for normal file transfer JES is used to
+	 * interact with the Job Entry Subsystem (JES) similar to a job scheduler
+	 * DB2 is used to interact with a DB2 subsystem
+	 * 
+	 * This parser supports SEQ and JES.
+	 * 
+	 * 
+	 * 
+	 * 
+	 * 
+	 * 
 	 */
 
 	/**
 	 * The sole constructor for a MVSFTPEntryParser object.
-	 *
+	 * 
 	 */
 	public MVSFTPEntryParser() {
 		super(""); // note the regex is set in preParse.
+		super.configure(null); // configure parser with default configurations
 	}
 
 	/**
-	 * Parses a line of an z/OS - MVS FTP server file listing and converts it into a
-	 * usable format in the form of an <code> FTPFile </code> instance.  If the
-	 * file listing line doesn't describe a file, then <code> null </code> is returned.
-	 * Otherwise a <code> FTPFile </code> instance representing the file is returned.
+	 * Parses a line of an z/OS - MVS FTP server file listing and converts it
+	 * into a usable format in the form of an <code> FTPFile </code> instance.
+	 * If the file listing line doesn't describe a file, then
+	 * <code> null </code> is returned. Otherwise a <code> FTPFile </code>
+	 * instance representing the file is returned.
 	 * 
-	 * @param entry A line of text from the file listing
+	 * @param entry
+	 *            A line of text from the file listing
 	 * @return An FTPFile instance corresponding to the supplied entry
 	 */
 	public FTPFile parseFTPEntry(String entry) {
-		boolean isParsed;
+		boolean isParsed = false;
 		FTPFile f = new FTPFile();
 
-		logPrintln("MVSFTPEntryParser entry >" + entry + "<");
-
-		isParsed = false;
 		if (isType == FILE_LIST_TYPE)
 			isParsed = parseFileList(f, entry);
 		else if (isType == MEMBER_LIST_TYPE) {
@@ -245,127 +239,101 @@
 				isParsed = parseSimpleEntry(f, entry);
 		} else if (isType == UNIX_LIST_TYPE) {
 			isParsed = parseUnixList(f, entry);
-		} else if (isType == JES_LEVEL1_LIST_TYPE) {
+		} else if (isType == JES_LEVEL_1_LIST_TYPE) {
 			isParsed = parseJeslevel1List(f, entry);
+		} else if (isType == JES_LEVEL_2_LIST_TYPE) {
+			isParsed = parseJeslevel2List(f, entry);
 		}
 
-		if (isParsed)
-			logPrintln("Name "
-					+ f.getName()
-					+ ", type "
-					+ f.getType()
-					+ ", timestamp "
-					+ (f.getTimestamp() != null ? f.getTimestamp().getTime()
-							.toString() : "null") + ", rawlisting "
-							+ f.getRawListing());
-		else {
-			logPrintln("Entry did not parse ...");
-			f = null; /* as per calling convention, parser must return null */
-		}
-
+		if (!isParsed)
+			f = null;
+		
 		return f;
 	}
 
 	/**
-	 * Parse entries representing a dataset list.
-	 * Only datasets with DSORG PS or PO or PO-E 
-	 * and with RECFM F* or V* will be parsed.
-	 * 
-	 * Format of ZOS/MVS file list:
-	 *     0    1         2      3    4    5      6     7    8     9 
-	 *	Volume Unit    Referred Ext Used Recfm Lrecl BlkSz Dsorg Dsname
-	 *	B10142 3390   2006/03/20  2   31  F       80    80  PS   MDI.OKL.WORK
-	 *	ARCIVE Not Direct Access Device                          KJ.IOP998.ERROR.PL.UNITTEST
-	 *	B1N231 3390   2006/03/20  1   15  VB     256 27998  PO   PLU
-	 *	B1N231 3390   2006/03/20  1   15  VB     256 27998  PO-E PLB
-	 * 
-	 * -----------------------------------
-	 * [0] Volume
-	 * [1] Unit
-	 * [2] Referred
-	 * [3] Ext: number of extents
-	 * [4] Used
-	 * [5] Recfm: Record format
-	 * [6] Lrecl: Logical record length
-	 * [7] BlkSz: Block size
-	 * [8] Dsorg: Dataset organisation. Many exists but only support: PS, PO, PO-E
-	 * [9] Dsname: Dataset name
+	 * Parse entries representing a dataset list. Only datasets with DSORG PS or
+	 * PO or PO-E and with RECFM F* or V* will be parsed.
+	 * 
+	 * Format of ZOS/MVS file list: 1 2 3 4 5 6 7 8 9 10 Volume Unit Referred
+	 * Ext Used Recfm Lrecl BlkSz Dsorg Dsname B10142 3390 2006/03/20 2 31 F 80
+	 * 80 PS MDI.OKL.WORK ARCIVE Not Direct Access Device
+	 * KJ.IOP998.ERROR.PL.UNITTEST B1N231 3390 2006/03/20 1 15 VB 256 27998 PO
+	 * PLU B1N231 3390 2006/03/20 1 15 VB 256 27998 PO-E PLB
+	 * 
+	 * ----------------------------------- Group within Regex [1] Volume [2]
+	 * Unit [3] Referred [4] Ext: number of extents [5] Used [6] Recfm: Record
+	 * format [7] Lrecl: Logical record length [8] BlkSz: Block size [9] Dsorg:
+	 * Dataset organisation. Many exists but only support: PS, PO, PO-E [10]
+	 * Dsname: Dataset name
 	 * 
 	 * Note: When volume is ARCIVE, it means the dataset is stored somewhere in
-	 *       a tape archive. These entries is currently not supported by this
-	 *       parser. A null value is returned.
-	 *       
-	 * @param f: will be updated with Name, Type, Timestamp if parsed.
+	 * a tape archive. These entries is currently not supported by this parser.
+	 * A null value is returned.
+	 * 
+	 * @param f:
+	 *            will be updated with Name, Type, Timestamp if parsed.
 	 * @param zosDirectoryEntry
 	 * @return true: entry was parsed, false: entry was not parsed.
 	 */
 	private boolean parseFileList(FTPFile file, String entry) {
-		logPrintln("MvsFilelistFTPEntryParser " + entry);
 		if (matches(entry)) {
 			file.setRawListing(entry);
 			String name = group(2);
 			String dsorg = group(1);
-			logPrint(" parsed name " + name + ", dsorg " + dsorg);
 			file.setName(name);
 
-			//DSORG
+			// DSORG
 			if ("PS".equals(dsorg)) {
 				file.setType(FTPFile.FILE_TYPE);
-				logPrintln("... is a file ");
-			} else if ("PO".equals(dsorg) || "PO-E".equals(dsorg)) {
-				// regex already ruled out anything other than
-				// PO or PO-E 
+			} 
+			else if ("PO".equals(dsorg) || "PO-E".equals(dsorg)) {
+				// regex already ruled out anything other than PO or PO-E
 				file.setType(FTPFile.DIRECTORY_TYPE);
-				logPrintln("... is a directory ");
-			} else {
-				logPrintln("... is currently not supported.");
+			} 
+			else {
 				return false;
 			}
-
+			
 			return true;
 		}
-
+		
 		return false;
 	}
 
 	/**
 	 * Parse entries within a partitioned dataset.
 	 * 
-	 * Format of a memberlist within a PDS:
-	 *    0         1        2          3        4     5     6      7    8
-	 *   Name      VV.MM   Created       Changed      Size  Init   Mod   Id
-	 *   TBSHELF   01.03 2002/09/12 2002/10/11 09:37    11    11     0 KIL001
-	 *   TBTOOL    01.12 2002/09/12 2004/11/26 19:54    51    28     0 KIL001
-	 *
-	 * -------------------------------------------
-	 * [0] Name
-	 * [1] VV.MM: Version . modification
-	 * [2] Created: yyyy / MM / dd
-	 * [3,4] Changed: yyyy / MM / dd  HH:mm
-	 * [5] Size: number of lines
-	 * [6] Init: number of lines when first created
-	 * [7] Mod: number of modified lines a last save
-	 * [8] Id: User id for last update
+	 * Format of a memberlist within a PDS: 1 2 3 4 5 6 7 8 9 Name VV.MM Created
+	 * Changed Size Init Mod Id TBSHELF 01.03 2002/09/12 2002/10/11 09:37 11 11
+	 * 0 KIL001 TBTOOL 01.12 2002/09/12 2004/11/26 19:54 51 28 0 KIL001
+	 * 
+	 * ------------------------------------------- [1] Name [2] VV.MM: Version .
+	 * modification [3] Created: yyyy / MM / dd [4,5] Changed: yyyy / MM / dd
+	 * HH:mm [6] Size: number of lines [7] Init: number of lines when first
+	 * created [8] Mod: number of modified lines a last save [9] Id: User id for
+	 * last update
 	 * 
 	 * 
-	 * @param f: will be updated with Name, Type and Timestamp if parsed.
+	 * @param f:
+	 *            will be updated with Name, Type and Timestamp if parsed.
 	 * @param zosDirectoryEntry
 	 * @return true: entry was parsed, false: entry was not parsed.
 	 */
 	private boolean parseMemberList(FTPFile file, String entry) {
-
-		logPrintln("MvsMemberlistFTPEntryParser " + entry);
 		if (matches(entry)) {
 			file.setRawListing(entry);
 			String name = group(1);
 			String datestr = group(2) + " " + group(3);
-			logPrintln(" parsed name " + name + ", datestr " + datestr);
 			file.setName(name);
 			file.setType(FTPFile.FILE_TYPE);
 			try {
 				file.setTimestamp(super.parseTimestamp(datestr));
-			} catch (ParseException e) { // just ignore parsing errors.
-				//return null;  // this is a parsing failure too.
+			} catch (ParseException e) {
+				e.printStackTrace();
+				// just ignore parsing errors.
+				// TODO check this is ok
+				return false; // this is a parsing failure too.
 			}
 			return true;
 		}
@@ -374,33 +342,28 @@
 	}
 
 	/**
-	 * Assigns the name to the first word of the entry.
-	 * Only to be used from a safe context, for example from
-	 * a memberlist, where the regex for some reason fails.
-	 * Then just assign the name field of FTPFile. 
+	 * Assigns the name to the first word of the entry. Only to be used from a
+	 * safe context, for example from a memberlist, where the regex for some
+	 * reason fails. Then just assign the name field of FTPFile.
+	 * 
 	 * @param file
 	 * @param entry
 	 * @return
 	 */
 	private boolean parseSimpleEntry(FTPFile file, String entry) {
-
-		logPrint("SimpleEntryParser " + entry);
 		if (entry != null && entry.length() > 0) {
 			file.setRawListing(entry);
 			String name = entry.split(" ")[0];
-			logPrintln(" parsed name " + name);
 			file.setName(name);
 			file.setType(FTPFile.FILE_TYPE);
-
 			return true;
 		}
-
 		return false;
 	}
 
 	/**
-	 * Parse the entry as a standard unix file.
-	 * Using the UnixFTPEntryParser.
+	 * Parse the entry as a standard unix file. Using the UnixFTPEntryParser.
+	 * 
 	 * @param file
 	 * @param entry
 	 * @return true: entry is parsed, false: entry could not be parsed.
@@ -413,44 +376,53 @@
 	}
 
 	/**
-	 * Parse entries within a partitioned dataset.
-	 * 
-	 * Format of a memberlist within a PDS:
-	 *    0         1        2          3        4     5     6      7    8
-	 *   Name      VV.MM   Created       Changed      Size  Init   Mod   Id
-	 *   TBSHELF   01.03 2002/09/12 2002/10/11 09:37    11    11     0 KIL001
-	 *   TBTOOL    01.12 2002/09/12 2004/11/26 19:54    51    28     0 KIL001
-	 *
-	 * -------------------------------------------
-	 * [0] Name
-	 * [1] VV.MM: Version . modification
-	 * [2] Created: yyyy / MM / dd
-	 * [3,4] Changed: yyyy / MM / dd  HH:mm
-	 * [5] Size: number of lines
-	 * [6] Init: number of lines when first created
-	 * [7] Mod: number of modified lines a last save
-	 * [8] Id: User id for last update
+	 * Matches these entries, note: no header: [1] [2] [3] [4] [5] IBMUSER1
+	 * JOB01906 OUTPUT 3 Spool Files
+	 * 012345678901234567890123456789012345678901234 1 2 3 4
+	 * ------------------------------------------- Group in regex [1] Job name
+	 * [2] Job number [3] Job status (INPUT,ACTIVE,OUTPUT) [4] Number of sysout
+	 * files [5] The string "Spool Files"
 	 * 
 	 * 
-	 * @param f: will be updated with Name, Type and Timestamp if parsed.
+	 * @param f:
+	 *            will be updated with Name, Type and Timestamp if parsed.
 	 * @param zosDirectoryEntry
 	 * @return true: entry was parsed, false: entry was not parsed.
 	 */
 	private boolean parseJeslevel1List(FTPFile file, String entry) {
-
-		logPrintln("JES Level 1 listFTPEntryParser >" + entry + "<");
 		if (matches(entry)) {
-			logPrintln("JES Level 1 matches = true");
-			logPrintln("group(0)=" + group(0));
-			logPrintln("group(1)=" + group(1));
-			logPrintln("group(2)=" + group(2));
-			logPrintln("group(3)=" + group(3));
-			logPrintln("group(4)=" + group(4));
 			if (group(3).equalsIgnoreCase("OUTPUT")) {
 				file.setRawListing(entry);
 				String name = group(2); /* Job Number, used by GET */
-				logPrintln(" parsed name " + name);
+				file.setName(name);
+				file.setType(FTPFile.FILE_TYPE);
+				return true;
+			}
+		}
 
+		return false;
+	}
+
+	/**
+	 * Matches these entries, note: no header: [1] [2] [3] [4] [5] JOBNAME JOBID
+	 * OWNER STATUS CLASS IBMUSER1 JOB01906 IBMUSER OUTPUT A RC=0000 3 spool
+	 * files IBMUSER TSU01830 IBMUSER OUTPUT TSU ABEND=522 3 spool files
+	 * 012345678901234567890123456789012345678901234 1 2 3 4
+	 * ------------------------------------------- Group in regex [1] Job name
+	 * [2] Job number [3] Owner [4] Job status (INPUT,ACTIVE,OUTPUT) [5] Job
+	 * Class [6] The rest
+	 * 
+	 * 
+	 * @param f:
+	 *            will be updated with Name, Type and Timestamp if parsed.
+	 * @param zosDirectoryEntry
+	 * @return true: entry was parsed, false: entry was not parsed.
+	 */
+	private boolean parseJeslevel2List(FTPFile file, String entry) {
+		if (matches(entry)) {
+			if (group(4).equalsIgnoreCase("OUTPUT")) {
+				file.setRawListing(entry);
+				String name = group(2); /* Job Number, used by GET */
 				file.setName(name);
 				file.setType(FTPFile.FILE_TYPE);
 				return true;
@@ -462,67 +434,49 @@
 
 	/**
 	 * preParse is called as part of the interface. Per definition is is called
-	 * before the parsing takes place.
-	 * Three kind of lists is recognize:
-	 * 	z/OS-MVS File lists
-	 *  z/OS-MVS Member lists
-	 *  unix file lists  
+	 * before the parsing takes place. Three kind of lists is recognize:
+	 * z/OS-MVS File lists z/OS-MVS Member lists unix file lists
 	 */
 	public List preParse(List orig) {
-		// simply remove the header line.  Composite logic will take care of the two different types of 
+		// simply remove the header line. Composite logic will take care of the
+		// two different types of
 		// list in short order.
 		if (orig != null && orig.size() > 0) {
 			String header = (String) orig.get(0);
 			if (header.indexOf("Volume") >= 0 && header.indexOf("Dsname") >= 0) {
-				setParseType(FILE_LIST_TYPE);
-			} 
-			else if (header.indexOf("Name") >= 0 && header.indexOf("Id") >= 0) {
-				setParseType(MEMBER_LIST_TYPE);
-			} 
-			else if (header.indexOf("total") == 0) {
-				setParseType(UNIX_LIST_TYPE);
-			} 
-			else if (header.indexOf("Spool Files") >= 30) {
-				setParseType(JES_LEVEL1_LIST_TYPE);
+				setType(FILE_LIST_TYPE);
+				super.setRegex(FILE_LIST_REGEX);
+			} else if (header.indexOf("Name") >= 0 && header.indexOf("Id") >= 0) {
+				setType(MEMBER_LIST_TYPE);
+				super.setRegex(MEMBER_LIST_REGEX);
+			} else if (header.indexOf("total") == 0) {
+				setType(UNIX_LIST_TYPE);
+				unixFTPEntryParser = new UnixFTPEntryParser();
+			} else if (header.indexOf("Spool Files") >= 30) {
+				setType(JES_LEVEL_1_LIST_TYPE);
+				super.setRegex(JES_LEVEL_1_LIST_REGEX);
+			} else if (header.indexOf("JOBNAME") == 0
+					&& header.indexOf("JOBID") > 8) {// header contains JOBNAME JOBID OWNER									// STATUS CLASS
+				setType(JES_LEVEL_2_LIST_TYPE);
+				super.setRegex(JES_LEVEL_2_LIST_REGEX);
+			} else {
+				setType(UNKNOWN_LIST_TYPE);
+			}
+			
+			if (isType != JES_LEVEL_1_LIST_TYPE) { // remove header is necessary
 				orig.remove(0);
-			} 
-			else if (header.indexOf("JOBNAME") == 0
-					&& header.indexOf("JOBID") > 8) {// header contains JOBNAME JOBID OWNER STATUS CLASS
-				setParseType(JES_LEVEL2_LIST_TYPE);
-			} 
-			else {
-				isType = UNKNOWN_LIST_TYPE;
 			}
 		}
+		
 		return orig;
 	}
 	
 	/**
-	 * 
-	 * @param parseType
-	 * @throws IllegalArgumentException
+	 * Explicitly set the type of listing being processed.
+	 * @param type The listing type.
 	 */
-	public void setParseType(int parseType) throws IllegalArgumentException {
-		if (parseType == FILE_LIST_TYPE) {
-			super.setRegex(REGEX_FILELIST);
-		}
-		else if (parseType == MEMBER_LIST_TYPE) {
-			super.setRegex(REGEX_MEMBERLIST);
-		}
-		else if (parseType == UNIX_LIST_TYPE) {
-			unixFTPEntryParser = new UnixFTPEntryParser();
-		}
-		else if (parseType == JES_LEVEL1_LIST_TYPE) {
-			super.setRegex(REGEX_JESLEVEL1LIST);
-		}
-		else if (parseType == JES_LEVEL2_LIST_TYPE) {
-			super.setRegex(REGEX_JESLEVEL2LIST);
-		}
-		else {
-			throw new IllegalArgumentException("Argument must be a valid type!");
-		}
-		
-		isType = parseType;
+	void setType(int type) {
+		isType = type;
 	}
 
 	/* 
@@ -533,17 +487,4 @@
 				DEFAULT_DATE_FORMAT, null, null, null, null);
 	}
 
-	/**
-	 * poor-mans logging ... 
-	 * @param string
-	 */
-	private void logPrint(String string) {
-		if (DEBUG_PARSER)
-			System.out.print(string);
-	}
-
-	private void logPrintln(String string) {
-		if (DEBUG_PARSER)
-			System.out.println(string);
-	}
 }

Modified: jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/test/java/org/apache/commons/net/ftp/parser/MVSFTPEntryParserTest.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/test/java/org/apache/commons/net/ftp/parser/MVSFTPEntryParserTest.java?rev=439598&r1=439597&r2=439598&view=diff
==============================================================================
--- jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/test/java/org/apache/commons/net/ftp/parser/MVSFTPEntryParserTest.java (original)
+++ jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/test/java/org/apache/commons/net/ftp/parser/MVSFTPEntryParserTest.java Sat Sep  2 06:44:52 2006
@@ -16,102 +16,229 @@
 
 package org.apache.commons.net.ftp.parser;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import junit.framework.TestSuite;
 
 import org.apache.commons.net.ftp.FTPFile;
 import org.apache.commons.net.ftp.FTPFileEntryParser;
 
 /**
+ * Changed on August 31, 2006<br/>
+ * Test suite addapted to new MVSFTPEntryParser.java.
+ * @author <a href="mailto:henrik.sorensen@balcab.ch">Henrik Sorensen</a>
+ * 
  * Created on Apr 6, 2005<br/>
  * @author <a href="mailto:wnoto@openfinance.com">William Noto</a>
- * @version $Id: NTFTPEntryParserTest.java,v 1.16 2005/01/02 03:17:50 scohen Exp $
+ * @version $Id: MVSFTPEntryParserTest.java,v 1.16 2005/01/02 03:17:50 scohen Exp $
  */
-public class MVSFTPEntryParserTest extends FTPParseTestFramework 
-{
-    private static final String [] goodsamples  = 
-    {
-        "Migrated                                                file1.I",
-        "Migrated                                                file2.I",
-        "PSMLC1 3390   2005/04/04  1    1  VB   27994 27998  PS  file3.I",
-        "PSMLB9 3390   2005/04/04  1    1  VB   27994 27998  PS  file4.I.BU",
-        "PSMLB6 3390   2005/04/05  1    1  VB   27994 27998  PS  file3.I.BU",
-        "PSMLC6 3390   2005/04/05  1    1  VB   27994 27998  PS  file6.I",
-        "Migrated                                                file6.O",
-        "PSMLB7 3390   2005/04/04  1    1  VB   27994 27998  PS  file7.O",
-        "PSMLC6 3390   2005/04/05  1    1  VB   27994 27998  PS  file7.O.BU",
-    	"FPFS42 3390   2004/06/23  1    1  FB     128  6144  PS  INCOMING.RPTBM023.D061704",
-    	"FPFS41 3390   2004/06/23  1    1  FB     128  6144  PS  INCOMING.RPTBM056.D061704",
-    	"FPFS25 3390   2004/06/23  1    1  FB     128  6144  PS  INCOMING.WTM204.D061704",                
-    };
-    
-    private static final String [] badsamples = 
-    {
-        "MigratedP201.$FTXPBI1.$CF2ITB.$AAB0402.I",
-        "PSMLC133902005/04/041VB2799427998PSfile1.I",
-        "file2.O",
-    };
-    
-    /**
-     * @see junit.framework.TestCase#TestCase(String)
-     */
-    public MVSFTPEntryParserTest (String name) 
-    {
-        super(name);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.apache.commons.net.ftp.parser.CompositeFTPParseTestFramework#getBadListings()
-     */
-    protected String[] getBadListing() {
-        return badsamples;
-    }
-    /* (non-Javadoc)
-     * @see org.apache.commons.net.ftp.parser.CompositeFTPParseTestFramework#getGoodListings()
-     */
-    protected String[] getGoodListing() {
-        return goodsamples;
-    }
-
-    
-    /**
-     * @see org.apache.commons.net.ftp.parser.FTPParseTestFramework#getParser()
-     */
-    protected FTPFileEntryParser getParser()
-    {
-        return new CompositeFileEntryParser(new FTPFileEntryParser[]
-        {
-            new MVSFTPEntryParser(),
-        });
-    }
-    
-    /**
-     * Method suite.
-     * 
-     * @return TestSuite
-     */
-    public static TestSuite suite()
-    {
-        return(new TestSuite(MVSFTPEntryParserTest.class));
-    }
-    
-    public void testParseFieldsOnDirectory() throws Exception
-    {
-        // I don't really know how to test this because the MVS system that I 
-        // connect with does not allow me to create directories.         
-    }
-    
-    /* (non-Javadoc)
-     * @see org.apache.commons.net.ftp.parser.FTPParseTestFramework#testParseFieldsOnFile()
-     */
-    public void testParseFieldsOnFile() throws Exception {
-        FTPFile file = getParser().parseFTPEntry("Migrated                                                file1.I");
-        assertNotNull("Could not parse entry.", file);
-        assertTrue("Should have been a file.", file.isFile());
-        assertEquals("file1.I", file.getName());
-        
-        FTPFile file2 = getParser().parseFTPEntry("PSMLC1 3390   2005/04/04  1    1  VB   27994 27998  PS  file2.I");
-        assertNotNull("Could not parse entry.", file2);
-        assertTrue("Should have been a file.", file2.isFile());
-        assertEquals("file2.I", file2.getName());
-    }    
+public class MVSFTPEntryParserTest extends FTPParseTestFramework {
+	static List saveftpfiles;
+
+	private static final String[] goodsamplesDatasetList = { /* Note, if the string begins with SAVE, the parsed entry is stored in the List saveftpfiles */
+			//	"Volume Unit    Referred Ext Used Recfm Lrecl BlkSz Dsorg Dsname",
+			"SAVE00 3390   2004/06/23  1    1  FB     128  6144  PS    INCOMING.RPTBM023.D061704",
+			"SAVE01 3390   2004/06/23  1    1  FB     128  6144  PO    INCOMING.RPTBM024.D061704",
+			"SAVE02 3390   2004/06/23  1    1  FB     128  6144  PO-E  INCOMING.RPTBM025.D061704",
+			"PSMLC1 3390   2005/04/04  1    1  VB   27994 27998  PS    file3.I",
+			"PSMLB9 3390   2005/04/04  1    1  VB   27994 27998  PS    file4.I.BU",
+			"PSMLB6 3390   2005/04/05  1    1  VB   27994 27998  PS    file3.I.BU",
+			"PSMLC6 3390   2005/04/05  1    1  VB   27994 27998  PS    file6.I",
+			"PSMLB7 3390   2005/04/04  1    1  VB   27994 27998  PS    file7.O",
+			"PSMLC6 3390   2005/04/05  1    1  VB   27994 27998  PS    file7.O.BU",
+			"FPFS49 3390   2004/06/23  1    1  FB     128  6144  PO-E  INCOMING.RPTBM026.D061704",
+			"FPFS41 3390   2004/06/23  1    1  FB     128  6144  PS    INCOMING.RPTBM056.D061704",
+			"FPFS25 3390   2004/06/23  1    1  FB     128  6144  PS    INCOMING.WTM204.D061704", };
+
+	private static final String[] goodsamplesMemberList = {/* Note, if the string begins with SAVE, the parsed entry is stored in the List saveftpfiles */
+			"Name      VV.MM   Created       Changed      Size  Init   Mod   Id",
+			"SAVE03    01.03 2002/09/12 2002/10/11 09:37    11    11     0 KIL001",
+			"SAVE04                                                              ", // no statistics
+			"TBSHELF1  01.03 2002/09/12 2002/10/11 09:37    11    11     0 KIL001",
+			"TBSHELF2  01.03 2002/09/12 2002/10/11 09:37    11    11     0 KIL001",
+			"TBSHELF3  01.03 2002/09/12 2002/10/11 09:37    11    11     0 KIL001",
+			"TBSHELF4  01.03 2002/09/12 2002/10/11 09:37    11    11     0 KIL001", };
+
+	private static final String[] goodsamplesJES1List = { /* no header for JES1 (JES Interface level 1) */
+	/* Note, if the string begins with SAVE, the parsed entry is stored in the List saveftpfiles */
+	"IBMUSER1  JOB01906  OUTPUT    3 Spool Files", };
+
+	private static final String[] goodsamplesJES2List = { /* JES2 (JES Interface level 2) */
+			/* Note, if the string begins with SAVE, the parsed entry is stored in the List saveftpfiles */
+			//"JOBNAME  JOBID    OWNER    STATUS CLASS",
+			"IBMUSER2 JOB01906 IBMUSER  OUTPUT A        RC=0000 3 spool files",
+			"IBMUSER  TSU01830 IBMUSER  OUTPUT TSU      ABEND=522 3 spool files", };
+
+	private static final String[] badsamples = {
+			"MigratedP201.$FTXPBI1.$CF2ITB.$AAB0402.I",
+			"PSMLC133902005/04/041VB2799427998PSfile1.I", "file2.O", };
+
+	/**
+	 * @see junit.framework.TestCase#TestCase(String)
+	 */
+	public MVSFTPEntryParserTest(String name) {
+		super(name);
+		if (saveftpfiles == null)
+			saveftpfiles = new ArrayList();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.apache.commons.net.ftp.parser.CompositeFTPParseTestFramework#getBadListings()
+	 */
+	protected String[] getBadListing() {
+		return badsamples;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.apache.commons.net.ftp.parser.CompositeFTPParseTestFramework#getGoodListings()
+	 */
+	protected String[] getGoodListing() {
+		return goodsamplesDatasetList;
+	}
+
+	/**
+	 * @see org.apache.commons.net.ftp.parser.FTPParseTestFramework#getAllGoodListings()
+	 */
+	protected List getAllGoodListings() {
+		List l = new ArrayList();
+		l.add(goodsamplesDatasetList);
+		l.add(goodsamplesMemberList);
+		l.add(goodsamplesJES1List);
+		l.add(goodsamplesJES2List);
+
+		return l;
+	}
+
+	/**
+	 * @see org.apache.commons.net.ftp.parser.FTPParseTestFramework#doAdditionalGoodTests()
+	 */
+	/* Add the parsed files for more testing later */
+	protected void doAdditionalGoodTests(String test, FTPFile f) {
+		if (test.startsWith("SAVE")) { //System.out.println("saving ftpfile name ="+f.getName()); 
+			saveftpfiles.add(f);
+		}
+	}
+
+	/**
+	 * @see org.apache.commons.net.ftp.parser.FTPParseTestFramework#getParser()
+	 */
+	protected FTPFileEntryParser getParser() {
+		return new MVSFTPEntryParser();
+	}
+
+	/**
+	 * Method suite.
+	 * 
+	 * @return TestSuite
+	 */
+	public static TestSuite suite() {
+		return (new TestSuite(MVSFTPEntryParserTest.class));
+	}
+
+	/* 
+	 * note the testGoodListing has to be the first test invoked, because 
+	 * some FTPFile entries are saved for the later tests
+	 * 
+	 * (non-Javadoc)
+	 * @see org.apache.commons.net.ftp.parser.FTPParseTestFramework#testGoodListing()
+	 */
+	@Override
+	public void testGoodListing() throws Exception {
+		String[] goodsamples = getGoodListing();
+		MVSFTPEntryParser parser = new MVSFTPEntryParser();
+		parser.setType(MVSFTPEntryParser.FILE_LIST_TYPE);
+		parser.setRegex(MVSFTPEntryParser.FILE_LIST_REGEX);
+		for (String test : goodsamples) {
+			FTPFile f = parser.parseFTPEntry(test);
+			assertNotNull("Failed to parse " + test, f);
+			doAdditionalGoodTests(test, f);
+		}
+	}
+
+	public void testMemberListing() throws Exception {
+		MVSFTPEntryParser parser = new MVSFTPEntryParser();
+		parser.setType(MVSFTPEntryParser.MEMBER_LIST_TYPE);
+		parser.setRegex(MVSFTPEntryParser.MEMBER_LIST_REGEX);
+		for (String test : goodsamplesMemberList) {
+			FTPFile f = parser.parseFTPEntry(test);
+			assertNotNull("Failed to parse " + test, f);
+			doAdditionalGoodTests(test, f);
+		}
+	}
+
+	public void testJesLevel1Listing() {
+		MVSFTPEntryParser parser = new MVSFTPEntryParser();
+		parser.setType(MVSFTPEntryParser.JES_LEVEL_1_LIST_TYPE);
+		parser.setRegex(MVSFTPEntryParser.JES_LEVEL_1_LIST_REGEX);
+		for (String test : goodsamplesJES1List) {
+			FTPFile f = parser.parseFTPEntry(test);
+			assertNotNull("Failed to parse " + test, f);
+			doAdditionalGoodTests(test, f);
+		}
+	}
+	
+	public void testJesLevel2Listing() {
+		MVSFTPEntryParser parser = new MVSFTPEntryParser();
+		parser.setType(MVSFTPEntryParser.JES_LEVEL_2_LIST_TYPE);
+		parser.setRegex(MVSFTPEntryParser.JES_LEVEL_2_LIST_REGEX);
+		for (String test : goodsamplesJES2List) {
+			FTPFile f = parser.parseFTPEntry(test);
+			assertNotNull("Failed to parse " + test, f);
+			doAdditionalGoodTests(test, f);
+		}
+	}
+
+	public void testParseFieldsOnDirectory() throws Exception {
+		MVSFTPEntryParser parser = new MVSFTPEntryParser();
+		parser.setType(MVSFTPEntryParser.FILE_LIST_TYPE);
+		parser.setRegex(MVSFTPEntryParser.FILE_LIST_REGEX);
+
+		FTPFile file = parser
+				.parseFTPEntry("SAVE01 3390   2004/06/23  1    1  FB     128  6144  PO    INCOMING.RPTBM024.D061704");
+		assertNotNull("Could not parse entry.", file);
+		assertTrue("Should have been a directory.", file.isDirectory());
+		assertEquals("INCOMING.RPTBM024.D061704", file.getName());
+
+		file = parser
+				.parseFTPEntry("SAVE02 3390   2004/06/23  1    1  FB     128  6144  PO-E  INCOMING.RPTBM025.D061704");
+		assertNotNull("Could not parse entry.", file);
+		assertTrue("Should have been a directory.", file.isDirectory());
+		assertEquals("INCOMING.RPTBM025.D061704", file.getName());
+
+	}
+
+	/* (non-Javadoc)
+	 * @see org.apache.commons.net.ftp.parser.FTPParseTestFramework#testParseFieldsOnFile()
+	 */
+	public void testParseFieldsOnFile() throws Exception {
+		FTPFile file = null;
+		
+		MVSFTPEntryParser parser = new MVSFTPEntryParser(); 
+		
+		parser.setRegex(MVSFTPEntryParser.FILE_LIST_REGEX);
+		parser.setType(MVSFTPEntryParser.FILE_LIST_TYPE);
+		
+		file = parser.parseFTPEntry("SAVE00 3390   2004/06/23  1    1  FB     128  6144  PS    INCOMING.RPTBM023.D061704");
+		assertNotNull("Could not parse entry.", file);
+		assertTrue("Should have been a file.", file.isFile());
+		assertEquals("INCOMING.RPTBM023.D061704", file.getName());
+		assertNull("Timestamp should not have been set.", file.getTimestamp());
+
+		parser.setType(MVSFTPEntryParser.MEMBER_LIST_TYPE);
+		parser.setRegex(MVSFTPEntryParser.MEMBER_LIST_REGEX);
+		
+		file = parser.parseFTPEntry("SAVE03    01.03 2002/09/12 2002/10/11 09:37    11    11     0 KIL001");
+		assertNotNull("Could not parse entry.", file);
+		assertTrue("Should have been a file.", file.isFile());
+		assertEquals("SAVE03", file.getName());
+		assertNotNull("Timestamp should have been set.", file.getTimestamp());
+
+		file = parser.parseFTPEntry("SAVE04                                                              ");
+		assertNotNull("Could not parse entry.", file);
+		assertTrue("Should have been a file.", file.isFile());
+		assertEquals("SAVE04", file.getName());
+		assertNull("Timestamp should not have been set.", file.getTimestamp());
+
+	}
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org