You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2012/01/23 18:27:37 UTC
svn commit: r1234908 -
/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/CommandDispatcher.java
Author: norman
Date: Mon Jan 23 17:27:36 2012
New Revision: 1234908
URL: http://svn.apache.org/viewvc?rev=1234908&view=rev
Log:
Add support for FutureResponse when using ProtocolHandlerResultHandler. See PROTOCOLS-37
Modified:
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/CommandDispatcher.java
Modified: james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/CommandDispatcher.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/CommandDispatcher.java?rev=1234908&r1=1234907&r2=1234908&view=diff
==============================================================================
--- james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/CommandDispatcher.java (original)
+++ james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/CommandDispatcher.java Mon Jan 23 17:27:36 2012
@@ -34,6 +34,8 @@ import org.apache.james.protocols.api.Pr
import org.apache.james.protocols.api.Request;
import org.apache.james.protocols.api.Response;
import org.apache.james.protocols.api.future.FutureResponse;
+import org.apache.james.protocols.api.future.FutureResponse.ResponseListener;
+import org.apache.james.protocols.api.future.FutureResponseImpl;
@@ -165,7 +167,6 @@ public class CommandDispatcher<Session e
}
List<CommandHandler<Session>> commandHandlers = getCommandHandlers(request.getCommand(), session);
// fetch the command handlers registered to the command
-
Iterator<CommandHandler<Session>> handlers = commandHandlers.iterator();
while (handlers.hasNext()) {
@@ -176,23 +177,48 @@ public class CommandDispatcher<Session e
long executionTime = System.currentTimeMillis() - start;
// now process the result handlers
- for (int a = 0; a < rHandlers.size(); a++) {
- // Disable till PROTOCOLS-37 is implemented
- if (response instanceof FutureResponse) {
- session.getLogger().debug("ProtocolHandlerResultHandler are not supported for FutureResponse yet");
- break;
- }
- response = rHandlers.get(a).onResponse(session, response, executionTime, (CommandHandler<Session>) cHandler);
+ response = executeResultHandlers(session, response, executionTime, cHandler, rHandlers.iterator());
+ if (response != null) {
+ return response;
}
}
- if (response != null) {
- return response;
- }
+
}
return null;
}
+ private Response executeResultHandlers(final Session session, Response response, final long executionTime, final CommandHandler<Session> cHandler, final Iterator<ProtocolHandlerResultHandler<Response, Session>> resultHandlers) {
+ // Check if the there is a ResultHandler left to execute if not just return the response
+ if (resultHandlers.hasNext()) {
+ // Special handling of FutureResponse
+ // See PROTOCOLS-37
+ if (response instanceof FutureResponse) {
+ final FutureResponseImpl futureResponse = new FutureResponseImpl();
+ ((FutureResponse) response).addListener(new ResponseListener() {
+
+ public void onResponse(FutureResponse response) {
+ Response r = resultHandlers.next().onResponse(session, response, executionTime, cHandler);
+
+ // call the next ResultHandler
+ r = executeResultHandlers(session, r, executionTime, cHandler, resultHandlers);
+
+ // notify the FutureResponse that we are ready
+ futureResponse.setResponse(r);
+ }
+ });
+
+ // just return the new FutureResponse which will get notified once its ready
+ return futureResponse;
+ } else {
+ response = resultHandlers.next().onResponse(session, response, executionTime, (CommandHandler<Session>) cHandler);
+
+ // call the next ResultHandler
+ return executeResultHandlers(session, response, executionTime, cHandler, resultHandlers);
+ }
+ }
+ return response;
+ }
/**
* Parse the line into a {@link Request}
*
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org