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;
/**