Author: rwinston
Date: Sun Jun  3 14:44:08 2007
New Revision: 543998

URL: http://svn.apache.org/viewvc?view=rev&rev=543998
Log:
Attempt to provide a workaround for date rollback issue

Modified:
    
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/FTP.java
    
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/FTPClient.java
    
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/FTPClientConfig.java
    
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/parser/FTPTimestampParserImpl.java
    
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/io/CopyStreamException.java
    jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/site/xdoc/changes.xml
    
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/test/java/org/apache/commons/net/ftp/parser/FTPTimestampParserImplTest.java

Modified: 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/FTP.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/FTP.java?view=diff&rev=543998&r1=543997&r2=543998
==============================================================================
--- 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/FTP.java
 (original)
+++ 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/FTP.java
 Sun Jun  3 14:44:08 2007
@@ -33,7 +33,7 @@
 import org.apache.commons.net.SocketClient;
 
 /***
- * FTP provides the basic the functionality necessary to implement your
+ * FTP provides basic functionality necessary to implement your
  * own FTP client.  It extends org.apache.commons.net.SocketClient since
  * extending TelnetClient was causing unwanted behavior (like connections
  * that did not time out properly).
@@ -311,8 +311,7 @@
                 // returning too soon after encountering a naked CR or some 
other
                 // anomaly.
             }
-            while (!(line.length() >= 4 && line.charAt(3) != '-' &&
-                     Character.isDigit(line.charAt(0))));
+            while ((line.length() >= 4 || line.charAt(3) == '-' || 
!(line.substring(0,3).matches("\\d{3}"))));
             // This is too strong a condition because of non-conforming ftp
             // servers like ftp.funet.fi which sent 226 as the last line of a
             // 426 multi-line reply in response to ls /.  We relax the 
condition to

Modified: 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/FTPClient.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/FTPClient.java?view=diff&rev=543998&r1=543997&r2=543998
==============================================================================
--- 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/FTPClient.java
 (original)
+++ 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/FTPClient.java
 Sun Jun  3 14:44:08 2007
@@ -2431,7 +2431,7 @@
     public void setListHiddenFiles(boolean listHiddenFiles) {
        this.__listHiddenFiles = listHiddenFiles;
     }
-
+    
     /**
      * @see #setListHiddenFiles(boolean)
      * @return the current state
@@ -2439,6 +2439,27 @@
     public boolean getListHiddenFiles() {
        return this.__listHiddenFiles;
     }
+
+    /**
+     * 
+     * @return
+     */
+       public boolean isDateRollbackPermitted() {
+               return __configuration.isDateRollbackPermitted();
+       }
+
+       /**
+        * Set a boolean flag that specifies whether short date timestamps on 
the server 
+        * (i.e. those with no year component) can be "rolled back" by a year 
if the server
+        * timestamp is greater than the local timestamp. This is true by 
default.
+        *
+        * @param dateRollbackPermitted false to explicitly prevent date 
rollback
+        */
+       public void setDateRollbackPermitted(boolean dateRollbackPermitted) {
+               __configuration.setDateRollbackPermitted(dateRollbackPermitted);
+       }
+    
+    
 }
 
 /* Emacs configuration

Modified: 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/FTPClientConfig.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/FTPClientConfig.java?view=diff&rev=543998&r1=543997&r2=543998
==============================================================================
--- 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/FTPClientConfig.java
 (original)
+++ 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/FTPClientConfig.java
 Sun Jun  3 14:44:08 2007
@@ -192,6 +192,8 @@
        private String shortMonthNames = null;
        private String serverTimeZoneId = null;
        
+       private boolean dateRollbackPermitted = true;
+       
        
        /**
         * The main constructor for an FTPClientConfig object
@@ -554,5 +556,22 @@
            return LANGUAGE_CODE_MAP.keySet();
        }
        
+
+       /**
+        * getter for the [EMAIL PROTECTED] #dateRollbackPermitted} property
+        * @return
+        */
+       public boolean isDateRollbackPermitted() {
+               return dateRollbackPermitted;
+       }
+       
+       /**
+        * @see FTPClient#setDateRollbackPermitted(boolean)
+        * 
+        * @param dateRollbackPermitted true/false
+        */
+       public void setDateRollbackPermitted(boolean dateRollbackPermitted) {
+               this.dateRollbackPermitted = dateRollbackPermitted;
+       }
        
 }

Modified: 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/parser/FTPTimestampParserImpl.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/FTPTimestampParserImpl.java?view=diff&rev=543998&r1=543997&r2=543998
==============================================================================
--- 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/parser/FTPTimestampParserImpl.java
 (original)
+++ 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/ftp/parser/FTPTimestampParserImpl.java
 Sun Jun  3 14:44:08 2007
@@ -26,6 +26,7 @@
 import java.util.TimeZone;
 
 import org.apache.commons.net.ftp.Configurable;
+import org.apache.commons.net.ftp.FTPClient;
 import org.apache.commons.net.ftp.FTPClientConfig;
 
 /**
@@ -44,6 +45,7 @@
        private SimpleDateFormat defaultDateFormat;
        private SimpleDateFormat recentDateFormat;
        private boolean lenientFutureDates = false;
+       private boolean dateRollbackPermitted = true;
        
        
        /**
@@ -91,7 +93,7 @@
                            // slightly in the future to roll back a full year. 
 (Bug 35181)
                            now.add(Calendar.DATE, 1);
                        }    
-                       if (working.after(now)) {
+                       if (working.after(now) && isDateRollbackPermitted()) {
                                working.add(Calendar.YEAR, -1);
                        }
                } else {
@@ -244,6 +246,8 @@
                setServerTimeZone(config.getServerTimeZoneId());
                
                this.lenientFutureDates = config.isLenientFutureDates();
+               
+               this.dateRollbackPermitted = config.isDateRollbackPermitted();
        }
     /**
      * @return Returns the lenientFutureDates.
@@ -257,4 +261,19 @@
     void setLenientFutureDates(boolean lenientFutureDates) {
         this.lenientFutureDates = lenientFutureDates;
     }
+    
+    /**
+     * @returns the [EMAIL PROTECTED] #dateRollbackPermitted} property
+     */
+    boolean isDateRollbackPermitted() {
+               return dateRollbackPermitted;
+       }
+    
+    /**
+     * @see FTPClient#setDateRollbackPermitted(boolean)
+     * @param dateRollbackPermitted
+     */
+    void setDateRollbackPermitted(boolean dateRollbackPermitted) {
+               this.dateRollbackPermitted = dateRollbackPermitted;
+       }
 }

Modified: 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/io/CopyStreamException.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/io/CopyStreamException.java?view=diff&rev=543998&r1=543997&r2=543998
==============================================================================
--- 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/io/CopyStreamException.java
 (original)
+++ 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/main/java/org/apache/commons/net/io/CopyStreamException.java
 Sun Jun  3 14:44:08 2007
@@ -68,4 +68,12 @@
     {
         return ioException;
     }
+    
+    /**
+     * Returns the original [EMAIL PROTECTED] IOException}
+     */
+    @Override
+    public Throwable getCause() {
+       return getIOException();
+    }
 }

Modified: 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/site/xdoc/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/site/xdoc/changes.xml?view=diff&rev=543998&r1=543997&r2=543998
==============================================================================
--- 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/site/xdoc/changes.xml 
(original)
+++ 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/site/xdoc/changes.xml 
Sun Jun  3 14:44:08 2007
@@ -23,6 +23,14 @@
 
        <body>
                <release version="2.0" date="" description="Java 5.0 release">
+                       <action dev="rwinston" type="update" issue="NET-159">
+                               Add a setDateRollbackPermitted() method to 
disable rolling 
+                               back dates by 1 year when only short date 
format is 
+                               available, and server timstamp is ahead of 
local.
+                       </action>
+                       <action dev="rwinston" type="update" issue="NET-153">
+                               Add getCause() to CopyStreamException
+                       </action>
                        <action dev="rwinston" type="update" issue="NET-155">
                                Change NNTPClient/NewsgroupInfo article counts 
from int to long
                        </action>

Modified: 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/test/java/org/apache/commons/net/ftp/parser/FTPTimestampParserImplTest.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/FTPTimestampParserImplTest.java?view=diff&rev=543998&r1=543997&r2=543998
==============================================================================
--- 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/test/java/org/apache/commons/net/ftp/parser/FTPTimestampParserImplTest.java
 (original)
+++ 
jakarta/commons/proper/net/branches/JDK_1_5_BRANCH/src/test/java/org/apache/commons/net/ftp/parser/FTPTimestampParserImplTest.java
 Sun Jun  3 14:44:08 2007
@@ -158,6 +158,49 @@
        }
 
 
+       public void testParseWithoutDateRollback() {
+               FTPTimestampParserImpl parser = new FTPTimestampParserImpl();
+               
+               // Client calendar
+               Calendar now = Calendar.getInstance();
+               
+               // Server calendar - same TZ, +1 hour drift
+               Calendar working = Calendar.getInstance();
+               working.add(Calendar.HOUR_OF_DAY, 1);
+               
+               // Create a dummy timestamp
+               SimpleDateFormat formatter = new SimpleDateFormat("MMM d 
HH:mm");
+               String timestamp = formatter.format(working.getTime());
+               
+               Calendar server = null;
+               
+               try {
+                       server = parser.parseTimestamp(timestamp);
+               } catch (ParseException e) {
+                       e.printStackTrace();
+               }
+               
+               // As the server's clock is (client clock + 1 hour), the date 
should have rolled back
+               // by a full year
+               assertTrue( server.get(Calendar.YEAR) == now.get(Calendar.YEAR) 
- 1 );
+               
+               /* Now, we attempt to parse the same timestamp, but explicitly 
disallow */
+               /* date rollback                                                
                                                                */
+               
+               // Set property directly on parser (normally we would set it 
via the FTPClientConfig instance)
+               parser.setDateRollbackPermitted(false);
+       
+               try {
+                       server = parser.parseTimestamp(timestamp);
+               } catch (ParseException e) {
+                       e.printStackTrace();
+               }
+               
+               // The local and remote year value should be equal
+               assertTrue( server.get(Calendar.YEAR) == now.get(Calendar.YEAR) 
);
+       }
+       
+       
        public void testParser() {
                FTPTimestampParserImpl parser = new FTPTimestampParserImpl();
                try {



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

Reply via email to