I have checked out from the trunk and ported all the Commandhandlers. There are calls mapping to old code so that latest code (changed since i checked out) can be ported easily. By mappings what I mean is To port 'state' variable, I added getSessionState() method to SMTPSession.
This was not part of my original design. These will be deprecated in the next version. Right now I am testing thoroughly. I can provide this first version of the code for review this weekend. How can I check in the code as I dont have priveleges? Summary of changes made: 1. SMTPServer ----------------------- configure method (LogEnabled)cmdMap).enableLogging(getLogger()); cmdMap.load(handlerConfiguration.getChild("commandmap")); newHandler() method theHandler.setCommandHandlerMap(cmdMap); 2. *NEW* class CommandHandlerMap --------------------------------------------------------- loads the commandHandlers from the config file. CommandHandlerMap public class CommandHandlerMap extends AbstractLogEnabled { void load(Configuration configuration) throws ConfigurationException { addToMap(unknownHandler.getCommandName(), unknownHandler); if(configuration != null) { Configuration[] children = configuration.getChildren("commandhandler"); if ( children != null ) { ClassLoader classLoader = getClass().getClassLoader(); for ( int i = 0 ; i < children.length ; i++ ) { String commandName = children[i].getAttribute("name"); String className = children[i].getAttribute("class"); if(className != null) { try { CommandHandler cmdHandler = (CommandHandler)classLoader.loadClass(className).newInstance(); //configure the command handler cmdHandler.configure(children[i]); addToMap(commandName, cmdHandler); ... ... }}} ArrayList getCommandHandlers(String command) { ... ... return handlers; } } SMTPHandler ------------------- The SMTPHandler parses command and checks if there are any commandHandlers handleConnection method ArrayList handlers = cmdMap.getCommandHandlers(curCommandName); int count = handlers.size(); for(int i = 0; i < count; i++) { if(session.isSessionEnded()) { break; } ((CommandHandler)handlers.get(i)).processCommand(session); } The config file config.xml ------------------------------------ <handler> .. .. <commandmap> <commandhandler name="HELP" class="org.apache.james.smtpserver.HelpCmdHandler"></commandhandler> <commandhandler name="MAIL" class="org.apache.james.smtpserver.MailCmdHandler"></commandhandler> <commandhandler name="RCPT" class="org.apache.james.smtpserver.RcptCmdHandler"></commandhandler> <commandhandler name="EHLO" class="org.apache.james.smtpserver.EhloCmdHandler"></commandhandler> <commandhandler name="HELO" class="org.apache.james.smtpserver.HeloCmdHandler"></commandhandler> <commandhandler name="RSET" class="org.apache.james.smtpserver.RsetCmdHandler"></commandhandler> <commandhandler name="VRFY" class="org.apache.james.smtpserver.VrfyCmdHandler"></commandhandler> <commandhandler name="EXPN" class="org.apache.james.smtpserver.ExpnCmdHandler"></commandhandler> <commandhandler name="QUIT" class="org.apache.james.smtpserver.QuitCmdHandler"></commandhandler> <commandhandler name="AUTH" class="org.apache.james.smtpserver.AuthCmdHandler"></commandhandler> <commandhandler name="DATA" class="org.apache.james.smtpserver.DataCmdHandler"></commandhandler> </commandmap> </handler> SMTPSession --------------------- The SMTPSession Interface looks like this package org.apache.james.smtpserver; import org.apache.james.core.MailHeaders; import org.apache.james.core.MailImpl; import java.net.Socket; import org.apache.avalon.framework.logger.AbstractLogEnabled; import java.util.HashMap; import java.io.IOException; import java.io.InputStream; import org.apache.james.util.watchdog.Watchdog; import org.apache.avalon.framework.logger.Logger; public interface SMTPSession { //Write Response void writeResponse(String respString); //Register connectionhandlers to handle Message void registerMessageHandler(ConnectHandler connHandler); //Register commandhandlers to handle Message void registerMessageHandler(CommandHandler cmdHandler); //Command sequence handling void addCommandSequenceMap(String command, String[] predecessorCmds, String failMessage); boolean isCommandAllowed(String cmdString); //State information String getSender(); String[] getRecepients(); String setSender(String sender); String addRecepient(String recepient); String addRecepient(String[] recepients); String removeRecepient(String[] recepient); String removeRecepient(String recepient); String getCommandName(); String getCommandArgument(); MailImpl getMessage(); //whether we should return just the socket(??) String getRemoteHost(); String getRemoteIPAddress(); //Message state modified void startMessage(); void endMessage(); void abortMessage(); //Message state modifier void endSession(); void startSession(); void abortSession(); boolean isSessionEnded(); //TO be deprecated HashMap getState(); void resetState(); public String readCommandLine() throws IOException; Logger getLogger(); StringBuffer getResponseBuffer(); String clearResponseBuffer(); SMTPHandlerConfigurationData getConfigurationData(); boolean isBlockListed(); boolean isRelayingAllowed(); boolean isAuthRequired(); String getUser(); void setUser(String user); Watchdog getWatchdog(); InputStream getInputStream(); String getSessionID(); } -- Anagha --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]