You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by Anagha Mudigonda <an...@yahoo.com> on 2005/06/15 18:57:55 UTC

suggestions to http://wiki.apache.org/james/FastFail

Danny and Noel,

I would like to contribute in arriving at a
lightweight in-protocol
framework that is *reasonably* extensible and
configurable. I tweaked
the interfaces little bit and there are two major
deviations from the
proposals put forth at
http://wiki.apache.org/james/FastFail. 

1. Response interface is dropped as it is making the
design less
flexible apart from adding up configuration
complexity. Moreover the
Response object should also indicate if the session
should be 
terminated
or not.
2. There is no separate MessageHandler interface
because message is not
an independent entity and is always associate with a
command. Hence the
message processing is included as a method (onMessage)
in 
CommandHandler
class itself.

Here are the framework classes and config.xml from my
second iteration
and I am not completely convinced yet. Am thinking
coding a simple
command-line app emulating SMTP commands to evaluate
the extensiblility
of the interfaces.

Class design
------------

The framework consists of 3 core interfaces -
ProtocolHandler,
CommandHandler and Rule.
ProtocolHandler: delegates the command and message
processing to
appropriate command handlers. Also ensures that all
the configured 
rules
are applied. Protocol handler maintains the state of
the protocol
session. Example: SMTPHandler

CommandHandler: the actual command and message
processing is done here.
The command provides methods to access command
arguments and message.
These access methods are used by Rule objects.

Rule: Rules can be applied as soon as the client
initiates connection.
These are known as connection rules. The Command rules
are applied
before processing command after. The Message rules
that are applied
after message is processed and before accepting for
delivery.


details 
-------

A set of framework classes placed under a new package
org.apache.james.protocol

ProtocolHandler {
    //configure and add command
    void addCommand(Command cmdHandler);

    //configure and rules
    void addRule(Rule rule);
    void addRule(Rule rule, Command cmdHandler);

    //get rules
    Rules[] getConnectionRules();
    Rules[] getCommandRules(Command cmdHamdler);
    Rules[] getMessageRules(Command cmdHandler);

    //get all the registered command handlers
    CommandHandler[] getCommandHandlers();

    //state info
    boolean isCommandAllowed(String cmdName);
    void SetCommandStatus(String cmdName, boolean
status);
    CommandHandler getCurrentCommandHandler()

    //access function used by command and message
processing
    InputStream getInputStream();
    InputStream getOutputStream();
    String nextCommand();
}    


public interface CommandHandler {
    configure(...);//
    void onCommand(String cmdStr); //for command
processing
    boolean waitForMessage(); //if message is expected
for the command
    void onMessage(); //for message processing
    byte[] getMessage(); //return message buffer

    String getName(); //get command Name
    String getArgument(); //return the arguments for
the command
    void setProtocolHandler(ProtocolHandler handler);
// to access to
I/O and state 
    boolean equals(String cmdString);//to check if the
command string
can be processed by the handler
}

public interface Rule {
    public final type; // 3 types rules as mentioned
    void apply() throws Exception;//continue session
if there is no
exception
    configure(..); //configure the rule 
}


Configuration
-------------
Here is a sample configuration (config.xml) that shows
how command
handlers and various rules can configured.

<Protocol name= "SMTP"
class="org.apache.james.smtp.SMTPHandler">

<!-DNS black lists and white lists
<Rule name="DNSRBL" type=connection class =
"org.apache.james.smtp.DNSRBLRule">
config..
</Rule>

<!-the RCPT command has no associated message -->
<commandHandler name="RCPT"
class="org.apache.james.smtp.MailHandler">
<rule name="Recepients" type="command"
class=""org.apache.james.smtp.RecepientRule" > 
config..
</rule>
<rule name="userQuota" type="command"
class=""org.apache.james.smtp.userQuotoRule" > 
config..
</rule>
</commandHandler>

<!-the DATA command and associated message rules -->
<commandHandler name="DATA"
class=="org.apache.james.smtp.DATAHandler">
<rule name="SpamRule" type="message"
class=""org.apache.james.smtp.SpamRule" > 
config..
</rule>
<rule name="MessageSize" type="message"
class=""org.apache.james.smtp.MessageSizeRule" > 
config..
</rule>
<rule name="your custom handlers" type="message"
class=""MYCustomRule" 
>

config..
</rule>
</commandHandler>

</protocol>


SMTPHandler implementation example
----------------------------------
SMTPHandler implements the ProtocolHandler interface.

///initialization steps
read config.xml
create and configure command objects
create and configure connection rules
create and configure command and message rules

////processing commands and messages
//get all connection rules and apply
Rules[] connectionRules = getConnectionRules();
for(int i = 0;  i < connectionRules.length; i++) {
    connectionRules[i].apply();
}

while(true) {
    //Get matching command handler
    cmdString = nextComand();
    Command[] commands = getCommands();
    Command currCmd = null;
    for(int i = 0; i < commands.length; i++)
    {
        if(commands[i].equals(cmdString))
        {
            currCmd = commands[i];
            break;
        }
    }
    //handle command and message
    if(currCmd == null) //command not supported
    else {
        //apply command rules
        Rules[] commandRules =
getCommandRules(currCmd);
        for(int i = 0; i < commandRules.length; i++) {
            commandRules[i].apply();
        }
                     
        currCmd.onCommand(); //process command
        //if there is no associate message stop
        if(!currCmd.waitForMessage()) continue;
        //else process message
        currCmd.onMessage();
              
        //apply message rules
        Rules[] msgRules = getMessageRules(currCmd);
        for(int i = 0; i < msgRules.length; i++) {
            msgRulesRules[i].apply();
        }
    }





		
__________________________________ 
Discover Yahoo! 
Find restaurants, movies, travel and more fun for the weekend. Check it out! 
http://discover.yahoo.com/weekend.html 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org