Author: norman Date: Wed Oct 14 11:12:39 2009 New Revision: 825085 URL: http://svn.apache.org/viewvc?rev=825085&view=rev Log: Refactor code to keep things as generic as possible. This will allow us to provide a Avalon Socket implementation of SMTPServer and one which use MINA (in the long term)
Added: james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/mina/SMTPIoHandler.java - copied, changed from r825071, james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/mina/SMTPCommandDispatcherIoHandler.java Removed: james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/mina/SMTPCommandDispatcherIoHandler.java Modified: james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/SMTPServer.java james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/SMTPSession.java james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/core/CoreCmdHandlerLoader.java james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/mina/SMTPSessionImpl.java Modified: james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/SMTPServer.java URL: http://svn.apache.org/viewvc/james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/SMTPServer.java?rev=825085&r1=825084&r2=825085&view=diff ============================================================================== --- james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/SMTPServer.java (original) +++ james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/SMTPServer.java Wed Oct 14 11:12:39 2009 @@ -45,7 +45,7 @@ import org.apache.james.services.FileSystem; import org.apache.james.services.MailServer; import org.apache.james.smtpserver.mina.RequestValidationFilter; -import org.apache.james.smtpserver.mina.SMTPCommandDispatcherIoHandler; +import org.apache.james.smtpserver.mina.SMTPIoHandler; import org.apache.james.smtpserver.mina.SMTPResponseFilter; import org.apache.james.smtpserver.mina.filter.ConnectionFilter; import org.apache.james.socket.configuration.JamesConfiguration; @@ -585,10 +585,7 @@ Log logger = new AvalonLogger(getLogger()); ProtocolCodecFilter codecFactory = new ProtocolCodecFilter(new TextLineCodecFactory()); SocketAcceptor acceptor = new NioSocketAcceptor(); - SMTPCommandDispatcherIoHandler ioHandler = new SMTPCommandDispatcherIoHandler(handlerChain, theConfigData,logger,buildSSLContextFactory()); - // init the handler - ioHandler.init(); - acceptor.setHandler(ioHandler); + acceptor.setHandler(new SMTPIoHandler(handlerChain, theConfigData,logger,buildSSLContextFactory())); acceptor.getFilterChain().addLast("protocolCodecFactory", codecFactory); acceptor.getFilterChain().addLast("connectionFilter", new ConnectionFilter(logger, connectionLimit, connPerIP)); Modified: james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/SMTPSession.java URL: http://svn.apache.org/viewvc/james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/SMTPSession.java?rev=825085&r1=825084&r2=825085&view=diff ============================================================================== --- james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/SMTPSession.java (original) +++ james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/SMTPSession.java Wed Oct 14 11:12:39 2009 @@ -111,7 +111,7 @@ * @return authentication required or not */ boolean isAuthSupported(); -; + /** * Returns the SMTP session id Modified: james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/core/CoreCmdHandlerLoader.java URL: http://svn.apache.org/viewvc/james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/core/CoreCmdHandlerLoader.java?rev=825085&r1=825084&r2=825085&view=diff ============================================================================== --- james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/core/CoreCmdHandlerLoader.java (original) +++ james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/core/CoreCmdHandlerLoader.java Wed Oct 14 11:12:39 2009 @@ -25,7 +25,6 @@ import org.apache.james.smtpserver.core.esmtp.EhloCmdHandler; import org.apache.james.smtpserver.core.esmtp.MailSizeEsmtpExtension; import org.apache.james.smtpserver.core.esmtp.StartTlsCmdHandler; -import org.apache.james.smtpserver.mina.SMTPCommandDispatcherIoHandler; import org.apache.james.socket.shared.HandlersPackage; import java.util.LinkedList; @@ -36,6 +35,7 @@ */ public class CoreCmdHandlerLoader implements HandlersPackage { + private final String COMMANDDISPATCHER = SMTPCommandDispatcherLineHandler.class.getName(); private final String AUTHCMDHANDLER = AuthCmdHandler.class.getName(); private final String DATACMDHANDLER = DataCmdHandler.class.getName(); private final String EHLOCMDHANDLER = EhloCmdHandler.class.getName(); @@ -61,6 +61,7 @@ public CoreCmdHandlerLoader() { // Insert the base commands in the Map commands.add(WELCOMEMESSAGEHANDLER); + commands.add(COMMANDDISPATCHER); commands.add(AUTHCMDHANDLER); commands.add(DATACMDHANDLER); commands.add(EHLOCMDHANDLER); Copied: james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/mina/SMTPIoHandler.java (from r825071, james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/mina/SMTPCommandDispatcherIoHandler.java) URL: http://svn.apache.org/viewvc/james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/mina/SMTPIoHandler.java?p2=james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/mina/SMTPIoHandler.java&p1=james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/mina/SMTPCommandDispatcherIoHandler.java&r1=825071&r2=825085&rev=825085&view=diff ============================================================================== --- james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/mina/SMTPCommandDispatcherIoHandler.java (original) +++ james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/mina/SMTPIoHandler.java Wed Oct 14 11:12:39 2009 @@ -19,45 +19,40 @@ package org.apache.james.smtpserver.mina; -import java.util.Arrays; import java.util.LinkedList; import java.util.List; import org.apache.commons.logging.Log; -import org.apache.james.smtpserver.CommandHandler; import org.apache.james.smtpserver.ConnectHandler; +import org.apache.james.smtpserver.LineHandler; import org.apache.james.smtpserver.SMTPConfiguration; import org.apache.james.smtpserver.SMTPHandlerChain; import org.apache.james.smtpserver.SMTPRequest; -import org.apache.james.smtpserver.SMTPResponse; -import org.apache.james.smtpserver.SMTPRetCode; import org.apache.james.smtpserver.SMTPSession; -import org.apache.james.smtpserver.core.UnknownCmdHandler; -import org.apache.james.socket.shared.AbstractCommandDispatcher; -import org.apache.james.socket.shared.ExtensibleHandler; -import org.apache.james.socket.shared.WiringException; -import org.apache.mina.core.service.IoHandler; +import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.ssl.SslContextFactory; -public class SMTPCommandDispatcherIoHandler extends - AbstractCommandDispatcher<CommandHandler> implements ExtensibleHandler, - IoHandler { - private final static String SMTP_SESSION = "com.googlecode.asyncmail.smtpserver.SMTPCommandDispatcherIoHandler.SMTP_SESSION"; - private final UnknownCmdHandler unknownCmdHandler = new UnknownCmdHandler(); - private final static String[] mandatoryCommands = { "MAIL", "RCPT", "QUIT" }; +/** + * This IoHandler handling the calling of ConnectHandler and LineHandlers + * + * + */ +public class SMTPIoHandler extends IoHandlerAdapter{ + private final static String SMTP_SESSION = "org.apache.james.smtpserver.mina.SMTPIoHandler.SMTP_SESSION"; + private Log logger; private SMTPHandlerChain chain; private SMTPConfiguration conf; private SslContextFactory contextFactory; - public SMTPCommandDispatcherIoHandler(SMTPHandlerChain chain, + public SMTPIoHandler(SMTPHandlerChain chain, SMTPConfiguration conf, Log logger) { this(chain,conf,logger,null); } - public SMTPCommandDispatcherIoHandler(SMTPHandlerChain chain, + public SMTPIoHandler(SMTPHandlerChain chain, SMTPConfiguration conf, Log logger, SslContextFactory contextFactory) { this.chain = chain; this.conf = conf; @@ -65,10 +60,6 @@ this.contextFactory = contextFactory; } - - public void init() throws Exception { - wireCommandHandler(); - } /** * @see org.apache.james.socket.shared.AbstractCommandDispatcher#getLog() @@ -77,43 +68,23 @@ return logger; } - @Override - protected List<String> getMandatoryCommands() { - return Arrays.asList(mandatoryCommands); - } - /** - * @see org.apache.james.socket.shared.AbstractCommandDispatcher#getUnknownCommandHandler() - */ - protected CommandHandler getUnknownCommandHandler() { - return unknownCmdHandler; - } /** - * @see org.apache.james.socket.shared.AbstractCommandDispatcher#getUnknownCommandHandlerIdentifier() + * @see org.apache.mina.core.service.IoHandlerAdapter#messageReceived(org.apache.mina.core.session.IoSession, java.lang.Object) */ - protected String getUnknownCommandHandlerIdentifier() { - return UnknownCmdHandler.UNKNOWN_COMMAND; - } - - /** - * @see org.apache.james.socket.shared.ExtensibleHandler#getMarkerInterfaces() - */ - public List<Class<?>> getMarkerInterfaces() { - List<Class<?>> res = new LinkedList<Class<?>>(); - res.add(CommandHandler.class); - res.add(ConnectHandler.class); - return res; - } - - - protected void wireCommandHandler() throws WiringException { - List<CommandHandler> chandlers = chain.getHandlers(CommandHandler.class); - List<Class<?>> markerInterfaces = getMarkerInterfaces(); - for (int i = 0; i < markerInterfaces.size(); i++) { - wireExtensions(markerInterfaces.get(i), chandlers); + public void messageReceived(IoSession session, Object message) + throws Exception { + SMTPSession smtpSession = (SMTPSession) session.getAttribute(SMTP_SESSION); + LinkedList<LineHandler> lineHandlers = chain.getHandlers(LineHandler.class); + if (lineHandlers.size() > 0) { + // thats not really optimal but it allow us to keep things as generic as possible + // Will prolly get refactored later + byte[] line = ((SMTPRequest) message).toString().getBytes("US-ASCII"); + ((LineHandler) lineHandlers.getLast()).onLine(smtpSession, line); } } + /** * @see org.apache.mina.core.service.IoHandler#exceptionCaught(org.apache.mina.core.session.IoSession, * java.lang.Throwable) @@ -128,68 +99,6 @@ } /** - * @see org.apache.mina.core.service.IoHandler#messageReceived(org.apache.mina.core.session.IoSession, - * java.lang.Object) - */ - public void messageReceived(IoSession session, Object message) - throws Exception { - if (message instanceof SMTPRequest) { - SMTPRequest request = (SMTPRequest) message; - SMTPSession smtpSession = (SMTPSession) session - .getAttribute(SMTP_SESSION); - List<CommandHandler> commandHandlers = getCommandHandlers(request - .getCommand(), smtpSession); - // fetch the command handlers registered to the command - if (commandHandlers == null) { - // end the session - SMTPResponse resp = new SMTPResponse(SMTPRetCode.LOCAL_ERROR, - "Local configuration error: unable to find a command handler."); - resp.setEndSession(true); - session.write(resp); - } else { - int count = commandHandlers.size(); - for (int i = 0; i < count; i++) { - SMTPResponse response = commandHandlers.get(i).onCommand( - smtpSession, request); - - // if the response is received, stop processing of command - // handlers - if (response != null) { - session.write(response); - break; - } - - // NOTE we should never hit this line, otherwise we ended - // the - // CommandHandlers with - // no responses. - // (The note is valid for i == count-1) - } - - } - - } else { - logger.error("Invalid message object"); - } - - } - - /** - * Not implemented - */ - public void messageSent(IoSession session, Object message) throws Exception { - // Nothing todo here - } - - /** - * Not implemented - */ - public void sessionClosed(IoSession session) throws Exception { - // Nothing todo here - - } - - /** * @see org.apache.mina.core.service.IoHandler#sessionCreated(org.apache.mina.core.session.IoSession) */ public void sessionCreated(IoSession session) throws Exception { Modified: james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/mina/SMTPSessionImpl.java URL: http://svn.apache.org/viewvc/james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/mina/SMTPSessionImpl.java?rev=825085&r1=825084&r2=825085&view=diff ============================================================================== --- james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/mina/SMTPSessionImpl.java (original) +++ james/server/sandbox/active/mina_experiments/smtpserver-function/src/main/java/org/apache/james/smtpserver/mina/SMTPSessionImpl.java Wed Oct 14 11:12:39 2009 @@ -287,8 +287,7 @@ session.suspendRead(); SslFilter filter = new SslFilter(context); resetState(); - session.getFilterChain() - .addFirst("sslFilter", filter); + session.getFilterChain().addFirst("sslFilter", filter); session.resumeRead(); } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org