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