scohen      2005/05/28 10:05:44

  Modified:    src/main/org/apache/tools/ant/taskdefs/optional/net
                        FTPConfigurator.java FTP.java
               src/testcases/org/apache/tools/ant/taskdefs/optional/net
                        FTPTest.java
               src/etc/testcases/taskdefs/optional/net ftp.xml
  Log:
  Convert ftp task systemTypeKey and timestampGranularity attributes to using 
the EnumeratedAttribute pattern
  and add some JUnit tests of the new configuration stuff.
  
  Revision  Changes    Path
  1.3       +4 -1      
ant/src/main/org/apache/tools/ant/taskdefs/optional/net/FTPConfigurator.java
  
  Index: FTPConfigurator.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/net/FTPConfigurator.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- FTPConfigurator.java      14 May 2005 13:14:14 -0000      1.2
  +++ FTPConfigurator.java      28 May 2005 17:05:44 -0000      1.3
  @@ -37,14 +37,17 @@
        * @return the client as configured.
        */
       static FTPClient configure(FTPClient client, FTP task) {
  +        task.log("custom configuration", Project.MSG_VERBOSE);
           FTPClientConfig config;
           String systemTypeKey = task.getSystemTypeKey(); 
  -        if (systemTypeKey != null) {
  +        if (systemTypeKey != null && !"".equals(systemTypeKey)) {
               config = new FTPClientConfig(systemTypeKey);
               task.log("custom config: system key = " 
                       + systemTypeKey, Project.MSG_VERBOSE);
           } else {
               config = new FTPClientConfig();
  +            task.log("custom config: system key = default (UNIX)", 
  +                    Project.MSG_VERBOSE);
           }
           
           String defaultDateFormatConfig = task.getDefaultDateFormatConfig();
  
  
  
  1.75      +91 -33    
ant/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java
  
  Index: FTP.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java,v
  retrieving revision 1.74
  retrieving revision 1.75
  diff -u -r1.74 -r1.75
  --- FTP.java  22 May 2005 18:48:42 -0000      1.74
  +++ FTP.java  28 May 2005 17:05:44 -0000      1.75
  @@ -101,6 +101,7 @@
       private boolean verbose = false;
       private boolean newerOnly = false;
       private long timeDiffMillis = 0;
  +    private long granularityMillis = 0L;
       private boolean timeDiffAuto = false;
       private int action = SEND_FILES;
       private Vector filesets = new Vector();
  @@ -114,14 +115,13 @@
       private boolean preserveLastModified = false;
       private String chmod = null;
       private String umask = null;
  -    private String systemTypeKey = null;
  +    private FTPSystemType systemTypeKey = FTPSystemType.getDefault();
       private String defaultDateFormatConfig = null;
       private String recentDateFormatConfig = null;
       private String serverLanguageCodeConfig = null;
       private String serverTimeZoneConfig = null;
       private String shortMonthNamesConfig = null;
  -    private String timestampGranularity = null;
  -    private long serverTimestampGranularity = 0L;
  +    private Granularity timestampGranularity = Granularity.getDefault();
       private boolean isConfigurationSet = false;
   
       protected static final String[] ACTION_STRS = {
  @@ -1268,8 +1268,8 @@
        * the default value of null will be kept.
        * @see org.apache.commons.net.ftp.FTPClientConfig
        */
  -    public void setSystemTypeKey(String systemKey) {
  -        if (systemKey != null && !systemKey.equals(""))
  +    public void setSystemTypeKey(FTPSystemType systemKey) {
  +        if (systemKey != null && !systemKey.getValue().equals(""))
           {
               this.systemTypeKey = systemKey;
               configurationHasBeenSet();
  @@ -1361,7 +1361,7 @@
        * @return Returns the systemTypeKey.
        */
       String getSystemTypeKey() {
  -        return systemTypeKey;
  +        return systemTypeKey.getValue();
       }
       /**
        * @return Returns the defaultDateFormatConfig.
  @@ -1396,13 +1396,13 @@
       /**
        * @return Returns the timestampGranularity.
        */
  -    String getTimestampGranularity() {
  +    Granularity getTimestampGranularity() {
           return timestampGranularity;
       }
       /**
        * @param timestampGranularity The timestampGranularity to set.
        */
  -    public void setTimestampGranularity(String timestampGranularity) {
  +    public void setTimestampGranularity(Granularity timestampGranularity) {
           if (null == timestampGranularity || "".equals(timestampGranularity)) 
{
               return;
           }
  @@ -1517,29 +1517,8 @@
                   }
               } else {
                   if (this.newerOnly) {
  -                     if (action == SEND_FILES) {
  -                         if 
("NONE".equalsIgnoreCase(this.timestampGranularity)) 
  -                         {
  -                             this.serverTimestampGranularity = 0L;
  -                         }
  -                         else if 
("MINUTE".equalsIgnoreCase(this.timestampGranularity)) 
  -                         {
  -                             this.serverTimestampGranularity = 
GRANULARITY_MINUTE;
  -                         } 
  -                         else 
  -                         {
  -                             this.serverTimestampGranularity = 
GRANULARITY_MINUTE;
  -                         }
  -                     } else if (action == GET_FILES) {
  -                         if 
("MINUTE".equalsIgnoreCase(this.timestampGranularity)) 
  -                         {
  -                             this.serverTimestampGranularity = 
GRANULARITY_MINUTE;
  -                         }
  -                         else 
  -                         {
  -                             this.serverTimestampGranularity = 0L;
  -                         }
  -                     }
  +                    this.granularityMillis = 
  +                        this.timestampGranularity.getMilliseconds(action);
                   }
                   for (int i = 0; i < dsfiles.length; i++) {
                       switch (action) {
  @@ -1799,13 +1778,13 @@
           if (this.action == SEND_FILES) {
               return remoteTimestamp 
                        + this.timeDiffMillis 
  -                     + this.serverTimestampGranularity 
  +                     + this.granularityMillis 
                >= localTimestamp;
           } else {
               return localTimestamp 
                >= remoteTimestamp 
                        + this.timeDiffMillis
  -                     + this.serverTimestampGranularity;
  +                     + this.granularityMillis;
           }
       }
   
  @@ -2300,5 +2279,84 @@
               return SEND_FILES;
           }
       }
  +    /**
  +     * represents one of the valid timestamp adjustment values 
  +     * recognized by the <code>timestampGranularity</code> attribute.<p>
  +
  +     * A timestamp adjustment may be used in file transfers for checking 
  +     * uptodateness. MINUTE means to add one minute to the server 
  +     * timestamp.  This is done because FTP servers typically list 
  +     * timestamps HH:mm and client FileSystems typically use HH:mm:ss.
  +     * 
  +     * The default is to use MINUTE for PUT actions and NONE for GET 
  +     * actions, since GETs have the <code>preserveLastModified</code>
  +     * option, which takes care of the problem in most use cases where
  +     * this level of granularity is an issue.
  +     * 
  +     */
  +    public static class Granularity extends EnumeratedAttribute {
  +
  +        private static final String[] VALID_GRANULARITIES = {
  +                "", "MINUTE", "NONE"
  +        };
  +         /* 
  +         * @return the list of valid Granularity values
  +         */
  +        public String[] getValues() {
  +            // TODO Auto-generated method stub
  +            return VALID_GRANULARITIES;
  +        }
  +        /**
  +         * returns the number of milliseconds associated with 
  +         * the attribute, which can vary in some cases depending
  +         * on the value of the action parameter.
  +         * @param action SEND_FILES or GET_FILES
  +         * @return the number of milliseconds associated with 
  +         * the attribute, in the context of the supplied action
  +         */
  +        public long getMilliseconds(int action) {
  +            String granularityU = getValue().toUpperCase(Locale.US);
  +            long granularity = 0L;
  +            if ("".equals(granularityU)) {
  +                if (action == SEND_FILES) {
  +                    return GRANULARITY_MINUTE;                   
  +                }
  +            } else if ("MINUTE".equals(granularityU)) {
  +                return GRANULARITY_MINUTE;
  +             }  
  +             return 0L;
  +        }
  +        static final Granularity getDefault() {
  +            Granularity g = new Granularity();
  +            g.setValue("");
  +            return g;
  +        }
  +        
  +   }
  +   /**
  +      * one of the valid system type keys recognized by the systemTypeKey
  +      * attribute.
  +      */
  +    public static class FTPSystemType extends EnumeratedAttribute {
  +
  +       private static final String[] VALID_SYSTEM_TYPES = {
  +                "", "UNIX", "VMS", "WINDOWS", "OS/2", "OS/400",
  +                "MVS"
  +        };
  +       
  +       
  +         /* 
  +          * @return the list of valid system types.
  +          */
  +         public String[] getValues() {
  +             return VALID_SYSTEM_TYPES;
  +         }
  +         
  +         static final FTPSystemType getDefault() {
  +             FTPSystemType ftpst = new FTPSystemType();
  +             ftpst.setValue("");
  +             return ftpst;
  +         }
  +    }
   }
   
  
  
  
  1.17      +115 -12   
ant/src/testcases/org/apache/tools/ant/taskdefs/optional/net/FTPTest.java
  
  Index: FTPTest.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/optional/net/FTPTest.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- FTPTest.java      22 May 2005 02:58:47 -0000      1.16
  +++ FTPTest.java      28 May 2005 17:05:44 -0000      1.17
  @@ -16,25 +16,23 @@
    */
   package org.apache.tools.ant.taskdefs.optional.net;
   
  +import java.io.File;
  +import java.io.IOException;
  +import java.util.Arrays;
  +import java.util.HashMap;
  +import java.util.Map;
  +import java.util.Vector;
  +
  +import org.apache.commons.net.ftp.FTPClient;
   import org.apache.tools.ant.BuildEvent;
   import org.apache.tools.ant.BuildFileTest;
  -import org.apache.tools.ant.BuildListener;
  -import org.apache.tools.ant.BuildLogger;
   import org.apache.tools.ant.DefaultLogger;
   import org.apache.tools.ant.DirectoryScanner;
  +import org.apache.tools.ant.Project;
  +import org.apache.tools.ant.taskdefs.condition.Os;
   import org.apache.tools.ant.types.FileSet;
  -import org.apache.tools.ant.taskdefs.optional.net.FTP;
  -import org.apache.tools.ant.util.JavaEnvUtils;
   import org.apache.tools.ant.util.regexp.RegexpMatcher;
   import org.apache.tools.ant.util.regexp.RegexpMatcherFactory;
  -import org.apache.tools.ant.taskdefs.condition.Os;
  -
  -import java.io.File;
  -import java.io.IOException;
  -import java.util.Arrays;
  -import java.util.Vector;
  -
  -import org.apache.commons.net.ftp.FTPClient;
   
   public class FTPTest extends BuildFileTest{
       // keep track of what operating systems are supported here.
  @@ -593,6 +591,42 @@
       }
       
       /**
  +     * This class enables the use of the log to count the number
  +     * of times a message has been emitted.
  +     */
  +    private class LogCounter extends DefaultLogger {
  +        private Map searchMap = new HashMap();
  +        private int matchCount;
  +
  +        public void addLogMessageToSearch(String message) {
  +            searchMap.put(message, new Integer(0));
  +        }
  +        
  +        /* 
  +         * @param event the build event that is being logged.
  +         */
  +        public void messageLogged(BuildEvent event) {
  +            String message = event.getMessage();
  +            Integer mcnt = (Integer) searchMap.get(message);
  +            if (null != mcnt) {
  +                searchMap.put(message, new Integer(mcnt.intValue() + 1));
  +            }
  +            super.messageLogged(event);
  +        }
  +        
  +        /**
  +         * @return the number of times that the looked for message was sent 
  +         * to the log
  +         */
  +        public int getMatchCount(String message) {
  +            Integer mcnt = (Integer) searchMap.get(message);
  +            if (null != mcnt) {
  +                return mcnt.intValue();
  +            }
  +            return 0;
  +        }
  +    }
  +    /**
        * Tests the combination of the newer parameter and the 
        * serverTimezoneConfig  parameter in the PUT action.  The default 
        * configuration is an ftp server on localhost which formats 
  @@ -619,7 +653,76 @@
           getProject().executeTarget("timed.test.get.older");
           assertEquals(3, log.getCount());
       }
  +   
  +    
  +    /**
  +     * Tests that the presence of one of the server config params forces
  +     * the system type to Unix if not specified.
  +     */
  +    public void testConfiguration1() {
  +        int[] expectedCounts = {
  +                1,1,0,1,0,0
  +        };
  +        performConfigTest("configuration.1", expectedCounts);
  +        
  +    }
  +
  +    /**
  +     * Tests the systemTypeKey attribute.
  +     */
  +    public void testConfiguration2() {
  +        int[] expectedCounts = {
  +                1,0,0,1,1,0
  +        };
  +        performConfigTest("configuration.2", expectedCounts);
  +        
  +    }
  +
  +    /**
  +     * Tests the systemTypeKey attribute with UNIX specified.
  +     */
  +    public void testConfiguration3() {
  +        int[] expectedCounts = {
  +                1,0,1,0,0,1
  +        };
  +        performConfigTest("configuration.3", expectedCounts);
  +        
  +    }
  +    /**
  +     * Tests the systemTypeKey attribute.
  +     */
  +    public void testConfigurationNone() {
  +        int[] expectedCounts = {
  +                0,0,0,0,0,0
  +        };
  +        performConfigTest("configuration.none", expectedCounts);
  + 
  +    }
  +    
  +    private void performConfigTest(String target, int[] expectedCounts) {
  +        String[] messages = new String[]{
  +                "custom configuration",
  +                "custom config: system key = default (UNIX)",
  +                "custom config: system key = UNIX",
  +                "custom config: server time zone ID = " + 
getProject().getProperty("ftp.server.timezone"),
  +                "custom config: system key = WINDOWS",
  +                "custom config: default date format = yyyy/MM/dd HH:mm" 
  +
  +        };
  +        LogCounter counter = new LogCounter();
  +        for (int i=0; i < messages.length; i++) {
  +            counter.addLogMessageToSearch(messages[i]);
  +        }
  +            
  +        getProject().addBuildListener(counter);
  +        getProject().executeTarget(target);
  +        for (int i=0; i < messages.length; i++) {
  +            assertEquals("target "+target+":message "+ i, expectedCounts[i], 
counter.getMatchCount(messages[i]));
  +        }
  +        
  +    }
   
  +    
       /**
        *  this test is inspired by a user reporting that deletions of 
directories with the ftp task do not work
        */
  
  
  
  1.11      +55 -0     ant/src/etc/testcases/taskdefs/optional/net/ftp.xml
  
  Index: ftp.xml
  ===================================================================
  RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/optional/net/ftp.xml,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- ftp.xml   22 May 2005 18:48:42 -0000      1.10
  +++ ftp.xml   28 May 2005 17:05:44 -0000      1.11
  @@ -14,6 +14,7 @@
       <property name="tstamp.format" value="yyyy-MM-dd HH:mm"/>
       <property name="server.timestamp.granularity.millis" value="60000"/>
       <property name="ftp.server.timezone" value="GMT"/>
  +    <property name="ftp.listing.file" value="/dev/null"/>
   
       <fileset dir="${tmp.get.dir}" id="fileset-destination-with-selector">
           <include name="alpha/**"/>
  @@ -191,5 +192,59 @@
               </fileset>
           </ftp>
       </target>
  +    
  +    <target name="configuration.1">
  +        <ftp action="list"
  +            server="${ftp.host}"
  +            userid="${ftp.user}"
  +            password="${ftp.password}"
  +            separator="${ftp.filesep}"
  +            remotedir="${tmp.remote}"
  +            serverTimeZoneConfig="${ftp.server.timezone}"
  +            listing="${ftp.listing.file}"
  +            >
  +             <fileset dir="${tmp.local}"/>
  +         </ftp>
  +    </target>
  +    <target name="configuration.2">
  +        <ftp action="list"
  +            server="${ftp.host}"
  +            userid="${ftp.user}"
  +            password="${ftp.password}"
  +            separator="${ftp.filesep}"
  +            remotedir="${tmp.remote}"
  +            serverTimeZoneConfig="${ftp.server.timezone}"
  +            listing="${ftp.listing.file}"
  +            systemTypeKey="WINDOWS"
  +            >
  +             <fileset dir="${tmp.local}"/>
  +         </ftp>
  +    </target>
  +    <target name="configuration.3">
  +        <ftp action="list"
  +            server="${ftp.host}"
  +            userid="${ftp.user}"
  +            password="${ftp.password}"
  +            separator="${ftp.filesep}"
  +            remotedir="${tmp.remote}"
  +            defaultDateFormatConfig="yyyy/MM/dd HH:mm"
  +            listing="${ftp.listing.file}"
  +            systemTypeKey="UNIX"
  +            >
  +             <fileset dir="${tmp.local}"/>
  +         </ftp>
  +    </target>
  +    <target name="configuration.none">
  +        <ftp action="list"
  +            server="${ftp.host}"
  +            userid="${ftp.user}"
  +            password="${ftp.password}"
  +            separator="${ftp.filesep}"
  +            remotedir="${tmp.remote}"
  +            listing="${ftp.listing.file}"
  +            >
  +             <fileset dir="${tmp.local}"/>
  +         </ftp>
  +    </target>
   
   </project>
  \ No newline at end of file
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to