You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by df...@apache.org on 2003/07/29 04:35:35 UTC

cvs commit: jakarta-commons/net/src/test/org/apache/commons/net/ftp/parser VMSFTPEntryParserTest.java

dfs         2003/07/28 19:35:35

  Modified:    net/src/java/org/apache/commons/net/ftp/parser
                        VMSFTPEntryParser.java
               net/src/test/org/apache/commons/net/ftp/parser
                        VMSFTPEntryParserTest.java
  Log:
  Applied patch from Stephane Este-Gracias that fixes the parsing of
  VMS listings.  I verified that it would compile and pass its tests.
  I also visually inspected the code, but did not perform a deep
  examination.  On the surface, everything looks okay.
  
  PR: 20796
  Submitted by: sestegra@free.fr (Stephane ESTE-GRACIAS)
  Reviewed by: dfs
  
  Revision  Changes    Path
  1.6       +95 -10    jakarta-commons/net/src/java/org/apache/commons/net/ftp/parser/VMSFTPEntryParser.java
  
  Index: VMSFTPEntryParser.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/net/src/java/org/apache/commons/net/ftp/parser/VMSFTPEntryParser.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- VMSFTPEntryParser.java	18 May 2003 04:03:17 -0000	1.5
  +++ VMSFTPEntryParser.java	29 Jul 2003 02:35:34 -0000	1.6
  @@ -55,8 +55,13 @@
    */
   
   import java.util.Calendar;
  +import java.util.HashMap;
   import java.io.BufferedReader;
  +import java.io.ByteArrayInputStream;
   import java.io.IOException;
  +import java.io.InputStream;
  +import java.io.InputStreamReader;
  +
   import org.apache.commons.net.ftp.FTPFile;
   import org.apache.commons.net.ftp.FTPFileListParserImpl;
   
  @@ -112,6 +117,7 @@
    * 
    * @author  <a href="Winston.Ojeda@qg.com">Winston Ojeda</a>
    * @author <a href="mailto:scohen@apache.org">Steve Cohen</a>
  + * @author <a href="sestegra@free.fr">Stephane ESTE-GRACIAS</a>
    * @version $Id$
    */
   public class VMSFTPEntryParser extends FTPFileListParserImpl
  @@ -139,8 +145,8 @@
           + MONTHS 
           + "-([0-9]{4})\\s*"
           + "((?:[01]\\d)|(?:2[0-3])):([012345]\\d):([012345]\\d)\\s*"
  -        + "\\[([0-9$A-Za-z_]+),([0-9$a-zA-Z_]+)\\]\\s*" 
  -        + "(\\([a-zA-Z]*,[a-zA-Z]*,[a-zA-Z]*,[a-zA-Z]*\\))";
  +        + "\\[(([0-9$A-Za-z_]+)|([0-9$A-Za-z_]+),([0-9$a-zA-Z_]+))\\]\\s*" 
  +        + "\\([a-zA-Z]*,[a-zA-Z]*,[a-zA-Z]*,[a-zA-Z]*\\)";
   
   
       /**
  @@ -156,7 +162,8 @@
       {
           this(false);
       }
  -    
  +
  +
       /**
        * Constructor for a VMSFTPEntryParser object.  Sets the versioning member 
        * to the supplied value.
  @@ -174,6 +181,68 @@
           this.versioning = versioning;
       }
   
  +
  +    /***
  +     * Parses an FTP server file listing and converts it into a usable format
  +     * in the form of an array of <code> FTPFile </code> instances.  If the
  +     * file list contains no files, <code> null </code> should be
  +     * returned, otherwise an array of <code> FTPFile </code> instances
  +     * representing the files in the directory is returned.
  +     * <p>
  +     * @param listStream The InputStream from which the file list should be
  +     *        read.
  +     * @return The list of file information contained in the given path.  null
  +     *     if the list could not be obtained or if there are no files in
  +     *     the directory.
  +     * @exception IOException  If an I/O error occurs reading the listStream.
  +     ***/
  +    public FTPFile[] parseFileList(InputStream listStream) throws IOException {
  +        BufferedReader reader = new BufferedReader(new InputStreamReader(listStream));
  +        String listing = null;
  +        FTPFile[] files;
  +
  +        String line = reader.readLine();
  +        while (line != null) {
  +            if ((line.trim().equals("")) ||
  +                (line.startsWith("Directory")) ||
  +                (line.startsWith("Total"))
  +               ) {
  +                line = reader.readLine();
  +                continue;
  +            }
  +            if (listing == null) {
  +                listing = line;
  +            } else {
  +                listing += "\r\n" + line;
  +            }
  +            line = reader.readLine();
  +        }
  +        reader.close();
  +
  +        byte[] bytes = listing.getBytes();
  +        ByteArrayInputStream listingStream = new ByteArrayInputStream(bytes);
  +        
  +        if (versioning) {
  +            files = super.parseFileList(listingStream);
  +        } else {
  +            FTPFile[] tempFiles = super.parseFileList(listingStream);
  +            HashMap filesHash = new HashMap();
  +            String fileName;
  +            
  +            for (int index = 0; index < tempFiles.length; index++) {
  +                fileName = tempFiles[index].getName();
  +                if (!filesHash.containsKey(fileName)) {
  +                    filesHash.put(fileName, (FTPFile) tempFiles[index]);
  +                }
  +            }
  +            
  +            files = (FTPFile[]) filesHash.values().toArray(new FTPFile[0]);
  +        }
  +        
  +        return files;
  +    }
  +
  +
       /**
        * Parses a line of a VMS FTP server file listing and converts it into a
        * usable format in the form of an <code> FTPFile </code> instance.  If the
  @@ -201,9 +270,25 @@
               String hr = group(6);
               String min = group(7);
               String sec = group(8);
  -            String grp = group(9);
  -            String owner = group(10);
  -
  +            String owner = group(9);
  +            String[] array = owner.split(",");
  +            String grp;
  +            String user;
  +
  +            switch (array.length) {
  +                case 1:
  +                    grp = null;
  +                    user = array[0];
  +                    break;
  +                case 2:
  +                    grp = array[0];
  +                    user = array[1];
  +                    break;
  +                default:
  +                    grp = null;
  +                    user = null;
  +            }
  +            
               if (name.lastIndexOf(".DIR") != -1) 
               {
                   f.setType(FTPFile.DIRECTORY_TYPE);
  @@ -243,7 +328,7 @@
               f.setTimestamp(cal);
   
               f.setGroup(grp);
  -            f.setUser(owner);
  +            f.setUser(user);
               //set group and owner
               //Since I don't need the persmissions on this file (RWED), I'll 
               //leave that for further development. 'Cause it will be a bit 
  @@ -253,6 +338,7 @@
           return null;
       }
   
  +
       /**
        * Reads the next entry using the supplied BufferedReader object up to
        * whatever delemits one entry from the next.   This parser cannot use
  @@ -265,7 +351,6 @@
        * @return A string representing the next ftp entry or null if none found.
        * @exception IOException thrown on any IO Error reading from the reader.
        */
  -    
       public String readNextEntry(BufferedReader reader) throws IOException
       {
           String line = reader.readLine();
  @@ -279,6 +364,6 @@
               }
               line = reader.readLine();
           }
  -        return (entry.length() == 0  ? null : entry.toString());
  +        return (entry.length() == 0 ? null : entry.toString());
       }
   }
  
  
  
  1.5       +73 -6     jakarta-commons/net/src/test/org/apache/commons/net/ftp/parser/VMSFTPEntryParserTest.java
  
  Index: VMSFTPEntryParserTest.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/net/src/test/org/apache/commons/net/ftp/parser/VMSFTPEntryParserTest.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- VMSFTPEntryParserTest.java	3 Mar 2003 15:25:56 -0000	1.4
  +++ VMSFTPEntryParserTest.java	29 Jul 2003 02:35:35 -0000	1.5
  @@ -54,6 +54,8 @@
    * <http://www.apache.org/>.
    */
    
  +import java.io.ByteArrayInputStream;
  +
   import junit.framework.TestSuite;
   
   import org.apache.commons.net.ftp.FTPFile;
  @@ -61,6 +63,7 @@
   
   /**
    * @author <a href="mailto:scohen@apache.org">Steve Cohen</a>
  + * @author <a href="sestegra@free.fr">Stephane ESTE-GRACIAS</a>
    * @version $Id$
    */
   public class VMSFTPEntryParserTest extends FTPParseTestFramework
  @@ -80,11 +83,11 @@
       
       private static final String[] goodsamples = 
       {
  -
  +		"Directory USER1:[TEMP]\r\n\r\n",
           "1-JUN.LIS;1              9/9           2-JUN-1998 07:32:04  [GROUP,OWNER]    (RWED,RWED,RWED,RE)", 
  +        "1-JUN.LIS;3              9/9           2-JUN-1998 07:32:04  [GROUP,OWNER]    (RWED,RWED,RWED,)", 
           "1-JUN.LIS;2              9/9           2-JUN-1998 07:32:04  [GROUP,OWNER]    (RWED,RWED,RWED,)", 
  -        "1-JUN.LIS;2              9/9           2-JUN-1998 07:32:04  [GROUP,OWNER]    (RWED,RWED,RWED,)", 
  -        "DATA.DIR;1               1/9           2-JUN-1998 07:32:04  [GROUP,OWNER]    (,RWED,RWED,RE)", 
  +        "DATA.DIR;1               1/9           2-JUN-1998 07:32:04  [TRANSLATED]     (,RWED,RWED,RE)", 
           "120196.TXT;1           118/126        14-APR-1997 12:45:27  [GROUP,OWNER]    (RWED,,RWED,RE)", 
           "30CHARBAR.TXT;1         11/18          2-JUN-1998 08:38:42  [GROUP,OWNER]    (RWED,RWED,RWED,RE)", 
           "A.;2                    18/18          1-JUL-1998 08:43:20  [GROUP,OWNER]    (RWED,RWED,RWED,RE)", 
  @@ -93,8 +96,9 @@
           "UNARCHIVE.COM;1          2/15          7-JUL-1997 16:37:45  [POSTWARE,LP]    (RWE,RWE,RWE,RE)",
           "UNXMERGE.COM;15          1/15         20-AUG-1996 13:59:50  [POSTWARE,LP]    (RWE,RWE,RWE,RE)",
           "UNXTEMP.COM;7            1/15         15-AUG-1996 14:10:38  [POSTWARE,LP]    (RWE,RWE,RWE,RE)",
  -        "UNZIP_AND_ATTACH_FILES.COM;12\r\n                        14/15         24-JUL-2002 14:35:40  [POSTWARE,LP]    (RWE,RWE,RWE,RE)",
  -        "UNZIP_AND_ATTACH_FILES.SAV;1\r\n                        14/15         17-JAN-2002 11:13:53  [POSTWARE,LP]    (RWE,RWED,RWE,RE)"        
  +        "UNZIP_AND_ATTACH_FILES.COM;12\r\n                        14/15         24-JUL-2002 14:35:40  [TRANSLATED]    (RWE,RWE,RWE,RE)",
  +        "UNZIP_AND_ATTACH_FILES.SAV;1\r\n                        14/15         17-JAN-2002 11:13:53  [POSTWARE,LP]    (RWE,RWED,RWE,RE)",
  +		"\r\nTotal 14 files"        
       };
   
       /**
  @@ -127,6 +131,22 @@
           assertEquals("OWNER", 
                        dir.getUser());
           checkPermisions(dir);
  +        
  +        
  +        dir = getParser().parseFTPEntry("DATA.DIR;1               1/9           2-JUN-1998 07:32:04  [TRANSLATED]    (RWED,RWED,RWED,RE)");
  +        assertTrue("Should be a directory.", 
  +                           dir.isDirectory());
  +        assertEquals("DATA.DIR", 
  +                             dir.getName());
  +        assertEquals(512, 
  +                             dir.getSize());
  +        assertEquals("Tue Jun 02 07:32:04 1998", 
  +                             df.format(dir.getTimestamp().getTime()));
  +        assertEquals(null, 
  +                     dir.getGroup());
  +        assertEquals("TRANSLATED", 
  +                     dir.getUser());
  +        checkPermisions(dir);
       }
   
       /**
  @@ -148,6 +168,22 @@
           assertEquals("OWNER", 
                        file.getUser());
           checkPermisions(file);
  +        
  +        
  +        file = getParser().parseFTPEntry("1-JUN.LIS;1              9/9           2-JUN-1998 07:32:04  [TRANSLATED]    (RWED,RWED,RWED,RE)");
  +        assertTrue("Should be a file.", 
  +                   file.isFile());
  +        assertEquals("1-JUN.LIS", 
  +                     file.getName());
  +        assertEquals(9 * 512, 
  +                     file.getSize());
  +        assertEquals("Tue Jun 02 07:32:04 1998", 
  +                     df.format(file.getTimestamp().getTime()));
  +        assertEquals(null, 
  +                     file.getGroup());
  +        assertEquals("TRANSLATED", 
  +                     file.getUser());
  +        checkPermisions(file);
       }
   
       /**
  @@ -221,4 +257,35 @@
       {
           return(new TestSuite(VMSFTPEntryParserTest.class));
       }       
  +	
  +	public void testBadListing() throws Exception {
  +		super.testBadListing();
  +	}
  +
  +	public void testGoodListing() throws Exception {
  +		String[] goodsamples = getGoodListing();
  +        String listing = "";
  +           
  +        for (int i = 0; i < goodsamples.length; i++) {
  +            listing += goodsamples[i] + "\r\n";    
  +        }
  +        
  +        byte[] bytes = listing.getBytes();
  +        ByteArrayInputStream listingStream = new ByteArrayInputStream(bytes);
  +        
  +        FTPFile[] files = new VMSFTPEntryParser(true).parseFileList(listingStream);
  +
  +        System.out.println(files.length);
  +        for (int index = 0; index < files.length; index++) {
  +            System.out.println(files[index].getName());
  +        }
  +        
  +        listingStream.reset();
  +        files = new VMSFTPEntryParser(false).parseFileList(listingStream);
  +        
  +        System.out.println(files.length);
  +        for (int index = 0; index < files.length; index++) {
  +            System.out.println(files[index].getName());
  +        }
  +	}
   }
  
  
  

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