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 no...@apache.org on 2006/12/25 18:31:12 UTC

svn commit: r490155 [1/3] - in /james/server/sandbox/handlerapi-experiment/src: java/org/apache/james/core/ java/org/apache/james/nntpserver/ java/org/apache/james/pop3server/ java/org/apache/james/remotemanager/ java/org/apache/james/smtpserver/ java/...

Author: norman
Date: Mon Dec 25 09:31:07 2006
New Revision: 490155

URL: http://svn.apache.org/viewvc?view=rev&rev=490155
Log:
Commit the changes of Stefano for IO handling and some fixes of tests etc. See JAMES-750

Added:
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/LineHandler.java   (with props)
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPResponse.java   (with props)
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/util/CRLFDelimitedByteBuffer.java   (with props)
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/util/mail/SMTPRetCode.java   (with props)
Modified:
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/core/AbstractJamesHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/nntpserver/NNTPHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Handler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Session.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/remotemanager/RemoteManagerHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/CommandHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPServer.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPSession.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AuthCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/ExpnCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HelpCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/NoopCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RsetCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/UnknownCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/VrfyCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/DataFilterCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/EhloFilterCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/HeloFilterCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/MailFilterCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/RcptFilterCmdHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/AbstractJunkHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/DNSRBLHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/GreylistHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/MaxRcptHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/ResolvableEhloHeloHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/SPFHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/SupressDuplicateRcptHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/TarpitHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/ValidRcptHandler.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/ValidRcptMX.java
    james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/fastfail/ValidSenderDomainHandler.java
    james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/AbstractSMTPSession.java
    james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java
    james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/MaxRcptHandlerTest.java
    james/server/sandbox/handlerapi-experiment/src/test/org/apache/james/smtpserver/SMTPServerTest.java

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/core/AbstractJamesHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/core/AbstractJamesHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/core/AbstractJamesHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/core/AbstractJamesHandler.java Mon Dec 25 09:31:07 2006
@@ -31,7 +31,7 @@
 import org.apache.james.imapserver.debug.CopyInputStream;
 import org.apache.james.imapserver.debug.SplitOutputStream;
 import org.apache.james.services.DNSServer;
-import org.apache.james.util.CRLFTerminatedReader;
+import org.apache.james.util.CRLFDelimitedByteBuffer;
 import org.apache.james.util.InternetPrintWriter;
 import org.apache.james.util.watchdog.Watchdog;
 import org.apache.james.util.watchdog.WatchdogTarget;
@@ -74,11 +74,11 @@
      * The incoming stream of bytes coming from the socket.
      */
     protected InputStream in;
-
+    
     /**
-     * The reader associated with incoming characters.
+     * Manage inputstream as a bytebuffer
      */
-    protected CRLFTerminatedReader inReader;
+    private CRLFDelimitedByteBuffer bytebufferHandler;
 
     /**
      * The socket's output stream
@@ -159,8 +159,8 @@
                 outs = new SplitOutputStream(outs, new FileOutputStream(tcplogprefix+"out"));
                 in = new CopyInputStream(in, new FileOutputStream(tcplogprefix+"in"));
             }
-            inReader = new CRLFTerminatedReader(in, "ASCII");
-            
+            bytebufferHandler = new CRLFDelimitedByteBuffer();
+
             out = new InternetPrintWriter(outs, true);
         } catch (RuntimeException e) {
             StringBuffer exceptionBuffer = 
@@ -211,15 +211,15 @@
         }
 
         // Clear the streams
-        try {
-            if (inReader != null) {
-                inReader.close();
-            }
-        } catch (IOException ioe) {
-            getLogger().warn("Handler: Unexpected exception occurred while closing reader: " + ioe);
-        } finally {
-            inReader = null;
-        }
+//        try {
+//            if (inReader != null) {
+//                inReader.close();
+//            }
+//        } catch (IOException ioe) {
+//            getLogger().warn("Handler: Unexpected exception occurred while closing reader: " + ioe);
+//        } finally {
+//            inReader = null;
+//        }
 
         in = null;
 
@@ -449,6 +449,25 @@
 
     public void setDnsServer(DNSServer dnsServer) {
         this.dnsServer = dnsServer;
+    }
+
+
+    public final byte[] readInputLine() throws IOException {
+        byte[] buffer = new byte[1000];
+        while (bytebufferHandler.isEmpty()) {
+            int length = in.read(buffer);
+            bytebufferHandler.write(buffer, length);
+        }
+        return bytebufferHandler.read();
+    }
+    
+    public final String readInputLineAsString() throws IOException {
+        byte[] buffer = new byte[1000];
+        while (bytebufferHandler.isEmpty()) {
+            int length = in.read(buffer);
+            bytebufferHandler.write(buffer, length);
+        }
+        return bytebufferHandler.readString();
     }
 
 }

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/nntpserver/NNTPHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/nntpserver/NNTPHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/nntpserver/NNTPHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/nntpserver/NNTPHandler.java Mon Dec 25 09:31:07 2006
@@ -282,7 +282,7 @@
         }
 
         theWatchdog.start();
-        while (parseCommand(inReader.readLine())) {
+        while (parseCommand(new String(readInputLine(), "US-ASCII"))) {
             theWatchdog.reset();
         }
         theWatchdog.stop();

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Handler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Handler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Handler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Handler.java Mon Dec 25 09:31:07 2006
@@ -26,7 +26,7 @@
 import org.apache.james.core.AbstractJamesHandler;
 import org.apache.james.core.MailImpl;
 import org.apache.james.services.MailRepository;
-import org.apache.james.util.CRLFTerminatedReader;
+import org.apache.james.util.CRLFDelimitedByteBuffer;
 import org.apache.james.util.watchdog.Watchdog;
 import org.apache.mailet.Mail;
 
@@ -208,7 +208,13 @@
           mode = COMMAND_MODE;
 
           //parse the command
-          String cmdString =  readCommandLine();
+          String cmdString = null;
+          try {
+              cmdString = readInputLineAsString();
+          } catch (CRLFDelimitedByteBuffer.TerminationException te) {
+              writeLoggedFlushedResponse("-ERR Syntax error at character position " + te.position() + ". CR and LF must be CRLF paired.  See RFC 1939 #3.");
+          }
+
           if (cmdString == null) {
               break;
           }
@@ -303,24 +309,6 @@
 
         // Clear config data
         theConfigData = null;
-    }
-
-    /**
-     * Reads a line of characters off the command line.
-     *
-     * @return the trimmed input line
-     * @throws IOException if an exception is generated reading in the input characters
-     */
-    public final String readCommandLine() throws IOException {
-        for (;;) try {
-            String commandLine = inReader.readLine();
-            if (commandLine != null) {
-                commandLine = commandLine.trim();
-            }
-            return commandLine;
-        } catch (CRLFTerminatedReader.TerminationException te) {
-            writeLoggedFlushedResponse("-ERR Syntax error at character position " + te.position() + ". CR and LF must be CRLF paired.  See RFC 1939 #3.");
-        }
     }
 
     /**

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Session.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Session.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Session.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/pop3server/POP3Session.java Mon Dec 25 09:31:07 2006
@@ -25,7 +25,6 @@
 import org.apache.james.services.MailRepository;
 import org.apache.james.util.watchdog.Watchdog;
 
-import java.io.IOException;
 import java.io.OutputStream;
 import java.util.HashMap;
 import java.util.List;
@@ -43,14 +42,6 @@
      * @param respString String that needs to send to the client
      */
     void writeResponse(String respString);
-
-    /**
-     * Reads a line of characters off the command line.
-     *
-     * @return the trimmed input line
-     * @throws IOException if an exception is generated reading in the input characters
-     */
-    String readCommandLine() throws IOException;
 
 
     /**

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/remotemanager/RemoteManagerHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/remotemanager/RemoteManagerHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/remotemanager/RemoteManagerHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/remotemanager/RemoteManagerHandler.java Mon Dec 25 09:31:07 2006
@@ -151,9 +151,9 @@
                 writeLoggedFlushedResponse(message);
             }
             writeLoggedFlushedResponse("Login id:");
-            login = inReader.readLine().trim();
+            login = readInputLineAsString().trim();
             writeLoggedFlushedResponse("Password:");
-            password = inReader.readLine().trim();
+            password = readInputLineAsString().trim();
         } while (!password.equals(theConfigData.getAdministrativeAccountData().get(login)) || password.length() == 0);
 
         StringBuffer messageBuffer =
@@ -176,7 +176,7 @@
             out.print(theConfigData.getPrompt());
             out.flush();
             theWatchdog.start();
-            while (parseCommand(inReader.readLine())) {
+            while (parseCommand(readInputLineAsString())) {
                 theWatchdog.reset();
                 out.print(theConfigData.getPrompt());
                 out.flush();

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/CommandHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/CommandHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/CommandHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/CommandHandler.java Mon Dec 25 09:31:07 2006
@@ -35,7 +35,7 @@
     /**
      * Handle the command
     **/
-    void onCommand(SMTPSession session);
+    SMTPResponse onCommand(SMTPSession session, String command, String parameters);
 
     /**
      * Return a Collection of implemented commands

Added: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/LineHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/LineHandler.java?view=auto&rev=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/LineHandler.java (added)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/LineHandler.java Mon Dec 25 09:31:07 2006
@@ -0,0 +1,32 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you 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;
+
+/**
+ * Custom line handlers must implement this interface
+ */
+public interface LineHandler {
+     
+    /**
+     * Handle the command
+    **/
+    void onLine(SMTPSession session, byte[] line);
+    
+}

Propchange: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/LineHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPHandler.java Mon Dec 25 09:31:07 2006
@@ -24,17 +24,17 @@
 import org.apache.avalon.framework.container.ContainerUtil;
 import org.apache.james.Constants;
 import org.apache.james.core.AbstractJamesHandler;
-import org.apache.james.util.CRLFTerminatedReader;
-import org.apache.james.util.watchdog.Watchdog;
+import org.apache.james.util.CRLFDelimitedByteBuffer;
 import org.apache.mailet.Mail;
 import org.apache.mailet.dates.RFC822DateFormat;
 
 import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
+import java.io.UnsupportedEncodingException;
+import java.net.Socket;
 import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -48,7 +48,7 @@
  */
 public class SMTPHandler
     extends AbstractJamesHandler
-    implements SMTPSession {
+    implements SMTPSession, LineHandler {
 
     /**
      * The constants to indicate the current processing mode of the session
@@ -142,15 +142,6 @@
     private SMTPHandlerConfigurationData theConfigData;
 
     /**
-     * The hash map that holds variables for the SMTP message transfer in progress.
-     *
-     * This hash map should only be used to store variable set in a particular
-     * set of sequential MAIL-RCPT-DATA commands, as described in RFC 2821.  Per
-     * connection values should be stored as member variables in this class.
-     */
-    private HashMap state = new HashMap();
-
-    /**
      * The hash map holds states which should be used in the whole connection
      */
     private HashMap connectionState = new HashMap();
@@ -161,6 +152,17 @@
     private StringBuffer responseBuffer = new StringBuffer(256);
     
     private boolean stopHandlerProcessing = false;
+    
+    /**
+     * If not null every line is sent to this command handler instead
+     * of the default "command parsing -> dipatching" procedure.
+     */
+    private LinkedList lineHandlers;
+
+    protected void initHandler(Socket connection) throws IOException {
+        super.initHandler(connection);
+        pushLineHandler(this); 
+    }
 
     /**
      * Set the configuration data for the handler
@@ -183,10 +185,11 @@
         relayingAllowed = theConfigData.isRelayingAllowed(remoteIP);
         authRequired = theConfigData.isAuthRequired(remoteIP);
         heloEhloEnforcement = theConfigData.useHeloEhloEnforcement();
-        sessionEnded = false;
         smtpGreeting = theConfigData.getSMTPGreeting();
-        resetState();
-        resetConnectionState();
+        // Both called in resetHandler, we don't need to call them again here.
+        // sessionEnded = false;
+        // resetState();
+        // resetConnectionState();
 
         // if no greeting was configured use a default
         if (smtpGreeting == null) {
@@ -251,40 +254,21 @@
           mode = COMMAND_MODE;
 
           //parse the command
-          String cmdString =  readCommandLine();
-          if (cmdString == null) {
-              break;
-          }
-          int spaceIndex = cmdString.indexOf(" ");
-          if (spaceIndex > 0) {
-              curCommandName = cmdString.substring(0, spaceIndex);
-              curCommandArgument = cmdString.substring(spaceIndex + 1);
-          } else {
-              curCommandName = cmdString;
+          byte[] line =  null;
+          try {
+              line = readInputLine();
+          } catch (CRLFDelimitedByteBuffer.TerminationException e) {
+              writeLoggedFlushedResponse("501 Syntax error at character position " + e.position() + ". CR and LF must be CRLF paired.  See RFC 2821 #2.7.1.");
+          } catch (CRLFDelimitedByteBuffer.LineLengthExceededException e) {
+              writeLoggedFlushedResponse("500 Line length exceeded. See RFC 2821 #4.5.3.1.");
           }
-          curCommandName = curCommandName.toUpperCase(Locale.US);
-
-          //fetch the command handlers registered to the command
-          List commandHandlers = handlerChain.getCommandHandlers(curCommandName);
-          if(commandHandlers == null) {
-              //end the session
+          if (line == null) {
               break;
-          } else {
-              int count = commandHandlers.size();
-              for(int i = 0; i < count; i++) {
-                  setStopHandlerProcessing(false);
-                  ((CommandHandler)commandHandlers.get(i)).onCommand(this);
-                  
-                  theWatchdog.reset();
-                  
-                  //if the response is received, stop processing of command handlers
-                  if(mode != COMMAND_MODE || getStopHandlerProcessing()) {
-                      break;
-                  }
-              }
-
           }
 
+          ((LineHandler) lineHandlers.getLast()).onLine(this, line);
+          theWatchdog.reset();
+          
           //handle messages
           if(mode == MESSAGE_RECEIVED_MODE) {
               try {
@@ -303,16 +287,8 @@
                   if(mail != null) {
                       ContainerUtil.dispose(mail);
               
-                      // remember the ehlo mode
-                      Object currentHeloMode = state.get(CURRENT_HELO_MODE);
-              
                       mail = null;
                       resetState();
-
-                      // start again with the old helo mode
-                      if (currentHeloMode != null) {
-                          state.put(CURRENT_HELO_MODE,currentHeloMode);
-                      }
                   }
               }
           }
@@ -322,18 +298,97 @@
     }
 
     /**
+     * @see org.apache.james.smtpserver.LineHandler#onLine(org.apache.james.smtpserver.SMTPSession, byte[])
+     */
+    public void onLine(SMTPSession session, byte[] line) {
+        String cmdString;
+        try {
+            cmdString = new String(line, "US-ASCII");
+            if (cmdString != null) {
+                cmdString = cmdString.trim();
+            }
+            
+            int spaceIndex = cmdString.indexOf(" ");
+            if (spaceIndex > 0) {
+                curCommandName = cmdString.substring(0, spaceIndex);
+                curCommandArgument = cmdString.substring(spaceIndex + 1);
+            } else {
+                curCommandName = cmdString;
+            }
+            curCommandName = curCommandName.toUpperCase(Locale.US);
+
+            //fetch the command handlers registered to the command
+            List commandHandlers = handlerChain.getCommandHandlers(curCommandName);
+            if(commandHandlers == null) {
+                //end the session
+                sessionEnded = true;
+            } else {
+                int count = commandHandlers.size();
+                for(int i = 0; i < count; i++) {
+                    setStopHandlerProcessing(false);
+                    SMTPResponse response = ((CommandHandler)commandHandlers.get(i)).onCommand(this, curCommandName, curCommandArgument);
+                    
+                    writeSMTPResponse(response);
+                    
+                    //if the response is received, stop processing of command handlers
+                    if(mode != COMMAND_MODE || response != null) {
+                        break;
+                    }
+                }
+
+            }        
+        } catch (UnsupportedEncodingException e) {
+            // TODO Define what to do
+            e.printStackTrace();
+        }
+    }
+
+    /*
+     * @see org.apache.james.smtpserver.SMTPSession#writeSMTPResponse(org.apache.james.smtpserver.SMTPResponse)
+     */
+    public void writeSMTPResponse(SMTPResponse response) {
+        // Write a single-line or multiline response
+        if (response != null) {
+            if (response.getRawLine() != null) {
+                writeResponse(response.getRawLine());
+            } else {
+                // Iterator i = esmtpextensions.iterator();
+                for (int k = 0; k < response.getLines().size(); k++) {
+                    responseBuffer.append(response.getRetCode());
+                    if (k == response.getLines().size() - 1) {
+                        responseBuffer.append(" ");
+                    } else {
+                        responseBuffer.append("-");
+                    }
+                    responseBuffer.append(response.getLines().get(k));
+                    writeResponse(clearResponseBuffer());
+                }
+            }
+            
+            if (response.isEndSession()) {
+                endSession();
+            }
+        }
+    }
+    
+    /**
      * Resets the handler data to a basic state.
      */
     protected void resetHandler() {
-        resetState();
+        // not needed anymore because state is inside the connection state
+        // resetState();
         resetConnectionState();
 
+        // empty any previous line handler and add self (command dispatcher)
+        // as the default.
+        lineHandlers = null;
+        pushLineHandler(this);
+
         clearResponseBuffer();
 
-        remoteHost = null;
-        remoteIP = null;
         authenticatedUser = null;
         smtpID = null;
+        sessionEnded = false;
     }
 
    /**
@@ -407,28 +462,41 @@
     }
 
     /**
-     * @see org.apache.james.smtpserver.SMTPSession#isSessionEnded()
-     */
-    public boolean isSessionEnded() {
-        return sessionEnded;
-    }
-
-    /**
      * @see org.apache.james.smtpserver.SMTPSession#resetState()
      */
     public void resetState() {
-        ArrayList recipients = (ArrayList)state.get(RCPT_LIST);
-        if (recipients != null) {
-            recipients.clear();
+        // We already clear the map, it should be enough
+//        ArrayList recipients = (ArrayList)state.get(RCPT_LIST);
+//        if (recipients != null) {
+//            recipients.clear();
+//        }
+        // remember the ehlo mode between resets
+        Object currentHeloMode = getState().get(CURRENT_HELO_MODE);
+
+        getState().clear();
+
+        // start again with the old helo mode
+        if (currentHeloMode != null) {
+            getState().put(CURRENT_HELO_MODE,currentHeloMode);
         }
-        state.clear();
     }
 
     /**
+     * The hash map that holds variables for the SMTP message transfer in progress.
+     *
+     * This hash map should only be used to store variable set in a particular
+     * set of sequential MAIL-RCPT-DATA commands, as described in RFC 2821.  Per
+     * connection values should be stored as member variables in this class.
+     * 
      * @see org.apache.james.smtpserver.SMTPSession#getState()
      */
     public Map getState() {
-        return state;
+        Object res = getConnectionState().get(SMTPSession.SESSION_STATE_MAP);
+        if (res == null || !(res instanceof Map)) {
+            res = new HashMap();
+            getConnectionState().put(SMTPSession.SESSION_STATE_MAP, res);
+        }
+        return (Map) res;
     }
 
     /**
@@ -494,38 +562,6 @@
         return responseString;
     }
 
-
-    /**
-     * @see org.apache.james.smtpserver.SMTPSession#readCommandLine()
-     */
-    public final String readCommandLine() throws IOException {
-        for (;;) try {
-            String commandLine = inReader.readLine();
-            if (commandLine != null) {
-                commandLine = commandLine.trim();
-            }
-            return commandLine;
-        } catch (CRLFTerminatedReader.TerminationException te) {
-            writeLoggedFlushedResponse("501 Syntax error at character position " + te.position() + ". CR and LF must be CRLF paired.  See RFC 2821 #2.7.1.");
-        } catch (CRLFTerminatedReader.LineLengthExceededException llee) {
-            writeLoggedFlushedResponse("500 Line length exceeded. See RFC 2821 #4.5.3.1.");
-        }
-    }
-
-    /**
-     * @see org.apache.james.smtpserver.SMTPSession#getWatchdog()
-     */
-    public Watchdog getWatchdog() {
-        return theWatchdog;
-    }
-
-    /**
-     * @see org.apache.james.smtpserver.SMTPSession#getInputStream()
-     */
-    public InputStream getInputStream() {
-        return in;
-    }
-
     /**
      * @see org.apache.james.smtpserver.SMTPSession#getSessionID()
      */
@@ -547,8 +583,8 @@
         int count = 0;
 
         // check if the key exists
-        if (state.get(SMTPSession.RCPT_LIST) != null) {
-            count = ((Collection) state.get(SMTPSession.RCPT_LIST)).size();
+        if (getState().get(SMTPSession.RCPT_LIST) != null) {
+            count = ((Collection) getState().get(SMTPSession.RCPT_LIST)).size();
         }
 
         return count;
@@ -572,8 +608,30 @@
         connectionState.clear();
     }
     
+    /**
+     * @see org.apache.james.smtpserver.SMTPSession#getConnectionState()
+     */
     public Map getConnectionState() {
         return connectionState;
+    }
+
+    /**
+     * @see org.apache.james.smtpserver.SMTPSession#popLineHandler()
+     */
+    public void popLineHandler() {
+        if (lineHandlers != null) {
+            lineHandlers.removeLast();
+        }
+    }
+
+    /**
+     * @see org.apache.james.smtpserver.SMTPSession#pushLineHandler(org.apache.james.smtpserver.LineHandler)
+     */
+    public void pushLineHandler(LineHandler lineHandler) {
+        if (lineHandlers == null) {
+            lineHandlers = new LinkedList();
+        }
+        lineHandlers.addLast(lineHandler);
     }
 
 }

Added: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPResponse.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPResponse.java?view=auto&rev=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPResponse.java (added)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPResponse.java Mon Dec 25 09:31:07 2006
@@ -0,0 +1,98 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you 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 java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Contains an SMTP result
+ */
+public class SMTPResponse {
+
+    private String retCode = null;
+    private List lines = null;
+    private String rawLine = null;
+    private boolean endSession = false;
+    
+    public SMTPResponse() {
+        
+    }
+    
+    public SMTPResponse(String code, String description) {
+        this.setRetCode(code);
+        this.appendLine(description);
+    }
+    
+    public SMTPResponse(String code, StringBuffer description) {
+        this.setRetCode(code);
+        this.appendLine(description);
+    }
+    
+    public SMTPResponse(String rawLine) {
+	String args[] = rawLine.split(" ");
+	if (args != null && args.length > 1) {
+	    this.setRetCode(args[0]);
+	    this.appendLine(new StringBuffer(rawLine.substring(args[0].length()+1)));
+	} else {
+	    // TODO: Throw exception ?
+	}
+        this.rawLine = rawLine;
+    }
+    
+    public void appendLine(String line) {
+        if (lines == null) {
+            lines = new LinkedList();
+        }
+        lines.add(line);
+    }
+    
+    public void appendLine(StringBuffer line) {
+        if (lines == null) {
+            lines = new LinkedList();
+        }
+        lines.add(line);
+    }
+
+    public String getRetCode() {
+        return retCode;
+    }
+
+    public void setRetCode(String retCode) {
+        this.retCode = retCode;
+    }
+
+    public List getLines() {
+        return lines;
+    }
+
+    public String getRawLine() {
+        return rawLine;
+    }
+
+    public boolean isEndSession() {
+        return endSession;
+    }
+
+    public void setEndSession(boolean endSession) {
+        this.endSession = endSession;
+    }
+
+}
\ No newline at end of file

Propchange: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPResponse.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPServer.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPServer.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPServer.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPServer.java Mon Dec 25 09:31:07 2006
@@ -338,7 +338,7 @@
          * @see org.apache.james.smtpserver.SMTPHandlerConfigurationData#isAuthRequired(String)
          */
         public boolean isAuthRequired(String remoteIP) {
-              if (SMTPServer.this.authRequired == AUTH_ANNOUNCE) return true;
+            if (SMTPServer.this.authRequired == AUTH_ANNOUNCE) return true;
             boolean authRequired = SMTPServer.this.authRequired != AUTH_DISABLED;
             if (authorizedNetworks != null) {
                 authRequired = authRequired && !SMTPServer.this.authorizedNetworks.matchInetNetwork(remoteIP);

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPSession.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPSession.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPSession.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/SMTPSession.java Mon Dec 25 09:31:07 2006
@@ -22,11 +22,8 @@
 package org.apache.james.smtpserver;
 
 
-import org.apache.james.util.watchdog.Watchdog;
 import org.apache.mailet.Mail;
 
-import java.io.IOException;
-import java.io.InputStream;
 import java.util.Map;
 
 /**
@@ -43,6 +40,7 @@
     public final static String CURRENT_HELO_MODE = "CURRENT_HELO_MODE"; // HELO or EHLO
     public final static String CURRENT_HELO_NAME = "CURRENT_HELO_NAME"; 
     public static final Object CURRENT_RECIPIENT = "CURRENT_RECIPIENT"; // Current recipient
+    public final static String SESSION_STATE_MAP = "SESSION_STATE_MAP"; // the Session state 
 
     /**
      * Writes response string to the client
@@ -57,7 +55,7 @@
      * @return the trimmed input line
      * @throws IOException if an exception is generated reading in the input characters
      */
-    String readCommandLine() throws IOException;
+    // String readCommandLine() throws IOException;
 
 
     /**
@@ -76,13 +74,6 @@
     String clearResponseBuffer();
 
     /**
-     * Returns Inputstream for handling messages and commands
-     *
-     * @return InputStream object
-     */
-    InputStream getInputStream();
-
-    /**
      * Returns currently process command name
      *
      * @return current command name
@@ -137,13 +128,6 @@
     void endSession();
 
     /**
-     * Returns the session status
-     *
-     * @return if the session is open or closed
-     */
-    boolean isSessionEnded();
-
-    /**
      * Returns Map that consists of the state of the SMTPSession per mail
      *
      * @return map of the current SMTPSession state per mail
@@ -206,13 +190,6 @@
     void setUser(String user);
 
     /**
-     * Returns Watchdog object used for handling timeout
-     *
-     * @return Watchdog object
-     */
-    Watchdog getWatchdog();
-
-    /**
      * Returns the SMTP session id
      *
      * @return SMTP session id
@@ -240,12 +217,6 @@
      */
     boolean getStopHandlerProcessing();
     
-    
-    /**
-     * Reset the Connection state
-     */
-    void resetConnectionState();
-    
     /**
      * Returns Map that consists of the state of the SMTPSession per connection
      *
@@ -253,5 +224,20 @@
      */
     Map getConnectionState();
 
+    /**
+     * Put a new line handler in the chain
+     * @param overrideCommandHandler
+     */
+    void pushLineHandler(LineHandler overrideCommandHandler);
+    
+    /**
+     * Pop the last command handler 
+     */
+    void popLineHandler();
+
+    /**
+     * Write an SMTPResponse to the client
+     */
+    void writeSMTPResponse(SMTPResponse response);
 }
 

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AuthCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AuthCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AuthCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/AuthCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -22,6 +22,8 @@
 package org.apache.james.smtpserver.core;
 
 import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.LineHandler;
+import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
 import org.apache.james.util.mail.dsn.DSNStatus;
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
@@ -31,7 +33,7 @@
 import java.util.Locale;
 import java.util.StringTokenizer;
 import org.apache.james.util.Base64;
-import java.io.IOException;
+import java.io.UnsupportedEncodingException;
 
 
 /**
@@ -50,21 +52,14 @@
      * The text string for the SMTP AUTH type LOGIN.
      */
     private final static String AUTH_TYPE_LOGIN = "LOGIN";
-
+    
     /**
      * handles AUTH command
      *
      * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
      */
-    public void onCommand(SMTPSession session) {
-        //deviation from the Main code
-        //Instead of throwing exception just end the session
-        try{
-            doAUTH(session, session.getCommandArgument());
-        } catch (Exception ex) {
-            getLogger().error("Exception occured:" + ex.getMessage());
-            session.endSession();
-        }
+    public SMTPResponse onCommand(SMTPSession session, String command, String argument) {
+        return doAUTH(session, argument);
     }
 
 
@@ -76,16 +71,12 @@
      * @param session SMTP session
      * @param argument the argument passed in with the command by the SMTP client
      */
-    private void doAUTH(SMTPSession session, String argument)
-            throws Exception {
-        String responseString = null;
+    private SMTPResponse doAUTH(SMTPSession session, String argument) {
         if (session.getUser() != null) {
-            responseString = "503 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" User has previously authenticated. "
-                        + " Further authentication is not required!";
-            session.writeResponse(responseString);
+            return new SMTPResponse("503", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" User has previously authenticated. "
+                    + " Further authentication is not required!");
         } else if (argument == null) {
-            responseString = "501 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Usage: AUTH (authentication type) <challenge>";
-            session.writeResponse(responseString);
+            return new SMTPResponse("501", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Usage: AUTH (authentication type) <challenge>");
         } else {
             String initialResponse = null;
             if ((argument != null) && (argument.indexOf(" ") > 0)) {
@@ -94,14 +85,50 @@
             }
             String authType = argument.toUpperCase(Locale.US);
             if (authType.equals(AUTH_TYPE_PLAIN)) {
-                doPlainAuth(session, initialResponse);
-                return;
+                String userpass;
+                if (initialResponse == null) {
+                    session.pushLineHandler(new LineHandler() {
+
+                        public void onLine(SMTPSession session, byte[] line) {
+                            try {
+                                String l = new String(line, "US-ASCII");
+                                System.err.println("((("+line+")))");
+                                SMTPResponse res = doPlainAuthPass(session, l);
+                                session.writeSMTPResponse(res);
+                            } catch (UnsupportedEncodingException e) {
+                                // TODO should never happen
+                                e.printStackTrace();
+                            }
+                        }
+                        
+                    });
+                    return new SMTPResponse("334", "OK. Continue authentication");
+                } else {
+                    userpass = initialResponse.trim();
+                    return doPlainAuthPass(session, userpass);
+                }
             } else if (authType.equals(AUTH_TYPE_LOGIN)) {
-                doLoginAuth(session, initialResponse);
-                return;
+                
+                if (initialResponse == null) {
+                    session.pushLineHandler(new LineHandler() {
+
+                        public void onLine(SMTPSession session, byte[] line) {
+                            try {
+                                session.writeSMTPResponse(doLoginAuthPass(session, new String(line, "US-ASCII"), true));
+                            } catch (UnsupportedEncodingException e) {
+                                // TODO should never happen
+                                e.printStackTrace();
+                            }
+                        }
+                        
+                    });
+                    return new SMTPResponse("334", "VXNlcm5hbWU6"); // base64 encoded "Username:"
+                } else {
+                    String user = initialResponse.trim();
+                    return doLoginAuthPass(session, user, false);
+                }
             } else {
-                doUnknownAuth(session, authType, initialResponse);
-                return;
+                return doUnknownAuth(session, authType, initialResponse);
             }
         }
     }
@@ -120,16 +147,8 @@
      * @param session SMTP session object
      * @param initialResponse the initial response line passed in with the AUTH command
      */
-    private void doPlainAuth(SMTPSession session, String initialResponse)
-            throws IOException {
-        String userpass = null, user = null, pass = null, responseString = null;
-        if (initialResponse == null) {
-            responseString = "334 OK. Continue authentication";
-            session.writeResponse(responseString);
-            userpass = session.readCommandLine();
-        } else {
-            userpass = initialResponse.trim();
-        }
+    private SMTPResponse doPlainAuthPass(SMTPSession session, String userpass) {
+        String user = null, pass = null;
         try {
             if (userpass != null) {
                 userpass = Base64.decodeAsString(userpass);
@@ -182,21 +201,18 @@
             // Ignored - this exception in parsing will be dealt
             // with in the if clause below
         }
+        session.popLineHandler();
         // Authenticate user
         if ((user == null) || (pass == null)) {
-            responseString = "501 Could not decode parameters for AUTH PLAIN";
-            session.writeResponse(responseString);
+            return new SMTPResponse("501", "Could not decode parameters for AUTH PLAIN");
         } else if (session.getConfigurationData().getUsersRepository().test(user, pass)) {
             session.setUser(user);
-            responseString = "235 Authentication Successful";
-            session.writeResponse(responseString);
             getLogger().info("AUTH method PLAIN succeeded");
+            return new SMTPResponse("235", "Authentication Successful");
         } else {
-            responseString = "535 Authentication Failed";
-            session.writeResponse(responseString);
             getLogger().error("AUTH method PLAIN failed");
+            return new SMTPResponse("535", "Authentication Failed");
         }
-        return;
     }
 
     /**
@@ -205,16 +221,7 @@
      * @param session SMTP session object
      * @param initialResponse the initial response line passed in with the AUTH command
      */
-    private void doLoginAuth(SMTPSession session, String initialResponse)
-            throws IOException {
-        String user = null, pass = null, responseString = null;
-        if (initialResponse == null) {
-            responseString = "334 VXNlcm5hbWU6"; // base64 encoded "Username:"
-            session.writeResponse(responseString);
-            user = session.readCommandLine();
-        } else {
-            user = initialResponse.trim();
-        }
+    private SMTPResponse doLoginAuthPass(SMTPSession session, String user, boolean inCustomeHandler) {
         if (user != null) {
             try {
                 user = Base64.decodeAsString(user);
@@ -224,9 +231,33 @@
                 user = null;
             }
         }
-        responseString = "334 UGFzc3dvcmQ6"; // base64 encoded "Password:"
-        session.writeResponse(responseString);
-        pass = session.readCommandLine();
+        if (inCustomeHandler) {
+            session.popLineHandler();
+        }
+        session.pushLineHandler(new LineHandler() {
+
+            private String user;
+
+            public void onLine(SMTPSession session, byte[] line) {
+                try {
+                    doLoginAuthPassCheck(session, user, new String(line, "US-ASCII"));
+                } catch (UnsupportedEncodingException e) {
+                    // TODO should never happen
+                    e.printStackTrace();
+                }
+            }
+
+            public LineHandler setUser(String user) {
+                this.user = user;
+                return this;
+            }
+            
+        }.setUser(user));
+        return new SMTPResponse("334", "UGFzc3dvcmQ6"); // base64 encoded "Password:"
+    }
+    
+    private void doLoginAuthPassCheck(SMTPSession session, String user, String pass) {
+        String responseString = null;
         if (pass != null) {
             try {
                 pass = Base64.decodeAsString(pass);
@@ -251,6 +282,8 @@
             // TODO: Make this string a more useful error message
             getLogger().error("AUTH method LOGIN failed");
         }
+        session.popLineHandler();
+        session.popLineHandler();
         session.writeResponse(responseString);
         return;
     }
@@ -262,9 +295,7 @@
      * @param authType the unknown auth type
      * @param initialResponse the initial response line passed in with the AUTH command
      */
-    private void doUnknownAuth(SMTPSession session, String authType, String initialResponse) {
-        String responseString = "504 Unrecognized Authentication Type";
-        session.writeResponse(responseString);
+    private SMTPResponse doUnknownAuth(SMTPSession session, String authType, String initialResponse) {
         if (getLogger().isErrorEnabled()) {
             StringBuffer errorBuffer =
                 new StringBuffer(128)
@@ -273,7 +304,7 @@
                         .append(" is an unrecognized authentication type");
             getLogger().error(errorBuffer.toString());
         }
-        return;
+        return new SMTPResponse("504", "Unrecognized Authentication Type");
     }
 
 

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/DataCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -27,13 +27,14 @@
 import org.apache.james.core.MailImpl;
 import org.apache.james.fetchmail.ReaderInputStream;
 import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.LineHandler;
 import org.apache.james.smtpserver.MessageSizeException;
+import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
 import org.apache.james.smtpserver.SizeLimitedInputStream;
 import org.apache.james.util.CharTerminatedInputStream;
 import org.apache.james.util.DotStuffingInputStream;
 import org.apache.james.util.mail.dsn.DSNStatus;
-import org.apache.james.util.watchdog.BytesReadResetInputStream;
 import org.apache.mailet.MailAddress;
 import org.apache.mailet.RFC2822Headers;
 import org.apache.mailet.dates.RFC822DateFormat;
@@ -43,6 +44,9 @@
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
 import java.io.SequenceInputStream;
 import java.io.StringReader;
 import java.util.ArrayList;
@@ -89,8 +93,8 @@
      *
      * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
      */
-    public void onCommand(SMTPSession session) {
-        doDATA(session, session.getCommandArgument());
+    public SMTPResponse onCommand(SMTPSession session, String command, String parameters) {
+        return doDATA(session, parameters);
     }
 
 
@@ -102,16 +106,81 @@
      * @param session SMTP session object
      * @param argument the argument passed in with the command by the SMTP client
      */
-    private void doDATA(SMTPSession session, String argument) {
+    private SMTPResponse doDATA(SMTPSession session, String argument) {
+        PipedInputStream messageIn = new PipedInputStream();
+        Thread t = new Thread() {
+            private PipedInputStream in;
+            private SMTPSession session;
 
-        String responseString = null;
-        responseString = "354 Ok Send data ending with <CRLF>.<CRLF>";
-        session.writeResponse(responseString);
-        InputStream msgIn = new CharTerminatedInputStream(session
-                .getInputStream(), SMTPTerminator);
+            public void run() {
+                handleStream(session, in);
+            }
+
+            public Thread setParam(SMTPSession session, PipedInputStream in) {
+                this.in = in;
+                this.session = session;
+                return this;
+            }
+        }.setParam(session, messageIn);
+        
+        t.start();
+        
+        OutputStream out;
+        try {
+            out = new PipedOutputStream(messageIn);
+            session.pushLineHandler(new LineHandler() {
+
+                private OutputStream out;
+                private Thread worker;
+
+                public void onLine(SMTPSession session, byte[] line) {
+                    try {
+                        out.write(line);
+//                        out.write(13);
+//                        out.write(10);
+                        out.flush();
+                        // 46 is "."
+                        if (line.length == 3 && line[0] == 46) {
+                            try {
+                                worker.join();
+                            } catch (InterruptedException e) {
+                                // TODO Auto-generated catch block
+                                e.printStackTrace();
+                            }
+                        }
+                        
+                    } catch (IOException e) {
+                        // TODO Define what we have to do here!
+                        e.printStackTrace();
+                    }
+                }
+
+                public LineHandler setParam(OutputStream out, Thread t) {
+                    this.out = out;
+                    this.worker = t;
+                    return this;
+                };
+            
+            }.setParam(out,t));
+        } catch (IOException e1) {
+            // TODO Define what to do.
+            e1.printStackTrace();
+        }
+        
+        return new SMTPResponse("354", "Ok Send data ending with <CRLF>.<CRLF>");
+    }
+    
+
+    public void handleStream(SMTPSession session, InputStream stream) {
+        String responseString;
+        InputStream msgIn = new CharTerminatedInputStream(stream, SMTPTerminator);
         try {
-            msgIn = new BytesReadResetInputStream(msgIn, session.getWatchdog(),
-                    session.getConfigurationData().getResetLength());
+            // 2006/12/24 - We can remove this now that every single line is pushed and
+            // reset the watchdog already in the handler.
+            // This means we don't use resetLength anymore and we can remove
+            // watchdog from the SMTPSession interface
+            // msgIn = new BytesReadResetInputStream(msgIn, session.getWatchdog(),
+            //         session.getConfigurationData().getResetLength());
 
             // if the message size limit has been set, we'll
             // wrap msgIn with a SizeLimitedInputStream
@@ -168,6 +237,7 @@
                 getLogger().error(
                         "Unknown error occurred while processing DATA.", me);
             }
+            session.popLineHandler();
             session.writeResponse(responseString);
             return;
         } finally {
@@ -311,6 +381,8 @@
                 mail.setAttribute(SMTP_AUTH_NETWORK_NAME,"true");
             }
             
+            session.popLineHandler();
+            
             session.setMail(mail);
         } catch (MessagingException me) {
             // if we get here, it means that we received a
@@ -355,5 +427,6 @@
         
         return implCommands;
     }
+
 
 }

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/EhloCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -26,7 +26,9 @@
 
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
+import org.apache.james.util.mail.SMTPRetCode;
 
 /**
  * Handles EHLO command
@@ -44,8 +46,8 @@
      *
      * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
      **/
-    public void onCommand(SMTPSession session) {
-        doEHLO(session, session.getCommandArgument());
+    public SMTPResponse onCommand(SMTPSession session, String command, String arguments) {
+        return doEHLO(session, arguments);
     }
 
     /**
@@ -56,47 +58,34 @@
      * @param session SMTP session object
      * @param argument the argument passed in with the command by the SMTP client
      */
-    private void doEHLO(SMTPSession session, String argument) {
-        StringBuffer responseBuffer = session.getResponseBuffer();
-
+    private SMTPResponse doEHLO(SMTPSession session, String argument) {
+        SMTPResponse resp = new SMTPResponse();
+        resp.setRetCode(SMTPRetCode.MAIL_OK);
+        
         session.getConnectionState().put(SMTPSession.CURRENT_HELO_MODE, COMMAND_NAME);
 
-        ArrayList esmtpextensions = new ArrayList();
-
-        esmtpextensions.add(new StringBuffer(session.getConfigurationData()
+        resp.appendLine(new StringBuffer(session.getConfigurationData()
                 .getHelloName()).append(" Hello ").append(argument)
                 .append(" (").append(session.getRemoteHost()).append(" [")
-                .append(session.getRemoteIPAddress()).append("])").toString());
+                .append(session.getRemoteIPAddress()).append("])"));
 
         // Extension defined in RFC 1870
         long maxMessageSize = session.getConfigurationData()
                 .getMaxMessageSize();
         if (maxMessageSize > 0) {
-            esmtpextensions.add("SIZE " + maxMessageSize);
+            resp.appendLine("SIZE " + maxMessageSize);
         }
 
         if (session.isAuthRequired()) {
-            esmtpextensions.add("AUTH LOGIN PLAIN");
-            esmtpextensions.add("AUTH=LOGIN PLAIN");
+            resp.appendLine("AUTH LOGIN PLAIN");
+            resp.appendLine("AUTH=LOGIN PLAIN");
         }
 
-        esmtpextensions.add("PIPELINING");
-        esmtpextensions.add("ENHANCEDSTATUSCODES");
+        resp.appendLine("PIPELINING");
+        resp.appendLine("ENHANCEDSTATUSCODES");
         // see http://issues.apache.org/jira/browse/JAMES-419 
-        esmtpextensions.add("8BITMIME");
-
-        // Iterator i = esmtpextensions.iterator();
-        for (int i = 0; i < esmtpextensions.size(); i++) {
-            if (i == esmtpextensions.size() - 1) {
-                responseBuffer.append("250 ");
-                responseBuffer.append((String) esmtpextensions.get(i));
-                session.writeResponse(session.clearResponseBuffer());
-            } else {
-                responseBuffer.append("250-");
-                responseBuffer.append((String) esmtpextensions.get(i));
-                session.writeResponse(session.clearResponseBuffer());
-            }
-        }
+        resp.appendLine("8BITMIME");
+        return resp;
 
     }
     

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/ExpnCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/ExpnCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/ExpnCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/ExpnCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -25,6 +25,7 @@
 import java.util.Collection;
 
 import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
 import org.apache.james.util.mail.dsn.DSNStatus;
 
@@ -45,9 +46,8 @@
      *
      * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
      */
-    public void onCommand(SMTPSession session) {
-        String responseString = "502 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_NOT_CAPABLE)+" EXPN is not supported";
-        session.writeResponse(responseString);
+    public SMTPResponse onCommand(SMTPSession session, String command, String arguments) {
+        return new SMTPResponse("502", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_NOT_CAPABLE)+" EXPN is not supported");
     }
     
     /**

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HeloCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -27,6 +27,7 @@
 
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
 
 
@@ -45,25 +46,22 @@
      *
      * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
     **/
-    public void onCommand(SMTPSession session) {
-        doHELO(session, session.getCommandArgument());
+    public SMTPResponse onCommand(SMTPSession session, String command, String arguments) {
+        return doHELO(session, arguments);
     }
 
     /**
      * @param session SMTP session object
      * @param argument the argument passed in with the command by the SMTP client
      */
-    private void doHELO(SMTPSession session, String argument) {
-        String responseString = null;
-
+    private SMTPResponse doHELO(SMTPSession session, String argument) {
         session.getConnectionState().put(SMTPSession.CURRENT_HELO_MODE, COMMAND_NAME);
-        session.getResponseBuffer().append("250 ").append(
-                session.getConfigurationData().getHelloName())
+        StringBuffer response = new StringBuffer();
+        response.append(session.getConfigurationData().getHelloName())
                 .append(" Hello ").append(argument).append(" (").append(
                         session.getRemoteHost()).append(" [").append(
                         session.getRemoteIPAddress()).append("])");
-        responseString = session.clearResponseBuffer();
-        session.writeResponse(responseString);
+        return new SMTPResponse("250", response);
     }
     
     /**

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HelpCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HelpCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HelpCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/HelpCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -25,6 +25,7 @@
 import java.util.Collection;
 
 import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
 import org.apache.james.util.mail.dsn.DSNStatus;
 
@@ -43,9 +44,8 @@
      *
      * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
     **/
-    public void onCommand(SMTPSession session) {
-        String responseString = "502 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_NOT_CAPABLE)+" HELP is not supported";
-        session.writeResponse(responseString);
+    public SMTPResponse onCommand(SMTPSession session, String command, String arguments) {
+        return new SMTPResponse("502", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_NOT_CAPABLE)+" HELP is not supported");
     }
 
     /**

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/MailCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -26,6 +26,7 @@
 
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
 import org.apache.james.util.mail.dsn.DSNStatus;
 import org.apache.mailet.MailAddress;
@@ -43,8 +44,8 @@
      *
      * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
      */
-    public void onCommand(SMTPSession session) {
-        doMAIL(session, session.getCommandArgument());
+    public SMTPResponse onCommand(SMTPSession session, String command, String arguments) {
+        return doMAIL(session, arguments);
     }
 
 
@@ -55,21 +56,12 @@
      * @param session SMTP session object
      * @param argument the argument passed in with the command by the SMTP client
      */
-    private void doMAIL(SMTPSession session, String argument) {
-      
-        StringBuffer responseBuffer = session.getResponseBuffer();
-        String responseString = null;
-
-        MailAddress sender = (MailAddress) session.getState().get(
-                SMTPSession.SENDER);
-        responseBuffer.append(
-                "250 "
-                        + DSNStatus.getStatus(DSNStatus.SUCCESS,
-                                DSNStatus.ADDRESS_OTHER) + " Sender <").append(
-                sender).append("> OK");
-        responseString = session.clearResponseBuffer();
-        session.writeResponse(responseString);
-        
+    private SMTPResponse doMAIL(SMTPSession session, String argument) {
+        StringBuffer responseBuffer = new StringBuffer();
+        MailAddress sender = (MailAddress) session.getState().get(SMTPSession.SENDER);
+        responseBuffer.append(DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.ADDRESS_OTHER) + " Sender <")
+                .append(sender).append("> OK");
+        return new SMTPResponse("250", responseBuffer);
     }
     
     /**

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/NoopCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/NoopCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/NoopCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/NoopCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -25,6 +25,7 @@
 import java.util.Collection;
 
 import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
 import org.apache.james.util.mail.dsn.DSNStatus;
 
@@ -44,9 +45,8 @@
      *
      * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
      */
-    public void onCommand(SMTPSession session) {
-        String responseString = "250 "+DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.UNDEFINED_STATUS)+" OK";
-        session.writeResponse(responseString);
+    public SMTPResponse onCommand(SMTPSession session, String command, String arguments) {
+        return new SMTPResponse("250", DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.UNDEFINED_STATUS)+" OK");
     }
     
     /**

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/QuitCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -25,6 +25,7 @@
 import java.util.Collection;
 
 import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
 import org.apache.james.util.mail.dsn.DSNStatus;
 
@@ -43,8 +44,8 @@
      *
      * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
      */
-    public void onCommand(SMTPSession session) {
-        doQUIT(session, session.getCommandArgument());
+    public SMTPResponse onCommand(SMTPSession session, String command, String parameters) {
+        return doQUIT(session, parameters);
 
     }
 
@@ -57,19 +58,20 @@
      * @param session SMTP session object
      * @param argument the argument passed in with the command by the SMTP client
      */
-    private void doQUIT(SMTPSession session, String argument) {
-
-        String responseString = "";
+    private SMTPResponse doQUIT(SMTPSession session, String argument) {
+        SMTPResponse ret;
         if ((argument == null) || (argument.length() == 0)) {
-            session.getResponseBuffer().append("221 "+DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.UNDEFINED_STATUS)+" ")
-                          .append(session.getConfigurationData().getHelloName())
-                          .append(" Service closing transmission channel");
-            responseString = session.clearResponseBuffer();
+            StringBuffer response = new StringBuffer();
+            response.append(DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.UNDEFINED_STATUS))
+                    .append(" ")
+                    .append(session.getConfigurationData().getHelloName())
+                    .append(" Service closing transmission channel");
+            ret = new SMTPResponse("221", response);
         } else {
-            responseString = "500 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Unexpected argument provided with QUIT command";
+            ret = new SMTPResponse("500", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Unexpected argument provided with QUIT command");
         }
-        session.writeResponse(responseString);
-        session.endSession();
+        ret.setEndSession(true);
+        return ret;
     }
 
     /**

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RcptCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -26,6 +26,7 @@
 
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
 import org.apache.james.util.mail.dsn.DSNStatus;
 import org.apache.mailet.MailAddress;
@@ -41,8 +42,8 @@
      *
      * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
     **/
-    public void onCommand(SMTPSession session) {
-        doRCPT(session, session.getCommandArgument());
+    public SMTPResponse onCommand(SMTPSession session, String command, String parameters) {
+        return doRCPT(session, parameters);
     }
 
 
@@ -54,11 +55,7 @@
      * @param session SMTP session object
      * @param argument the argument passed in with the command by the SMTP client
      */
-    private void doRCPT(SMTPSession session, String argument) {
-       
-        String responseString = null;
-        StringBuffer responseBuffer = session.getResponseBuffer();
-
+    private SMTPResponse doRCPT(SMTPSession session, String argument) {
         Collection rcptColl = (Collection) session.getState().get(
                 SMTPSession.RCPT_LIST);
         if (rcptColl == null) {
@@ -68,13 +65,12 @@
                 SMTPSession.CURRENT_RECIPIENT);
         rcptColl.add(recipientAddress);
         session.getState().put(SMTPSession.RCPT_LIST, rcptColl);
-        responseBuffer.append(
-                "250 "
-                        + DSNStatus.getStatus(DSNStatus.SUCCESS,
-                                DSNStatus.ADDRESS_VALID) + " Recipient <")
-                .append(recipientAddress).append("> OK");
-        responseString = session.clearResponseBuffer();
-        session.writeResponse(responseString);
+        StringBuffer response = new StringBuffer();
+        response.append(DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.ADDRESS_VALID))
+                .append(" Recipient <")
+                .append(recipientAddress)
+                .append("> OK");
+        return new SMTPResponse("250", response);
              
     }
     

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RsetCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RsetCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RsetCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/RsetCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -25,6 +25,7 @@
 import java.util.Collection;
 
 import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
 import org.apache.james.util.mail.dsn.DSNStatus;
 
@@ -42,8 +43,8 @@
      *
      * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
     **/
-    public void onCommand(SMTPSession session) {
-        doRSET(session, session.getCommandArgument());
+    public SMTPResponse onCommand(SMTPSession session, String command, String parameters) {
+        return doRSET(session, session.getCommandArgument());
     }
 
 
@@ -53,18 +54,15 @@
      *
      * @param session SMTP session object
      * @param argument the argument passed in with the command by the SMTP client
+     * @return 
      */
-    private void doRSET(SMTPSession session, String argument) {
-        String responseString = "";
+    private SMTPResponse doRSET(SMTPSession session, String argument) {
         if ((argument == null) || (argument.length() == 0)) {
-
             session.resetState();
-
-            responseString = "250 "+DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.UNDEFINED_STATUS)+" OK";
+            return new SMTPResponse("250", DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.UNDEFINED_STATUS)+" OK");
         } else {
-            responseString = "500 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Unexpected argument provided with RSET command";
+            return new SMTPResponse("500", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Unexpected argument provided with RSET command");
         }
-        session.writeResponse(responseString);
     }
 
     /**

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/UnknownCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/UnknownCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/UnknownCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/UnknownCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -25,6 +25,7 @@
 import java.util.Collection;
 
 import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
 import org.apache.james.util.mail.dsn.DSNStatus;
 
@@ -38,28 +39,25 @@
      */
     public static final String UNKNOWN_COMMAND = "UNKNOWN";
     
-    private boolean stopHandlerProcessing = true;
-
     /**
      * Handler method called upon receipt of an unrecognized command.
      * Returns an error response and logs the command.
      *
      * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
     **/
-    public void onCommand(SMTPSession session) {
+    public SMTPResponse onCommand(SMTPSession session, String command, String parameters) {
 
         //If there was message failure, don't consider it as an unknown command
         if (session.getState().get(SMTPSession.MESG_FAILED) != null) {
-            return;
+            return null;
         }
 
-        session.getResponseBuffer().append("500 "+DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.DELIVERY_INVALID_CMD))
+        StringBuffer result = new StringBuffer();
+        result.append(DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.DELIVERY_INVALID_CMD))
                       .append(" Command ")
                       .append(session.getCommandName())
                       .append(" unrecognized.");
-        String responseString = session.clearResponseBuffer();
-
-        session.writeResponse(responseString);
+        return new SMTPResponse("500", result);
     }
     
     /**

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/VrfyCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/VrfyCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/VrfyCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/VrfyCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -25,7 +25,9 @@
 import java.util.Collection;
 
 import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
+import org.apache.james.util.mail.SMTPRetCode;
 import org.apache.james.util.mail.dsn.DSNStatus;
 
 /**
@@ -42,9 +44,9 @@
      *
      * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
     **/
-    public void onCommand(SMTPSession session) {
-        String responseString = "502 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_NOT_CAPABLE)+" VRFY is not supported";
-        session.writeResponse(responseString);
+    public SMTPResponse onCommand(SMTPSession session, String command, String parameters) {
+        return new SMTPResponse(SMTPRetCode.UNIMPLEMENTED_COMMAND, 
+                DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_NOT_CAPABLE)+" VRFY is not supported");
     }
     
     /**

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/DataFilterCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/DataFilterCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/DataFilterCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/DataFilterCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -26,6 +26,7 @@
 
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
 import org.apache.james.util.mail.dsn.DSNStatus;
 
@@ -42,8 +43,8 @@
      *
      * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
      */
-    public void onCommand(SMTPSession session) {
-        doDATA(session, session.getCommandArgument());
+    public SMTPResponse onCommand(SMTPSession session, String command, String parameters) {
+        return doDATA(session, parameters);
     }
 
 
@@ -51,28 +52,16 @@
      * @param session SMTP session object
      * @param argument the argument passed in with the command by the SMTP client
      */
-    private void doDATA(SMTPSession session, String argument) {
-        String responseString = null;
+    private SMTPResponse doDATA(SMTPSession session, String argument) {
         if ((argument != null) && (argument.length() > 0)) {
-            responseString = "500 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Unexpected argument provided with DATA command";
-            session.writeResponse(responseString);
-            
-            //TODO: Check if this should been!
+            return new SMTPResponse("500", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Unexpected argument provided with DATA command");
         }
         if (!session.getState().containsKey(SMTPSession.SENDER)) {
-            responseString = "503 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" No sender specified";
-            session.writeResponse(responseString);
-            
-            // After this filter match we should not call any other handler!
-            session.setStopHandlerProcessing(true);
-            
+            return new SMTPResponse("503", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" No sender specified");
         } else if (!session.getState().containsKey(SMTPSession.RCPT_LIST)) {
-            responseString = "503 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" No recipients specified";
-            session.writeResponse(responseString);
-            
-            // After this filter match we should not call any other handler!
-            session.setStopHandlerProcessing(true);
+            return new SMTPResponse("503", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" No recipients specified");
         }
+        return null;
     }
     
     /**

Modified: james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/EhloFilterCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/EhloFilterCmdHandler.java?view=diff&rev=490155&r1=490154&r2=490155
==============================================================================
--- james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/EhloFilterCmdHandler.java (original)
+++ james/server/sandbox/handlerapi-experiment/src/java/org/apache/james/smtpserver/core/filter/EhloFilterCmdHandler.java Mon Dec 25 09:31:07 2006
@@ -26,6 +26,7 @@
 
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.james.smtpserver.CommandHandler;
+import org.apache.james.smtpserver.SMTPResponse;
 import org.apache.james.smtpserver.SMTPSession;
 import org.apache.james.util.mail.dsn.DSNStatus;
 
@@ -44,28 +45,23 @@
      *
      * @see org.apache.james.smtpserver.CommandHandler#onCommand(SMTPSession)
     **/
-    public void onCommand(SMTPSession session) {
-        doEHLO(session, session.getCommandArgument());
+    public SMTPResponse onCommand(SMTPSession session, String command, String arguments) {
+        return doEHLO(session, arguments);
     }
 
     /**
      * @param session SMTP session object
      * @param argument the argument passed in with the command by the SMTP client
      */
-    private void doEHLO(SMTPSession session, String argument) {
-        String responseString = null;        
-     
+    private SMTPResponse doEHLO(SMTPSession session, String argument) {
         session.resetState();
         
         if (argument == null) {
-            responseString = "501 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Domain address required: " + COMMAND_NAME;
-            session.writeResponse(responseString);
-            
-            // After this filter match we should not call any other handler!
-            session.setStopHandlerProcessing(true);
+            return new SMTPResponse("501", DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Domain address required: " + COMMAND_NAME);
         } else {
             // store provided name
             session.getState().put(SMTPSession.CURRENT_HELO_NAME,argument);
+            return null;
         }
     }
     



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