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

Reply via email to