Fixing issue where we returned timestamps in the local time zone rather than UTC as required by the RFC (FTPSERVER-330)

git-svn-id: https://svn.apache.org/repos/asf/mina/ftpserver/trunk@818387 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/core/src/main/java/org/apache/ftpserver/util/DateUtils.java b/core/src/main/java/org/apache/ftpserver/util/DateUtils.java
index 76b3f33..e792eda 100644
--- a/core/src/main/java/org/apache/ftpserver/util/DateUtils.java
+++ b/core/src/main/java/org/apache/ftpserver/util/DateUtils.java
@@ -36,6 +36,8 @@
  */
 public class DateUtils {
 
+    private static final TimeZone TIME_ZONE_UTC = TimeZone.getTimeZone("UTC");
+
     private final static String[] MONTHS = { "Jan", "Feb", "Mar", "Apr", "May",
             "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
 
@@ -64,7 +66,7 @@
         }
 
         StringBuffer sb = new StringBuffer(16);
-        Calendar cal = new GregorianCalendar();
+        Calendar cal = new GregorianCalendar(TIME_ZONE_UTC);
         cal.setTimeInMillis(millis);
 
         // month
@@ -112,7 +114,7 @@
      */
     public final static String getISO8601Date(long millis) {
         StringBuffer sb = new StringBuffer(19);
-        Calendar cal = new GregorianCalendar();
+        Calendar cal = new GregorianCalendar(TIME_ZONE_UTC);
         cal.setTimeInMillis(millis);
 
         // year
@@ -166,8 +168,9 @@
      */
     public final static String getFtpDate(long millis) {
         StringBuffer sb = new StringBuffer(20);
-        Calendar cal = new GregorianCalendar();
+        Calendar cal = new GregorianCalendar(TIME_ZONE_UTC);
         cal.setTimeInMillis(millis);
+        
 
         // year
         sb.append(cal.get(Calendar.YEAR));
diff --git a/core/src/test/java/org/apache/ftpserver/clienttests/MDTMTest.java b/core/src/test/java/org/apache/ftpserver/clienttests/MDTMTest.java
index ac8aae8..53920ce 100644
--- a/core/src/test/java/org/apache/ftpserver/clienttests/MDTMTest.java
+++ b/core/src/test/java/org/apache/ftpserver/clienttests/MDTMTest.java
@@ -21,7 +21,9 @@
 
 import java.io.File;
 import java.text.SimpleDateFormat;
+import java.util.Calendar;
 import java.util.Date;
+import java.util.TimeZone;
 
 /**
 *
@@ -31,7 +33,10 @@
 public class MDTMTest extends ClientTestTemplate {
     private static final SimpleDateFormat FTP_DATE_FORMAT = new SimpleDateFormat(
             "yyyyMMddHHmmss.SSS");
-
+    static {
+        FTP_DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));
+    }
+    
     private static final File TEST_FILE1 = new File(ROOT_DIR, "test1.txt");
 
     private static final File TEST_DIR1 = new File(ROOT_DIR, "dir1");
@@ -51,11 +56,15 @@
         assertFalse(TEST_FILE1.exists());
         assertTrue(TEST_FILE1.createNewFile());
 
-        Date expected = new Date(TEST_FILE1.lastModified());
+        Calendar expected = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+        expected.clear();
+        expected.setTimeInMillis(TEST_FILE1.lastModified());
         assertEquals(213, client.sendCommand("MDTM " + TEST_FILE1.getName()));
 
-        Date actual = FTP_DATE_FORMAT.parse(client.getReplyString()
-                .substring(4).trim());
+        Calendar actual = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+        actual.clear();
+        actual.setTime(FTP_DATE_FORMAT.parse(client.getReplyString()
+                .substring(4).trim()));
         assertEquals(expected, actual);
     }
 
diff --git a/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java b/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java
index 606b5f2..a1afaad 100644
--- a/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java
+++ b/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java
@@ -22,8 +22,9 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.Date;
+import java.util.Calendar;
 import java.util.List;
+import java.util.TimeZone;
 
 import junit.framework.TestCase;
 
@@ -38,7 +39,11 @@
 @SuppressWarnings("deprecation")
 public class MLSTFileFormaterTest extends TestCase {
 
-    private static final Date LAST_MODIFIED_IN_2005 = new Date(105, 1, 2, 3, 4);
+    private static final Calendar LAST_MODIFIED_IN_2005 = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 
+    static {
+        LAST_MODIFIED_IN_2005.clear();
+        LAST_MODIFIED_IN_2005.set(2005, Calendar.JANUARY, 2, 3, 4, 5);
+    }
 
     private static final FtpFile TEST_FILE = new MockFileObject();
 
@@ -70,7 +75,7 @@
         }
 
         public long getLastModified() {
-            return LAST_MODIFIED_IN_2005.getTime();
+            return LAST_MODIFIED_IN_2005.getTimeInMillis();
         }
 
         public int getLinkCount() {
@@ -136,7 +141,8 @@
     }
 
     public void testSingleFile() {
-        assertEquals("Size=13;Modify=20050202030400.000;Type=file; short\r\n",
+        // time should be in UTC
+        assertEquals("Size=13;Modify=20050102030405.000;Type=file; short\r\n",
                 formater.format(TEST_FILE));
     }
 
@@ -156,8 +162,8 @@
 
         };
 
-        assertEquals("Size=0;Modify=20050202030400.000;Type=dir; short\r\n",
+        // time should be in UTC
+        assertEquals("Size=0;Modify=20050102030405.000;Type=dir; short\r\n",
                 formater.format(dir));
     }
-
 }
\ No newline at end of file
diff --git a/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpFile.java b/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpFile.java
index 6777bb1..c96432b 100644
--- a/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpFile.java
+++ b/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpFile.java
@@ -106,7 +106,7 @@
     int getLinkCount();
 
     /**
-     * Get last modified time.
+     * Get last modified time in UTC.
      * @return The timestamp of the last modified time for the {@link FtpFile}
      */
     long getLastModified();