Author: norman
Date: Thu Sep 22 13:27:35 2011
New Revision: 1174122

URL: http://svn.apache.org/viewvc?rev=1174122&view=rev
Log:
Remove return value from ConnectHandler/LineHandler as it makes no sense. Not 
sure why I thought it would make sense before.. Beside this I added special 
type of FutureResponse which allows to handle Responses in a async fashion. 
This is more for the skilled dev but there are use cases (stay tuned) 

Added:
    
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/FutureResponse.java
   (with props)
Removed:
    
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/log/ConnectHandlerResultLogger.java
    
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/log/LineHandlerResultLogger.java
Modified:
    
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/AbstractCommandDispatcher.java
    
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandler.java
    
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandlerResultHandler.java
    
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandler.java
    
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandlerResultHandler.java
    
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/BasicChannelUpstreamHandler.java
    
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/LineHandlerUpstreamHandler.java
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/WelcomeMessageHandler.java
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/DNSRBLHandler.java

Added: 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/FutureResponse.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/FutureResponse.java?rev=1174122&view=auto
==============================================================================
--- 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/FutureResponse.java
 (added)
+++ 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/FutureResponse.java
 Thu Sep 22 13:27:35 2011
@@ -0,0 +1,66 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.protocols.api;
+
+/**
+ * An special {@link Response} which allows to populate it in an async 
fashion. It also allows to register listeners which will get notified once the 
+ * {@link FutureResponse} is ready
+ * 
+ *
+ */
+public interface FutureResponse extends Response{
+
+    /**
+     * Add a {@link ResponseListener} which will get notified once {@link 
#isReady()} is true
+     * 
+     * @param listener
+     */
+    public void addListener(ResponseListener listener);
+    
+    /**
+     * Remote a {@link ResponseListener}
+     * 
+     * @param listener
+     */
+    public void removeListener(ResponseListener listener);
+    
+    /**
+     * Return <code>true</code> once the {@link FutureResponse} is ready and 
calling any of the get methods will not block any more.
+     * 
+     * @return ready
+     */
+    public boolean isReady();
+    
+    
+    /**
+     * Listener which will get notified once the {@link 
FutureResponse#isReady()} returns <code>true</code>
+     * 
+     *
+     */
+    public interface ResponseListener {
+
+        /**
+         * The {@link Response} is ready for processing
+         * 
+         * @param response
+         */
+        public void onResponse(Response response);
+    }
+}

Propchange: 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/FutureResponse.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/AbstractCommandDispatcher.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/AbstractCommandDispatcher.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
--- 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/AbstractCommandDispatcher.java
 (original)
+++ 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/AbstractCommandDispatcher.java
 Thu Sep 22 13:27:35 2011
@@ -29,7 +29,10 @@ import java.util.List;
 import java.util.Locale;
 
 import org.apache.james.protocols.api.BaseRequest;
+import org.apache.james.protocols.api.FutureResponse;
+import org.apache.james.protocols.api.FutureResponse.ResponseListener;
 import org.apache.james.protocols.api.ProtocolSession;
+import org.apache.james.protocols.api.Request;
 import org.apache.james.protocols.api.Response;
 
 
@@ -125,7 +128,7 @@ public abstract class AbstractCommandDis
      * (non-Javadoc)
      * @see 
org.apache.james.api.protocol.LineHandler#onLine(org.apache.james.api.protocol.ProtocolSession,
 byte[])
      */
-    public boolean onLine(Session session, byte[] line) {
+    public void onLine(final Session session, byte[] line) {
         String curCommandName = null;
         String curCommandArgument = null;
         String cmdString;
@@ -146,37 +149,55 @@ public abstract class AbstractCommandDis
             }
             List<CommandHandler<Session>> commandHandlers = 
getCommandHandlers(curCommandName, session);
             // fetch the command handlers registered to the command
-            int count = commandHandlers.size();
-            for (int i = 0; i < count; i++) {
-                CommandHandler<Session> cHandler = commandHandlers.get(i);
-
-                long start = System.currentTimeMillis();
-                Response response = cHandler.onCommand(session, new 
BaseRequest(curCommandName, curCommandArgument));
-                long executionTime = System.currentTimeMillis() - start;
-
-                // if the response is received, stop processing of command
-                // handlers
-                if (response != null) {
-                    
-                    // now process the result handlers
-                    for (int a = 0; a < rHandlers.size(); a++) {
-                        response = rHandlers.get(a).onResponse(session, 
response, executionTime, (CommandHandler<Session>) cHandler);
-                    }
-                    session.writeResponse(response);
-
-                    break;
-                }
-            }
+            
+            BaseRequest request = new BaseRequest(curCommandName, 
curCommandArgument);
+            Iterator<CommandHandler<Session>> handlers = 
commandHandlers.iterator();
+            executeHandlers(handlers, session, request);
 
         } catch (UnsupportedEncodingException e) {
             // Should never happen
            session.getLogger().error("Unable to handle encoding" ,e );
         }
         
-        return false;
        
     }
 
+    private void executeHandlers(final Iterator<CommandHandler<Session>> 
handlers, final Session session, final Request request) {
+        final CommandHandler<Session> cHandler = handlers.next();
+        
+
+        final long start = System.currentTimeMillis();
+        Response response = cHandler.onCommand(session, request);
+        if (response instanceof FutureResponse) {
+            ((FutureResponse) response).addListener(new ResponseListener() {
+                
+                public void onResponse(Response response) {
+                    long executionTime = System.currentTimeMillis() - start;
+                    handleResponse(handlers, session, response, request, 
cHandler, executionTime);
+                }
+            });
+        } else {
+            long executionTime = System.currentTimeMillis() - start;
+            handleResponse(handlers, session, response, request, cHandler, 
executionTime);
+        }
+    }
+    
+    private void handleResponse(Iterator<CommandHandler<Session>> handlers, 
Session session, Response response, Request request, CommandHandler<Session> 
cHandler, long executionTime) {
+
+        // if the response is received, stop processing of command
+        // handlers
+        if (response != null) {
+            
+            // now process the result handlers
+            for (int a = 0; a < rHandlers.size(); a++) {
+                response = rHandlers.get(a).onResponse(session, response, 
executionTime, (CommandHandler<Session>) cHandler);
+            }
+            session.writeResponse(response);
+        } else {
+            executeHandlers(handlers, session, request);
+        }
+        
+    }
     protected String getLineDecodingCharset() {
         return "US-ASCII";
     }

Modified: 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandler.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
--- 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandler.java
 (original)
+++ 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandler.java
 Thu Sep 22 13:27:35 2011
@@ -33,8 +33,7 @@ public interface ConnectHandler<Session 
     /**
      * Handle connection and disconnect if true is returned
      * 
-     * @return disconnect 
     **/
-    boolean onConnect(Session session);
+    void onConnect(Session session);
 
 }

Modified: 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandlerResultHandler.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandlerResultHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
--- 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandlerResultHandler.java
 (original)
+++ 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandlerResultHandler.java
 Thu Sep 22 13:27:35 2011
@@ -36,8 +36,7 @@ public interface ConnectHandlerResultHan
      * @param response
      * @param executionTime
      * @param handler
-     * @return result
      */
-    boolean onResponse(ProtocolSession session, boolean response, long 
executionTime, ConnectHandler<S> handler);
+    void onResponse(ProtocolSession session, long executionTime, 
ConnectHandler<S> handler);
 
 }

Modified: 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandler.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
--- 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandler.java
 (original)
+++ 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandler.java
 Thu Sep 22 13:27:35 2011
@@ -34,8 +34,7 @@ public interface LineHandler<Session ext
      * 
      * @param session not null
      * @param line not null 
-     * @return disconnect
      */
-    boolean onLine(Session session, byte[] line);
+    void onLine(Session session, byte[] line);
     
 }

Modified: 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandlerResultHandler.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandlerResultHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
--- 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandlerResultHandler.java
 (original)
+++ 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/LineHandlerResultHandler.java
 Thu Sep 22 13:27:35 2011
@@ -35,12 +35,11 @@ public interface LineHandlerResultHandle
      * Called after the {@link LineHandler} returned a result
      * 
      * @param session
-     * @param response
      * @param executionTime
      * @param handler
      * @return result
      */
-    boolean onResponse(ProtocolSession session, boolean response, long 
executionTime, LineHandler<S> handler);
+    void onResponse(ProtocolSession session, long executionTime, 
LineHandler<S> handler);
 
     
 }

Modified: 
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/BasicChannelUpstreamHandler.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/BasicChannelUpstreamHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
--- 
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/BasicChannelUpstreamHandler.java
 (original)
+++ 
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/BasicChannelUpstreamHandler.java
 Thu Sep 22 13:27:35 2011
@@ -95,16 +95,13 @@ public class BasicChannelUpstreamHandler
                 ConnectHandler cHandler = connectHandlers.get(i);
                 
                 long start = System.currentTimeMillis();
-                boolean disconnect = connectHandlers.get(i).onConnect(session);
+                connectHandlers.get(i).onConnect(session);
                 long executionTime = System.currentTimeMillis() - start;
                 
                 for (int a = 0; a < resultHandlers.size(); a++) {
-                    disconnect = resultHandlers.get(a).onResponse(session, 
disconnect, executionTime, cHandler);
-                }
-                if (disconnect)  {
-                    ctx.getChannel().disconnect();
-                    break;
+                    resultHandlers.get(a).onResponse(session, executionTime, 
cHandler);
                 }
+               
             }
         }
         super.channelConnected(ctx, e);
@@ -151,13 +148,12 @@ public class BasicChannelUpstreamHandler
             
             LineHandler lHandler=  (LineHandler) lineHandlers.getLast();
             long start = System.currentTimeMillis();            
-            boolean disconnect = lHandler.onLine(pSession,line);
+            lHandler.onLine(pSession,line);
             long executionTime = System.currentTimeMillis() - start;
 
             for (int i = 0; i < resultHandlers.size(); i++) {
-                disconnect = resultHandlers.get(i).onResponse(pSession, 
disconnect, executionTime, lHandler);
+                resultHandlers.get(i).onResponse(pSession, executionTime, 
lHandler);
             }
-            if (disconnect) ctx.getChannel().disconnect();
 
         }
         

Modified: 
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/LineHandlerUpstreamHandler.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/LineHandlerUpstreamHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
--- 
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/LineHandlerUpstreamHandler.java
 (original)
+++ 
james/protocols/trunk/impl/src/main/java/org/apache/james/protocols/impl/LineHandlerUpstreamHandler.java
 Thu Sep 22 13:27:35 2011
@@ -21,8 +21,6 @@ package org.apache.james.protocols.impl;
 import org.apache.james.protocols.api.ProtocolSession;
 import org.apache.james.protocols.api.handler.LineHandler;
 import org.jboss.netty.buffer.ChannelBuffer;
-import org.jboss.netty.buffer.ChannelBuffers;
-import org.jboss.netty.channel.ChannelFutureListener;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.ChannelUpstreamHandler;
 import org.jboss.netty.channel.MessageEvent;
@@ -55,9 +53,7 @@ public class LineHandlerUpstreamHandler<
             buf.getBytes(0, line);
         }
 
-        boolean disconnect = handler.onLine(session, line);
-        if (disconnect) 
ctx.getChannel().write(ChannelBuffers.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
-        
+        handler.onLine(session, line);        
     }
 
 }

Modified: 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
--- 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java
 (original)
+++ 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java
 Thu Sep 22 13:27:35 2011
@@ -48,13 +48,12 @@ public class DataCmdHandler implements C
          * (non-Javadoc)
          * @see 
org.apache.james.api.protocol.LineHandler#onLine(org.apache.james.api.protocol.ProtocolSession,
 byte[])
          */
-        public boolean onLine(SMTPSession session, byte[] line) {
+        public void onLine(SMTPSession session, byte[] line) {
             
             // Discard everything until the end of DATA session
             if (line.length == 3 && line[0] == 46) {
                 session.popLineHandler();
             }
-            return false;
         }
     }
 
@@ -72,9 +71,8 @@ public class DataCmdHandler implements C
          * (non-Javadoc)
          * @see 
org.apache.james.api.protocol.LineHandler#onLine(org.apache.james.api.protocol.ProtocolSession,
 byte[])
          */
-        public boolean onLine(SMTPSession session, byte[] line) {
+        public void onLine(SMTPSession session, byte[] line) {
             filter.onLine(session, line, next);
-            return false;
         }
                 
     }

Modified: 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/WelcomeMessageHandler.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/WelcomeMessageHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
--- 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/WelcomeMessageHandler.java
 (original)
+++ 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/WelcomeMessageHandler.java
 Thu Sep 22 13:27:35 2011
@@ -41,7 +41,7 @@ public class WelcomeMessageHandler imple
     /**
      * @see 
org.apache.james.smtpserver.protocol.ConnectHandler#onConnect(SMTPSession)
      */
-    public boolean onConnect(SMTPSession session) {
+    public void onConnect(SMTPSession session) {
         String smtpGreeting = session.getSMTPGreeting();
 
         SMTPResponse welcomeResponse;
@@ -60,8 +60,6 @@ public class WelcomeMessageHandler imple
             welcomeResponse = new 
SMTPResponse(SMTPRetCode.SERVICE_READY,smtpGreeting);
         }
         session.writeResponse(welcomeResponse);
-        
-        return false;
     }
     
     protected String getProductName() {

Modified: 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
--- 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java
 (original)
+++ 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java
 Thu Sep 22 13:27:35 2011
@@ -60,7 +60,7 @@ public class AuthCmdHandler
 
     private abstract class AbstractSMTPLineHandler implements 
LineHandler<SMTPSession> {
 
-        public boolean onLine(SMTPSession session, byte[] l) {
+        public void onLine(SMTPSession session, byte[] l) {
             SMTPResponse res;
             try {
                 res = handleCommand(session, new String(l,"US-ASCII"));
@@ -68,7 +68,6 @@ public class AuthCmdHandler
             } catch (UnsupportedEncodingException e) {
                 e.printStackTrace();
             }
-            return false;
 
            
         }

Modified: 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/DNSRBLHandler.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/DNSRBLHandler.java?rev=1174122&r1=1174121&r2=1174122&view=diff
==============================================================================
--- 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/DNSRBLHandler.java
 (original)
+++ 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/DNSRBLHandler.java
 Thu Sep 22 13:27:35 2011
@@ -70,9 +70,8 @@ public class DNSRBLHandler implements  C
      * check if the remote Ip address is block listed
      *
     **/
-    public boolean onConnect(SMTPSession session) {
+    public void onConnect(SMTPSession session) {
         checkDNSRBL(session, session.getRemoteIPAddress());
-        return false;
     }
     
     /**



---------------------------------------------------------------------
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