Author: dlat
Date: Thu Dec  4 15:05:54 2008
New Revision: 723482

URL: http://svn.apache.org/viewvc?rev=723482&view=rev
Log:
FTPSERVER-231 MFMT Commad does not work on file/path names that have one or 
more white spaces
FTPSERVER-232 MFMT command always returns a 2XX reply even if the date could 
not be set
FTPSERVER-234 TYPE command with no argument

Modified:
    
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/MFMT.java
    
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/TYPE.java
    
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/nativefs/impl/NativeFtpFile.java
    
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/util/DateUtils.java
    
mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties
    
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/MFMTTest.java
    
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/LISTFileFormaterTest.java
    
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java
    
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/NLSTFileFormaterTest.java
    
mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpFile.java

Modified: 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/MFMT.java
URL: 
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/MFMT.java?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
--- 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/MFMT.java
 (original)
+++ 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/MFMT.java
 Thu Dec  4 15:05:54 2008
@@ -20,11 +20,8 @@
 package org.apache.ftpserver.command.impl;
 
 import java.io.IOException;
-import java.text.DateFormat;
 import java.text.ParseException;
-import java.text.SimpleDateFormat;
 import java.util.Date;
-import java.util.TimeZone;
 
 import org.apache.ftpserver.command.AbstractCommand;
 import org.apache.ftpserver.ftplet.FtpFile;
@@ -33,6 +30,7 @@
 import org.apache.ftpserver.impl.FtpIoSession;
 import org.apache.ftpserver.impl.FtpServerContext;
 import org.apache.ftpserver.impl.LocalizedFtpReply;
+import org.apache.ftpserver.util.DateUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -56,7 +54,6 @@
             final FtpServerContext context, final FtpRequest request)
             throws IOException {
 
-        DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
         
         // reset state variables
         session.resetState();
@@ -75,7 +72,7 @@
             return;
         }
         
-        String[] arguments = argument.split(" ");
+        String[] arguments = argument.split(" ",2);
 
         if(arguments.length != 2) {
             session
@@ -90,12 +87,10 @@
         }
        
         String timestamp = arguments[0].trim();
-        
-        df.setLenient(false);
-        df.setTimeZone(TimeZone.getTimeZone("GMT"));
-        
+       
         try {
-            Date time = df.parse(timestamp);
+            
+            Date time = DateUtils.parseFTPDate(timestamp);
             
             String fileName = arguments[1].trim();
             
@@ -133,9 +128,17 @@
                 return;
             }
 
+             // check if we can set date and retrieve the actual date stored 
for the file.
+             if (file.setLastModified(time.getTime())) {
+             //    timestamp=DateUtils.getFtpDate(time.getTime());
+             }
+             // we couldn't set the date.
+             else{
+                 session.write(LocalizedFtpReply.translate(session, request, 
context,
+                         FtpReply.REPLY_450_REQUESTED_FILE_ACTION_NOT_TAKEN, 
"MFMT",
+                         fileName));
+             }
             // all checks okay, lets go
-            file.setLastModified(time.getTime());
-
             session
             .write(LocalizedFtpReply
                     .translate(
@@ -143,7 +146,7 @@
                             request,
                             context,
                             FtpReply.REPLY_213_FILE_STATUS,
-                            "MFMT", "ModifyTime=" + timestamp + " " + 
fileName));
+                            "MFMT", "Modify=" + timestamp + "; " + fileName));
             return;
 
         } catch (ParseException e) {

Modified: 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/TYPE.java
URL: 
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/TYPE.java?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
--- 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/TYPE.java
 (original)
+++ 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/impl/TYPE.java
 Thu Dec  4 15:05:54 2008
@@ -59,6 +59,17 @@
         char type = 'A';
         if (request.hasArgument()) {
             type = request.getArgument().charAt(0);
+        }else{
+            // no type specified
+            session
+            .write(LocalizedFtpReply
+                    .translate(
+                            session,
+                            request,
+                            context,
+                            
FtpReply.REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS,
+                            "TYPE", null));
+            return;
         }
 
         // set type

Modified: 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/nativefs/impl/NativeFtpFile.java
URL: 
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/nativefs/impl/NativeFtpFile.java?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
--- 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/nativefs/impl/NativeFtpFile.java
 (original)
+++ 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/filesystem/nativefs/impl/NativeFtpFile.java
 Thu Dec  4 15:05:54 2008
@@ -189,8 +189,8 @@
     /**
      * [EMAIL PROTECTED]
      */
-    public void setLastModified(long time) {
-        file.setLastModified(time);
+    public boolean setLastModified(long time) {
+        return file.setLastModified(time);
     }
     
     /**

Modified: 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/util/DateUtils.java
URL: 
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/util/DateUtils.java?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
--- 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/util/DateUtils.java
 (original)
+++ 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/util/DateUtils.java
 Thu Dec  4 15:05:54 2008
@@ -19,8 +19,13 @@
 
 package org.apache.ftpserver.util;
 
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.Calendar;
+import java.util.Date;
 import java.util.GregorianCalendar;
+import java.util.TimeZone;
 
 /**
  * <strong>Internal class, do not use directly.</strong>
@@ -35,6 +40,18 @@
     private final static String[] MONTHS = { "Jan", "Feb", "Mar", "Apr", "May",
             "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
 
+    
+    /*
+     * Creates the DateFormat object used to parse/format
+     * dates in FTP format.
+     */
+    private  final static DateFormat createFTPDateFormat(){
+        DateFormat df=new SimpleDateFormat("yyyyMMddHHmmss");
+        df.setLenient(false);
+        df.setTimeZone(TimeZone.getTimeZone("GMT"));
+        return df;
+    }
+    
     /**
      * Get unix style date string.
      */
@@ -199,4 +216,15 @@
         sb.append(milli);
         return sb.toString();
     }
+    /*
+     *  Parses a date in the format used by the FTP commands 
+     *  involving dates(MFMT, MDTM)
+     */
+    public final static Date parseFTPDate(String dateStr) throws 
ParseException{
+       // TODO: Here we could use a single DateFormat (in a thread-safe way)  
+       //  instead of one per call 
+        return createFTPDateFormat().parse(dateStr);
+        
+    }
+    
 }

Modified: 
mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties
URL: 
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
--- 
mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties
 (original)
+++ 
mina/ftpserver/trunk/core/src/main/resources/org/apache/ftpserver/message/FtpStatus.properties
 Thu Dec  4 15:05:54 2008
@@ -277,5 +277,6 @@
 
 
 213.MFMT={output.msg}
+450.MFMT=Could not perform action on file {output.msg}.
 501.MFMT.invalid=Command Not Implemented for the Specified Arguments
 550.MFMT.filemissing=File missing {output.msg}
\ No newline at end of file

Modified: 
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/MFMTTest.java
URL: 
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/MFMTTest.java?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
--- 
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/MFMTTest.java
 (original)
+++ 
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/MFMTTest.java
 Thu Dec  4 15:05:54 2008
@@ -40,6 +40,8 @@
 
     private static final File TEST_FILE_IN_DIR1 = new File(TEST_DIR1,
             "test4.txt");
+    private static final File TEST_FILE_BLANK_SPACES=new File(ROOT_DIR,"my 
test.txt");
+    
 
     private static final Calendar EXPECTED_TIME = new GregorianCalendar(2002, 
6, 17, 21, 7, 15);        
     static {
@@ -53,11 +55,11 @@
         assertTrue(TEST_FILE1.createNewFile());
         assertTrue(TEST_DIR1.mkdir());
         assertTrue(TEST_FILE_IN_DIR1.createNewFile());
-        
+        assertTrue(TEST_FILE_BLANK_SPACES.createNewFile());
         
         client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
     }
-
+   
     public void testNoArgument() throws Exception {
         // must return 500 or 501 errors
         assertEquals(501, client.sendCommand("MFMT"));
@@ -69,8 +71,8 @@
     }
 
     public void testNoManyArguments() throws Exception {
-        // must return 500 or 501 errors
-        assertEquals(501, client.sendCommand("MFMT", "20020717210715 test1.txt 
too many"));
+        // must return 550 errors as a filename can contain blank spaces
+        assertEquals(550, client.sendCommand("MFMT", "20020717210715 test1.txt 
too many"));
     }
     
     public void testNonTimestampArgument() throws Exception {
@@ -127,5 +129,11 @@
         
         assertEquals(EXPECTED_TIME.getTimeInMillis(), 
TEST_FILE_IN_DIR1.lastModified());
     }
+    @SuppressWarnings("deprecation")
+    public void testSetTimeFileWithSpaces() throws Exception{
+        assertEquals(213, client.sendCommand("MFMT", "20020717210715 my 
test.txt"));
+        
+        
assertEquals(EXPECTED_TIME.getTimeInMillis(),TEST_FILE_BLANK_SPACES.lastModified());
+    }
     
 }

Modified: 
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/LISTFileFormaterTest.java
URL: 
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/LISTFileFormaterTest.java?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
--- 
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/LISTFileFormaterTest.java
 (original)
+++ 
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/LISTFileFormaterTest.java
 Thu Dec  4 15:05:54 2008
@@ -130,9 +130,8 @@
             return false;
         }
 
-        public void setLastModified(long time) {
-            // TODO Auto-generated method stub
-            
+        public boolean setLastModified(long time) {
+            return false;
         }
     }
 

Modified: 
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java
URL: 
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
--- 
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java
 (original)
+++ 
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/MLSTFileFormaterTest.java
 Thu Dec  4 15:05:54 2008
@@ -126,8 +126,8 @@
             return false;
         }
 
-        public void setLastModified(long time) {
-            // TODO Auto-generated method stub
+        public boolean setLastModified(long time) {
+           return false;
             
         }
     }

Modified: 
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/NLSTFileFormaterTest.java
URL: 
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/NLSTFileFormaterTest.java?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
--- 
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/NLSTFileFormaterTest.java
 (original)
+++ 
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/commands/impl/listing/NLSTFileFormaterTest.java
 Thu Dec  4 15:05:54 2008
@@ -122,8 +122,8 @@
             return false;
         }
 
-        public void setLastModified(long time) {
-            // TODO Auto-generated method stub
+        public boolean setLastModified(long time) {
+            return false;
             
         }
     }

Modified: 
mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpFile.java
URL: 
http://svn.apache.org/viewvc/mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpFile.java?rev=723482&r1=723481&r2=723482&view=diff
==============================================================================
--- 
mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpFile.java
 (original)
+++ 
mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpFile.java
 Thu Dec  4 15:05:54 2008
@@ -116,7 +116,7 @@
      * Set the last modified time stamp of a file
      * @param time The last modified time, in milliseconds since the epoch. 
See [EMAIL PROTECTED] File#setLastModified(long)}.
      */
-    void setLastModified(long time);
+    boolean setLastModified(long time);
     
     /**
      * Get file size.


Reply via email to