Author: ngn
Date: Thu Nov 20 13:50:22 2008
New Revision: 719389

URL: http://svn.apache.org/viewvc?rev=719389&view=rev
Log:
Applied modified patch for providing FtpReply on the Ftplet.afterCommand 
(FTPSERVER-222). Most of the code by Sai Pullabhotla.

Modified:
    
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftpletcontainer/impl/DefaultFtpletContainer.java
    
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/DefaultFtpHandler.java
    
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/FtpIoSession.java
    
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftpletcontainer/FtpLetContainerTestTemplate.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/Ftplet.java

Modified: 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftpletcontainer/impl/DefaultFtpletContainer.java
URL: 
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftpletcontainer/impl/DefaultFtpletContainer.java?rev=719389&r1=719388&r2=719389&view=diff
==============================================================================
--- 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftpletcontainer/impl/DefaultFtpletContainer.java
 (original)
+++ 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/ftpletcontainer/impl/DefaultFtpletContainer.java
 Thu Nov 20 13:50:22 2008
@@ -25,6 +25,7 @@
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.ftpserver.ftplet.FtpException;
+import org.apache.ftpserver.ftplet.FtpReply;
 import org.apache.ftpserver.ftplet.FtpRequest;
 import org.apache.ftpserver.ftplet.FtpSession;
 import org.apache.ftpserver.ftplet.Ftplet;
@@ -137,12 +138,12 @@
         return retVal;
     }
 
-    public FtpletResult afterCommand(FtpSession session, FtpRequest request)
+    public FtpletResult afterCommand(FtpSession session, FtpRequest request, 
FtpReply reply)
             throws FtpException, IOException {
         FtpletResult retVal = FtpletResult.DEFAULT;
         for (Entry<String, Ftplet> entry : ftplets.entrySet()) {
 
-            retVal = entry.getValue().afterCommand(session, request);
+            retVal = entry.getValue().afterCommand(session, request, reply);
             if (retVal == null) {
                 retVal = FtpletResult.DEFAULT;
             }

Modified: 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/DefaultFtpHandler.java
URL: 
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/DefaultFtpHandler.java?rev=719389&r1=719388&r2=719389&view=diff
==============================================================================
--- 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/DefaultFtpHandler.java
 (original)
+++ 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/DefaultFtpHandler.java
 Thu Nov 20 13:50:22 2008
@@ -143,7 +143,7 @@
 
                 try {
                     ftpletRet = 
ftplets.afterCommand(session.getFtpletSession(),
-                            request);
+                            request, session.getLastReply());
                 } catch (Exception e) {
                     LOG.debug("Ftplet container threw exception", e);
                     ftpletRet = FtpletResult.DISCONNECT;
@@ -170,6 +170,9 @@
             } else {
                 LOG.warn("RequestHandler.service()", ex);
             }
+        } finally {
+            // clear the last reply so we're sure it's only there for one 
command
+            session.clearLastReply();
         }
 
     }

Modified: 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/FtpIoSession.java
URL: 
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/FtpIoSession.java?rev=719389&r1=719388&r2=719389&view=diff
==============================================================================
--- 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/FtpIoSession.java
 (original)
+++ 
mina/ftpserver/trunk/core/src/main/java/org/apache/ftpserver/impl/FtpIoSession.java
 Thu Nov 20 13:50:22 2008
@@ -31,6 +31,7 @@
 import org.apache.ftpserver.ftplet.DataType;
 import org.apache.ftpserver.ftplet.FileSystemView;
 import org.apache.ftpserver.ftplet.FtpFile;
+import org.apache.ftpserver.ftplet.FtpReply;
 import org.apache.ftpserver.ftplet.FtpSession;
 import org.apache.ftpserver.ftplet.Structure;
 import org.apache.ftpserver.ftplet.User;
@@ -112,6 +113,11 @@
 
     private FtpServerContext context;
 
+    /**
+     * Last reply that was sent to the client, if any. 
+     */
+    private FtpReply lastReply = null;
+
     /* Begin wrapped IoSession methods */
 
     /**
@@ -536,14 +542,18 @@
      * @see IoSession#write(Object)
      */
     public WriteFuture write(Object message) {
-        return wrappedSession.write(message);
+        WriteFuture future = wrappedSession.write(message);
+        this.lastReply = (FtpReply) message;
+        return future;
     }
 
     /**
      * @see IoSession#write(Object, SocketAddress)
      */
     public WriteFuture write(Object message, SocketAddress destination) {
-        return wrappedSession.write(message, destination);
+        WriteFuture future = wrappedSession.write(message, destination);
+        this.lastReply = (FtpReply) message;
+        return future;
     }
 
     /* End wrapped IoSession methods */
@@ -776,9 +786,11 @@
      * @param increment The number of bytes written
      */
     public void increaseWrittenDataBytes(int increment) {
-        if(wrappedSession instanceof AbstractIoSession ) {
-            
((AbstractIoSession)wrappedSession).increaseScheduledWriteBytes(increment);
-            
((AbstractIoSession)wrappedSession).increaseWrittenBytes(increment, 
System.currentTimeMillis());
+        if (wrappedSession instanceof AbstractIoSession) {
+            ((AbstractIoSession) wrappedSession)
+                    .increaseScheduledWriteBytes(increment);
+            ((AbstractIoSession) wrappedSession).increaseWrittenBytes(
+                    increment, System.currentTimeMillis());
         }
     }
 
@@ -787,8 +799,24 @@
      * @param increment The number of bytes written
      */
     public void increaseReadDataBytes(int increment) {
-        if(wrappedSession instanceof AbstractIoSession ) {
-            ((AbstractIoSession)wrappedSession).increaseReadBytes(increment, 
System.currentTimeMillis());
+        if (wrappedSession instanceof AbstractIoSession) {
+            ((AbstractIoSession) wrappedSession).increaseReadBytes(increment,
+                    System.currentTimeMillis());
         }
     }
+
+    /**
+     * Returns the last reply that was sent to the client. 
+     * @return the last reply that was sent to the client.
+     */
+    public FtpReply getLastReply() {
+        return lastReply;
+    }
+    
+    /**
+     * Clears the last reply
+     */
+    public void clearLastReply() {
+        lastReply = null;
+    }
 }

Modified: 
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftpletcontainer/FtpLetContainerTestTemplate.java
URL: 
http://svn.apache.org/viewvc/mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftpletcontainer/FtpLetContainerTestTemplate.java?rev=719389&r1=719388&r2=719389&view=diff
==============================================================================
--- 
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftpletcontainer/FtpLetContainerTestTemplate.java
 (original)
+++ 
mina/ftpserver/trunk/core/src/test/java/org/apache/ftpserver/ftpletcontainer/FtpLetContainerTestTemplate.java
 Thu Nov 20 13:50:22 2008
@@ -27,6 +27,7 @@
 
 import junit.framework.TestCase;
 
+import org.apache.ftpserver.ftplet.DefaultFtpReply;
 import org.apache.ftpserver.ftplet.FileSystemFactory;
 import org.apache.ftpserver.ftplet.FtpException;
 import org.apache.ftpserver.ftplet.FtpRequest;
@@ -185,7 +186,7 @@
         FtpletContainer container = createFtpletContainer(ftplets);
 
         container.afterCommand(new DefaultFtpSession(null), new 
DefaultFtpRequest(
-                "PASS"));
+                "PASS"), null);
 
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -245,7 +246,7 @@
         FtpletContainer container = createFtpletContainer(ftplets);
 
         container.afterCommand(new DefaultFtpSession(null), new 
DefaultFtpRequest(
-                "DELE"));
+                "DELE"), new DefaultFtpReply(200, "foo"));
 
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -305,7 +306,7 @@
         FtpletContainer container = createFtpletContainer(ftplets);
 
         container.afterCommand(new DefaultFtpSession(null), new 
DefaultFtpRequest(
-                "STOR"));
+                "STOR"), new DefaultFtpReply(200, "foo"));
 
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -365,7 +366,7 @@
         FtpletContainer container = createFtpletContainer(ftplets);
 
         container.afterCommand(new DefaultFtpSession(null), new 
DefaultFtpRequest(
-                "RETR"));
+                "RETR"), new DefaultFtpReply(200, "foo"));
 
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -425,7 +426,7 @@
         FtpletContainer container = createFtpletContainer(ftplets);
 
         container.afterCommand(new DefaultFtpSession(null), new 
DefaultFtpRequest(
-                "RMD"));
+                "RMD"), new DefaultFtpReply(200, "foo"));
 
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -485,7 +486,7 @@
         FtpletContainer container = createFtpletContainer(ftplets);
 
         container.afterCommand(new DefaultFtpSession(null), new 
DefaultFtpRequest(
-                "MKD"));
+                "MKD"), new DefaultFtpReply(200, "foo"));
 
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -545,7 +546,7 @@
         FtpletContainer container = createFtpletContainer(ftplets);
 
         container.afterCommand(new DefaultFtpSession(null), new 
DefaultFtpRequest(
-                "APPE"));
+                "APPE"), new DefaultFtpReply(200, "foo"));
 
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -605,7 +606,7 @@
         FtpletContainer container = createFtpletContainer(ftplets);
 
         container.afterCommand(new DefaultFtpSession(null), new 
DefaultFtpRequest(
-                "STOU"));
+                "STOU"), new DefaultFtpReply(200, "foo"));
 
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));
@@ -665,7 +666,7 @@
         FtpletContainer container = createFtpletContainer(ftplets);
 
         container.afterCommand(new DefaultFtpSession(null), new 
DefaultFtpRequest(
-                "RNTO"));
+                "RNTO"), new DefaultFtpReply(200, "foo"));
 
         assertEquals(2, calls.size());
         assertEquals("ftplet1", calls.get(0));

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=719389&r1=719388&r2=719389&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
 Thu Nov 20 13:50:22 2008
@@ -75,9 +75,11 @@
         }
     }
 
-    public FtpletResult afterCommand(FtpSession session, FtpRequest request)
+    public FtpletResult afterCommand(FtpSession session, FtpRequest request, 
FtpReply reply)
             throws FtpException, IOException {
 
+        // the reply is ignored for these callbacks
+        
         String command = request.getCommand().toUpperCase();
 
         if ("PASS".equals(command)) {

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=719389&r1=719388&r2=719389&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
 Thu Nov 20 13:50:22 2008
@@ -98,28 +98,32 @@
             throws FtpException, IOException;
 
     /**
-     * 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>[EMAIL PROTECTED] FtpletResult#DEFAULT}: The server continues as 
normal</li>
-     * <li>[EMAIL PROTECTED] FtpletResult#NO_FTPLET}: The server does not call 
any more
-     * Ftplets before this command but continues as normal</li>
-     * <li>[EMAIL PROTECTED] FtpletResult#SKIP}: Same as [EMAIL PROTECTED] 
FtpletResult#DEFAULT}</li>
-     * <li>[EMAIL PROTECTED] FtpletResult#DISCONNECT}: The server will 
immediately
-     * disconnect the client.</li>
-     * <li>Ftplet throws exception: Same as [EMAIL PROTECTED] 
FtpletResult#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
-     */
-    FtpletResult afterCommand(FtpSession session, FtpRequest request)
+        * 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>[EMAIL PROTECTED] FtpletResult#DEFAULT}: The server continues as 
normal</li>
+        * <li>[EMAIL PROTECTED] FtpletResult#NO_FTPLET}: The server does not 
call any more
+        * Ftplets before this command but continues as normal</li>
+        * <li>[EMAIL PROTECTED] FtpletResult#SKIP}: Same as [EMAIL PROTECTED] 
FtpletResult#DEFAULT}</li>
+        * <li>[EMAIL PROTECTED] FtpletResult#DISCONNECT}: The server will 
immediately
+        * disconnect the client.</li>
+        * <li>Ftplet throws exception: Same as [EMAIL PROTECTED] 
FtpletResult#DISCONNECT}</li>
+        * </ul>
+        * 
+        * @param session
+        *            The current session
+        * @param request
+        *            The current request
+        * @param reply
+        *            the reply that was sent for this command. Implementations 
can
+        *            use this to check the reply code and thus determine if the
+        *            command was successfully processed or not.
+        * @return The desired action to be performed by the server
+        * @throws FtpException
+        * @throws IOException
+        */
+    FtpletResult afterCommand(FtpSession session, FtpRequest request, FtpReply 
reply)
             throws FtpException, IOException;
 
     /**


Reply via email to