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-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org