You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by ng...@apache.org on 2008/08/15 22:41:19 UTC

svn commit: r686360 [1/2] - in /mina/ftpserver/trunk: core/src/main/java/org/apache/ftpserver/ core/src/main/java/org/apache/ftpserver/command/ core/src/main/java/org/apache/ftpserver/ftplet/ core/src/test/java/org/apache/ftpserver/ core/src/test/java/...

Author: ngn
Date: Fri Aug 15 13:41:18 2008
New Revision: 686360

URL: http://svn.apache.org/viewvc?rev=686360&view=rev
Log:
Generalized Ftplets, now support beforeCommand anf afterCommand (FTPSERVER-138 and FTPSERVER-82)
DefaultFtplet supports the same interface as the old Ftplet, users who previously implemented Ftplet can now extend DefaultFtplet

Added:
    mina/ftpserver/trunk/ftplet-api/src/test/java/org/apache/ftpserver/ftplet/Foo.java   (with props)
Modified:
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DefaultFtpHandler.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/APPE.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/DELE.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/MKD.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/PASS.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/RETR.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/RMD.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/RNTO.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/SITE.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/STOR.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/STOU.java
    mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftplet/DefaultFtpletContainer.java
    mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/DefaultFtpReplyTest.java
    mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/FeatTest.java
    mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/LoginTest.java
    mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetContainerTestTemplate.java
    mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetReturnDefaultTest.java
    mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetReturnDisconnectTest.java
    mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetReturnSkipTest.java
    mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/MockFtplet.java
    mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/MockFtpletCallback.java
    mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/DefaultFtplet.java
    mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpSession.java
    mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/Ftplet.java

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DefaultFtpHandler.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DefaultFtpHandler.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DefaultFtpHandler.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/DefaultFtpHandler.java Fri Aug 15 13:41:18 2008
@@ -23,6 +23,8 @@
 
 import org.apache.ftpserver.ftplet.FtpReply;
 import org.apache.ftpserver.ftplet.FtpRequest;
+import org.apache.ftpserver.ftplet.FtpletContainer;
+import org.apache.ftpserver.ftplet.FtpletEnum;
 import org.apache.ftpserver.interfaces.Command;
 import org.apache.ftpserver.interfaces.CommandFactory;
 import org.apache.ftpserver.interfaces.FtpIoSession;
@@ -38,6 +40,12 @@
 	
 	private final Logger LOG = LoggerFactory.getLogger(DefaultFtpHandler.class);
 	
+	private final static String[] NON_AUTHENTICATED_COMMANDS = new String[] {
+	        "USER",
+	        "PASS",
+	        "AUTH"
+	};
+	
 	private FtpServerContext context;
 	private Listener listener;
 	
@@ -76,21 +84,64 @@
     	session.closeOnFlush().awaitUninterruptibly(10000);
     }
 
+    private boolean isCommandOkWithoutAuthentication(String command) {
+        boolean okay = false;
+        for(String allowed : NON_AUTHENTICATED_COMMANDS) {
+            if(allowed.equals(command)) {
+                okay = true;
+                break;
+            }
+        }
+        return okay;
+    }
+    
     public void messageReceived( final FtpIoSession session, final FtpRequest request ) throws Exception {
         try {
             String commandName = request.getCommand();
             CommandFactory commandFactory = context.getCommandFactory();
             Command command = commandFactory.getCommand(commandName);
             
+            // make sure the user is authenticated before he issues commands
+            if(!session.isLoggedIn() && !isCommandOkWithoutAuthentication(commandName)) {
+                session.write(FtpReplyUtil.translate(session, request, context, FtpReply.REPLY_530_NOT_LOGGED_IN, "permission", null));
+                return;
+            }
             
-            if(command != null) {
-            	synchronized (session) {
-            		command.execute(session, context, request);
-				}
+            FtpletContainer ftplets = context.getFtpletContainer();
+            
+            FtpletEnum ftpletRet;
+            try {
+                ftpletRet = ftplets.beforeCommand(session.getFtpletSession(), request);
+            } catch(Exception e) {
+                LOG.debug("Ftplet container threw exception", e);
+                ftpletRet = FtpletEnum.RET_DISCONNECT;
+            }
+            if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
+                session.closeOnFlush().awaitUninterruptibly(10000);
+                return;
+            } else if(ftpletRet != FtpletEnum.RET_SKIP) {
+
+                if(command != null) {
+                	synchronized (session) {
+                		command.execute(session, context, request);
+    				}
+                }
+                else {
+                    session.write(FtpReplyUtil.translate(session, request, context, FtpReply.REPLY_502_COMMAND_NOT_IMPLEMENTED, "not.implemented", null));
+                }
             }
-            else {
-                session.write(FtpReplyUtil.translate(session, request, context, FtpReply.REPLY_502_COMMAND_NOT_IMPLEMENTED, "not.implemented", null));
+            
+            try {
+                ftpletRet = ftplets.afterCommand(session.getFtpletSession(), request);
+            } catch(Exception e) {
+                LOG.debug("Ftplet container threw exception", e);
+                ftpletRet = FtpletEnum.RET_DISCONNECT;
+            }
+            if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
+                session.closeOnFlush().awaitUninterruptibly(10000);
+                return;
             }
+
         }
         catch(Exception ex) {
             

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/APPE.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/APPE.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/APPE.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/APPE.java Fri Aug 15 13:41:18 2008
@@ -32,8 +32,6 @@
 import org.apache.ftpserver.ftplet.FtpException;
 import org.apache.ftpserver.ftplet.FtpReply;
 import org.apache.ftpserver.ftplet.FtpRequest;
-import org.apache.ftpserver.ftplet.Ftplet;
-import org.apache.ftpserver.ftplet.FtpletEnum;
 import org.apache.ftpserver.interfaces.FtpIoSession;
 import org.apache.ftpserver.interfaces.FtpServerContext;
 import org.apache.ftpserver.interfaces.ServerFtpStatistics;
@@ -86,23 +84,6 @@
                 }
             }
             
-            // call Ftplet.onAppendStart() method
-            Ftplet ftpletContainer = context.getFtpletContainer();
-            FtpletEnum ftpletRet;
-            try {
-                ftpletRet = ftpletContainer.onAppendStart(session.getFtpletSession(), request);
-            } catch(Exception e) {
-                LOG.debug("Ftplet container threw exception", e);
-                ftpletRet = FtpletEnum.RET_DISCONNECT;
-            }
-            if(ftpletRet == FtpletEnum.RET_SKIP) {
-                return;
-            }
-            else if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
-                session.closeOnFlush().awaitUninterruptibly(10000);
-                return;
-            }
-            
             // get filenames
             FileObject file = null;
             try {
@@ -183,20 +164,7 @@
             
             // if data transfer ok - send transfer complete message
             if(!failure) {
-                session.write(FtpReplyUtil.translate(session, request, context, FtpReply.REPLY_226_CLOSING_DATA_CONNECTION, "APPE", fileName));
-                
-                // call Ftplet.onAppendEnd() method
-                try {
-                    ftpletRet = ftpletContainer.onAppendEnd(session.getFtpletSession(), request);
-                } catch(Exception e) {
-                    LOG.debug("Ftplet container threw exception", e);
-                    ftpletRet = FtpletEnum.RET_DISCONNECT;
-                }
-                if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
-                    session.closeOnFlush().awaitUninterruptibly(10000);
-                    return;
-                }
-
+                session.write(FtpReplyUtil.translate(session, request, context, FtpReply.REPLY_226_CLOSING_DATA_CONNECTION, "APPE", fileName));                
             }
         }
         finally {

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/DELE.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/DELE.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/DELE.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/DELE.java Fri Aug 15 13:41:18 2008
@@ -25,8 +25,6 @@
 import org.apache.ftpserver.ftplet.FtpException;
 import org.apache.ftpserver.ftplet.FtpReply;
 import org.apache.ftpserver.ftplet.FtpRequest;
-import org.apache.ftpserver.ftplet.Ftplet;
-import org.apache.ftpserver.ftplet.FtpletEnum;
 import org.apache.ftpserver.interfaces.FtpIoSession;
 import org.apache.ftpserver.interfaces.FtpServerContext;
 import org.apache.ftpserver.interfaces.ServerFtpStatistics;
@@ -62,24 +60,6 @@
             return;  
         }
         
-        // call Ftplet.onDeleteStart() method
-        Ftplet ftpletContainer = context.getFtpletContainer();
-        FtpletEnum ftpletRet;
-        try {
-            ftpletRet = ftpletContainer.onDeleteStart(session.getFtpletSession(), request);
-        } catch(Exception e) {
-            LOG.debug("Ftplet container threw exception", e);
-            ftpletRet = FtpletEnum.RET_DISCONNECT;
-        }
-        if(ftpletRet == FtpletEnum.RET_SKIP) {
-        	session.write(FtpReplyUtil.translate(session, request, context, FtpReply.REPLY_450_REQUESTED_FILE_ACTION_NOT_TAKEN, "DELE", fileName));
-            return;
-        }
-        else if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
-            session.closeOnFlush().awaitUninterruptibly(10000);
-            return;
-        }
-
         // get file object
         FileObject file = null;
         
@@ -114,21 +94,7 @@
             // notify statistics object
             ServerFtpStatistics ftpStat = (ServerFtpStatistics)context.getFtpStatistics();
             ftpStat.setDelete(session, file);
-            
-            // call Ftplet.onDeleteEnd() method
-            try{
-                ftpletRet = ftpletContainer.onDeleteEnd(session.getFtpletSession(), request);
-            } catch(Exception e) {
-                LOG.debug("Ftplet container threw exception", e);
-                ftpletRet = FtpletEnum.RET_DISCONNECT;
-            }
-            if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
-                session.closeOnFlush().awaitUninterruptibly(10000);
-                return;
-            }
-
-        }
-        else {
+        } else {
             session.write(FtpReplyUtil.translate(session, request, context, FtpReply.REPLY_450_REQUESTED_FILE_ACTION_NOT_TAKEN, "DELE", fileName));
         }
     }

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/MKD.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/MKD.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/MKD.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/MKD.java Fri Aug 15 13:41:18 2008
@@ -26,8 +26,6 @@
 import org.apache.ftpserver.ftplet.FtpException;
 import org.apache.ftpserver.ftplet.FtpReply;
 import org.apache.ftpserver.ftplet.FtpRequest;
-import org.apache.ftpserver.ftplet.Ftplet;
-import org.apache.ftpserver.ftplet.FtpletEnum;
 import org.apache.ftpserver.interfaces.FtpIoSession;
 import org.apache.ftpserver.interfaces.FtpServerContext;
 import org.apache.ftpserver.interfaces.ServerFtpStatistics;
@@ -64,24 +62,7 @@
             session.write(FtpReplyUtil.translate(session, request, context, FtpReply.REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS, "MKD", null));
             return;  	
         }
-        
-        // call Ftplet.onMkdirStart() method
-        Ftplet ftpletContainer = context.getFtpletContainer();
-        FtpletEnum ftpletRet;
-        try{
-            ftpletRet = ftpletContainer.onMkdirStart(session.getFtpletSession(), request);
-        } catch(Exception e) {
-            LOG.debug("Ftplet container threw exception", e);
-            ftpletRet = FtpletEnum.RET_DISCONNECT;
-        }
-        if(ftpletRet == FtpletEnum.RET_SKIP) {
-            return;
-        }
-        else if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
-            session.closeOnFlush().awaitUninterruptibly(10000);
-            return;
-        }
-        
+                
         // get file object
         FileObject file = null;
         try {
@@ -120,20 +101,7 @@
             ServerFtpStatistics ftpStat = (ServerFtpStatistics)context.getFtpStatistics();
             ftpStat.setMkdir(session, file);
             
-            // call Ftplet.onMkdirEnd() method
-            try{
-                ftpletRet = ftpletContainer.onMkdirEnd(session.getFtpletSession(), request);
-            } catch(Exception e) {
-                LOG.debug("Ftplet container threw exception", e);
-                ftpletRet = FtpletEnum.RET_DISCONNECT;
-            }
-            if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
-                session.closeOnFlush().awaitUninterruptibly(10000);
-                return;
-            }
-
-        }
-        else {
+        } else {
             session.write(FtpReplyUtil.translate(session, request, context, FtpReply.REPLY_550_REQUESTED_ACTION_NOT_TAKEN, "MKD", fileName));
         }
     }

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/PASS.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/PASS.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/PASS.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/PASS.java Fri Aug 15 13:41:18 2008
@@ -29,8 +29,6 @@
 import org.apache.ftpserver.ftplet.FtpException;
 import org.apache.ftpserver.ftplet.FtpReply;
 import org.apache.ftpserver.ftplet.FtpRequest;
-import org.apache.ftpserver.ftplet.Ftplet;
-import org.apache.ftpserver.ftplet.FtpletEnum;
 import org.apache.ftpserver.ftplet.User;
 import org.apache.ftpserver.ftplet.UserManager;
 import org.apache.ftpserver.interfaces.FtpIoSession;
@@ -129,6 +127,7 @@
                 else {
                     auth = new UsernamePasswordAuthentication(userName, password, userMetadata);
                 }
+
                 authenticatedUser = userManager.authenticate(auth);
             } catch(AuthenticationFailedException e) { 
                 authenticatedUser = null;
@@ -139,8 +138,6 @@
                 LOG.warn("PASS.execute()", e);
             }
 
-            // set the user so that the Ftplets will be able to verify it
-            
             // first save old values so that we can reset them if Ftplets
             // tell us to fail
             User oldUser = session.getUser();
@@ -156,24 +153,6 @@
                 session.setUser(null);
             }
             
-            // call Ftplet.onLogin() method
-            Ftplet ftpletContainer = context.getFtpletContainer();
-            if(ftpletContainer != null) {
-                FtpletEnum ftpletRet;
-                try{
-                    ftpletRet = ftpletContainer.onLogin(session.getFtpletSession(), request);
-                } catch(Exception e) {
-                    LOG.debug("Ftplet container threw exception", e);
-                    ftpletRet = FtpletEnum.RET_DISCONNECT;
-                }
-                if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
-                    session.closeOnFlush().awaitUninterruptibly(10000);
-                    return;
-                } else if(ftpletRet == FtpletEnum.RET_SKIP) {
-                    success = false;
-                }
-            }
-            
             if(!success) {
                 // reset due to failure
                 session.setUser(oldUser);

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/RETR.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/RETR.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/RETR.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/RETR.java Fri Aug 15 13:41:18 2008
@@ -34,8 +34,6 @@
 import org.apache.ftpserver.ftplet.FtpException;
 import org.apache.ftpserver.ftplet.FtpReply;
 import org.apache.ftpserver.ftplet.FtpRequest;
-import org.apache.ftpserver.ftplet.Ftplet;
-import org.apache.ftpserver.ftplet.FtpletEnum;
 import org.apache.ftpserver.interfaces.FtpIoSession;
 import org.apache.ftpserver.interfaces.FtpServerContext;
 import org.apache.ftpserver.interfaces.ServerFtpStatistics;
@@ -76,23 +74,6 @@
                 return;  
             }
     
-            // call Ftplet.onDownloadStart() method
-            Ftplet ftpletContainer = context.getFtpletContainer();
-            FtpletEnum ftpletRet;
-            try {
-                ftpletRet = ftpletContainer.onDownloadStart(session.getFtpletSession(), request);
-            } catch(Exception e) {
-                LOG.debug("Ftplet container threw exception", e);
-                ftpletRet = FtpletEnum.RET_DISCONNECT;
-            }
-            if(ftpletRet == FtpletEnum.RET_SKIP) {
-                return;
-            }
-            else if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
-                session.closeOnFlush().awaitUninterruptibly(10000);
-                return;
-            }
-            
             // get file object
             FileObject file = null;
             try {
@@ -188,21 +169,8 @@
             if(!failure) {
                 session.write(FtpReplyUtil.translate(session, request, context, FtpReply.REPLY_226_CLOSING_DATA_CONNECTION, "RETR", fileName));
                 
-                // call Ftplet.onDownloadEnd() method
-                try {
-                    ftpletRet = ftpletContainer.onDownloadEnd(session.getFtpletSession(), request);
-                } catch(Exception e) {
-                    LOG.debug("Ftplet container threw exception", e);
-                    ftpletRet = FtpletEnum.RET_DISCONNECT;
-                }
-                if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
-                    session.closeOnFlush().awaitUninterruptibly(10000);
-                    return;
-                }
-
             }
-        }
-        finally {
+        } finally {
             session.resetState();
             session.getDataConnection().closeDataConnection();
         }

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/RMD.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/RMD.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/RMD.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/RMD.java Fri Aug 15 13:41:18 2008
@@ -25,8 +25,6 @@
 import org.apache.ftpserver.ftplet.FtpException;
 import org.apache.ftpserver.ftplet.FtpReply;
 import org.apache.ftpserver.ftplet.FtpRequest;
-import org.apache.ftpserver.ftplet.Ftplet;
-import org.apache.ftpserver.ftplet.FtpletEnum;
 import org.apache.ftpserver.interfaces.FtpIoSession;
 import org.apache.ftpserver.interfaces.FtpServerContext;
 import org.apache.ftpserver.interfaces.ServerFtpStatistics;
@@ -64,23 +62,6 @@
             return;  
         }
         
-        // call Ftplet.onRmdirStart() method
-        Ftplet ftpletContainer = context.getFtpletContainer();
-        FtpletEnum ftpletRet;
-        try{
-            ftpletRet = ftpletContainer.onRmdirStart(session.getFtpletSession(), request);
-        } catch(Exception e) {
-            LOG.debug("Ftplet container threw exception", e);
-            ftpletRet = FtpletEnum.RET_DISCONNECT;
-        }
-        if(ftpletRet == FtpletEnum.RET_SKIP) {
-            return;
-        }
-        else if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
-            session.closeOnFlush().awaitUninterruptibly(10000);
-            return;
-        }
-        
         // get file object
         FileObject file = null;
         try {
@@ -119,20 +100,7 @@
             ServerFtpStatistics ftpStat = (ServerFtpStatistics)context.getFtpStatistics();
             ftpStat.setRmdir(session, file);
             
-            // call Ftplet.onRmdirEnd() method
-            try{
-                ftpletRet = ftpletContainer.onRmdirEnd(session.getFtpletSession(), request);
-            } catch(Exception e) {
-                LOG.debug("Ftplet container threw exception", e);
-                ftpletRet = FtpletEnum.RET_DISCONNECT;
-            }
-            if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
-                session.closeOnFlush().awaitUninterruptibly(10000);
-                return;
-            }
-
-        }
-        else {
+        } else {
             session.write(FtpReplyUtil.translate(session, request, context, FtpReply.REPLY_450_REQUESTED_FILE_ACTION_NOT_TAKEN, "RMD", fileName));
         }
     }

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/RNTO.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/RNTO.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/RNTO.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/RNTO.java Fri Aug 15 13:41:18 2008
@@ -25,8 +25,6 @@
 import org.apache.ftpserver.ftplet.FtpException;
 import org.apache.ftpserver.ftplet.FtpReply;
 import org.apache.ftpserver.ftplet.FtpRequest;
-import org.apache.ftpserver.ftplet.Ftplet;
-import org.apache.ftpserver.ftplet.FtpletEnum;
 import org.apache.ftpserver.interfaces.FtpIoSession;
 import org.apache.ftpserver.interfaces.FtpServerContext;
 import org.apache.ftpserver.util.FtpReplyUtil;
@@ -61,23 +59,6 @@
                 return;  
             }
             
-            // call Ftplet.onRenameStart() method
-            Ftplet ftpletContainer = context.getFtpletContainer();
-            FtpletEnum ftpletRet;
-            try {
-                ftpletRet = ftpletContainer.onRenameStart(session.getFtpletSession(), request);
-            } catch(Exception e) {
-                LOG.debug("Ftplet container threw exception", e);
-                ftpletRet = FtpletEnum.RET_DISCONNECT;
-            }
-            if(ftpletRet == FtpletEnum.RET_SKIP) {
-                return;
-            }
-            else if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
-                session.closeOnFlush().awaitUninterruptibly(10000);
-                return;
-            }
-            
             // get the "rename from" file object
             FileObject frFile = session.getRenameFrom();
             if( frFile == null ) {
@@ -118,24 +99,11 @@
                 LOG.info("File rename (" + session.getUser().getName() + ") " 
                                          + frFile.getFullName() + " -> " + toFile.getFullName());
                 
-                // call Ftplet.onRenameEnd() method
-                try {
-                    ftpletRet = ftpletContainer.onRenameEnd(session.getFtpletSession(), request);
-                } catch(Exception e) {
-                    LOG.debug("Ftplet container threw exception", e);
-                    ftpletRet = FtpletEnum.RET_DISCONNECT;
-                }
-                if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
-                    session.closeOnFlush().awaitUninterruptibly(10000);
-                    return;
-                }
-            }
-            else {
+            } else {
                 session.write(FtpReplyUtil.translate(session, request, context, FtpReply.REPLY_553_REQUESTED_ACTION_NOT_TAKEN_FILE_NAME_NOT_ALLOWED, "RNTO", toFileStr));
             }
         
-        }
-        finally {
+        } finally {
             session.resetState(); 
         }
     } 

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/SITE.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/SITE.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/SITE.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/SITE.java Fri Aug 15 13:41:18 2008
@@ -25,8 +25,6 @@
 import org.apache.ftpserver.ftplet.FtpException;
 import org.apache.ftpserver.ftplet.FtpReply;
 import org.apache.ftpserver.ftplet.FtpRequest;
-import org.apache.ftpserver.ftplet.Ftplet;
-import org.apache.ftpserver.ftplet.FtpletEnum;
 import org.apache.ftpserver.interfaces.Command;
 import org.apache.ftpserver.interfaces.FtpIoSession;
 import org.apache.ftpserver.interfaces.FtpServerContext;
@@ -53,23 +51,6 @@
             final FtpServerContext context,
             final FtpRequest request) throws IOException, FtpException {
         
-        // call Ftplet.onSite method
-        Ftplet ftpletContainer = context.getFtpletContainer();
-        FtpletEnum ftpletRet;
-        try {
-            ftpletRet = ftpletContainer.onSite(session.getFtpletSession(), request);
-        } catch(Exception e) {
-            LOG.debug("Ftplet container threw exception", e);
-            ftpletRet = FtpletEnum.RET_DISCONNECT;
-        }
-        if(ftpletRet == FtpletEnum.RET_SKIP) {
-            return;
-        }
-        else if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
-            session.closeOnFlush().awaitUninterruptibly(10000);
-            return;
-        }
-        
         // get request name
         String argument = request.getArgument();
         if(argument != null) {

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/STOR.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/STOR.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/STOR.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/STOR.java Fri Aug 15 13:41:18 2008
@@ -32,8 +32,6 @@
 import org.apache.ftpserver.ftplet.FtpException;
 import org.apache.ftpserver.ftplet.FtpReply;
 import org.apache.ftpserver.ftplet.FtpRequest;
-import org.apache.ftpserver.ftplet.Ftplet;
-import org.apache.ftpserver.ftplet.FtpletEnum;
 import org.apache.ftpserver.interfaces.FtpIoSession;
 import org.apache.ftpserver.interfaces.FtpServerContext;
 import org.apache.ftpserver.interfaces.ServerFtpStatistics;
@@ -87,23 +85,6 @@
                 }
             }
             
-            // call Ftplet.onUploadStart() method
-            Ftplet ftpletContainer = context.getFtpletContainer();
-            FtpletEnum ftpletRet;
-            try {
-                ftpletRet = ftpletContainer.onUploadStart(session.getFtpletSession(), request);
-            } catch(Exception e) {
-                LOG.debug("Ftplet container threw exception", e);
-                ftpletRet = FtpletEnum.RET_DISCONNECT;
-            }
-            if(ftpletRet == FtpletEnum.RET_SKIP) {
-                return;
-            }
-            else if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
-                session.closeOnFlush().awaitUninterruptibly(10000);
-                return;
-            }
-            
             // get filename
             FileObject file = null;
             try {
@@ -169,18 +150,6 @@
             if(!failure) {
                 session.write(FtpReplyUtil.translate(session, request, context, FtpReply.REPLY_226_CLOSING_DATA_CONNECTION, "STOR", fileName));
                 
-                // call Ftplet.onUploadEnd() method
-                try {
-                    ftpletRet = ftpletContainer.onUploadEnd(session.getFtpletSession(), request);
-                } catch(Exception e) {
-                    LOG.debug("Ftplet container threw exception", e);
-                    ftpletRet = FtpletEnum.RET_DISCONNECT;
-                }
-                if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
-                    session.closeOnFlush().awaitUninterruptibly(10000);
-                    return;
-                }
-
             }
         }
         finally {

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/STOU.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/STOU.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/STOU.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/command/STOU.java Fri Aug 15 13:41:18 2008
@@ -33,8 +33,6 @@
 import org.apache.ftpserver.ftplet.FtpException;
 import org.apache.ftpserver.ftplet.FtpReply;
 import org.apache.ftpserver.ftplet.FtpRequest;
-import org.apache.ftpserver.ftplet.Ftplet;
-import org.apache.ftpserver.ftplet.FtpletEnum;
 import org.apache.ftpserver.interfaces.FtpIoSession;
 import org.apache.ftpserver.interfaces.FtpServerContext;
 import org.apache.ftpserver.interfaces.ServerFtpStatistics;
@@ -77,23 +75,6 @@
             // reset state variables
             session.resetState();
             
-            // call Ftplet.onUploadUniqueStart() method
-            Ftplet ftpletContainer = context.getFtpletContainer();
-            FtpletEnum ftpletRet;
-            try {
-                ftpletRet = ftpletContainer.onUploadUniqueStart(session.getFtpletSession(), request);
-            } catch(Exception e) {
-                LOG.debug("Ftplet container threw exception", e);
-                ftpletRet = FtpletEnum.RET_DISCONNECT;
-            }
-            if(ftpletRet == FtpletEnum.RET_SKIP) {
-                return;
-            }
-            else if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
-                session.closeOnFlush().awaitUninterruptibly(10000);
-                return;
-            }
-            
             String pathName = request.getArgument();
             
             // get filenames
@@ -184,21 +165,8 @@
             if(!failure) {
                 session.write(FtpReplyUtil.translate(session, request, context, FtpReply.REPLY_226_CLOSING_DATA_CONNECTION, "STOU", fileName));
                 
-                // call Ftplet.onUploadUniqueEnd() method
-                try {
-                    ftpletRet = ftpletContainer.onUploadUniqueEnd(session.getFtpletSession(), request);
-                } catch(Exception e) {
-                    LOG.debug("Ftplet container threw exception", e);
-                    ftpletRet = FtpletEnum.RET_DISCONNECT;
-                }
-                if(ftpletRet == FtpletEnum.RET_DISCONNECT) {
-                    session.closeOnFlush().awaitUninterruptibly(10000);
-                    return;
-                }
-
             }
-        }
-        finally {
+        } finally {
             session.getDataConnection().closeDataConnection();
         }
         

Modified: mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftplet/DefaultFtpletContainer.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftplet/DefaultFtpletContainer.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftplet/DefaultFtpletContainer.java (original)
+++ mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftplet/DefaultFtpletContainer.java Fri Aug 15 13:41:18 2008
@@ -78,302 +78,41 @@
        
         return ftplets.get(name);
     }
-    
-    /**
-     * Destroy all ftplets.
-     */
-    public void destroy() {
-        dispose();
-    }
-    
-    /**
-     * Call ftplet onConnect.
-     */
-    public FtpletEnum onConnect(FtpSession session) throws FtpException, IOException {
-        FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
-        for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
-            retVal = entry.getValue().onConnect(session);
-            if(retVal == null) {
-                retVal = FtpletEnum.RET_DEFAULT;
-            }
-            
-            // proceed only if the return value is FtpletEnum.RET_DEFAULT
-            if(retVal != FtpletEnum.RET_DEFAULT) {
-                break;
-            }
-        }
-        return retVal;
-    }
-
-    /**
-     * Call ftplet onDisconnect.
-     */
-    public FtpletEnum onDisconnect(FtpSession session) throws FtpException, IOException {
-        FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
-        for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
-
-            retVal = entry.getValue().onDisconnect(session);
-            if(retVal == null) {
-                retVal = FtpletEnum.RET_DEFAULT;
-            }
-            
-            // proceed only if the return value is FtpletEnum.RET_DEFAULT
-            if(retVal != FtpletEnum.RET_DEFAULT) {
-                break;
-            }
-        }
-        return retVal;
-    }
-    
-    /**
-     * Call ftplet onLogin.
-     */
-    public FtpletEnum onLogin(FtpSession session, FtpRequest request) throws FtpException, IOException {
-        FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
-        for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
 
-            retVal = entry.getValue().onLogin(session, request);
-            if(retVal == null) {
-                retVal = FtpletEnum.RET_DEFAULT;
-            }
-            
-            // proceed only if the return value is FtpletEnum.RET_DEFAULT
-            if(retVal != FtpletEnum.RET_DEFAULT) {
-                break;
-            }
-        }
-        return retVal;
-    }
-
-    /** 
-     * Call ftplet onDeleteStart.
-     */
-    public FtpletEnum onDeleteStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
-        FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
-        for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
-
-            retVal = entry.getValue().onDeleteStart(session, request);
-            if(retVal == null) {
-                retVal = FtpletEnum.RET_DEFAULT;
-            }
-            
-            // proceed only if the return value is FtpletEnum.RET_DEFAULT
-            if(retVal != FtpletEnum.RET_DEFAULT) {
-                break;
-            }
-        }
-        return retVal;
-    }
-
-    
-    /**
-     * Call ftplet onDeleteEnd.
-     */
-    public FtpletEnum onDeleteEnd(FtpSession session, FtpRequest request) throws FtpException, IOException {
-        FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
-        for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
-
-            retVal = entry.getValue().onDeleteEnd(session, request);
-            if(retVal == null) {
-                retVal = FtpletEnum.RET_DEFAULT;
-            }
-            
-            // proceed only if the return value is FtpletEnum.RET_DEFAULT
-            if(retVal != FtpletEnum.RET_DEFAULT) {
-                break;
-            }
-        }
-        return retVal;
-    }
-
-    /**
-     * Call ftplet onUploadStart.
-     */
-    public FtpletEnum onUploadStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
-        FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
-        for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
-
-            retVal = entry.getValue().onUploadStart(session, request);
-            if(retVal == null) {
-                retVal = FtpletEnum.RET_DEFAULT;
-            }
-            
-            // proceed only if the return value is FtpletEnum.RET_DEFAULT
-            if(retVal != FtpletEnum.RET_DEFAULT) {
-                break;
-            }
-        }
-        return retVal;
-    }
-
-    /**
-     * Call ftplet onUploadEnd.
-     */
-    public FtpletEnum onUploadEnd(FtpSession session, FtpRequest request) throws FtpException, IOException {
-        FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
-        for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
-
-            retVal = entry.getValue().onUploadEnd(session, request);
-            if(retVal == null) {
-                retVal = FtpletEnum.RET_DEFAULT;
-            }
-            
-            // proceed only if the return value is FtpletEnum.RET_DEFAULT
-            if(retVal != FtpletEnum.RET_DEFAULT) {
-                break;
-            }
-        }
-        return retVal;
-    }
-
-    /**
-     * Call ftplet onDownloadStart.
-     */
-    public FtpletEnum onDownloadStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
-        FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
-        for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
-
-            retVal = entry.getValue().onDownloadStart(session, request);
-            if(retVal == null) {
-                retVal = FtpletEnum.RET_DEFAULT;
-            }
-            
-            // proceed only if the return value is FtpletEnum.RET_DEFAULT
-            if(retVal != FtpletEnum.RET_DEFAULT) {
-                break;
-            }
-        }
-        return retVal;
-    }
-
-    /**
-     * Call ftplet onDownloadEnd.
-     */
-    public FtpletEnum onDownloadEnd(FtpSession session, FtpRequest request) throws FtpException, IOException {
-        FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
-        for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
-
-            retVal = entry.getValue().onDownloadEnd(session, request);
-            if(retVal == null) {
-                retVal = FtpletEnum.RET_DEFAULT;
-            }
-            
-            // proceed only if the return value is FtpletEnum.RET_DEFAULT
-            if(retVal != FtpletEnum.RET_DEFAULT) {
-                break;
-            }
-        }
-        return retVal;
-    }
-
-    /**
-     * Call ftplet onRmdirStart.
-     */
-    public FtpletEnum onRmdirStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
-        FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
-        for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
-
-            retVal = entry.getValue().onRmdirStart(session, request);
-            if(retVal == null) {
-                retVal = FtpletEnum.RET_DEFAULT;
-            }
-            
-            // proceed only if the return value is FtpletEnum.RET_DEFAULT
-            if(retVal != FtpletEnum.RET_DEFAULT) {
-                break;
-            }
-        }
-        return retVal;
+    public void init(FtpletContext ftpletContext) throws FtpException {
+        // dummy, forced by Ftplet API       
     }
 
     /**
-     * Call ftplet onRmdirEnd.
+     * @see FtpletContainer#getFtplets()
      */
-    public FtpletEnum onRmdirEnd(FtpSession session, FtpRequest request) throws FtpException, IOException {
-        FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
-        for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
-
-            retVal = entry.getValue().onRmdirEnd(session, request);
-            if(retVal == null) {
-                retVal = FtpletEnum.RET_DEFAULT;
-            }
-            
-            // proceed only if the return value is FtpletEnum.RET_DEFAULT
-            if(retVal != FtpletEnum.RET_DEFAULT) {
-                break;
-            }
-        }
-        return retVal;
+    public Map<String, Ftplet> getFtplets() {
+        return ftplets;
     }
 
     /**
-     * Call ftplet onMkdirStart.
+     * @see FtpletContainer#setFtplets(Map)
      */
-    public FtpletEnum onMkdirStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
-        FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
-        for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
-
-            retVal = entry.getValue().onMkdirStart(session, request);
-            if(retVal == null) {
-                retVal = FtpletEnum.RET_DEFAULT;
-            }
-            
-            // proceed only if the return value is FtpletEnum.RET_DEFAULT
-            if(retVal != FtpletEnum.RET_DEFAULT) {
-                break;
-            }
-        }
-        return retVal;
+    public void setFtplets(Map<String, Ftplet> ftplets) {
+        this.ftplets = ftplets;
     }
 
-    /** 
-     * Call ftplet onMkdirEnd.
-     */
-    public FtpletEnum onMkdirEnd(FtpSession session, FtpRequest request) throws FtpException, IOException {
-        FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
-        for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
 
-            retVal = entry.getValue().onMkdirEnd(session, request);
-            if(retVal == null) {
-                retVal = FtpletEnum.RET_DEFAULT;
-            }
-            
-            // proceed only if the return value is FtpletEnum.RET_DEFAULT
-            if(retVal != FtpletEnum.RET_DEFAULT) {
-                break;
-            }
-        }
-        return retVal;
-    }
     
     /**
-     * Call ftplet onAppendStart.
+     * Destroy all ftplets.
      */
-    public FtpletEnum onAppendStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
-        FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
-        for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
-
-            retVal = entry.getValue().onAppendStart(session, request);
-            if(retVal == null) {
-                retVal = FtpletEnum.RET_DEFAULT;
-            }
-            
-            // proceed only if the return value is FtpletEnum.RET_DEFAULT
-            if(retVal != FtpletEnum.RET_DEFAULT) {
-                break;
-            }
-        }
-        return retVal;
+    public void destroy() {
+        dispose();
     }
-
+    
     /**
-     * Call ftplet onAppendEnd.
+     * Call ftplet onConnect.
      */
-    public FtpletEnum onAppendEnd(FtpSession session, FtpRequest request) throws FtpException, IOException {
+    public FtpletEnum onConnect(FtpSession session) throws FtpException, IOException {
         FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
         for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
-
-            retVal = entry.getValue().onAppendEnd(session, request);
+            retVal = entry.getValue().onConnect(session);
             if(retVal == null) {
                 retVal = FtpletEnum.RET_DEFAULT;
             }
@@ -387,13 +126,13 @@
     }
 
     /**
-     * Call ftplet onUploadUniqueStart.
+     * Call ftplet onDisconnect.
      */
-    public FtpletEnum onUploadUniqueStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
+    public FtpletEnum onDisconnect(FtpSession session) throws FtpException, IOException {
         FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
         for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
 
-            retVal = entry.getValue().onUploadUniqueStart(session, request);
+            retVal = entry.getValue().onDisconnect(session);
             if(retVal == null) {
                 retVal = FtpletEnum.RET_DEFAULT;
             }
@@ -406,34 +145,12 @@
         return retVal;
     }
     
-    /**
-     * Call ftplet onUploadUniqueEnd.
-     */
-    public FtpletEnum onUploadUniqueEnd(FtpSession session, FtpRequest request) throws FtpException, IOException {
-        FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
-        for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
 
-            retVal = entry.getValue().onUploadUniqueEnd(session, request);
-            if(retVal == null) {
-                retVal = FtpletEnum.RET_DEFAULT;
-            }
-            
-            // proceed only if the return value is FtpletEnum.RET_DEFAULT
-            if(retVal != FtpletEnum.RET_DEFAULT) {
-                break;
-            }
-        }
-        return retVal;
-    }
-
-    /**
-     * Call ftplet onRenameStart.
-     */
-    public FtpletEnum onRenameStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
+    public FtpletEnum afterCommand(FtpSession session, FtpRequest request) throws FtpException, IOException {
         FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
         for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
 
-            retVal = entry.getValue().onRenameStart(session, request);
+            retVal = entry.getValue().afterCommand(session, request);
             if(retVal == null) {
                 retVal = FtpletEnum.RET_DEFAULT;
             }
@@ -443,37 +160,14 @@
                 break;
             }
         }
-        return retVal;
+        return retVal;    
     }
-    
-    /**
-     * Call ftplet onRenameEnd.
-     */
-    public FtpletEnum onRenameEnd(FtpSession session, FtpRequest request) throws FtpException, IOException {
-        FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
-        for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
 
-            retVal = entry.getValue().onRenameEnd(session, request);
-            if(retVal == null) {
-                retVal = FtpletEnum.RET_DEFAULT;
-            }
-            
-            // proceed only if the return value is FtpletEnum.RET_DEFAULT
-            if(retVal != FtpletEnum.RET_DEFAULT) {
-                break;
-            }
-        }
-        return retVal;
-    }
-    
-    /**
-     * Call ftplet onSite.
-     */
-    public FtpletEnum onSite(FtpSession session, FtpRequest request) throws FtpException, IOException {
+    public FtpletEnum beforeCommand(FtpSession session, FtpRequest request) throws FtpException, IOException {
         FtpletEnum retVal = FtpletEnum.RET_DEFAULT;
         for(Entry<String, Ftplet> entry : ftplets.entrySet()) {
 
-            retVal = entry.getValue().onSite(session, request);
+            retVal = entry.getValue().beforeCommand(session, request);
             if(retVal == null) {
                 retVal = FtpletEnum.RET_DEFAULT;
             }
@@ -486,23 +180,5 @@
         return retVal;
     }
 
-    public void init(FtpletContext ftpletContext) throws FtpException {
-        // dummy, forced by Ftplet API       
-    }
-
-    /**
-     * @see FtpletContainer#getFtplets()
-     */
-    public Map<String, Ftplet> getFtplets() {
-        return ftplets;
-    }
-
-    /**
-     * @see FtpletContainer#setFtplets(Map)
-     */
-    public void setFtplets(Map<String, Ftplet> ftplets) {
-        this.ftplets = ftplets;
-    }
-
 
 }

Modified: mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/DefaultFtpReplyTest.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/DefaultFtpReplyTest.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/DefaultFtpReplyTest.java (original)
+++ mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/DefaultFtpReplyTest.java Fri Aug 15 13:41:18 2008
@@ -19,10 +19,10 @@
 
 package org.apache.ftpserver;
 
-import org.apache.ftpserver.ftplet.DefaultFtpReply;
-
 import junit.framework.TestCase;
 
+import org.apache.ftpserver.ftplet.DefaultFtpReply;
+
 
 public class DefaultFtpReplyTest extends TestCase {
 

Modified: mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/FeatTest.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/FeatTest.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/FeatTest.java (original)
+++ mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/FeatTest.java Fri Aug 15 13:41:18 2008
@@ -26,6 +26,8 @@
 
 
     public void test() throws Exception {
+        client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
+        
         client.sendCommand("FEAT");
         String[] featReplies = client.getReplyString().split("\r\n");
         

Modified: mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/LoginTest.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/LoginTest.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/LoginTest.java (original)
+++ mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/clienttests/LoginTest.java Fri Aug 15 13:41:18 2008
@@ -19,6 +19,8 @@
 
 package org.apache.ftpserver.clienttests;
 
+import java.io.ByteArrayInputStream;
+
 import org.apache.commons.net.ftp.FTPClient;
 import org.apache.commons.net.ftp.FTPConnectionClosedException;
 import org.apache.commons.net.ftp.FTPReply;
@@ -31,6 +33,9 @@
         assertTrue(client.login(ADMIN_USERNAME, ADMIN_PASSWORD));
     }
     
+    public void testCommandWithoutLogin() throws Exception {
+        assertFalse(client.storeFile("foo", new ByteArrayInputStream("foo".getBytes())));
+    }
 
 
     public void testLoginNoUser() throws Exception {

Modified: mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetContainerTestTemplate.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetContainerTestTemplate.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetContainerTestTemplate.java (original)
+++ mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetContainerTestTemplate.java Fri Aug 15 13:41:18 2008
@@ -156,7 +156,7 @@
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
         
-        container.onLogin(new FtpSessionImpl(null), new FtpRequestImpl("foo"));
+        container.beforeCommand(new FtpSessionImpl(null), new FtpRequestImpl("PASS"));
         
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -180,7 +180,7 @@
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
         
-        container.onDeleteStart(new FtpSessionImpl(null), new FtpRequestImpl("foo"));
+        container.beforeCommand(new FtpSessionImpl(null), new FtpRequestImpl("DELE"));
         
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -204,7 +204,7 @@
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
         
-        container.onDeleteEnd(new FtpSessionImpl(null), new FtpRequestImpl("foo"));
+        container.afterCommand(new FtpSessionImpl(null), new FtpRequestImpl("DELE"));
         
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -227,8 +227,8 @@
         
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
-        
-        container.onUploadStart(new FtpSessionImpl(null), new FtpRequestImpl("foo"));
+
+        container.beforeCommand(new FtpSessionImpl(null), new FtpRequestImpl("STOR"));
         
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -251,8 +251,8 @@
         
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
-        
-        container.onUploadEnd(new FtpSessionImpl(null), new FtpRequestImpl("foo"));
+
+        container.afterCommand(new FtpSessionImpl(null), new FtpRequestImpl("STOR"));
         
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -276,7 +276,7 @@
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
         
-        container.onDownloadStart(new FtpSessionImpl(null), new FtpRequestImpl("foo"));
+        container.beforeCommand(new FtpSessionImpl(null), new FtpRequestImpl("RETR"));
         
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -300,7 +300,7 @@
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
         
-        container.onDownloadEnd(new FtpSessionImpl(null), new FtpRequestImpl("foo"));
+        container.afterCommand(new FtpSessionImpl(null), new FtpRequestImpl("RETR"));
         
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -324,7 +324,7 @@
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
         
-        container.onRmdirStart(new FtpSessionImpl(null), new FtpRequestImpl("foo"));
+        container.beforeCommand(new FtpSessionImpl(null), new FtpRequestImpl("RMD"));
         
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -348,7 +348,7 @@
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
         
-        container.onRmdirEnd(new FtpSessionImpl(null), new FtpRequestImpl("foo"));
+        container.afterCommand(new FtpSessionImpl(null), new FtpRequestImpl("RMD"));
         
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -372,7 +372,7 @@
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
         
-        container.onMkdirStart(new FtpSessionImpl(null), new FtpRequestImpl("foo"));
+        container.beforeCommand(new FtpSessionImpl(null), new FtpRequestImpl("MKD"));
         
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -396,7 +396,7 @@
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
         
-        container.onMkdirEnd(new FtpSessionImpl(null), new FtpRequestImpl("foo"));
+        container.afterCommand(new FtpSessionImpl(null), new FtpRequestImpl("MKD"));
         
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -420,7 +420,7 @@
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
         
-        container.onAppendStart(new FtpSessionImpl(null), new FtpRequestImpl("foo"));
+        container.beforeCommand(new FtpSessionImpl(null), new FtpRequestImpl("APPE"));
         
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -444,7 +444,7 @@
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
         
-        container.onAppendEnd(new FtpSessionImpl(null), new FtpRequestImpl("foo"));
+        container.afterCommand(new FtpSessionImpl(null), new FtpRequestImpl("APPE"));
         
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -468,7 +468,7 @@
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
         
-        container.onUploadUniqueStart(new FtpSessionImpl(null), new FtpRequestImpl("foo"));
+        container.beforeCommand(new FtpSessionImpl(null), new FtpRequestImpl("STOU"));
         
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -492,7 +492,7 @@
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
         
-        container.onUploadUniqueEnd(new FtpSessionImpl(null), new FtpRequestImpl("foo"));
+        container.afterCommand(new FtpSessionImpl(null), new FtpRequestImpl("STOU"));
         
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -516,7 +516,7 @@
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
         
-        container.onRenameStart(new FtpSessionImpl(null), new FtpRequestImpl("foo"));
+        container.beforeCommand(new FtpSessionImpl(null), new FtpRequestImpl("RNTO"));
         
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -540,7 +540,7 @@
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
         
-        container.onRenameEnd(new FtpSessionImpl(null), new FtpRequestImpl("foo"));
+        container.afterCommand(new FtpSessionImpl(null), new FtpRequestImpl("RNTO"));
         
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -564,7 +564,7 @@
         container.addFtplet("ftplet1", ftplet1);
         container.addFtplet("ftplet2", ftplet2);
         
-        container.onSite(new FtpSessionImpl(null), new FtpRequestImpl("foo"));
+        container.afterCommand(new FtpSessionImpl(null), new FtpRequestImpl("SITE"));
         
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));

Modified: mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetReturnDefaultTest.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetReturnDefaultTest.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetReturnDefaultTest.java (original)
+++ mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetReturnDefaultTest.java Fri Aug 15 13:41:18 2008
@@ -63,7 +63,7 @@
     public void testLogin() throws Exception {
         MockFtplet.callback = new MockFtpletCallback() {
             public FtpletEnum onLogin(FtpSession session, FtpRequest request) throws FtpException, IOException {
-                assertNotNull(session.getUser());
+                assertNotNull(session.getUserArgument());
                 
                 return super.onLogin(session, request);
             }

Modified: mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetReturnDisconnectTest.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetReturnDisconnectTest.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetReturnDisconnectTest.java (original)
+++ mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetReturnDisconnectTest.java Fri Aug 15 13:41:18 2008
@@ -61,23 +61,6 @@
         return server;
     }
 
-
-/*    public void testExceptionDuringInit() throws Exception {
-        MockFtplet.callback = new MockFtpletCallback() {
-            public void init(FtpletContext ftpConfig, Configuration config)
-                    throws FtpException {
-                throw new RuntimeException();
-            }
-        };
-
-        try {
-            initServer();
-            fail("Must throw FtpException");
-        } catch (FtpException e) {
-            // OK
-        }
-    }*/
-
     public void testExceptionDuringLogin() throws Exception {
         MockFtplet.callback = new MockFtpletCallback() {
             public FtpletEnum onLogin(FtpSession session, FtpRequest request)
@@ -248,6 +231,7 @@
         client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
         try {
             client.site("HELP");
+            client.completePendingCommand();
             fail("Must throw FTPConnectionClosedException");
         } catch (FTPConnectionClosedException e) {
             // OK

Modified: mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetReturnSkipTest.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetReturnSkipTest.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetReturnSkipTest.java (original)
+++ mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/FtpLetReturnSkipTest.java Fri Aug 15 13:41:18 2008
@@ -24,7 +24,7 @@
 import java.io.File;
 import java.io.IOException;
 
-import org.apache.commons.net.ftp.FTPConnectionClosedException;
+import org.apache.commons.net.ftp.FTPReply;
 import org.apache.ftpserver.FtpServer;
 import org.apache.ftpserver.clienttests.ClientTestTemplate;
 import org.apache.ftpserver.test.TestUtil;
@@ -36,7 +36,7 @@
     private static final File TEST_FILE2 = new File(ROOT_DIR, "test2.txt");
     private static final File TEST_DIR1 = new File(ROOT_DIR, "dir1");;
 
-    protected FtpletEnum mockReturnValue = FtpletEnum.RET_DISCONNECT;
+    protected FtpletEnum mockReturnValue = FtpletEnum.RET_SKIP;
     
     /*
      * (non-Javadoc)
@@ -63,7 +63,10 @@
     public void testLogin() throws Exception {
         MockFtplet.callback = new MockFtpletCallback() {
             public FtpletEnum onLogin(FtpSession session, FtpRequest request) throws FtpException, IOException {
-                return FtpletEnum.RET_SKIP;
+                session.write(new DefaultFtpReply(FtpReply.REPLY_530_NOT_LOGGED_IN, "foo"));
+
+                throwException();
+                return mockReturnValue;
             }
         };
 
@@ -73,7 +76,10 @@
     public void testExceptionDuringDeleteStart() throws Exception {
         MockFtplet.callback = new MockFtpletCallback() {
             public FtpletEnum onDeleteStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
-                return FtpletEnum.RET_SKIP;
+                
+                session.write(new DefaultFtpReply(FtpReply.REPLY_450_REQUESTED_FILE_ACTION_NOT_TAKEN, "foo"));
+                throwException();
+                return mockReturnValue;
             }
         };
         
@@ -96,32 +102,23 @@
         TestUtil.writeDataToFile(TEST_FILE1, TESTDATA);
         
         client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
-        try {
-            client.deleteFile(TEST_FILE1.getName());
-            client.completePendingCommand();
-            fail("Must throw FTPConnectionClosedException");
-        } catch (FTPConnectionClosedException e) {
-            // OK
-        }
-        
+        assertTrue(client.deleteFile(TEST_FILE1.getName()));
+
         assertFalse(TEST_FILE1.exists());
     }
 
     public void testExceptionDuringMkdirStart() throws Exception {
         MockFtplet.callback = new MockFtpletCallback() {
             public FtpletEnum onMkdirStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
+                
+                session.write(new DefaultFtpReply(FtpReply.REPLY_550_REQUESTED_ACTION_NOT_TAKEN, "foo"));
                 throwException();
                 return mockReturnValue;
             }
         };
         
         client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
-        try {
-            client.makeDirectory(TEST_DIR1.getName());
-            fail("Must throw FTPConnectionClosedException");
-        } catch (FTPConnectionClosedException e) {
-            // OK
-        }
+        assertFalse(client.makeDirectory(TEST_DIR1.getName()));
         
         assertFalse(TEST_DIR1.exists());
     }
@@ -135,13 +132,7 @@
         };
         
         client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
-        try {
-            client.makeDirectory(TEST_DIR1.getName());
-            client.completePendingCommand();
-            fail("Must throw FTPConnectionClosedException");
-        } catch (FTPConnectionClosedException e) {
-            // OK
-        }
+        assertTrue(client.makeDirectory(TEST_DIR1.getName()));
         
         assertTrue(TEST_DIR1.exists());
     }
@@ -149,6 +140,8 @@
     public void testExceptionDuringRmdirStart() throws Exception {
         MockFtplet.callback = new MockFtpletCallback() {
             public FtpletEnum onRmdirStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
+                session.write(new DefaultFtpReply(FtpReply.REPLY_450_REQUESTED_FILE_ACTION_NOT_TAKEN, "foo"));
+
                 throwException();
                 return mockReturnValue;
             }
@@ -157,12 +150,7 @@
         TEST_DIR1.mkdirs();
         
         client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
-        try {
-            client.removeDirectory(TEST_DIR1.getName());
-            fail("Must throw FTPConnectionClosedException");
-        } catch (FTPConnectionClosedException e) {
-            // OK
-        }
+        assertFalse(client.removeDirectory(TEST_DIR1.getName()));
         
         assertTrue(TEST_DIR1.exists());
     }
@@ -178,13 +166,7 @@
         TEST_DIR1.mkdirs();
         
         client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
-        try {
-            client.removeDirectory(TEST_DIR1.getName());
-            client.completePendingCommand();
-            fail("Must throw FTPConnectionClosedException");
-        } catch (FTPConnectionClosedException e) {
-            // OK
-        }
+        assertTrue(client.removeDirectory(TEST_DIR1.getName()));
         
         assertFalse(TEST_DIR1.exists());
     }
@@ -198,17 +180,15 @@
         };
         
         client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
-        try {
-            client.site("HELP");
-            fail("Must throw FTPConnectionClosedException");
-        } catch (FTPConnectionClosedException e) {
-            // OK
-        }
+        
+        client.site("HELP");
     }
 
     public void testExceptionDuringRenameStart() throws Exception {
         MockFtplet.callback = new MockFtpletCallback() {
             public FtpletEnum onRenameStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
+                session.write(new DefaultFtpReply(FtpReply.REPLY_553_REQUESTED_ACTION_NOT_TAKEN_FILE_NAME_NOT_ALLOWED, "foo"));
+                
                 throwException();
                 return mockReturnValue;
             }
@@ -217,12 +197,7 @@
         TestUtil.writeDataToFile(TEST_FILE1, TESTDATA);
         
         client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
-        try {
-            client.rename(TEST_FILE1.getName(), TEST_FILE2.getName());
-            fail("Must throw FTPConnectionClosedException");
-        } catch (FTPConnectionClosedException e) {
-            // OK
-        }
+        assertFalse(client.rename(TEST_FILE1.getName(), TEST_FILE2.getName()));
         
         assertTrue(TEST_FILE1.exists());
         assertFalse(TEST_FILE2.exists());
@@ -239,13 +214,7 @@
         TestUtil.writeDataToFile(TEST_FILE1, TESTDATA);
         
         client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
-        try {
-            client.rename(TEST_FILE1.getName(), TEST_FILE2.getName());
-            client.completePendingCommand();
-            fail("Must throw FTPConnectionClosedException");
-        } catch (FTPConnectionClosedException e) {
-            // OK
-        }
+        assertTrue(client.rename(TEST_FILE1.getName(), TEST_FILE2.getName()));
 
         assertFalse(TEST_FILE1.exists());
         assertTrue(TEST_FILE2.exists());
@@ -255,6 +224,8 @@
     public void testExceptionDuringDownloadStart() throws Exception {
         MockFtplet.callback = new MockFtpletCallback() {
             public FtpletEnum onDownloadStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
+                session.write(new DefaultFtpReply(FtpReply.REPLY_550_REQUESTED_ACTION_NOT_TAKEN, "foo"));
+                
                 throwException();
                 return mockReturnValue;
             }
@@ -263,12 +234,9 @@
         TestUtil.writeDataToFile(TEST_FILE1, TESTDATA);
         
         client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
-        try {
-            client.retrieveFileStream(TEST_FILE1.getName());
-            fail("Must throw FTPConnectionClosedException");
-        } catch (FTPConnectionClosedException e) {
-            // OK
-        }
+        client.retrieveFileStream(TEST_FILE1.getName());
+        
+        assertTrue(FTPReply.isNegativePermanent(client.getReplyCode()));
     }
 
     public void testExceptionDuringDownloadEnd() throws Exception {
@@ -283,13 +251,7 @@
         
         client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try {
-            client.retrieveFile(TEST_FILE1.getName(), baos);
-            client.completePendingCommand();
-            fail("Must throw FTPConnectionClosedException");
-        } catch (FTPConnectionClosedException e) {
-            // OK
-        }
+        assertTrue(client.retrieveFile(TEST_FILE1.getName(), baos));
     
         TestUtil.assertArraysEqual(TESTDATA, baos.toByteArray());
     }
@@ -297,6 +259,8 @@
     public void testExceptionDuringAppendStart() throws Exception {
         MockFtplet.callback = new MockFtpletCallback() {
             public FtpletEnum onAppendStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
+                session.write(new DefaultFtpReply(FtpReply.REPLY_550_REQUESTED_ACTION_NOT_TAKEN, "foo"));
+
                 throwException();
                 return mockReturnValue;
             }
@@ -305,12 +269,7 @@
         TestUtil.writeDataToFile(TEST_FILE1, TESTDATA);
         
         client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
-        try {
-            client.appendFile(TEST_FILE1.getName(), new ByteArrayInputStream(TESTDATA));
-            fail("Must throw FTPConnectionClosedException");
-        } catch (FTPConnectionClosedException e) {
-            // OK
-        }
+        assertFalse(client.appendFile(TEST_FILE1.getName(), new ByteArrayInputStream(TESTDATA)));
         
         TestUtil.assertFileEqual(TESTDATA, TEST_FILE1);
     }
@@ -326,13 +285,7 @@
         TestUtil.writeDataToFile(TEST_FILE1, TESTDATA);
         
         client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
-        try {
-            client.appendFile(TEST_FILE1.getName(), new ByteArrayInputStream(TESTDATA));
-            client.completePendingCommand();
-            fail("Must throw FTPConnectionClosedException");
-        } catch (FTPConnectionClosedException e) {
-            // OK
-        }
+        assertTrue(client.appendFile(TEST_FILE1.getName(), new ByteArrayInputStream(TESTDATA)));
         
         TestUtil.assertFileEqual(DOUBLE_TESTDATA, TEST_FILE1);
     }
@@ -340,18 +293,15 @@
     public void testExceptionDuringUploadStart() throws Exception {
         MockFtplet.callback = new MockFtpletCallback() {
             public FtpletEnum onUploadStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
+                session.write(new DefaultFtpReply(FtpReply.REPLY_550_REQUESTED_ACTION_NOT_TAKEN, "foo"));
+                
                 throwException();
                 return mockReturnValue;
             }
         };
         
         client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
-        try {
-            client.storeFile(TEST_FILE1.getName(), new ByteArrayInputStream(TESTDATA));
-            fail("Must throw FTPConnectionClosedException");
-        } catch (FTPConnectionClosedException e) {
-            // OK
-        }
+        assertFalse(client.storeFile(TEST_FILE1.getName(), new ByteArrayInputStream(TESTDATA)));
         
         assertFalse(TEST_FILE1.exists());
     }
@@ -365,13 +315,7 @@
         };
         
         client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
-        try {
-            client.storeFile(TEST_FILE1.getName(), new ByteArrayInputStream(TESTDATA));
-            client.completePendingCommand();
-            fail("Must throw FTPConnectionClosedException");
-        } catch (FTPConnectionClosedException e) {
-            // OK
-        }
+        assertTrue(client.storeFile(TEST_FILE1.getName(), new ByteArrayInputStream(TESTDATA)));
         
         TestUtil.assertFileEqual(TESTDATA, TEST_FILE1);
     }
@@ -379,18 +323,14 @@
     public void testExceptionDuringUploadUniqueStart() throws Exception {
         MockFtplet.callback = new MockFtpletCallback() {
             public FtpletEnum onUploadUniqueStart(FtpSession session, FtpRequest request) throws FtpException, IOException {
+                session.write(new DefaultFtpReply(FtpReply.REPLY_550_REQUESTED_ACTION_NOT_TAKEN, "foo"));
                 throwException();
                 return mockReturnValue;
             }
         };
         
         client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
-        try {
-            client.storeUniqueFile(TEST_FILE1.getName(), new ByteArrayInputStream(TESTDATA));
-            fail("Must throw FTPConnectionClosedException");
-        } catch (FTPConnectionClosedException e) {
-            // OK
-        }
+        assertFalse(client.storeUniqueFile(TEST_FILE1.getName(), new ByteArrayInputStream(TESTDATA)));
         
         assertEquals(ROOT_DIR.listFiles().length, 0);
     }
@@ -405,13 +345,7 @@
         };
         
         client.login(ADMIN_USERNAME, ADMIN_PASSWORD);
-        try {
-            client.storeUniqueFile(new ByteArrayInputStream(TESTDATA));
-            client.completePendingCommand();
-            fail("Must throw FTPConnectionClosedException");
-        } catch (FTPConnectionClosedException e) {
-            // OK
-        }
+        assertTrue(client.storeUniqueFile(new ByteArrayInputStream(TESTDATA)));
         
         TestUtil.assertFileEqual(TESTDATA, ROOT_DIR.listFiles()[0]);
     }

Modified: mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/MockFtplet.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/MockFtplet.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/MockFtplet.java (original)
+++ mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/MockFtplet.java Fri Aug 15 13:41:18 2008
@@ -21,7 +21,7 @@
 
 import java.io.IOException;
 
-public class MockFtplet implements Ftplet {
+public class MockFtplet extends DefaultFtplet {
 
     protected static MockFtpletCallback callback = new MockFtpletCallback();
     

Modified: mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/MockFtpletCallback.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/MockFtpletCallback.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/MockFtpletCallback.java (original)
+++ mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftplet/MockFtpletCallback.java Fri Aug 15 13:41:18 2008
@@ -21,7 +21,7 @@
 
 import java.io.IOException;
 
-public class MockFtpletCallback implements Ftplet {
+public class MockFtpletCallback extends DefaultFtplet {
 
     public static FtpletEnum returnValue;
     

Modified: mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/DefaultFtplet.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/DefaultFtplet.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/DefaultFtplet.java (original)
+++ mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/DefaultFtplet.java Fri Aug 15 13:41:18 2008
@@ -31,9 +31,65 @@
 
     public void init(FtpletContext ftpletContext) throws FtpException {}
     public void destroy() {}
-    
+
     public FtpletEnum onConnect(FtpSession session) throws FtpException, IOException {return null;}
     public FtpletEnum onDisconnect(FtpSession session) throws FtpException, IOException {return null;}
+
+    public FtpletEnum beforeCommand(FtpSession session, FtpRequest request) throws FtpException, IOException {
+        String command = request.getCommand().toUpperCase();
+
+        if("PASS".equals(command)) {
+            return onLogin(session, request);
+        } else if("DELE".equals(command)) {
+            return onDeleteStart(session, request);
+        } else if("STOR".equals(command)) {
+            return onUploadStart(session, request);
+        } else if("RETR".equals(command)) {
+            return onDownloadStart(session, request);
+        } else if("RMD".equals(command)) {
+            return onRmdirStart(session, request);
+        } else if("MKD".equals(command)) {
+            return onMkdirStart(session, request);
+        } else if("APPE".equals(command)) {
+            return onAppendStart(session, request);
+        } else if("STOU".equals(command)) {
+            return onUploadUniqueStart(session, request);
+        } else if("RNTO".equals(command)) {
+            return onRenameStart(session, request);
+        } else {
+            // TODO should we call a catch all?
+            return null;
+        }        
+    }
+    
+    public FtpletEnum afterCommand(FtpSession session, FtpRequest request) throws FtpException, IOException {
+        
+        String command = request.getCommand().toUpperCase();
+
+        if("DELE".equals(command)) {
+            return onDeleteEnd(session, request);
+        } else if("STOR".equals(command)) {
+            return onUploadEnd(session, request);
+        } else if("RETR".equals(command)) {
+            return onDownloadEnd(session, request);
+        } else if("RMD".equals(command)) {
+            return onRmdirEnd(session, request);
+        } else if("MKD".equals(command)) {
+            return onMkdirEnd(session, request);
+        } else if("APPE".equals(command)) {
+            return onAppendEnd(session, request);
+        } else if("STOU".equals(command)) {
+            return onUploadUniqueEnd(session, request);
+        } else if("RNTO".equals(command)) {
+            return onRenameEnd(session, request);
+        } else if("SITE".equals(command)) {
+            return onSite(session, request);
+        } else {
+            // TODO should we call a catch all?
+            return null;
+        }        
+    }
+
     public FtpletEnum onLogin(FtpSession session, FtpRequest request) throws FtpException, IOException {return null;}
     
     public FtpletEnum onDeleteStart(FtpSession session, FtpRequest request) throws FtpException, IOException {return null;}
@@ -61,4 +117,4 @@
     public FtpletEnum onRenameEnd(FtpSession session, FtpRequest request) throws FtpException, IOException {return null;}
     
     public FtpletEnum onSite(FtpSession session, FtpRequest request) throws FtpException, IOException {return null;}
-}
+}
\ No newline at end of file

Modified: mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpSession.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpSession.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpSession.java (original)
+++ mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/FtpSession.java Fri Aug 15 13:41:18 2008
@@ -31,8 +31,7 @@
  * So the attributes set by <code>setAttribute()</code> will be always 
  * available later unless that attribute is removed or the client disconnects.
  */
-public 
-interface FtpSession {
+public interface FtpSession {
 
     /**
      * Returns the IP address of the client that sent the request.

Modified: mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/Ftplet.java
URL: http://svn.apache.org/viewvc/mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/Ftplet.java?rev=686360&r1=686359&r2=686360&view=diff
==============================================================================
--- mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/Ftplet.java (original)
+++ mina/ftpserver/trunk/ftplet-api/src/main/java/org/apache/ftpserver/ftplet/Ftplet.java Fri Aug 15 13:41:18 2008
@@ -56,7 +56,7 @@
     void init(FtpletContext ftpletContext) throws FtpException;
     
     /**
-     * Called by the servlet container to indicate to a ftplet that the ftplet is 
+     * Called by the Ftplet container to indicate to a ftplet that the ftplet is 
      * being taken out of service. This method is only called once all threads within 
      * the ftplet's service method have exited. After the ftplet container calls this 
      * method, callback methods will not be executed. If the ftplet initialization 
@@ -65,105 +65,51 @@
     void destroy();
     
     /**
-     * Client connect notification method.
-     */
-    FtpletEnum onConnect(FtpSession session) throws FtpException, IOException;
-    
-    /**
-     * Client disconnect notification method. This is the last callback method.
-     */
-    FtpletEnum onDisconnect(FtpSession session) throws FtpException, IOException;
-    
-    /**
-     * Client successful login notification method. 
-     * If the user has successfully authenticated, the 
-     * {@link FtpSession#getUser()} method will return the user,
-     * otherwise it will return null.
+     * Called by the ftplet container before a command is executed by the server.
+     * The implementation should return based on the desired action to be taken by the server:
+     * <ul>
+     * <li>{@link FtpletEnum#RET_DEFAULT}: The server continues as normal and executes the command</li> 
+     * <li>{@link FtpletEnum#RET_NO_FTPLET}: The server does not call any more Ftplets before this command
+     *   but continues execution of the command as usual</li>
+     * <li>{@link FtpletEnum#RET_SKIP}: The server skips over execution of the command. Note that the Ftplet is 
+     *   responsible for returning the appropriate reply to the client, or the client might deadlock.</li> 
+     * <li>{@link FtpletEnum#RET_DISCONNECT}: The server will immediately disconnect the client.</li>
+     * <li>Ftplet throws exception: Same as {@link FtpletEnum#RET_DISCONNECT}</li>
+     * </ul>
+     * @param session The current session
+     * @param request The current request
+     * @return The desired action to be performed by the server
+     * @throws FtpException
+     * @throws IOException
      */
-    FtpletEnum onLogin(FtpSession session, FtpRequest request) throws FtpException, IOException;
-            
-    /**
-     * File delete request notification method.
-     */
-    FtpletEnum onDeleteStart(FtpSession session, FtpRequest request) throws FtpException, IOException;
-    
-    /**
-     * File delete success notification method.
-     */
-    FtpletEnum onDeleteEnd(FtpSession session, FtpRequest request) throws FtpException, IOException;
-    
-    /**
-     * File upload request notification method.
-     */
-    FtpletEnum onUploadStart(FtpSession session, FtpRequest request) throws FtpException, IOException;
+    FtpletEnum beforeCommand(FtpSession session, FtpRequest request) throws FtpException, IOException;
 
     /**
-     * File upload success notification method.
-     */
-    FtpletEnum onUploadEnd(FtpSession session, FtpRequest request) throws FtpException, IOException;
-    
-    /**
-     * File download request notification method.
-     */
-    FtpletEnum onDownloadStart(FtpSession session, FtpRequest request) throws FtpException, IOException;
-    
-    /**
-     * File download success notification method.
-     */
-    FtpletEnum onDownloadEnd(FtpSession session, FtpRequest request) throws FtpException, IOException;
-    
-    /**
-     * Remove directory request notification method.
+     * Called by the ftplet container after a command has been executed by the server.
+     * The implementation should return based on the desired action to be taken by the server:
+     * <ul>
+     * <li>{@link FtpletEnum#RET_DEFAULT}: The server continues as normal</li> 
+     * <li>{@link FtpletEnum#RET_NO_FTPLET}: The server does not call any more Ftplets before this command
+     *   but continues as normal</li>
+     * <li>{@link FtpletEnum#RET_SKIP}: Same as {@link FtpletEnum#RET_DEFAULT}</li> 
+     * <li>{@link FtpletEnum#RET_DISCONNECT}: The server will immediately disconnect the client.</li>
+     * <li>Ftplet throws exception: Same as {@link FtpletEnum#RET_DISCONNECT}</li>
+     * </ul>
+     * @param session The current session
+     * @param request The current request
+     * @return The desired action to be performed by the server
+     * @throws FtpException
+     * @throws IOException
      */
-    FtpletEnum onRmdirStart(FtpSession session, FtpRequest request) throws FtpException, IOException;
+    FtpletEnum afterCommand(FtpSession session, FtpRequest request) throws FtpException, IOException;
     
     /**
-     * Directory removal success notification method.
-     */
-    FtpletEnum onRmdirEnd(FtpSession session, FtpRequest request) throws FtpException, IOException;
-    
-    /**
-     * Directory creation request notification method.
-     */
-    FtpletEnum onMkdirStart(FtpSession session, FtpRequest request) throws FtpException, IOException;
-    
-    /**
-     * Directory creation success notification method.
-     */
-    FtpletEnum onMkdirEnd(FtpSession session, FtpRequest request) throws FtpException, IOException;
-            
-    /**
-     * File append request notification method.
-     */
-    FtpletEnum onAppendStart(FtpSession session, FtpRequest request) throws FtpException, IOException;
-    
-    /**
-     * File append success notification method.
-     */
-    FtpletEnum onAppendEnd(FtpSession session, FtpRequest request) throws FtpException, IOException;
-    
-    /**
-     * Unique file create request notification method.
-     */
-    FtpletEnum onUploadUniqueStart(FtpSession session, FtpRequest request) throws FtpException, IOException;
-    
-    /**
-     * Unique file create success notification method.
-     */
-    FtpletEnum onUploadUniqueEnd(FtpSession session, FtpRequest request) throws FtpException, IOException;
-    
-    /**
-     * Rename start notification method.
-     */
-    FtpletEnum onRenameStart(FtpSession session, FtpRequest request) throws FtpException, IOException;
-    
-    /**
-     * Rename end notification method.
+     * Client connect notification method.
      */
-    FtpletEnum onRenameEnd(FtpSession session, FtpRequest request) throws FtpException, IOException;
+    FtpletEnum onConnect(FtpSession session) throws FtpException, IOException;
     
     /**
-     * SITE command notification method.
+     * Client disconnect notification method. This is the last callback method.
      */
-    FtpletEnum onSite(FtpSession session, FtpRequest request) throws FtpException, IOException;
-}
+    FtpletEnum onDisconnect(FtpSession session) throws FtpException, IOException;
+}
\ No newline at end of file