Author: norman
Date: Fri Dec 23 20:36:23 2011
New Revision: 1222834

URL: http://svn.apache.org/viewvc?rev=1222834&view=rev
Log:
Fix nullsender handling. I broke this before while refactoring state handling

Added:
    
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/MultiLineHandler.java
   (with props)
Modified:
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/MailAddress.java
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/MailCmdHandler.java
    
james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/SMTPServerTest.java

Added: 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/MultiLineHandler.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/MultiLineHandler.java?rev=1222834&view=auto
==============================================================================
--- 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/MultiLineHandler.java
 (added)
+++ 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/MultiLineHandler.java
 Fri Dec 23 20:36:23 2011
@@ -0,0 +1,57 @@
+package org.apache.james.protocols.api.handler;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.james.protocols.api.ProtocolSession;
+import org.apache.james.protocols.api.ProtocolSession.State;
+import org.apache.james.protocols.api.Response;
+
+/**
+ * A special {@link LineHandler} which will "buffer" the received lines till a 
point and the push them all at
+ * one to the {@link #onLines(ProtocolSession, Collection)} method
+ * 
+ *
+ * @param <S>
+ */
+public abstract class MultiLineHandler<S extends ProtocolSession> implements 
LineHandler<S>{
+
+    private static final String BUFFERED_LINES = "BUFFERED_LINES";
+    
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.protocols.api.handler.LineHandler#onLine(org.apache.james.protocols.api.ProtocolSession,
 byte[])
+     */
+    @SuppressWarnings("unchecked")
+    public Response onLine(S session, byte[] line) {
+        Collection<byte[]> lines = (List<byte[]>) 
session.getAttachment(BUFFERED_LINES, State.Transaction);
+        if (lines == null)  {
+            lines = new ArrayList<byte[]>();
+            session.setAttachment(BUFFERED_LINES, lines, State.Transaction);
+        }
+        lines.add(line);
+        if (isReady(session, line)) {
+            return onLines(session, (Collection<byte[]>) 
session.setAttachment(BUFFERED_LINES, null, State.Transaction));
+        }
+        return null;
+    }
+
+    /**
+     * Return <code>true</code> if the buffered lines are ready to get pushed 
to the {@link #onLines(ProtocolSession, Collection)} method
+     * 
+     * @param session
+     * @param line
+     * @return ready
+     */
+    protected abstract boolean isReady(S session, byte[] line);
+    
+    /**
+     * Handle the buffered lines
+     * 
+     * @param session
+     * @param lines
+     * @return response
+     */
+    protected abstract Response onLines(S session, Collection<byte[]> lines);
+}

Propchange: 
james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/handler/MultiLineHandler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/MailAddress.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/MailAddress.java?rev=1222834&r1=1222833&r2=1222834&view=diff
==============================================================================
--- 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/MailAddress.java
 (original)
+++ 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/MailAddress.java
 Fri Dec 23 20:36:23 2011
@@ -66,6 +66,30 @@ public class MailAddress {
     private String localPart = null;
     private String domain = null;
 
+    private static final MailAddress NULL_SENDER = new MailAddress() {
+
+        @Override
+        public String getDomain() {
+            return "";
+        }
+
+        @Override
+        public String getLocalPart() {
+            return "";
+        }
+
+        @Override
+        public String toString() {
+            return "";
+        }
+
+        @Override
+        public boolean isNullSender() {
+            return true;
+        }
+        
+    };
+    
     /**
      * Strips source routing. According to RFC-2821 it is a valid approach
      * to handle mails containing RFC-821 source-route information.
@@ -86,6 +110,13 @@ public class MailAddress {
         return pos;
     }
     
+    public static MailAddress nullSender() {
+        return NULL_SENDER;
+    }
+    
+    private MailAddress() {
+        
+    }
     /**
      * Constructs a MailAddress by parsing the provided address.
      *
@@ -478,4 +509,13 @@ public class MailAddress {
         dSB.append(result);
         return pos;
     }
+    
+    /**
+     * Return <code>true</code> if the {@link MailAddress} should represent a 
null sender (<>)
+     * 
+     * @return nullsender
+     */
+    public boolean isNullSender() {
+        return false;
+    }
 }

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=1222834&r1=1222833&r2=1222834&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
 Fri Dec 23 20:36:23 2011
@@ -243,7 +243,9 @@ public class MailCmdHandler extends Abst
                                     + " Syntax error in sender address");
                 }
             }
-
+            if (senderAddress == null) {
+                senderAddress = MailAddress.nullSender();
+            }
             // Store the senderAddress in session map
             session.setAttachment(SMTPSession.SENDER, senderAddress, 
State.Transaction);
         }
@@ -261,7 +263,11 @@ public class MailCmdHandler extends Abst
      * {@inheritDoc}
      */
     protected HookResult callHook(MailHook rawHook, SMTPSession session, 
String parameters) {
-        return rawHook.doMail(session,(MailAddress) 
session.getAttachment(SMTPSession.SENDER, State.Transaction));
+        MailAddress sender = (MailAddress) 
session.getAttachment(SMTPSession.SENDER, State.Transaction);
+        if (sender.isNullSender()) {
+            sender = null;
+        }
+        return rawHook.doMail(session, sender);
     }
 
     
@@ -301,5 +307,6 @@ public class MailCmdHandler extends Abst
     protected String getDefaultDomain() {
         return "localhost";
     }
+    
 
 }

Modified: 
james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/SMTPServerTest.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/SMTPServerTest.java?rev=1222834&r1=1222833&r2=1222834&view=diff
==============================================================================
--- 
james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/SMTPServerTest.java
 (original)
+++ 
james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/SMTPServerTest.java
 Fri Dec 23 20:36:23 2011
@@ -674,6 +674,44 @@ public class SMTPServerTest {
     }
     
     @Test
+    public void testNullSender() throws Exception {
+
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", 
TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            server = new NettyServer(createProtocol(new ProtocolHandler[0]));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = createClient();
+            client.connect(address.getAddress().getHostAddress(), 
address.getPort());
+            assertTrue("Reply="+ client.getReplyString(), 
SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+           
+            client.helo("localhost");
+            assertTrue("Reply="+ client.getReplyString(), 
SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            client.setSender("");
+            assertTrue("Reply="+ client.getReplyString(), 
SMTPReply.isPositiveCompletion(client.getReplyCode()));
+         
+            client.addRecipient(RCPT1);
+            assertTrue("Reply="+ client.getReplyString(), 
SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), 
SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    @Test
     public void testMessageHookPermanentError() throws Exception {
         TestMessageHook testHook = new TestMessageHook();
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to