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