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]

Reply via email to