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 2011/12/24 22:17:28 UTC

svn commit: r1223019 [1/2] - in /james/protocols/trunk: api/src/main/java/org/apache/james/protocols/api/ pop3/src/main/java/org/apache/james/protocols/pop3/ pop3/src/main/java/org/apache/james/protocols/pop3/core/ smtp/src/main/java/org/apache/james/p...

Author: norman
Date: Sat Dec 24 21:17:27 2011
New Revision: 1223019

URL: http://svn.apache.org/viewvc?rev=1223019&view=rev
Log:
Minimize Response creation. See PROTOCOLS-74

Modified:
    james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/AbstractResponse.java
    james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/POP3Response.java
    james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/POP3SessionImpl.java
    james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/CapaCmdHandler.java
    james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/DeleCmdHandler.java
    james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/ListCmdHandler.java
    james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/NoopCmdHandler.java
    james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/PassCmdHandler.java
    james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/QuitCmdHandler.java
    james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/RetrCmdHandler.java
    james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/RsetCmdHandler.java
    james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/StatCmdHandler.java
    james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/StlsCmdHandler.java
    james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/TopCmdHandler.java
    james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/UidlCmdHandler.java
    james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/UnknownCmdHandler.java
    james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/UserCmdHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSessionImpl.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractAuthRequiredToRelayRcptHook.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractSenderAuthIdentifyVerificationRcptHook.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AcceptRecipientIfRelayingIsAllowed.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataLineMessageHookHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/ExpnCmdHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/HeloCmdHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/HelpCmdHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/MailCmdHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/NoopCmdHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/PostmasterAbuseRcptHook.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/QuitCmdHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/RcptCmdHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/RsetCmdHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/VrfyCmdHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/EhloCmdHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/MailSizeEsmtpExtension.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/StartTlsCmdHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/AbstractGreylistHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/AbstractValidRcptHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/DNSRBLHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/MaxRcptHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/MaxUnknownCmdHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/ResolvableEhloHeloHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/ReverseEqualsEhloHeloHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/SpamTrapHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/SupressDuplicateRcptHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/ValidSenderDomainHandler.java
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/hook/HookResult.java

Modified: james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/AbstractResponse.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/AbstractResponse.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/AbstractResponse.java (original)
+++ james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/AbstractResponse.java Sat Dec 24 21:17:27 2011
@@ -105,5 +105,27 @@ public abstract class AbstractResponse i
     public final String toString() {
         return getLines().toString();
     }
+    
+    /**
+     * Return a immutable instance of this {@link AbstractResponse}
+     * 
+     * @return immutable
+     */
+    public Response immutable() {
+        return new Response() {
+            
+            public boolean isEndSession() {
+                return AbstractResponse.this.isEndSession();
+            }
+            
+            public String getRetCode() {
+                return AbstractResponse.this.getRetCode();
+            }
+            
+            public List<CharSequence> getLines() {
+                return AbstractResponse.this.getLines();
+            }
+        };
+    }
 
 }

Modified: james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/POP3Response.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/POP3Response.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/POP3Response.java (original)
+++ james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/POP3Response.java Sat Dec 24 21:17:27 2011
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.james.protocols.api.AbstractResponse;
+import org.apache.james.protocols.api.Response;
 
 /**
  * Contains an POP3 result
@@ -44,12 +45,12 @@ public class POP3Response extends Abstra
     /**
      * {@link #OK_RESPONSE} with no description
      */
-    public static final POP3Response OK = new POP3Response(OK_RESPONSE);
+    public static final Response OK = new POP3Response(OK_RESPONSE).immutable();
     
     /**
      * {@link #ERR_RESPONSE} with no description
      */
-    public static final POP3Response ERR = new POP3Response(ERR_RESPONSE);
+    public static final Response ERR = new POP3Response(ERR_RESPONSE).immutable();
 
     
     /**

Modified: james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/POP3SessionImpl.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/POP3SessionImpl.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/POP3SessionImpl.java (original)
+++ james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/POP3SessionImpl.java Sat Dec 24 21:17:27 2011
@@ -30,6 +30,7 @@ import org.slf4j.Logger;
  */
 public class POP3SessionImpl extends ProtocolSessionImpl implements POP3Session {
 
+    private static final Response LINE_TOO_LONG = new POP3Response(POP3Response.ERR_RESPONSE, "Exceed maximal line length").immutable();
     private int handlerState;
 
     private Mailbox mailbox;
@@ -79,11 +80,11 @@ public class POP3SessionImpl extends Pro
 
     @Override
     public Response newLineTooLongResponse() {
-        return null;
+        return LINE_TOO_LONG;
     }
 
     @Override
     public Response newFatalErrorResponse() {
-        return null;
+        return POP3Response.ERR;
     }
 }

Modified: james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/CapaCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/CapaCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/CapaCmdHandler.java (original)
+++ james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/CapaCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -65,7 +65,7 @@ public class CapaCmdHandler implements C
      */
     @SuppressWarnings({ "unchecked", "rawtypes" })
     public List<Class<?>> getMarkerInterfaces() {
-		List<Class<?>> mList = new ArrayList();
+        List<Class<?>> mList = new ArrayList();
         mList.add(CapaCapability.class);
         return mList;
     }

Modified: james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/DeleCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/DeleCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/DeleCmdHandler.java (original)
+++ james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/DeleCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -38,20 +38,21 @@ import org.apache.james.protocols.pop3.m
 public class DeleCmdHandler implements CommandHandler<POP3Session> {
     private static final Collection<String> COMMANDS = Collections.unmodifiableCollection(Arrays.asList("DELE"));
 
+    private static final Response SYNTAX_ERROR = new POP3Response(POP3Response.ERR_RESPONSE, "Usage: DELE [mail number]").immutable();
+    private static final Response DELETED = new POP3Response(POP3Response.OK_RESPONSE, "Message deleted").immutable();
+
     /**
      * Handler method called upon receipt of a DELE command. This command
      * deletes a particular mail message from the mailbox.
      */
     @SuppressWarnings("unchecked")
     public Response onCommand(POP3Session session, Request request) {
-        POP3Response response = null;
         if (session.getHandlerState() == POP3Session.TRANSACTION) {
             int num = 0;
             try {
                 num = Integer.parseInt(request.getArgument());
             } catch (Exception e) {
-                response = new POP3Response(POP3Response.ERR_RESPONSE, "Usage: DELE [mail number]");
-                return response;
+                return SYNTAX_ERROR;
             }
             try {
                 List<MessageMetaData> uidList = (List<MessageMetaData>) session.getAttachment(POP3Session.UID_LIST, State.Transaction);
@@ -61,21 +62,20 @@ public class DeleCmdHandler implements C
 
                 if (deletedUidList.contains(uid)) {
                     StringBuilder responseBuffer = new StringBuilder(64).append("Message (").append(num).append(") already deleted.");
-                    response = new POP3Response(POP3Response.ERR_RESPONSE, responseBuffer.toString());
+                    return new POP3Response(POP3Response.ERR_RESPONSE, responseBuffer.toString());
                 } else {
                     deletedUidList.add(uid);
                     // we are replacing our reference with "DELETED", so we have
                     // to dispose the no-more-referenced mail object.
-                    response = new POP3Response(POP3Response.OK_RESPONSE, "Message deleted");
+                    return DELETED;
                 }
             } catch (IndexOutOfBoundsException iob) {
                 StringBuilder responseBuffer = new StringBuilder(64).append("Message (").append(num).append(") does not exist.");
-                response = new POP3Response(POP3Response.ERR_RESPONSE, responseBuffer.toString());
+                return  new POP3Response(POP3Response.ERR_RESPONSE, responseBuffer.toString());
             }
         } else {
-            response = new POP3Response(POP3Response.ERR_RESPONSE);
+            return POP3Response.ERR;
         }
-        return response;
     }
 
     /**

Modified: james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/ListCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/ListCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/ListCmdHandler.java (original)
+++ james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/ListCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -52,12 +52,13 @@ public class ListCmdHandler implements C
 
     @SuppressWarnings("unchecked")
     public Response onCommand(POP3Session session, Request request) {
-        POP3Response response = null;
         String parameters = request.getArgument();
         List<MessageMetaData> uidList = (List<MessageMetaData>) session.getAttachment(POP3Session.UID_LIST, State.Transaction);
         List<Long> deletedUidList = (List<Long>) session.getAttachment(POP3Session.DELETED_UID_LIST, State.Transaction);
 
         if (session.getHandlerState() == POP3Session.TRANSACTION) {
+            POP3Response response = null;
+
             if (parameters == null) {
 
                 long size = 0;
@@ -103,10 +104,10 @@ public class ListCmdHandler implements C
                     response = new POP3Response(POP3Response.ERR_RESPONSE, responseBuffer.toString());
                 }
             }
+            return response;
         } else {
-            response = new POP3Response(POP3Response.ERR_RESPONSE);
+            return POP3Response.ERR;
         }
-        return response;
     }
 
     /**

Modified: james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/NoopCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/NoopCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/NoopCmdHandler.java (original)
+++ james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/NoopCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -40,13 +40,11 @@ public class NoopCmdHandler implements C
      * NOOPs, does nothing much.
      */
     public Response onCommand(POP3Session session, Request request) {
-        POP3Response response = null;
         if (session.getHandlerState() == POP3Session.TRANSACTION) {
-            response = new POP3Response(POP3Response.OK_RESPONSE);
+            return POP3Response.OK;
         } else {
-            response = new POP3Response(POP3Response.ERR_RESPONSE);
+            return POP3Response.ERR;
         }
-        return response;
     }
 
     /**

Modified: james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/PassCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/PassCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/PassCmdHandler.java (original)
+++ james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/PassCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -37,6 +37,8 @@ import org.apache.james.protocols.pop3.m
  */
 public class PassCmdHandler extends RsetCmdHandler {
     private static final Collection<String> COMMANDS = Collections.unmodifiableCollection(Arrays.asList("PASS"));
+    private static final Response UNEXPECTED_ERROR = new POP3Response(POP3Response.ERR_RESPONSE, "Unexpected error accessing mailbox").immutable();
+    private static final Response AUTH_FAILED = new POP3Response(POP3Response.ERR_RESPONSE, "Authentication failed.").immutable();
 
     private MailboxFactory mailboxManager;
 
@@ -56,25 +58,24 @@ public class PassCmdHandler extends Rset
             try {
                 Mailbox mailbox = mailboxManager.getMailbox(session, passArg);
                 if (mailbox != null) {
-                	session.setUserMailbox(mailbox);
-                	stat(session);
-                
-                	StringBuilder responseBuffer = new StringBuilder(64).append("Welcome ").append(session.getUser());
-                	response = new POP3Response(POP3Response.OK_RESPONSE, responseBuffer.toString());
-                	session.setHandlerState(POP3Session.TRANSACTION);
+                    session.setUserMailbox(mailbox);
+                    stat(session);
+
+                    StringBuilder responseBuffer = new StringBuilder(64).append("Welcome ").append(session.getUser());
+                    response = new POP3Response(POP3Response.OK_RESPONSE, responseBuffer.toString());
+                    session.setHandlerState(POP3Session.TRANSACTION);
                 } else {
-                	response = new POP3Response(POP3Response.ERR_RESPONSE, "Authentication failed.");
-                	session.setHandlerState(POP3Session.AUTHENTICATION_READY);
+                    session.setHandlerState(POP3Session.AUTHENTICATION_READY);
+                    return AUTH_FAILED;
                 }
             } catch (IOException e) {
                 session.getLogger().error("Unexpected error accessing mailbox for " + session.getUser(), e);
-                response = new POP3Response(POP3Response.ERR_RESPONSE, "Unexpected error accessing mailbox");
                 session.setHandlerState(POP3Session.AUTHENTICATION_READY);
+                return UNEXPECTED_ERROR;
             }
         } else {
-            response = new POP3Response(POP3Response.ERR_RESPONSE, "Authentication failed.");
-
             session.setHandlerState(POP3Session.AUTHENTICATION_READY);
+            return AUTH_FAILED;
         }
 
         return response;

Modified: james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/QuitCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/QuitCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/QuitCmdHandler.java (original)
+++ james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/QuitCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -38,18 +38,26 @@ import org.apache.james.protocols.pop3.m
  */
 public class QuitCmdHandler implements CommandHandler<POP3Session> {
     private static final Collection<String> COMMANDS = Collections.unmodifiableCollection(Arrays.asList("QUIT"));
-
+    private static final Response SIGN_OFF;
+    private static final Response SIGN_OFF_NOT_CLEAN;
+    static {
+        POP3Response response = new POP3Response(POP3Response.OK_RESPONSE, "Apache James POP3 Server signing off.");
+        response.setEndSession(true);
+        SIGN_OFF = response.immutable();
+        
+        response = new POP3Response(POP3Response.ERR_RESPONSE, "Some deleted messages were not removed");
+        response.setEndSession(true);
+        SIGN_OFF_NOT_CLEAN = response.immutable();
+    }
     /**
      * Handler method called upon receipt of a QUIT command. This method handles
      * cleanup of the POP3Handler state.
      */
     @SuppressWarnings("unchecked")
     public Response onCommand(POP3Session session, Request request) {
-        POP3Response response = null;
+        Response response = null;
         if (session.getHandlerState() == POP3Session.AUTHENTICATION_READY || session.getHandlerState() == POP3Session.AUTHENTICATION_USERSET) {
-            response = new POP3Response(POP3Response.OK_RESPONSE, "Apache James POP3 Server signing off.");
-            response.setEndSession(true);
-            return response;
+            return SIGN_OFF;
         }
         List<Long> toBeRemoved = (List<Long>) session.getAttachment(POP3Session.DELETED_UID_LIST, State.Transaction);
         Mailbox mailbox = session.getUserMailbox();
@@ -60,12 +68,11 @@ public class QuitCmdHandler implements C
                 uids[i] = toBeRemoved.get(i);
             }
             mailbox.remove(uids);
-            response = new POP3Response(POP3Response.OK_RESPONSE, "Apache James POP3 Server signing off.");
+            response = SIGN_OFF;
         } catch (Exception ex) {
-            response = new POP3Response(POP3Response.ERR_RESPONSE, "Some deleted messages were not removed");
+            response = SIGN_OFF_NOT_CLEAN;
             session.getLogger().error("Some deleted messages were not removed", ex);
         }     
-        response.setEndSession(true);
         try {
             mailbox.close();
         } catch (IOException e) {

Modified: james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/RetrCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/RetrCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/RetrCmdHandler.java (original)
+++ james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/RetrCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -41,6 +41,8 @@ import org.apache.james.protocols.pop3.m
 public class RetrCmdHandler implements CommandHandler<POP3Session> {
 
     private static final Collection<String> COMMANDS = Collections.unmodifiableCollection(Arrays.asList("RETR"));
+    private static final Response SYNTAX_ERROR = new POP3Response(POP3Response.ERR_RESPONSE, "Usage: RETR [mail number]").immutable();
+    private static final Response ERROR_MESSAGE_RETRIEVE = new POP3Response(POP3Response.ERR_RESPONSE, "Error while retrieving message.").immutable();
 
     /**
      * Handler method called upon receipt of a RETR command. This command
@@ -55,8 +57,7 @@ public class RetrCmdHandler implements C
             try {
                 num = Integer.parseInt(parameters.trim());
             } catch (Exception e) {
-                response = new POP3Response(POP3Response.ERR_RESPONSE, "Usage: RETR [mail number]");
-                return response;
+                return SYNTAX_ERROR;
             }
             try {
                 List<MessageMetaData> uidList = (List<MessageMetaData>) session.getAttachment(POP3Session.UID_LIST, State.Transaction);
@@ -79,10 +80,10 @@ public class RetrCmdHandler implements C
                     response = new POP3Response(POP3Response.ERR_RESPONSE, responseBuffer.toString());
                 }
             } catch (IOException ioe) {
-                response = new POP3Response(POP3Response.ERR_RESPONSE, "Error while retrieving message.");
+                return ERROR_MESSAGE_RETRIEVE;
             }
         } else {
-            response = new POP3Response(POP3Response.ERR_RESPONSE);
+            return POP3Response.ERR;
         }
         return response;
     }

Modified: james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/RsetCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/RsetCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/RsetCmdHandler.java (original)
+++ james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/RsetCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -46,14 +46,13 @@ public class RsetCmdHandler implements C
      * reset the mailbox.
      */
     public Response onCommand(POP3Session session, Request request) {
-        POP3Response response = null;
         if (session.getHandlerState() == POP3Session.TRANSACTION) {
             stat(session);
-            response = new POP3Response(POP3Response.OK_RESPONSE);
+            return POP3Response.OK;
         } else {
-            response = new POP3Response(POP3Response.ERR_RESPONSE);
+            return POP3Response.ERR;
         }
-        return response;
+        
     }
 
     /**

Modified: james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/StatCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/StatCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/StatCmdHandler.java (original)
+++ james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/StatCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -45,7 +45,6 @@ public class StatCmdHandler implements C
      */
     @SuppressWarnings("unchecked")
     public Response onCommand(POP3Session session, Request request) {
-        POP3Response response = null;
         if (session.getHandlerState() == POP3Session.TRANSACTION) {
 
             List<MessageMetaData> uidList = (List<MessageMetaData>) session.getAttachment(POP3Session.UID_LIST, State.Transaction);
@@ -64,12 +63,11 @@ public class StatCmdHandler implements C
                 }
             }
             StringBuilder responseBuffer = new StringBuilder(32).append(count).append(" ").append(size);
-            response = new POP3Response(POP3Response.OK_RESPONSE, responseBuffer.toString());
+            return new POP3Response(POP3Response.OK_RESPONSE, responseBuffer.toString());
 
         } else {
-            response = new POP3Response(POP3Response.ERR_RESPONSE);
+            return POP3Response.ERR;
         }
-        return response;
     }
 
     /**

Modified: james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/StlsCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/StlsCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/StlsCmdHandler.java (original)
+++ james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/StlsCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -39,20 +39,17 @@ public class StlsCmdHandler implements C
     private static final Collection<String> COMMANDS = Collections.unmodifiableCollection(Arrays.asList("STLS"));
     private static final List<String> CAPS = Collections.unmodifiableList(Arrays.asList("STLS"));
 
+    private static final Response BEGIN_TLS = new StartTlsPop3Response(POP3Response.OK_RESPONSE, "Begin TLS negotiation").immutable();
     /**
      * @see CommandHandler#onCommand(org.apache.james.protocols.api.ProtocolSession, Request)
      */
     public Response onCommand(POP3Session session, Request request) {
-        POP3Response response;
         // check if starttls is supported, the state is the right one and it was
         // not started before
         if (session.isStartTLSSupported() && session.getHandlerState() == POP3Session.AUTHENTICATION_READY && session.isTLSStarted() == false) {
-            response = new StartTlsPop3Response(POP3Response.OK_RESPONSE, "Begin TLS negotiation");
-            return response;
-
+            return BEGIN_TLS;
         } else {
-            response = new POP3Response(POP3Response.ERR_RESPONSE);
-            return response;
+            return POP3Response.ERR;
         }
     }
 

Modified: james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/TopCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/TopCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/TopCmdHandler.java (original)
+++ james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/TopCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -42,8 +42,10 @@ import org.apache.james.protocols.pop3.m
 public class TopCmdHandler extends RetrCmdHandler implements CapaCapability {
     private static final Collection<String> COMMANDS = Collections.unmodifiableCollection(Arrays.asList("TOP"));
     private static final List<String> CAPS = Collections.unmodifiableList(Arrays.asList("TOP"));
-
     
+    private static final Response SYNTAX_ERROR = new POP3Response(POP3Response.ERR_RESPONSE, "Usage: TOP [mail number] [Line number]").immutable();
+    private static final Response ERROR_MESSAGE_RETR = new POP3Response(POP3Response.ERR_RESPONSE, "Error while retrieving message.").immutable();
+
     /**
      * Handler method called upon receipt of a TOP command. This command
      * retrieves the top N lines of a specified message in the mailbox.
@@ -54,11 +56,9 @@ public class TopCmdHandler extends RetrC
     @SuppressWarnings("unchecked")
     @Override
     public Response onCommand(POP3Session session, Request request) {
-        POP3Response response = null;
         String parameters = request.getArgument();
         if (parameters == null) {
-            response = new POP3Response(POP3Response.ERR_RESPONSE, "Usage: TOP [mail number] [Line number]");
-            return response;
+            return SYNTAX_ERROR;
         }
 
         String argument = "";
@@ -76,8 +76,7 @@ public class TopCmdHandler extends RetrC
                 num = Integer.parseInt(argument);
                 lines = Integer.parseInt(argument1);
             } catch (NumberFormatException nfe) {
-                response = new POP3Response(POP3Response.ERR_RESPONSE, "Usage: TOP [mail number] [Line number]");
-                return response;
+                return SYNTAX_ERROR;
             }
             try {
                 List<MessageMetaData> uidList = (List<MessageMetaData>) session.getAttachment(POP3Session.UID_LIST, State.Transaction);
@@ -89,31 +88,29 @@ public class TopCmdHandler extends RetrC
                     InputStream body = new CountingBodyInputStream(new ExtraDotInputStream(new CRLFTerminatedInputStream(session.getUserMailbox().getMessageBody(uid))), lines);
                     InputStream headers = session.getUserMailbox().getMessageHeaders(uid);
                     if (body != null && headers != null) {
-                        response = new POP3StreamResponse(POP3Response.OK_RESPONSE, "Message follows", new SequenceInputStream(headers, body));
-                        return response;
+                        return new POP3StreamResponse(POP3Response.OK_RESPONSE, "Message follows", new SequenceInputStream(headers, body));
 
                     } else {
                         StringBuilder exceptionBuffer = new StringBuilder(64).append("Message (").append(num).append(") does not exist.");
-                        response = new POP3Response(POP3Response.ERR_RESPONSE, exceptionBuffer.toString());
+                        return new POP3Response(POP3Response.ERR_RESPONSE, exceptionBuffer.toString());
                     }
 
                 } else {
                     StringBuilder responseBuffer = new StringBuilder(64).append("Message (").append(num).append(") already deleted.");
-                    response = new POP3Response(POP3Response.ERR_RESPONSE, responseBuffer.toString());
+                    return new POP3Response(POP3Response.ERR_RESPONSE, responseBuffer.toString());
                 }
             } catch (IOException ioe) {
-                response = new POP3Response(POP3Response.ERR_RESPONSE, "Error while retrieving message.");
+                return ERROR_MESSAGE_RETR;
             } catch (IndexOutOfBoundsException iob) {
                 StringBuilder exceptionBuffer = new StringBuilder(64).append("Message (").append(num).append(") does not exist.");
-                response = new POP3Response(POP3Response.ERR_RESPONSE, exceptionBuffer.toString());
+                return new POP3Response(POP3Response.ERR_RESPONSE, exceptionBuffer.toString());
             } catch (NoSuchElementException iob) {
                 StringBuilder exceptionBuffer = new StringBuilder(64).append("Message (").append(num).append(") does not exist.");
-                response = new POP3Response(POP3Response.ERR_RESPONSE, exceptionBuffer.toString());
+                return new POP3Response(POP3Response.ERR_RESPONSE, exceptionBuffer.toString());
             }
         } else {
-            response = new POP3Response(POP3Response.ERR_RESPONSE);
+            return POP3Response.ERR;
         }
-        return response;
 
     }
 
@@ -132,6 +129,7 @@ public class TopCmdHandler extends RetrC
     /**
      * @see org.apache.james.protocols.api.handler.CommandHandler#getImplCommands()
      */
+    @Override
     public Collection<String> getImplCommands() {
         return COMMANDS;
     }
@@ -139,7 +137,7 @@ public class TopCmdHandler extends RetrC
     /**
      * This {@link InputStream} implementation can be used to limit the body
      * lines which will be read from the wrapped {@link InputStream}
-     */    // TODO: Fix me!
+     */   
     private final class CountingBodyInputStream extends InputStream {
 
         private int count = 0;

Modified: james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/UidlCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/UidlCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/UidlCmdHandler.java (original)
+++ james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/UidlCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -89,12 +89,11 @@ public class UidlCmdHandler implements C
                     }
                 }
             } catch (IOException e) {
-                response = new POP3Response(POP3Response.ERR_RESPONSE);
-                return response;
+                return POP3Response.ERR;
             }
             
         } else {
-            response = new POP3Response(POP3Response.ERR_RESPONSE);
+            return POP3Response.ERR;
         }
         return response;
     }

Modified: james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/UnknownCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/UnknownCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/UnknownCmdHandler.java (original)
+++ james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/UnknownCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -34,6 +34,6 @@ public class UnknownCmdHandler extends U
      * error response and logs the command.
      */
     public Response onCommand(POP3Session session, Request request) {
-        return new POP3Response(POP3Response.ERR_RESPONSE);
+        return POP3Response.ERR;
     }
 }

Modified: james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/UserCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/UserCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/UserCmdHandler.java (original)
+++ james/protocols/trunk/pop3/src/main/java/org/apache/james/protocols/pop3/core/UserCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -44,16 +44,14 @@ public class UserCmdHandler implements C
      * id.
      */
     public Response onCommand(POP3Session session, Request request) {
-        POP3Response response = null;
         String parameters = request.getArgument();
         if (session.getHandlerState() == POP3Session.AUTHENTICATION_READY && parameters != null) {
             session.setUser(parameters);
             session.setHandlerState(POP3Session.AUTHENTICATION_USERSET);
-            response = new POP3Response(POP3Response.OK_RESPONSE);
+            return POP3Response.OK;
         } else {
-            response = new POP3Response(POP3Response.ERR_RESPONSE);
+            return POP3Response.ERR;
         }
-        return response;
     }
 
     /**

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSessionImpl.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSessionImpl.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSessionImpl.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSessionImpl.java Sat Dec 24 21:17:27 2011
@@ -33,8 +33,11 @@ import org.slf4j.Logger;
  */
 public class SMTPSessionImpl extends ProtocolSessionImpl implements SMTPSession {
 
+    private static final Response LINE_LENGTH_EXCEEDED = new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_COMMAND_UNRECOGNIZED, "Line length exceeded. See RFC 2821 #4.5.3.1.").immutable();
+    private static final Response FATAL_ERROR = new SMTPResponse(SMTPRetCode.LOCAL_ERROR, "Unable to process request").immutable();
+    
     private boolean relayingAllowed;
-
+    
     public SMTPSessionImpl(Logger logger, ProtocolTransport transport, SMTPConfiguration config) {
         super(logger, transport, config);
         relayingAllowed = config.isRelayingAllowed(getRemoteAddress().getAddress().getHostAddress());
@@ -115,11 +118,11 @@ public class SMTPSessionImpl extends Pro
     }
 
     public Response newLineTooLongResponse() {
-        return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_COMMAND_UNRECOGNIZED, "Line length exceeded. See RFC 2821 #4.5.3.1.");
+        return LINE_LENGTH_EXCEEDED;
     }
 
     public Response newFatalErrorResponse() {
-        return new SMTPResponse(SMTPRetCode.LOCAL_ERROR, "Unable to process request");
+        return FATAL_ERROR;
     }
 
     @Override

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractAuthRequiredToRelayRcptHook.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractAuthRequiredToRelayRcptHook.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractAuthRequiredToRelayRcptHook.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractAuthRequiredToRelayRcptHook.java Sat Dec 24 21:17:27 2011
@@ -31,6 +31,19 @@ import org.apache.james.protocols.smtp.h
  */
 public abstract class AbstractAuthRequiredToRelayRcptHook implements RcptHook {
 
+    private static final HookResult AUTH_REQUIRED = new HookResult(HookReturnCode.DENY,
+            SMTPRetCode.AUTH_REQUIRED, DSNStatus.getStatus(
+                    DSNStatus.PERMANENT,
+                    DSNStatus.SECURITY_AUTH)
+                    + " Authentication Required");
+    private static final HookResult RELAYING_DENIED = new HookResult(
+            HookReturnCode.DENY,
+            // sendmail returns 554 (SMTPRetCode.TRANSACTION_FAILED).
+            // it is not clear in RFC wether it is better to use 550 or 554.
+            SMTPRetCode.MAILBOX_PERM_UNAVAILABLE,
+            DSNStatus.getStatus(DSNStatus.PERMANENT,
+                    DSNStatus.SECURITY_AUTH)
+                    + " Requested action not taken: relaying denied");
     
     /**
      * @see org.apache.james.protocols.smtp.hook.RcptHook#doRcpt(org.apache.james.protocols.smtp.SMTPSession,
@@ -42,25 +55,14 @@ public abstract class AbstractAuthRequir
             String toDomain = rcpt.getDomain();
             if (isLocalDomain(toDomain) == false) {
                 if (session.isAuthSupported()) {
-                    return new HookResult(HookReturnCode.DENY,
-                            SMTPRetCode.AUTH_REQUIRED, DSNStatus.getStatus(
-                                    DSNStatus.PERMANENT,
-                                    DSNStatus.SECURITY_AUTH)
-                                    + " Authentication Required");
+                    return AUTH_REQUIRED;
                 } else {
-                    return new HookResult(
-                            HookReturnCode.DENY,
-                            // sendmail returns 554 (SMTPRetCode.TRANSACTION_FAILED).
-                            // it is not clear in RFC wether it is better to use 550 or 554.
-                            SMTPRetCode.MAILBOX_PERM_UNAVAILABLE,
-                            DSNStatus.getStatus(DSNStatus.PERMANENT,
-                                    DSNStatus.SECURITY_AUTH)
-                                    + " Requested action not taken: relaying denied");
+                    return RELAYING_DENIED;
                 }
             }
 
         }
-        return new HookResult(HookReturnCode.DECLINED);
+        return HookResult.declined();
     }
 
     

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractSenderAuthIdentifyVerificationRcptHook.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractSenderAuthIdentifyVerificationRcptHook.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractSenderAuthIdentifyVerificationRcptHook.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractSenderAuthIdentifyVerificationRcptHook.java Sat Dec 24 21:17:27 2011
@@ -33,6 +33,11 @@ import org.apache.james.protocols.smtp.h
  * Handler which check if the authenticated user is the same as the one used as MAIL FROM
  */
 public abstract class AbstractSenderAuthIdentifyVerificationRcptHook implements RcptHook {  
+    private static final HookResult INVALID_AUTH =  new HookResult(HookReturnCode.DENY, 
+            SMTPRetCode.BAD_SEQUENCE,
+            DSNStatus.getStatus(DSNStatus.PERMANENT,
+                    DSNStatus.SECURITY_AUTH)
+                    + " Incorrect Authentication for Specified Email Address");
     /**
      * @see org.apache.james.protocols.smtp.hook.RcptHook#doRcpt(org.apache.james.protocols.smtp.SMTPSession,
      *      org.apache.mailet.MailAddress, org.apache.mailet.MailAddress)
@@ -59,14 +64,10 @@ public abstract class AbstractSenderAuth
             if ((senderAddress == null)
                     || (!authUser.equalsIgnoreCase(username))
                     || (!isLocalDomain(senderAddress.getDomain()))) {
-                return new HookResult(HookReturnCode.DENY, 
-                        SMTPRetCode.BAD_SEQUENCE,
-                        DSNStatus.getStatus(DSNStatus.PERMANENT,
-                                DSNStatus.SECURITY_AUTH)
-                                + " Incorrect Authentication for Specified Email Address");
+                return INVALID_AUTH;
             }
         }
-        return new HookResult(HookReturnCode.DECLINED);
+        return HookResult.declined();
     }
     
     

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AcceptRecipientIfRelayingIsAllowed.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AcceptRecipientIfRelayingIsAllowed.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AcceptRecipientIfRelayingIsAllowed.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AcceptRecipientIfRelayingIsAllowed.java Sat Dec 24 21:17:27 2011
@@ -21,7 +21,6 @@ package org.apache.james.protocols.smtp.
 import org.apache.james.protocols.smtp.MailAddress;
 import org.apache.james.protocols.smtp.SMTPSession;
 import org.apache.james.protocols.smtp.hook.HookResult;
-import org.apache.james.protocols.smtp.hook.HookReturnCode;
 import org.apache.james.protocols.smtp.hook.RcptHook;
 
 /**
@@ -36,9 +35,9 @@ public class AcceptRecipientIfRelayingIs
     public HookResult doRcpt(SMTPSession session, MailAddress sender,
             MailAddress rcpt) {
         if (session.isRelayingAllowed()) {
-            return new HookResult(HookReturnCode.OK);
+            return HookResult.ok();
         }
-        return new HookResult(HookReturnCode.DECLINED);
+        return HookResult.declined();
     }
 
 }

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -47,8 +47,12 @@ import org.apache.james.protocols.smtp.d
  */
 public class DataCmdHandler implements CommandHandler<SMTPSession>, ExtensibleHandler {
 
-	private static final Collection<String> COMMANDS = Collections.unmodifiableCollection(Arrays.asList("DATA"));
-	
+    private static final Response NO_RECIPIENT = new SMTPResponse(SMTPRetCode.BAD_SEQUENCE, DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" No recipients specified").immutable();
+    private static final Response NO_SENDER = new SMTPResponse(SMTPRetCode.BAD_SEQUENCE, DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" No sender specified").immutable();
+    private static final Response UNEXPECTED_ARG = new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_COMMAND_UNRECOGNIZED, DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Unexpected argument provided with DATA command").immutable();
+    private static final Response DATA_READY = new SMTPResponse(SMTPRetCode.DATA_READY, "Ok Send data ending with <CRLF>.<CRLF>").immutable();
+    private static final Collection<String> COMMANDS = Collections.unmodifiableCollection(Arrays.asList("DATA"));
+
     public static final class DataConsumerLineHandler implements LineHandler<SMTPSession> {
 
         public SMTPResponse onLine(SMTPSession session, ByteBuffer line) {
@@ -117,7 +121,7 @@ public class DataCmdHandler implements C
         session.setAttachment(MAILENV, env,ProtocolSession.State.Transaction);
         session.pushLineHandler(lineHandler);
         
-        return new SMTPResponse(SMTPRetCode.DATA_READY, "Ok Send data ending with <CRLF>.<CRLF>");
+        return DATA_READY;
     }
     
     protected MailEnvelope createEnvelope(SMTPSession session, MailAddress sender, List<MailAddress> recipients) {
@@ -165,18 +169,18 @@ public class DataCmdHandler implements C
 
     protected Response doDATAFilter(SMTPSession session, String argument) {
         if ((argument != null) && (argument.length() > 0)) {
-            return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_COMMAND_UNRECOGNIZED, DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Unexpected argument provided with DATA command");
+            return UNEXPECTED_ARG;
         }
         if (session.getAttachment(SMTPSession.SENDER, ProtocolSession.State.Transaction) == null) {
-            return new SMTPResponse(SMTPRetCode.BAD_SEQUENCE, DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" No sender specified");
+            return NO_SENDER;
         } else if (session.getAttachment(SMTPSession.RCPT_LIST, ProtocolSession.State.Transaction) == null) {
-            return new SMTPResponse(SMTPRetCode.BAD_SEQUENCE, DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" No recipients specified");
+            return NO_RECIPIENT;
         }
         return null;
     }
-    
+
     protected LineHandler<SMTPSession> getLineHandler() {
-    	return lineHandler;
+        return lineHandler;
     }
 
 }

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataLineMessageHookHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataLineMessageHookHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataLineMessageHookHandler.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataLineMessageHookHandler.java Sat Dec 24 21:17:27 2011
@@ -49,6 +49,8 @@ import org.apache.james.protocols.smtp.h
  */
 public class DataLineMessageHookHandler implements DataLineFilter, ExtensibleHandler {
 
+    private static final Response ERROR_PROCESSING_MESSAGE = new SMTPResponse(SMTPRetCode.LOCAL_ERROR,DSNStatus.getStatus(DSNStatus.TRANSIENT,
+            DSNStatus.UNDEFINED_STATUS) + " Error processing message").immutable();
     
     private List<?> messageHandlers;
     
@@ -89,14 +91,11 @@ public class DataLineMessageHookHandler 
             }
             out.flush();
         } catch (IOException e) {
-            SMTPResponse response = new SMTPResponse(SMTPRetCode.LOCAL_ERROR,DSNStatus.getStatus(DSNStatus.TRANSIENT,
-                            DSNStatus.UNDEFINED_STATUS) + " Error processing message: " + e.getMessage());
-            
             session.getLogger().error(
                     "Unknown error occurred while processing DATA.", e);
             
             session.resetState();
-            return response;
+            return ERROR_PROCESSING_MESSAGE;
         }
         return null;
     }

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/ExpnCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/ExpnCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/ExpnCmdHandler.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/ExpnCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -38,6 +38,7 @@ import org.apache.james.protocols.smtp.d
   */
 public class ExpnCmdHandler implements CommandHandler<SMTPSession> {
 
+    private static final Response NOT_SUPPORTED = new SMTPResponse(SMTPRetCode.UNIMPLEMENTED_COMMAND, DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_NOT_CAPABLE)+" EXPN is not supported").immutable();
     /**
      * The name of the command handled by the command handler
      */
@@ -50,7 +51,7 @@ public class ExpnCmdHandler implements C
      *
      */
     public Response onCommand(SMTPSession session, Request request) {
-        return new SMTPResponse(SMTPRetCode.UNIMPLEMENTED_COMMAND, DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_NOT_CAPABLE)+" EXPN is not supported");
+        return NOT_SUPPORTED;
     }
     
     /**

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/HeloCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/HeloCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/HeloCmdHandler.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/HeloCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -44,6 +44,10 @@ public class HeloCmdHandler extends Abst
      */
     private static final Collection<String> COMMANDS = Collections.unmodifiableCollection(Arrays.asList(COMMAND_NAME));
 
+    private static final Response DOMAIN_REQUIRED =  new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS,
+            DSNStatus.getStatus(DSNStatus.PERMANENT,
+                    DSNStatus.DELIVERY_INVALID_ARG)
+                    + " Domain address required: " + COMMAND_NAME).immutable();
     /**
      * @see org.apache.james.protocols.api.handler.CommandHandler#getImplCommands()
      */
@@ -74,10 +78,7 @@ public class HeloCmdHandler extends Abst
         session.resetState();
 
         if (parameters == null) {
-            return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS,
-                    DSNStatus.getStatus(DSNStatus.PERMANENT,
-                            DSNStatus.DELIVERY_INVALID_ARG)
-                            + " Domain address required: " + COMMAND_NAME);
+            return DOMAIN_REQUIRED;
         } else {
             // store provided name
             session.setAttachment(SMTPSession.CURRENT_HELO_NAME, parameters, State.Connection);

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/HelpCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/HelpCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/HelpCmdHandler.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/HelpCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -38,7 +38,7 @@ import org.apache.james.protocols.smtp.d
   */
 public class HelpCmdHandler implements CommandHandler<SMTPSession> {
     private static final String COMMAND_NAME = "HELP";
-
+    private static final Response NOT_SUPPORTED =  new SMTPResponse(SMTPRetCode.UNIMPLEMENTED_COMMAND, DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_NOT_CAPABLE)+" " + COMMAND_NAME + " is not supported").immutable();
 	/**
      * The name of the command handled by the command handler
      */
@@ -49,7 +49,7 @@ public class HelpCmdHandler implements C
      *
     **/
     public Response onCommand(SMTPSession session, Request request){
-        return new SMTPResponse(SMTPRetCode.UNIMPLEMENTED_COMMAND, DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_NOT_CAPABLE)+" " + COMMAND_NAME + " is not supported");
+        return NOT_SUPPORTED;
     }
 
     /**

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/MailCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/MailCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/MailCmdHandler.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/MailCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -46,7 +46,24 @@ import org.apache.james.protocols.smtp.h
  */
 public class MailCmdHandler extends AbstractHookableCmdHandler<MailHook> {
     private static final Collection<String> COMMANDS = Collections.unmodifiableCollection(Arrays.asList("MAIL"));
-
+    private static final Response SENDER_ALREADY_SPECIFIED =  new SMTPResponse(SMTPRetCode.BAD_SEQUENCE, DSNStatus
+            .getStatus(DSNStatus.PERMANENT, DSNStatus.DELIVERY_OTHER)
+            + " Sender already specified").immutable();
+    private static final Response EHLO_HELO_NEEDED =  new SMTPResponse(SMTPRetCode.BAD_SEQUENCE, DSNStatus
+            .getStatus(DSNStatus.PERMANENT, DSNStatus.DELIVERY_OTHER)
+            + " Need HELO or EHLO before MAIL").immutable();
+    private static final Response SYNTAX_ERROR_ARG = new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS,
+            DSNStatus.getStatus(DSNStatus.PERMANENT,
+                    DSNStatus.DELIVERY_INVALID_ARG)
+                    + " Usage: MAIL FROM:<sender>").immutable();
+    private static final Response SYNTAX_ERROR = new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS,
+            DSNStatus.getStatus(DSNStatus.PERMANENT,
+                    DSNStatus.ADDRESS_SYNTAX_SENDER)
+                    + " Syntax error in MAIL command").immutable();
+    private static final Response SYNTAX_ERROR_ADDRESS = new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS,
+            DSNStatus.getStatus(DSNStatus.PERMANENT,
+                    DSNStatus.ADDRESS_SYNTAX_SENDER)
+                    + " Syntax error in sender address").immutable();
     /**
      * A map of parameterHooks
      */
@@ -131,22 +148,15 @@ public class MailCmdHandler extends Abst
             argument = argument.substring(0, colonIndex);
         }
         if (session.getAttachment(SMTPSession.SENDER, State.Transaction) != null) {
-            return new SMTPResponse(SMTPRetCode.BAD_SEQUENCE, DSNStatus
-                    .getStatus(DSNStatus.PERMANENT, DSNStatus.DELIVERY_OTHER)
-                    + " Sender already specified");
+            return SENDER_ALREADY_SPECIFIED;
         } else if (session.getAttachment(
                 SMTPSession.CURRENT_HELO_MODE, State.Connection) == null
                 && session.getConfiguration().useHeloEhloEnforcement()) {
-            return new SMTPResponse(SMTPRetCode.BAD_SEQUENCE, DSNStatus
-                    .getStatus(DSNStatus.PERMANENT, DSNStatus.DELIVERY_OTHER)
-                    + " Need HELO or EHLO before MAIL");
+            return EHLO_HELO_NEEDED;
         } else if (argument == null
                 || !argument.toUpperCase(Locale.US).equals("FROM")
                 || sender == null) {
-            return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS,
-                    DSNStatus.getStatus(DSNStatus.PERMANENT,
-                            DSNStatus.DELIVERY_INVALID_ARG)
-                            + " Usage: MAIL FROM:<sender>");
+            return SYNTAX_ERROR_ARG;
         } else {
             sender = sender.trim();
             // the next gt after the first lt ... AUTH may add more <>
@@ -204,10 +214,7 @@ public class MailCmdHandler extends Abst
                             .append(": did not start and end with < >");
                     session.getLogger().info(errorBuffer.toString());
                 }
-                return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS,
-                        DSNStatus.getStatus(DSNStatus.PERMANENT,
-                                DSNStatus.ADDRESS_SYNTAX_SENDER)
-                                + " Syntax error in MAIL command");
+                return SYNTAX_ERROR;
             }
             MailAddress senderAddress = null;
 
@@ -237,10 +244,7 @@ public class MailCmdHandler extends Abst
                                         pe.getMessage());
                         session.getLogger().info(errorBuffer.toString());
                     }
-                    return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS,
-                            DSNStatus.getStatus(DSNStatus.PERMANENT,
-                                    DSNStatus.ADDRESS_SYNTAX_SENDER)
-                                    + " Syntax error in sender address");
+                    return SYNTAX_ERROR_ADDRESS;
                 }
             }
             if (senderAddress == null) {

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/NoopCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/NoopCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/NoopCmdHandler.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/NoopCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -43,13 +43,15 @@ public class NoopCmdHandler implements C
      */
     private static final Collection<String> COMMANDS = Collections.unmodifiableCollection(Arrays.asList("NOOP"));
 
+    private static final Response NOOP = new SMTPResponse(SMTPRetCode.MAIL_OK, DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.UNDEFINED_STATUS)+" OK").immutable();
+
     /**
      * Handler method called upon receipt of a NOOP command.
      * Just sends back an OK and logs the command.
      *
      */
     public Response onCommand(SMTPSession session, Request request) {
-        return new SMTPResponse(SMTPRetCode.MAIL_OK, DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.UNDEFINED_STATUS)+" OK");
+        return NOOP;
     }
     
     /**

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/PostmasterAbuseRcptHook.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/PostmasterAbuseRcptHook.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/PostmasterAbuseRcptHook.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/PostmasterAbuseRcptHook.java Sat Dec 24 21:17:27 2011
@@ -21,7 +21,6 @@ package org.apache.james.protocols.smtp.
 import org.apache.james.protocols.smtp.MailAddress;
 import org.apache.james.protocols.smtp.SMTPSession;
 import org.apache.james.protocols.smtp.hook.HookResult;
-import org.apache.james.protocols.smtp.hook.HookReturnCode;
 import org.apache.james.protocols.smtp.hook.RcptHook;
 
 /**
@@ -35,9 +34,9 @@ public class PostmasterAbuseRcptHook imp
     public HookResult doRcpt(SMTPSession session, MailAddress sender, MailAddress rcpt) {
         if (rcpt.getLocalPart().equalsIgnoreCase("postmaster") || rcpt.getLocalPart().equalsIgnoreCase("abuse")) {
             session.getLogger().debug("Sender allowed");
-            return new HookResult(HookReturnCode.OK);
+            return HookResult.ok();
         } else {
-            return new HookResult(HookReturnCode.DECLINED);
+            return HookResult.declined();
         }
     }
 

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/QuitCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/QuitCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/QuitCmdHandler.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/QuitCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -41,6 +41,17 @@ public class QuitCmdHandler extends Abst
      */
     private static final Collection<String> COMMANDS = Collections.unmodifiableCollection(Arrays.asList("QUIT"));
 
+    private static final Response SYNTAX_ERROR;
+    static {
+        SMTPResponse response = new SMTPResponse(
+                SMTPRetCode.SYNTAX_ERROR_COMMAND_UNRECOGNIZED, DSNStatus
+                .getStatus(DSNStatus.PERMANENT,
+                        DSNStatus.DELIVERY_INVALID_ARG)
+                + " Unexpected argument provided with QUIT command");
+        response.setEndSession(true);
+        SYNTAX_ERROR = response.immutable();
+    }
+    
     /**
      * Handler method called upon receipt of a QUIT command. This method informs
      * the client that the connection is closing.
@@ -51,7 +62,6 @@ public class QuitCmdHandler extends Abst
      *            the argument passed in with the command by the SMTP client
      */
     private Response doQUIT(SMTPSession session, String argument) {
-        SMTPResponse ret;
         if ((argument == null) || (argument.length() == 0)) {
             StringBuilder response = new StringBuilder();
             response.append(
@@ -59,16 +69,12 @@ public class QuitCmdHandler extends Abst
                             DSNStatus.UNDEFINED_STATUS)).append(" ").append(
                     session.getConfiguration().getHelloName()).append(
                     " Service closing transmission channel");
-            ret = new SMTPResponse(SMTPRetCode.SYSTEM_QUIT, response);
+            SMTPResponse ret = new SMTPResponse(SMTPRetCode.SYSTEM_QUIT, response);
+            ret.setEndSession(true);
+            return ret;
         } else {
-            ret = new SMTPResponse(
-                    SMTPRetCode.SYNTAX_ERROR_COMMAND_UNRECOGNIZED, DSNStatus
-                            .getStatus(DSNStatus.PERMANENT,
-                                    DSNStatus.DELIVERY_INVALID_ARG)
-                            + " Unexpected argument provided with QUIT command");
+            return SYNTAX_ERROR;
         }
-        ret.setEndSession(true);
-        return ret;
     }
 
     /**

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/RcptCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/RcptCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/RcptCmdHandler.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/RcptCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -43,11 +43,13 @@ import org.apache.james.protocols.smtp.h
 public class RcptCmdHandler extends AbstractHookableCmdHandler<RcptHook> implements
         CommandHandler<SMTPSession> {
 
-    public static final String CURRENT_RECIPIENT = "CURRENT_RECIPIENT"; // Current recipient
+    public static final String CURRENT_RECIPIENT = "CURRENT_RECIPIENT"; // Current
+                                                                        // recipient
     private static final Collection<String> COMMANDS = Collections.unmodifiableCollection(Arrays.asList("RCPT"));
-
-   
-    
+    private static final Response MAIL_NEEDED = new SMTPResponse(SMTPRetCode.BAD_SEQUENCE, DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.DELIVERY_OTHER) + " Need MAIL before RCPT").immutable();
+    private static final Response SYNTAX_ERROR_ARGS = new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS, DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.DELIVERY_SYNTAX) + " Usage: RCPT TO:<recipient>").immutable();
+    private static final Response SYNTAX_ERROR_DELIVERY = new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS, DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.DELIVERY_SYNTAX) + " Syntax error in parameters or arguments").immutable();
+    private static final Response SYNTAX_ERROR_ADDRESS = new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_MAILBOX, DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.ADDRESS_SYNTAX) + " Syntax error in recipient address").immutable();
     /**
      * Handler method called upon receipt of a RCPT command. Reads recipient.
      * Does some connection validation.
@@ -97,16 +99,11 @@ public class RcptCmdHandler extends Abst
             argument = argument.substring(0, colonIndex);
         }
         if (session.getAttachment(SMTPSession.SENDER, State.Transaction) == null) {
-            return new SMTPResponse(SMTPRetCode.BAD_SEQUENCE, DSNStatus
-                    .getStatus(DSNStatus.PERMANENT, DSNStatus.DELIVERY_OTHER)
-                    + " Need MAIL before RCPT");
+            return MAIL_NEEDED;
         } else if (argument == null
                 || !argument.toUpperCase(Locale.US).equals("TO")
                 || recipient == null) {
-            return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS,
-                    DSNStatus.getStatus(DSNStatus.PERMANENT,
-                            DSNStatus.DELIVERY_SYNTAX)
-                            + " Usage: RCPT TO:<recipient>");
+            return SYNTAX_ERROR_ARGS;
         }
 
         recipient = recipient.trim();
@@ -131,10 +128,7 @@ public class RcptCmdHandler extends Abst
                         getContext(session, null, recipient));
                 session.getLogger().info(errorBuffer.toString());
             }
-            return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS,
-                    DSNStatus.getStatus(DSNStatus.PERMANENT,
-                            DSNStatus.DELIVERY_SYNTAX)
-                            + " Syntax error in parameters or arguments");
+            return SYNTAX_ERROR_DELIVERY;
         }
         MailAddress recipientAddress = null;
         // Remove < and >
@@ -164,10 +158,7 @@ public class RcptCmdHandler extends Abst
              * from RFC2822; 553 Requested action not taken: mailbox name
              * not allowed (e.g., mailbox syntax incorrect)
              */
-            return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_MAILBOX,
-                    DSNStatus.getStatus(DSNStatus.PERMANENT,
-                            DSNStatus.ADDRESS_SYNTAX)
-                            + " Syntax error in recipient address");
+            return SYNTAX_ERROR_ADDRESS;
         }
 
         if (rcptOptionString != null) {
@@ -209,20 +200,15 @@ public class RcptCmdHandler extends Abst
         return null;
     }
 
-    private String getContext(SMTPSession session,
-            MailAddress recipientAddress, String recipient) {
+    private String getContext(SMTPSession session, MailAddress recipientAddress, String recipient) {
         StringBuilder sb = new StringBuilder(128);
         if (null != recipientAddress) {
-            sb
-                    .append(" [to:"
-                            + recipientAddress.toString() + "]");
+            sb.append(" [to:" + recipientAddress.toString() + "]");
         } else if (null != recipient) {
             sb.append(" [to:" + recipient + "]");
         }
         if (null != session.getAttachment(SMTPSession.SENDER, State.Transaction)) {
-            sb.append(" [from:"
-                            + ((MailAddress) session.getAttachment(
-                                    SMTPSession.SENDER, State.Transaction)).toString() + "]");
+            sb.append(" [from:" + ((MailAddress) session.getAttachment(SMTPSession.SENDER, State.Transaction)).toString() + "]");
         }
         return sb.toString();
     }

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/RsetCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/RsetCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/RsetCmdHandler.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/RsetCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -41,7 +41,8 @@ public class RsetCmdHandler implements C
      * The name of the command handled by the command handler
      */
     private static final Collection<String> COMMANDS = Collections.unmodifiableCollection(Arrays.asList("RSET"));
-
+    private static final Response OK = new SMTPResponse(SMTPRetCode.MAIL_OK, DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.UNDEFINED_STATUS)+" OK").immutable();
+    private static final Response SYNTAX_ERROR = new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_COMMAND_UNRECOGNIZED, DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Unexpected argument provided with RSET command").immutable();
     /**
      * handles RSET command
      *
@@ -62,9 +63,9 @@ public class RsetCmdHandler implements C
     private Response doRSET(SMTPSession session, String argument) {
         if ((argument == null) || (argument.length() == 0)) {
             session.resetState();
-            return new SMTPResponse(SMTPRetCode.MAIL_OK, DSNStatus.getStatus(DSNStatus.SUCCESS,DSNStatus.UNDEFINED_STATUS)+" OK");
+            return OK;
         } else {
-            return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_COMMAND_UNRECOGNIZED, DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Unexpected argument provided with RSET command");
+            return SYNTAX_ERROR;
         }
     }
 

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/VrfyCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/VrfyCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/VrfyCmdHandler.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/VrfyCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -39,7 +39,8 @@ import org.apache.james.protocols.smtp.d
 public class VrfyCmdHandler implements CommandHandler<SMTPSession> {
     
     private static final Collection<String> COMMANDS = Collections.unmodifiableCollection(Arrays.asList("VRFY"));
-
+    private static final Response NOT_SUPPORTED = new SMTPResponse(SMTPRetCode.UNIMPLEMENTED_COMMAND, 
+            DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_NOT_CAPABLE)+" VRFY is not supported").immutable();
 
     /**
      * Handler method called upon receipt of a VRFY command.
@@ -48,8 +49,7 @@ public class VrfyCmdHandler implements C
      *
      */
     public Response onCommand(SMTPSession session, Request request) {
-        return new SMTPResponse(SMTPRetCode.UNIMPLEMENTED_COMMAND, 
-                DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SYSTEM_NOT_CAPABLE)+" VRFY is not supported");
+        return NOT_SUPPORTED;
     }
     
     /**

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -64,6 +64,16 @@ public class AuthCmdHandler
     private static final List<String> ESMTP_FEATURES = Collections.unmodifiableList(Arrays.asList("AUTH LOGIN PLAIN", "AUTH=LOGIN PLAIN"));
     
     private final static String CHARSET = "US-ASCII";
+    private static final Response AUTH_ABORTED = new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS, DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.SECURITY_AUTH) + " Authentication aborted").immutable();
+    private static final Response ALREADY_AUTH = new SMTPResponse(SMTPRetCode.BAD_SEQUENCE, DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" User has previously authenticated. "
+            + " Further authentication is not required!").immutable();
+    private static final Response SYNTAX_ERROR = new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS, DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Usage: AUTH (authentication type) <challenge>").immutable();
+    private static final Response AUTH_READY_PLAIN = new SMTPResponse(SMTPRetCode.AUTH_READY, "OK. Continue authentication").immutable();
+    private static final Response AUTH_READY_USERNAME_LOGIN = new SMTPResponse(SMTPRetCode.AUTH_READY, "VXNlcm5hbWU6").immutable(); // base64 encoded "Username:"
+    private static final Response AUTH_READY_PASSWORD_LOGIN = new SMTPResponse(SMTPRetCode.AUTH_READY, "UGFzc3dvcmQ6").immutable(); // base64 encoded "Password:
+    private static final Response AUTH_FAILED = new SMTPResponse(SMTPRetCode.AUTH_FAILED, "Authentication Failed").immutable();
+    private static final Response UNKNOWN_AUTH_TYPE = new SMTPResponse(SMTPRetCode.PARAMETER_NOT_IMPLEMENTED, "Unrecognized Authentication Type").immutable();
+    
     private abstract class AbstractSMTPLineHandler implements LineHandler<SMTPSession> {
 
         public Response onLine(SMTPSession session, ByteBuffer line) {
@@ -91,7 +101,7 @@ public class AuthCmdHandler
             // command by sending a 501 reply."
             if (line.equals("*\r\n")) {
                 session.popLineHandler();
-                return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS, DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.SECURITY_AUTH) + " Authentication aborted");
+                return AUTH_ABORTED;
             }
             return onCommand(session, line);
         }
@@ -137,10 +147,9 @@ public class AuthCmdHandler
      */
     private Response doAUTH(SMTPSession session, String argument) {
         if (session.getUser() != null) {
-            return new SMTPResponse(SMTPRetCode.BAD_SEQUENCE, DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" User has previously authenticated. "
-                    + " Further authentication is not required!");
+            return ALREADY_AUTH;
         } else if (argument == null) {
-            return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS, DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_INVALID_ARG)+" Usage: AUTH (authentication type) <challenge>");
+            return SYNTAX_ERROR;
         } else {
             String initialResponse = null;
             if ((argument != null) && (argument.indexOf(" ") > 0)) {
@@ -156,7 +165,7 @@ public class AuthCmdHandler
                             return doPlainAuthPass(session, l);
                         }
                     });
-                    return new SMTPResponse(SMTPRetCode.AUTH_READY, "OK. Continue authentication");
+                    return AUTH_READY_PLAIN;
                 } else {
                     userpass = initialResponse.trim();
                     return doPlainAuthPass(session, userpass);
@@ -169,7 +178,7 @@ public class AuthCmdHandler
                             return doLoginAuthPass(session, l);
                         }
                     });
-                    return new SMTPResponse(SMTPRetCode.AUTH_READY, "VXNlcm5hbWU6"); // base64 encoded "Username:"
+                    return AUTH_READY_USERNAME_LOGIN;
                 } else {
                     String user = initialResponse.trim();
                     return doLoginAuthPass(session, user);
@@ -289,7 +298,7 @@ public class AuthCmdHandler
             }
             
         }.setUser(user));
-        return new SMTPResponse(SMTPRetCode.AUTH_READY, "UGFzc3dvcmQ6"); // base64 encoded "Password:"
+        return AUTH_READY_PASSWORD_LOGIN;
     }
     
     private Response doLoginAuthPassCheck(SMTPSession session, String user, String pass) {
@@ -366,7 +375,7 @@ public class AuthCmdHandler
             }
         }
 
-        res = new SMTPResponse(SMTPRetCode.AUTH_FAILED, "Authentication Failed");
+        res = AUTH_FAILED;
         session.getLogger().error("AUTH method "+authType+" failed from " + user + "@" + session.getRemoteAddress().getAddress().getHostAddress()); 
         return res;
     }
@@ -450,7 +459,7 @@ public class AuthCmdHandler
                         .append(" is an unrecognized authentication type");
             session.getLogger().info(errorBuffer.toString());
         }
-        return new SMTPResponse(SMTPRetCode.PARAMETER_NOT_IMPLEMENTED, "Unrecognized Authentication Type");
+        return UNKNOWN_AUTH_TYPE;
     }
 
 
@@ -516,7 +525,7 @@ public class AuthCmdHandler
     public HookResult doMailParameter(SMTPSession session, String paramName, String paramValue) {
         // Ignore the AUTH command.
         // TODO we should at least check for correct syntax and put the result in session
-        return new HookResult(HookReturnCode.DECLINED);
+        return HookResult.declined();
     }
 
     /**

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/EhloCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/EhloCmdHandler.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/EhloCmdHandler.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/EhloCmdHandler.java Sat Dec 24 21:17:27 2011
@@ -46,6 +46,8 @@ public class EhloCmdHandler extends Abst
     private final static Collection<String> COMMANDS = Collections.unmodifiableCollection(Arrays.asList(COMMAND_NAME));
     // see http://issues.apache.org/jira/browse/JAMES-419
     private final static List<String> ESMTP_FEATURES = Collections.unmodifiableList(Arrays.asList("PIPELINING", "ENHANCEDSTATUSCODES", "8BITMIME"));
+    private static final Response DOMAIN_ADDRESS_REQUIRED = new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS, DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.DELIVERY_INVALID_ARG) + " Domain address required: " + COMMAND_NAME).immutable();
+    
     private List<EhloExtension> ehloExtensions;
 
     /**
@@ -141,10 +143,7 @@ public class EhloCmdHandler extends Abst
         session.resetState();
 
         if (parameters == null) {
-            return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS,
-                    DSNStatus.getStatus(DSNStatus.PERMANENT,
-                            DSNStatus.DELIVERY_INVALID_ARG)
-                            + " Domain address required: " + COMMAND_NAME);
+            return DOMAIN_ADDRESS_REQUIRED;
         } else {
             // store provided name
             session.setAttachment(SMTPSession.CURRENT_HELO_NAME, parameters, State.Transaction);

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/MailSizeEsmtpExtension.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/MailSizeEsmtpExtension.java?rev=1223019&r1=1223018&r2=1223019&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/MailSizeEsmtpExtension.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/MailSizeEsmtpExtension.java Sat Dec 24 21:17:27 2011
@@ -45,6 +45,9 @@ public class MailSizeEsmtpExtension impl
     private final static String MESG_SIZE = "MESG_SIZE"; // The size of the
     private final static String MESG_FAILED = "MESG_FAILED";   // Message failed flag
     private final static String[] MAIL_PARAMS = { "SIZE" };
+    
+    private static final HookResult SYNTAX_ERROR = new HookResult(HookReturnCode.DENY, SMTPRetCode.SYNTAX_ERROR_ARGUMENTS, DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.DELIVERY_INVALID_ARG) + " Syntactically incorrect value for SIZE parameter");
+    private static final HookResult QUOTA_EXCEEDED = new HookResult(HookReturnCode.DENY, SMTPRetCode.QUOTA_EXCEEDED, DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.SYSTEM_MSG_TOO_BIG) + " Message size exceeds fixed maximum message size");
 
 
 
@@ -101,11 +104,7 @@ public class MailSizeEsmtpExtension impl
             session.getLogger().error("Rejected syntactically incorrect value for SIZE parameter.");
             
             // This is a malformed option value. We return an error
-            return new HookResult(HookReturnCode.DENY, 
-                    SMTPRetCode.SYNTAX_ERROR_ARGUMENTS,
-                    DSNStatus.getStatus(DSNStatus.PERMANENT,
-                            DSNStatus.DELIVERY_INVALID_ARG)
-                            + " Syntactically incorrect value for SIZE parameter");
+            return SYNTAX_ERROR;
         }
         if (session.getLogger().isDebugEnabled()) {
             StringBuilder debugBuffer = new StringBuilder(128).append(
@@ -126,10 +125,7 @@ public class MailSizeEsmtpExtension impl
                     .append(maxMessageSize).append("based on SIZE option.");
             session.getLogger().error(errorBuffer.toString());
 
-            return new HookResult(HookReturnCode.DENY, SMTPRetCode.QUOTA_EXCEEDED, DSNStatus
-                    .getStatus(DSNStatus.PERMANENT,
-                            DSNStatus.SYSTEM_MSG_TOO_BIG)
-                    + " Message size exceeds fixed maximum message size");
+            return QUOTA_EXCEEDED;
         } else {
             // put the message size in the message state so it can be used
             // later to restrict messages for user quotas, etc.
@@ -189,9 +185,7 @@ public class MailSizeEsmtpExtension impl
     public HookResult onMessage(SMTPSession session, MailEnvelope mail) {
         Boolean failed = (Boolean) session.getAttachment(MESG_FAILED, State.Transaction);
         if (failed != null && failed.booleanValue()) {
-            HookResult response = new HookResult(HookReturnCode.DENY, SMTPRetCode.QUOTA_EXCEEDED,DSNStatus.getStatus(DSNStatus.PERMANENT,
-                    DSNStatus.SYSTEM_MSG_TOO_BIG) + " Maximum message size exceeded");
-  
+            
             StringBuilder errorBuffer = new StringBuilder(256).append(
                     "Rejected message from ").append(
                     session.getAttachment(SMTPSession.SENDER, State.Transaction).toString())
@@ -200,9 +194,9 @@ public class MailSizeEsmtpExtension impl
                     .append(
                             session.getConfiguration().getMaxMessageSize());
             session.getLogger().error(errorBuffer.toString());
-            return response;
+            return QUOTA_EXCEEDED;
         } else {
-            return new HookResult(HookReturnCode.DECLINED);
+            return HookResult.declined();
         }
     }
 



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