Author: bago
Date: Fri Apr  7 02:15:34 2006
New Revision: 392227

URL: http://svn.apache.org/viewcvs?rev=392227&view=rev
Log:
Make SMTP message queuing configurable (as an Handler) (JAMES-469)

Added:
    james/server/trunk/src/java/org/apache/james/smtpserver/SendMailHandler.java
Modified:
    james/server/trunk/src/conf/james-config.xml
    james/server/trunk/src/java/org/apache/james/smtpserver/DataCmdHandler.java
    james/server/trunk/src/java/org/apache/james/smtpserver/EhloCmdHandler.java
    james/server/trunk/src/java/org/apache/james/smtpserver/HeloCmdHandler.java
    james/server/trunk/src/java/org/apache/james/smtpserver/MailCmdHandler.java
    james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java
    james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java
    
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java
    james/server/trunk/src/java/org/apache/james/smtpserver/SMTPServer.java
    james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java
    
james/server/trunk/src/java/org/apache/james/smtpserver/UnknownCmdHandler.java
    
james/server/trunk/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java
    james/server/trunk/src/test/org/apache/james/test/util/Util.java

Modified: james/server/trunk/src/conf/james-config.xml
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/conf/james-config.xml?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/conf/james-config.xml (original)
+++ james/server/trunk/src/conf/james-config.xml Fri Apr  7 02:15:34 2006
@@ -742,6 +742,12 @@
                 <headervalue>passed</headervalue>
             </handler>
             -->
+            
+            <!--  The default message receiving handler -->
+            <!--  The default behaviour is to put the message in the root 
processor of -->
+            <!--  the spooler -->
+            <handler class="org.apache.james.smtpserver.SendMailHandler">
+            </handler>
          </handlerchain>
             
       </handler>

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/DataCmdHandler.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/DataCmdHandler.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/DataCmdHandler.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/DataCmdHandler.java 
Fri Apr  7 02:15:34 2006
@@ -60,10 +60,6 @@
 
     // Keys used to store/lookup data in the internal state hash map
 
-    private final static String SENDER = "SENDER_ADDRESS";     // Sender's 
email address
-    private final static String MESG_FAILED = "MESG_FAILED";   // Message 
failed flag
-    private final static String RCPT_LIST = "RCPT_LIST";   // The message 
recipients
-
     /**
      * The mail attribute holding the SMTP AUTH user name, if any.
      */
@@ -74,11 +70,11 @@
      */
     private final static char[] SMTPTerminator = { '\r', '\n', '.', '\r', '\n' 
};
 
-    /*
+    /**
      * process DATA command
      *
      * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
-    **/
+     */
     public void onCommand(SMTPSession session) {
         doDATA(session, session.getCommandArgument());
     }
@@ -98,10 +94,10 @@
             responseString = "500 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" 
Unexpected argument provided with DATA command";
             session.writeResponse(responseString);
         }
-        if (!session.getState().containsKey(SENDER)) {
+        if (!session.getState().containsKey(SMTPSession.SENDER)) {
             responseString = "503 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" No sender 
specified";
             session.writeResponse(responseString);
-        } else if (!session.getState().containsKey(RCPT_LIST)) {
+        } else if (!session.getState().containsKey(SMTPSession.RCPT_LIST)) {
             responseString = "503 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" No 
recipients specified";
             session.writeResponse(responseString);
         } else {
@@ -144,7 +140,7 @@
                     // logging of extra lines of data
                     // that are sent after the size limit has
                     // been hit.
-                    session.getState().put(MESG_FAILED, Boolean.TRUE);
+                    session.getState().put(SMTPSession.MESG_FAILED, 
Boolean.TRUE);
                     // then let the client know that the size
                     // limit has been hit.
                     responseString = "552 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_MSG_TOO_BIG)+" Error 
processing message: "
@@ -152,7 +148,7 @@
                     StringBuffer errorBuffer =
                         new StringBuffer(256)
                             .append("Rejected message from ")
-                            .append(session.getState().get(SENDER).toString())
+                            
.append(session.getState().get(SMTPSession.SENDER).toString())
                             .append(" from host ")
                             .append(session.getRemoteHost())
                             .append(" (")
@@ -193,8 +189,8 @@
         if (!headers.isSet(RFC2822Headers.DATE)) {
             headers.setHeader(RFC2822Headers.DATE, rfc822DateFormat.format(new 
Date()));
         }
-        if (!headers.isSet(RFC2822Headers.FROM) && 
session.getState().get(SENDER) != null) {
-            headers.setHeader(RFC2822Headers.FROM, 
session.getState().get(SENDER).toString());
+        if (!headers.isSet(RFC2822Headers.FROM) && 
session.getState().get(SMTPSession.SENDER) != null) {
+            headers.setHeader(RFC2822Headers.FROM, 
session.getState().get(SMTPSession.SENDER).toString());
         }
         // RFC 2821 says that we cannot examine the message to see if
         // Return-Path headers are present.  If there is one, our
@@ -222,14 +218,14 @@
                         .append(") with SMTP ID ")
                         .append(session.getSessionID());
 
-        if (((Collection) session.getState().get(RCPT_LIST)).size() == 1) {
+        if (((Collection) 
session.getState().get(SMTPSession.RCPT_LIST)).size() == 1) {
             // Only indicate a recipient if they're the only recipient
             // (prevents email address harvesting and large headers in
             //  bulk email)
             newHeaders.addHeaderLine(headerLineBuffer.toString());
             headerLineBuffer.delete(0, headerLineBuffer.length());
             headerLineBuffer.append("          for <")
-                            .append(((List) 
session.getState().get(RCPT_LIST)).get(0).toString())
+                            .append(((List) 
session.getState().get(SMTPSession.RCPT_LIST)).get(0).toString())
                             .append(">;");
             newHeaders.addHeaderLine(headerLineBuffer.toString());
             headerLineBuffer.delete(0, headerLineBuffer.length());
@@ -264,10 +260,10 @@
         List recipientCollection = null;
         try {
             headersIn = new ByteArrayInputStream(headers.toByteArray());
-            recipientCollection = (List) session.getState().get(RCPT_LIST);
+            recipientCollection = (List) 
session.getState().get(SMTPSession.RCPT_LIST);
             mail =
                 new 
MailImpl(session.getConfigurationData().getMailServer().getId(),
-                             (MailAddress) session.getState().get(SENDER),
+                             (MailAddress) 
session.getState().get(SMTPSession.SENDER),
                              recipientCollection,
                              new SequenceInputStream(new 
SequenceInputStream(headersIn, msgIn),
                                      new ReaderInputStream(new 
StringReader("\r\n"))));

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/EhloCmdHandler.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/EhloCmdHandler.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/EhloCmdHandler.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/EhloCmdHandler.java 
Fri Apr  7 02:15:34 2006
@@ -37,11 +37,6 @@
     private final static String COMMAND_NAME = "EHLO";
 
     /**
-     * The helo mode set in state object
-     */
-    private final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; // 
HELO or EHLO
-
-    /**
      * set checkValidHelo to false as default value
      */
     private boolean checkValidEhlo = false;
@@ -97,7 +92,7 @@
             session.writeResponse(responseString);
         } else if (badEhlo == false){
             session.resetState();
-            session.getState().put(CURRENT_HELO_MODE, COMMAND_NAME);
+            session.getState().put(SMTPSession.CURRENT_HELO_MODE, 
COMMAND_NAME);
 
             ArrayList esmtpextensions = new ArrayList();
 

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/HeloCmdHandler.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/HeloCmdHandler.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/HeloCmdHandler.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/HeloCmdHandler.java 
Fri Apr  7 02:15:34 2006
@@ -36,11 +36,6 @@
     private final static String COMMAND_NAME = "HELO";
 
     /**
-     * The key used to store helo mode
-     */
-    private final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; // 
HELO or EHLO
-
-    /**
      * set checkValidHelo to false as default value
      */
     private boolean checkValidHelo = false;
@@ -98,7 +93,7 @@
             getLogger().info(responseString);
         } else if (badHelo == false) {
             session.resetState();
-            session.getState().put(CURRENT_HELO_MODE, COMMAND_NAME);
+            session.getState().put(SMTPSession.CURRENT_HELO_MODE, 
COMMAND_NAME);
             session.getResponseBuffer().append("250 ")
                           
.append(session.getConfigurationData().getHelloName())
                           .append(" Hello ")

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/MailCmdHandler.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/MailCmdHandler.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/MailCmdHandler.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/MailCmdHandler.java 
Fri Apr  7 02:15:34 2006
@@ -42,13 +42,6 @@
 
     private final static String MESG_SIZE = "MESG_SIZE"; // The size of the 
message
 
-    private final static String SENDER = "SENDER_ADDRESS";     // Sender's 
email address
-
-    /**
-     * The helo mode set in state object
-     */
-    private final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; // 
HELO or EHLO
-
     private boolean checkValidSenderDomain = false;
     
     /**
@@ -89,10 +82,10 @@
             sender = argument.substring(colonIndex + 1);
             argument = argument.substring(0, colonIndex);
         }
-        if (session.getState().containsKey(SENDER)) {
+        if (session.getState().containsKey(SMTPSession.SENDER)) {
             responseString = "503 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" Sender 
already specified";
             session.writeResponse(responseString);
-        } else if (!session.getState().containsKey(CURRENT_HELO_MODE)) {
+        } else if 
(!session.getState().containsKey(SMTPSession.CURRENT_HELO_MODE)) {
             responseString = "503 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" Need HELO 
or EHLO before MAIL";
             session.writeResponse(responseString);
         } else if (argument == null || 
!argument.toUpperCase(Locale.US).equals("FROM")
@@ -209,7 +202,7 @@
             }
             
             if (!badSenderDomain) {
-                session.getState().put(SENDER, senderAddress);
+                session.getState().put(SMTPSession.SENDER, senderAddress);
                 responseBuffer.append("250 
"+DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.ADDRESS_OTHER)+" Sender <")
                               .append(sender)
                               .append("> OK");
@@ -254,7 +247,7 @@
             StringBuffer errorBuffer =
                 new StringBuffer(256)
                     .append("Rejected message from ")
-                    .append(tempSender != null ? tempSender.toString() : null)
+                    .append(tempSender != null ? tempSender : null)
                     .append(" from host ")
                     .append(session.getRemoteHost())
                     .append(" (")

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/RcptCmdHandler.java 
Fri Apr  7 02:15:34 2006
@@ -38,8 +38,6 @@
     /**
      * The keys used to store sender and recepients in the SMTPSession state
      */
-    private final static String SENDER = "SENDER_ADDRESS";     // Sender's 
email address
-    private final static String RCPT_LIST = "RCPT_LIST";   // The message 
recipients
     private final static String RCPTCOUNT = "RCPT_COUNT";
     private int maxRcpt = 0;
     
@@ -82,7 +80,7 @@
             recipient = argument.substring(colonIndex + 1);
             argument = argument.substring(0, colonIndex);
         }
-        if (!session.getState().containsKey(SENDER)) {
+        if (!session.getState().containsKey(SMTPSession.SENDER)) {
             responseString = "503 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" Need MAIL 
before RCPT";
             session.writeResponse(responseString);
         } else if (argument == null || 
!argument.toUpperCase(Locale.US).equals("TO")
@@ -90,7 +88,7 @@
             responseString = "501 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_SYNTAX)+" Usage: 
RCPT TO:<recipient>";
             session.writeResponse(responseString);
         } else {
-            Collection rcptColl = (Collection) 
session.getState().get(RCPT_LIST);
+            Collection rcptColl = (Collection) 
session.getState().get(SMTPSession.RCPT_LIST);
             if (rcptColl == null) {
                 rcptColl = new ArrayList();
             }
@@ -174,7 +172,7 @@
                     // Identity verification checking
                     if (session.getConfigurationData().isVerifyIdentity()) {
                         String authUser = 
(session.getUser()).toLowerCase(Locale.US);
-                        MailAddress senderAddress = (MailAddress) 
session.getState().get(SENDER);
+                        MailAddress senderAddress = (MailAddress) 
session.getState().get(SMTPSession.SENDER);
 
                         if ((senderAddress == null) || 
(!authUser.equals(senderAddress.getUser())) ||
                             
(!session.getConfigurationData().getMailServer().isLocalServer(senderAddress.getHost())))
 {
@@ -262,7 +260,7 @@
             
             if (maxRcptReached == false) {
                 rcptColl.add(recipientAddress);
-                session.getState().put(RCPT_LIST, rcptColl);
+                session.getState().put(SMTPSession.RCPT_LIST, rcptColl);
                 responseBuffer.append("250 
"+DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.ADDRESS_VALID)+" Recipient <")
                               .append(recipient)
                               .append("> OK");
@@ -280,8 +278,8 @@
         } else if(null!=recipient) {
             sb.append(" [to:" + recipient + "]");
         }
-        if (null!=session.getState().get(SENDER)) {
-            sb.append(" [from:" + 
((MailAddress)session.getState().get(SENDER)).toInternetAddress().getAddress() 
+ "]");
+        if (null!=session.getState().get(SMTPSession.SENDER)) {
+            sb.append(" [from:" + 
((MailAddress)session.getState().get(SMTPSession.SENDER)).toInternetAddress().getAddress()
 + "]");
         }
         return sb.toString();
     } 

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java 
Fri Apr  7 02:15:34 2006
@@ -25,14 +25,11 @@
 import org.apache.james.Constants;
 import org.apache.james.util.CRLFTerminatedReader;
 import org.apache.james.util.InternetPrintWriter;
-import org.apache.james.util.mail.dsn.DSNStatus;
 import org.apache.james.util.watchdog.Watchdog;
 import org.apache.james.util.watchdog.WatchdogTarget;
 import org.apache.mailet.Mail;
 import org.apache.mailet.dates.RFC822DateFormat;
 
-import javax.mail.MessagingException;
-
 import java.io.BufferedInputStream;
 import java.io.BufferedWriter;
 import java.io.IOException;
@@ -43,7 +40,6 @@
 import java.net.Socket;
 import java.net.SocketException;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -74,12 +70,6 @@
     private final static String SOFTWARE_TYPE = "JAMES SMTP Server "
                                                  + Constants.SOFTWARE_VERSION;
 
-    // Keys used to store/lookup data in the internal state hash map
-    private final static String SENDER = "SENDER_ADDRESS";     // Sender's 
email address
-    private final static String MESG_FAILED = "MESG_FAILED";   // Message 
failed flag
-    private final static String RCPT_LIST = "RCPT_LIST";   // The message 
recipients
-    private final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; // 
HELO or EHLO
-
     /**
      * Static Random instance used to generate SMTP ids
      */
@@ -416,12 +406,6 @@
                   }
               }
 
-              //if the message is not aborted, then send Mail
-              if(mode == MESSAGE_RECEIVED_MODE) {
-                  getLogger().info("sending mail");
-                  sendMail(mail);
-              }
-
               //do the clean up
               if(mail != null) {
                   if (mail instanceof Disposable) {
@@ -593,73 +577,6 @@
     }
 
     /**
-     * delivers the mail to the spool.
-     *
-     * @param Mail the mail object
-     */
-    public void sendMail(Mail mail) {
-        String responseString = null;
-        try {
-            setMail(mail);
-            theConfigData.getMailServer().sendMail(mail);
-            Collection theRecipients = mail.getRecipients();
-            String recipientString = "";
-            if (theRecipients != null) {
-                recipientString = theRecipients.toString();
-            }
-            if (getLogger().isInfoEnabled()) {
-                StringBuffer infoBuffer =
-                     new StringBuffer(256)
-                         .append("Successfully spooled mail ")
-                         .append(mail.getName())
-                         .append(" from ")
-                         .append(mail.getSender())
-                         .append(" on ")
-                         .append(remoteIP)
-                         .append(" for ")
-                         .append(recipientString);
-                getLogger().info(infoBuffer.toString());
-            }
-         } catch (MessagingException me) {
-              // Grab any exception attached to this one.
-              Exception e = me.getNextException();
-              // If there was an attached exception, and it's a
-              // MessageSizeException
-              if (e != null && e instanceof MessageSizeException) {
-                   // Add an item to the state to suppress
-                   // logging of extra lines of data
-                   // that are sent after the size limit has
-                   // been hit.
-                   state.put(MESG_FAILED, Boolean.TRUE);
-                   // then let the client know that the size
-                   // limit has been hit.
-                   responseString = "552 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_MSG_TOO_BIG)+" Error 
processing message: "
-                             + e.getMessage();
-                   StringBuffer errorBuffer =
-                     new StringBuffer(256)
-                         .append("Rejected message from ")
-                         .append(state.get(SENDER).toString())
-                         .append(" from host ")
-                         .append(remoteHost)
-                         .append(" (")
-                         .append(remoteIP)
-                         .append(") exceeding system maximum message size of ")
-                         .append(theConfigData.getMaxMessageSize());
-                   getLogger().error(errorBuffer.toString());
-              } else {
-                   responseString = "451 
"+DSNStatus.getStatus(DSNStatus.TRANSIENT,DSNStatus.UNDEFINED_STATUS)+" Error 
processing message: "
-                             + me.getMessage();
-                   getLogger().error("Unknown error occurred while processing 
DATA.", me);
-              }
-              writeResponse(responseString);
-              return;
-         }
-         responseString = "250 
"+DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.CONTENT_OTHER)+" Message 
received";
-         writeResponse(responseString);
-    }
-
-
-    /**
      * @see org.apache.james.smtpserver.SMTPSession#writeResponse(String)
      */
     public void writeResponse(String respString) {
@@ -854,5 +771,4 @@
         mode = MESSAGE_ABORT_MODE;
     }
 
-
-}
+}
\ No newline at end of file

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java 
(original)
+++ 
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandlerChain.java 
Fri Apr  7 02:15:34 2006
@@ -21,32 +21,42 @@
 import java.util.List;
 import java.util.HashMap;
 import java.util.Locale;
+
+import org.apache.avalon.framework.configuration.Configurable;
 import org.apache.avalon.framework.configuration.Configuration;
 import org.apache.avalon.framework.configuration.ConfigurationException;
 import org.apache.avalon.framework.container.ContainerUtil;
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.avalon.framework.logger.LogEnabled;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.Serviceable;
 
 /**
   * The SMTPHandlerChain is per service object providing access
   * ConnectHandlers, Commandhandlers and message handlers
   */
-public class SMTPHandlerChain extends AbstractLogEnabled {
+public class SMTPHandlerChain extends AbstractLogEnabled implements 
Configurable, Serviceable {
 
     private HashMap commandHandlerMap = new HashMap();
     private ArrayList messageHandlers = new ArrayList();
     private ArrayList connectHandlers = new ArrayList();
 
     private final CommandHandler unknownHandler = new UnknownCmdHandler();
+    private ServiceManager serviceManager;
 
     private final static String[] mandatoryCommands = { "MAIL" , "RCPT", 
"DATA"};
 
+    public void service(ServiceManager arg0) throws ServiceException {
+        serviceManager = arg0;
+    }
+
 
     /**
      * loads the various handlers from the configuration
      * @param configuration configuration under handlerchain node
      */
-    void load(Configuration configuration) throws  ConfigurationException {
+    public void configure(Configuration configuration) throws  
ConfigurationException {
         addToMap(UnknownCmdHandler.UNKNOWN_COMMAND, unknownHandler);
         if(configuration != null) {
             Configuration[] children = configuration.getChildren("handler");
@@ -64,6 +74,9 @@
                                 
((LogEnabled)handler).enableLogging(getLogger());
                             }
 
+                            //servicing the handler
+                            ContainerUtil.service(handler,serviceManager);
+
                             //configure the handler
                             ContainerUtil.configure(handler,children[i]);
 
@@ -96,16 +109,20 @@
 
                         } catch (ClassNotFoundException ex) {
                            if (getLogger().isErrorEnabled()) {
-                               getLogger().error("Failed to add 
Commandhandler: " + className);
+                               getLogger().error("Failed to add 
Commandhandler: " + className,ex);
                            }
                         } catch (IllegalAccessException ex) {
                            if (getLogger().isErrorEnabled()) {
-                               getLogger().error("Failed to add 
Commandhandler: " + className);
+                               getLogger().error("Failed to add 
Commandhandler: " + className,ex);
                            }
                         } catch (InstantiationException ex) {
                            if (getLogger().isErrorEnabled()) {
-                               getLogger().error("Failed to add 
Commandhandler: " + className);
+                               getLogger().error("Failed to add 
Commandhandler: " + className,ex);
                            }
+                        } catch (ServiceException e) {
+                            if (getLogger().isErrorEnabled()) {
+                                getLogger().error("Failed to service 
Commandhandler: " + className,e);
+                            }
                         }
                     }
                 }
@@ -132,6 +149,13 @@
 
             if(!found) {
                 throw new ConfigurationException("No commandhandlers 
configured for mandatory commands");
+            }
+            
+            if (messageHandlers.size() == 0) {
+                if (getLogger().isErrorEnabled()) {
+                    getLogger().error("No messageHandler configured. Check 
that SendMailHandler is configured in the SMTPHandlerChain");
+                }
+                throw new ConfigurationException("No messageHandler 
configured");
             }
 
         }

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPServer.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/SMTPServer.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/SMTPServer.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/SMTPServer.java Fri 
Apr  7 02:15:34 2006
@@ -132,11 +132,14 @@
     private SMTPHandlerConfigurationData theConfigData
         = new SMTPHandlerConfigurationDataImpl();
 
+    private ServiceManager serviceManager;
+
     /**
      * @see 
org.apache.avalon.framework.service.Serviceable#service(ServiceManager)
      */
     public void service( final ServiceManager manager ) throws 
ServiceException {
         super.service( manager );
+        serviceManager = manager;
         mailetcontext = (MailetContext) 
manager.lookup("org.apache.mailet.MailetContext");
         mailServer = (MailServer) manager.lookup(MailServer.ROLE);
         users = (UsersRepository) manager.lookup(UsersRepository.ROLE);
@@ -218,8 +221,17 @@
             //set the logger
             ContainerUtil.enableLogging(handlerChain,getLogger());
 
+            try {
+                ContainerUtil.service(handlerChain,serviceManager);
+            } catch (ServiceException e) {
+                if (getLogger().isErrorEnabled()) {
+                    getLogger().error("Failed to service handlerChain",e);
+                }
+                throw new ConfigurationException("Failed to service 
handlerChain");
+            }
+            
             //read from the XML configuration and create and configure each of 
the handlers
-            handlerChain.load(handlerConfiguration.getChild("handlerchain"));
+            
ContainerUtil.configure(handlerChain,handlerConfiguration.getChild("handlerchain"));
 
         } else {
             mailetcontext.setAttribute(Constants.HELLO_NAME, "localhost");

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java 
Fri Apr  7 02:15:34 2006
@@ -32,6 +32,12 @@
 
 public interface SMTPSession {
 
+    // Keys used to store/lookup data in the internal state hash map
+    public final static String MESG_FAILED = "MESG_FAILED";   // Message 
failed flag
+    public final static String SENDER = "SENDER_ADDRESS";     // Sender's 
email address
+    public final static String RCPT_LIST = "RCPT_LIST";   // The message 
recipients
+    public final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; // 
HELO or EHLO
+
     /**
      * Writes response string to the client
      *

Added: 
james/server/trunk/src/java/org/apache/james/smtpserver/SendMailHandler.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/SendMailHandler.java?rev=392227&view=auto
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/smtpserver/SendMailHandler.java 
(added)
+++ 
james/server/trunk/src/java/org/apache/james/smtpserver/SendMailHandler.java 
Fri Apr  7 02:15:34 2006
@@ -0,0 +1,119 @@
+/***********************************************************************
+ * Copyright (c) 1999-2006 The Apache Software Foundation.             *
+ * All rights reserved.                                                *
+ * ------------------------------------------------------------------- *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you *
+ * may not use this file except in compliance with the License. You    *
+ * may obtain a copy of the License at:                                *
+ *                                                                     *
+ *     http://www.apache.org/licenses/LICENSE-2.0                      *
+ *                                                                     *
+ * Unless required by applicable law or agreed to in writing, software *
+ * distributed under the License is distributed on an "AS IS" BASIS,   *
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or     *
+ * implied.  See the License for the specific language governing       *
+ * permissions and limitations under the License.                      *
+ ***********************************************************************/
+
+package org.apache.james.smtpserver;
+
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.Serviceable;
+import org.apache.james.services.MailServer;
+import org.apache.james.util.mail.dsn.DSNStatus;
+import org.apache.mailet.Mail;
+
+import javax.mail.MessagingException;
+
+import java.util.Collection;
+
+
+/**
+  * Adds the header to the message
+  */
+public class SendMailHandler
+    extends AbstractLogEnabled
+    implements MessageHandler, Serviceable {
+
+    private MailServer mailServer;
+
+    /**
+     * @see 
org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
+     */
+    public void service(ServiceManager serviceManager) throws ServiceException 
{
+        mailServer = (MailServer) serviceManager.lookup(MailServer.ROLE);
+    }
+
+    /**
+     * Adds header to the message
+     * @see org.apache.james.smtpserver#onMessage(SMTPSession)
+     */
+    public void onMessage(SMTPSession session) {
+        getLogger().info("sending mail");
+
+        Mail mail = session.getMail();
+        
+        String responseString = null;
+        try {
+            mailServer.sendMail(mail);
+            Collection theRecipients = mail.getRecipients();
+            String recipientString = "";
+            if (theRecipients != null) {
+                recipientString = theRecipients.toString();
+            }
+            if (getLogger().isInfoEnabled()) {
+                StringBuffer infoBuffer =
+                     new StringBuffer(256)
+                         .append("Successfully spooled mail ")
+                         .append(mail.getName())
+                         .append(" from ")
+                         .append(mail.getSender())
+                         .append(" on ")
+                         .append(session.getRemoteIPAddress())
+                         .append(" for ")
+                         .append(recipientString);
+                getLogger().info(infoBuffer.toString());
+            }
+         } catch (MessagingException me) {
+              // Grab any exception attached to this one.
+              Exception e = me.getNextException();
+              // If there was an attached exception, and it's a
+              // MessageSizeException
+              if (e != null && e instanceof MessageSizeException) {
+                   // Add an item to the state to suppress
+                   // logging of extra lines of data
+                   // that are sent after the size limit has
+                   // been hit.
+                   session.getState().put(SMTPSession.MESG_FAILED, 
Boolean.TRUE);
+                   // then let the client know that the size
+                   // limit has been hit.
+                   responseString = "552 
"+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_MSG_TOO_BIG)+" Error 
processing message: "
+                             + e.getMessage();
+                   StringBuffer errorBuffer =
+                     new StringBuffer(256)
+                         .append("Rejected message from ")
+                         
.append(session.getState().get(SMTPSession.SENDER).toString())
+                         .append(" from host ")
+                         .append(session.getRemoteHost())
+                         .append(" (")
+                         .append(session.getRemoteIPAddress())
+                         .append(") exceeding system maximum message size of ")
+                         
.append(session.getConfigurationData().getMaxMessageSize());
+                   getLogger().error(errorBuffer.toString());
+              } else {
+                   responseString = "451 
"+DSNStatus.getStatus(DSNStatus.TRANSIENT,DSNStatus.UNDEFINED_STATUS)+" Error 
processing message: "
+                             + me.getMessage();
+                   getLogger().error("Unknown error occurred while processing 
DATA.", me);
+              }
+              session.writeResponse(responseString);
+              return;
+         }
+         responseString = "250 
"+DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.CONTENT_OTHER)+" Message 
received";
+         session.writeResponse(responseString);
+
+    
+    }
+
+}

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/UnknownCmdHandler.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/java/org/apache/james/smtpserver/UnknownCmdHandler.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/smtpserver/UnknownCmdHandler.java 
(original)
+++ 
james/server/trunk/src/java/org/apache/james/smtpserver/UnknownCmdHandler.java 
Fri Apr  7 02:15:34 2006
@@ -30,12 +30,6 @@
     public static final String UNKNOWN_COMMAND = "UNKNOWN";
 
     /**
-     * Message failed flag to indicate if there is any failure
-     */
-    private final static String MESG_FAILED = "MESG_FAILED";
-
-
-    /**
      * Handler method called upon receipt of an unrecognized command.
      * Returns an error response and logs the command.
      *
@@ -44,7 +38,7 @@
     public void onCommand(SMTPSession session) {
 
         //If there was message failure, don't consider it as an unknown command
-        if (session.getState().get(MESG_FAILED) != null) {
+        if (session.getState().get(SMTPSession.MESG_FAILED) != null) {
             return;
         }
 

Modified: 
james/server/trunk/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- 
james/server/trunk/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java
 (original)
+++ 
james/server/trunk/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java
 Fri Apr  7 02:15:34 2006
@@ -109,23 +109,24 @@
         handlerConfig.addChild(Util.getValuedConfiguration("authRequired", 
m_authorizingMode));
         if (m_verifyIdentity) 
handlerConfig.addChild(Util.getValuedConfiguration("verifyIdentity", "" + 
m_verifyIdentity));
         
-        
handlerConfig.addChild(Util.createRemoteManagerHandlerChainConfiguration());
+        handlerConfig.addChild(Util.createSMTPHandlerChainConfiguration());
         
         // Add Configuration for Helo checks and Ehlo checks
         Configuration[] heloConfig = 
handlerConfig.getChild("handlerchain").getChildren("handler");
         for (int i = 0; i < heloConfig.length; i++) {
             if (heloConfig[i] instanceof DefaultConfiguration) {
-                String cmd = ((DefaultConfiguration) 
heloConfig[i]).getAttribute("command");
-                if ("HELO".equals(cmd)) {
-                    ((DefaultConfiguration) 
heloConfig[i]).addChild(Util.getValuedConfiguration("checkValidHelo",m_heloResolv+""));
     
-                } else if ("EHLO".equals(cmd)) {
-                    ((DefaultConfiguration) 
heloConfig[i]).addChild(Util.getValuedConfiguration("checkValidEhlo",m_ehloResolv+""));
-                } else if ("MAIL".equals(cmd)) {
-                    ((DefaultConfiguration) 
heloConfig[i]).addChild(Util.getValuedConfiguration("checkValidSenderDomain",m_senderDomainResolv+""));
-                } else if ("RCPT".equals(cmd)) {
-                    ((DefaultConfiguration) 
heloConfig[i]).addChild(Util.getValuedConfiguration("maxRcpt",m_maxRcpt+""));
+                String cmd = ((DefaultConfiguration) 
heloConfig[i]).getAttribute("command",null);
+                if (cmd != null) {
+                    if ("HELO".equals(cmd)) {
+                        ((DefaultConfiguration) 
heloConfig[i]).addChild(Util.getValuedConfiguration("checkValidHelo",m_heloResolv+""));
     
+                    } else if ("EHLO".equals(cmd)) {
+                        ((DefaultConfiguration) 
heloConfig[i]).addChild(Util.getValuedConfiguration("checkValidEhlo",m_ehloResolv+""));
+                    } else if ("MAIL".equals(cmd)) {
+                        ((DefaultConfiguration) 
heloConfig[i]).addChild(Util.getValuedConfiguration("checkValidSenderDomain",m_senderDomainResolv+""));
+                    } else if ("RCPT".equals(cmd)) {
+                        ((DefaultConfiguration) 
heloConfig[i]).addChild(Util.getValuedConfiguration("maxRcpt",m_maxRcpt+""));
+                    }
                 }
-                
             }
         }
         

Modified: james/server/trunk/src/test/org/apache/james/test/util/Util.java
URL: 
http://svn.apache.org/viewcvs/james/server/trunk/src/test/org/apache/james/test/util/Util.java?rev=392227&r1=392226&r2=392227&view=diff
==============================================================================
--- james/server/trunk/src/test/org/apache/james/test/util/Util.java (original)
+++ james/server/trunk/src/test/org/apache/james/test/util/Util.java Fri Apr  7 
02:15:34 2006
@@ -33,6 +33,10 @@
     }
 
     public static DefaultConfiguration 
createRemoteManagerHandlerChainConfiguration() {
+        DefaultConfiguration handlerChainConfig = new 
DefaultConfiguration("test");
+        return handlerChainConfig;
+    }
+    public static DefaultConfiguration createSMTPHandlerChainConfiguration() {
         DefaultConfiguration handlerChainConfig = new 
DefaultConfiguration("handlerchain");
         handlerChainConfig.addChild(createCommandHandlerConfiguration("HELO", 
HeloCmdHandler.class));
         handlerChainConfig.addChild(createCommandHandlerConfiguration("EHLO", 
EhloCmdHandler.class));
@@ -45,14 +49,19 @@
         handlerChainConfig.addChild(createCommandHandlerConfiguration("RSET", 
RsetCmdHandler.class));
         handlerChainConfig.addChild(createCommandHandlerConfiguration("HELP", 
HelpCmdHandler.class));
         handlerChainConfig.addChild(createCommandHandlerConfiguration("QUIT", 
QuitCmdHandler.class));
+        // mail sender
+        handlerChainConfig.addChild(createCommandHandlerConfiguration(null, 
SendMailHandler.class));
         return handlerChainConfig;
     }
 
     private static DefaultConfiguration 
createCommandHandlerConfiguration(String command, Class commandClass) {
         DefaultConfiguration cmdHandlerConfig = new 
DefaultConfiguration("handler");
-        cmdHandlerConfig.setAttribute("command", command);
+        if (command != null) {
+            cmdHandlerConfig.setAttribute("command", command);
+        }
         String classname = commandClass.getName();
         cmdHandlerConfig.setAttribute("class", classname);
         return cmdHandlerConfig;
     }
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to