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]