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 2010/04/09 17:44:47 UTC

svn commit: r932468 [2/3] - in /james/server/trunk: ./ common-util/ common-util/src/main/java/org/apache/james/util/stream/ mina-socket/src/main/java/org/apache/james/socket/ mina-socket/src/main/java/org/apache/james/socket/mina/ netty-socket/ netty-s...

Added: james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ResponseEncoder.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ResponseEncoder.java?rev=932468&view=auto
==============================================================================
--- james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ResponseEncoder.java (added)
+++ james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ResponseEncoder.java Fri Apr  9 15:44:46 2010
@@ -0,0 +1,55 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.pop3server.netty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.james.pop3server.POP3Response;
+import org.apache.james.socket.netty.AbstractResponseEncoder;
+
+/**
+ * {@link AbstractResponseEncoder} implementation which handles {@link POP3Response} messages
+ *
+ */
+public class POP3ResponseEncoder extends AbstractResponseEncoder<POP3Response>{
+
+    public POP3ResponseEncoder() {
+        super(POP3Response.class, "US-ASCII");
+    }
+
+    @Override
+    protected List<String> getResponse(POP3Response response) {
+        List<String> responseList = new ArrayList<String>();
+        for (int k = 0; k < response.getLines().size(); k++) {
+            StringBuffer respBuff = new StringBuffer(256);
+            if (k == 0) {
+                respBuff.append(response.getRetCode());
+                respBuff.append(" ");
+                respBuff.append(response.getLines().get(k));
+
+            } else {
+                respBuff.append(response.getLines().get(k));
+            }
+            responseList.add(respBuff.toString());
+        }
+        return responseList;
+    }
+
+}

Copied: james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AbstractAsyncPOP3ServerTest.java (from r932257, james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java)
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AbstractAsyncPOP3ServerTest.java?p2=james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AbstractAsyncPOP3ServerTest.java&p1=james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java&r1=932257&r2=932468&rev=932468&view=diff
==============================================================================
--- james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java (original)
+++ james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AbstractAsyncPOP3ServerTest.java Fri Apr  9 15:44:46 2010
@@ -46,7 +46,6 @@ import org.apache.james.imap.mailbox.Mai
 import org.apache.james.imap.mailbox.MailboxSession;
 import org.apache.james.imap.store.Authenticator;
 import org.apache.james.lifecycle.LifecycleUtil;
-import org.apache.james.pop3server.mina.AsyncPOP3Server;
 import org.apache.james.services.MailServer;
 import org.apache.james.socket.ProtocolHandlerChainImpl;
 import org.apache.james.test.mock.james.MockFileSystem;
@@ -55,53 +54,44 @@ import org.apache.james.test.util.Util;
 import org.apache.james.userrepository.MockUsersRepository;
 import org.apache.james.util.POP3BeforeSMTPHelper;
 
-public class AsyncPOP3ServerTest extends TestCase {
+public abstract class AbstractAsyncPOP3ServerTest extends TestCase {
 
     private int m_pop3ListenerPort = Util.getNonPrivilegedPort();
-    private MockMailServer m_mailServer;
+    protected MockMailServer m_mailServer;
     private POP3TestConfiguration m_testConfiguration;
     private MockUsersRepository m_usersRepository = new MockUsersRepository();
     private POP3Client m_pop3Protocol = null;
     private FakeLoader serviceManager;
-    private DNSService dnsservice;
-    private MockFileSystem fSystem;
-    private ProtocolHandlerChainImpl chain;
+    protected DNSService dnsservice;
+    protected MockFileSystem fSystem;
+    protected ProtocolHandlerChainImpl chain;
     private InMemoryMailboxManager manager;
     
-    public AsyncPOP3ServerTest() {
+    public AbstractAsyncPOP3ServerTest() {
         super("AsyncPOP3ServerTest");
     }
 
-    private AsyncPOP3Server m_pop3Server;
-
     protected void setUp() throws Exception {
         setUpServiceManager();
         
         chain = new ProtocolHandlerChainImpl();
         chain.setInstanceFactory(serviceManager);
         chain.setLog(new SimpleLog("ChainLog"));
-        
-        m_pop3Server = new AsyncPOP3Server();
-        m_pop3Server.setDNSService(dnsservice);
-        m_pop3Server.setFileSystem(fSystem);
-        m_pop3Server.setProtocolHandlerChain(chain);
-       
-        
-        SimpleLog log = new SimpleLog("Mock");
-        log.setLevel(SimpleLog.LOG_LEVEL_DEBUG);
-        m_pop3Server.setLog(log);
-        m_pop3Server.setMailServer(m_mailServer);
+   
+        setUpPOP3Server();
         m_testConfiguration = new POP3TestConfiguration(m_pop3ListenerPort);
     }
 
     protected void finishSetUp(POP3TestConfiguration testConfiguration) throws Exception {
         testConfiguration.init();
         chain.configure(testConfiguration.configurationAt("handler.handlerchain"));        
-        m_pop3Server.configure(testConfiguration);
         chain.init();
-        m_pop3Server.init();
+        initPOP3Server(testConfiguration);
     }
 
+    protected abstract void setUpPOP3Server() throws Exception;
+    protected abstract void initPOP3Server(POP3TestConfiguration testConfiguration) throws Exception;
+    
     
     protected void setUpServiceManager() throws Exception {
         serviceManager = new FakeLoader();

Modified: james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java?rev=932468&r1=932467&r2=932468&view=diff
==============================================================================
--- james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java (original)
+++ james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java Fri Apr  9 15:44:46 2010
@@ -1,571 +1,50 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.pop3server;
-
-import java.io.ByteArrayInputStream;
-import java.io.Reader;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-
-import javax.mail.Flags;
-import javax.mail.MessagingException;
-
-import junit.framework.TestCase;
-
-import org.apache.commons.logging.impl.SimpleLog;
-import org.apache.commons.net.pop3.POP3Client;
-import org.apache.commons.net.pop3.POP3MessageInfo;
-import org.apache.commons.net.pop3.POP3Reply;
-import org.apache.james.api.dnsservice.AbstractDNSServer;
-import org.apache.james.api.dnsservice.DNSService;
-import org.apache.james.api.kernel.mock.FakeLoader;
-import org.apache.james.api.user.UsersRepository;
-import org.apache.james.imap.inmemory.InMemoryMailboxManager;
-import org.apache.james.imap.inmemory.InMemorySubscriptionManager;
-import org.apache.james.imap.mailbox.Mailbox;
-import org.apache.james.imap.mailbox.MailboxSession;
-import org.apache.james.imap.store.Authenticator;
-import org.apache.james.lifecycle.LifecycleUtil;
-import org.apache.james.pop3server.mina.AsyncPOP3Server;
-import org.apache.james.services.MailServer;
-import org.apache.james.socket.ProtocolHandlerChainImpl;
-import org.apache.james.test.mock.james.MockFileSystem;
-import org.apache.james.test.mock.james.MockMailServer;
-import org.apache.james.test.util.Util;
-import org.apache.james.userrepository.MockUsersRepository;
-import org.apache.james.util.POP3BeforeSMTPHelper;
-
-public class AsyncPOP3ServerTest extends TestCase {
-
-    private int m_pop3ListenerPort = Util.getNonPrivilegedPort();
-    private MockMailServer m_mailServer;
-    private POP3TestConfiguration m_testConfiguration;
-    private MockUsersRepository m_usersRepository = new MockUsersRepository();
-    private POP3Client m_pop3Protocol = null;
-    private FakeLoader serviceManager;
-    private DNSService dnsservice;
-    private MockFileSystem fSystem;
-    private ProtocolHandlerChainImpl chain;
-    private InMemoryMailboxManager manager;
-    
-    public AsyncPOP3ServerTest() {
-        super("AsyncPOP3ServerTest");
-    }
-
-    private AsyncPOP3Server m_pop3Server;
-
-    protected void setUp() throws Exception {
-        setUpServiceManager();
-        
-        chain = new ProtocolHandlerChainImpl();
-        chain.setInstanceFactory(serviceManager);
-        chain.setLog(new SimpleLog("ChainLog"));
-        
-        m_pop3Server = new AsyncPOP3Server();
-        m_pop3Server.setDNSService(dnsservice);
-        m_pop3Server.setFileSystem(fSystem);
-        m_pop3Server.setProtocolHandlerChain(chain);
-       
-        
-        SimpleLog log = new SimpleLog("Mock");
-        log.setLevel(SimpleLog.LOG_LEVEL_DEBUG);
-        m_pop3Server.setLog(log);
-        m_pop3Server.setMailServer(m_mailServer);
-        m_testConfiguration = new POP3TestConfiguration(m_pop3ListenerPort);
-    }
-
-    protected void finishSetUp(POP3TestConfiguration testConfiguration) throws Exception {
-        testConfiguration.init();
-        chain.configure(testConfiguration.configurationAt("handler.handlerchain"));        
-        m_pop3Server.configure(testConfiguration);
-        chain.init();
-        m_pop3Server.init();
-    }
-
-    
-    protected void setUpServiceManager() throws Exception {
-        serviceManager = new FakeLoader();
-
-        m_mailServer = new MockMailServer(m_usersRepository);
-        serviceManager.put(MailServer.ROLE, m_mailServer);
-        serviceManager.put(UsersRepository.ROLE,
-                m_usersRepository);
-        
-        
-        manager = new InMemoryMailboxManager(new Authenticator() {
-            
-            public boolean isAuthentic(String userid, CharSequence passwd) {
-                return m_usersRepository.test(userid, passwd.toString());
-            }
-        }, new InMemorySubscriptionManager());
-        
-        serviceManager.put("mailboxmanager", manager);
-        
-        dnsservice = setUpDNSServer();
-        serviceManager.put(DNSService.ROLE, setUpDNSServer());
-        fSystem = new MockFileSystem();
-        serviceManager.put(MockFileSystem.ROLE,fSystem);
-      
-    }
-
-    private DNSService setUpDNSServer() {
-        DNSService dns = new AbstractDNSServer() {
-            public String getHostName(InetAddress addr) {
-                return "localhost";
-            }
-            
-            public InetAddress getLocalHost() throws UnknownHostException {
-                return InetAddress.getLocalHost();
-            }            
-        
-        };
-        return dns;
-    }
-    protected void tearDown() throws Exception {
-        if (m_pop3Protocol != null) {
-           if ( m_pop3Protocol.isConnected()){
-               m_pop3Protocol.sendCommand("quit");
-               m_pop3Protocol.disconnect();
-           }
-        }
-        LifecycleUtil.dispose(m_mailServer);
-        
-        manager.deleteEverything();
-        //manager.deleteAll();
-
-        super.tearDown();
-    }
-
-    public void testAuthenticationFail() throws Exception {
-        finishSetUp(m_testConfiguration);
-        
-        m_pop3Protocol = new POP3Client();
-        m_pop3Protocol.connect("127.0.0.1", m_pop3ListenerPort);
-
-        m_usersRepository.addUser("known", "test2");
-
-        m_pop3Protocol.login("known", "test");
-        assertEquals(0, m_pop3Protocol.getState());
-        assertTrue(m_pop3Protocol.getReplyString().startsWith("-ERR"));
-    }
-
-    public void testUnknownUser() throws Exception {
-        finishSetUp(m_testConfiguration);
-
-        m_pop3Protocol = new POP3Client();
-        m_pop3Protocol.connect("127.0.0.1", m_pop3ListenerPort);
-
-        m_pop3Protocol.login("unknown", "test");
-        assertEquals(0, m_pop3Protocol.getState());
-        assertTrue(m_pop3Protocol.getReplyString().startsWith("-ERR"));
-    }
-
-    public void testKnownUserEmptyInbox() throws Exception {
-        finishSetUp(m_testConfiguration);
-
-        m_pop3Protocol = new POP3Client();
-        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-
-        m_usersRepository.addUser("foo", "bar");
-
-        // not authenticated
-        POP3MessageInfo[] entries = m_pop3Protocol.listMessages();
-        assertNull(entries);
-
-        m_pop3Protocol.login("foo", "bar");
-        System.err.println(m_pop3Protocol.getState());
-        assertEquals(1, m_pop3Protocol.getState());
-
-        entries = m_pop3Protocol.listMessages();
-        assertEquals(1, m_pop3Protocol.getState());
-
-        assertNotNull(entries);
-        assertEquals(entries.length, 0);
-        
-        POP3MessageInfo p3i = m_pop3Protocol.listMessage(1);
-        assertEquals(1, m_pop3Protocol.getState());
-        assertNull(p3i);
-
-    }
-
-    // TODO: This currently fails with Async implementation because
-    //       it use Charset US-ASCII to decode / Encode the protocol
-    //       from the RFC I'm currently not understand if NON-ASCII chars
-    //       are allowed at all. So this needs to be checked
-    /*
-    public void testNotAsciiCharsInPassword() throws Exception {
-        finishSetUp(m_testConfiguration);
-
-        m_pop3Protocol = new POP3Client();
-        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-
-        String pass = "bar" + (new String(new char[] { 200, 210 })) + "foo";
-        m_usersRepository.addUser("foo", pass);
-        InMemorySpoolRepository mockMailRepository = new InMemorySpoolRepository();
-        m_mailServer.setUserInbox("foo", mockMailRepository);
-
-        m_pop3Protocol.login("foo", pass);
-        assertEquals(1, m_pop3Protocol.getState());
-        ContainerUtil.dispose(mockMailRepository);
-    }
-    */
-
-
-    public void testUnknownCommand() throws Exception {
-        finishSetUp(m_testConfiguration);
-
-        m_pop3Protocol = new POP3Client();
-        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-        
-        m_pop3Protocol.sendCommand("unkn");
-        assertEquals(0, m_pop3Protocol.getState());
-        assertEquals("Expected -ERR as result for an unknown command", m_pop3Protocol.getReplyString().substring(0,4),"-ERR");
-    }
-
-    public void testUidlCommand() throws Exception {
-        finishSetUp(m_testConfiguration);
-
-        m_usersRepository.addUser("foo", "bar");
-
-        m_pop3Protocol = new POP3Client();
-        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-
-        m_pop3Protocol.sendCommand("uidl");
-        assertEquals(0, m_pop3Protocol.getState());
-
-        m_pop3Protocol.login("foo", "bar");
-
-        POP3MessageInfo[] list = m_pop3Protocol.listUniqueIdentifiers();
-        assertEquals("Found unexpected messages", 0, list.length);
-
-        m_pop3Protocol.disconnect();
-        String mailboxName = "#mail.foo.INBOX";
-        MailboxSession session = manager.login("foo", "bar", new SimpleLog("Test"));
-        if (manager.mailboxExists(mailboxName, session) == false) {
-            manager.createMailbox(mailboxName, session);
-        }
-        setupTestMails(session,manager.getMailbox(mailboxName, session));
-        
-        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-        m_pop3Protocol.login("foo", "bar");
-
-        list = m_pop3Protocol.listUniqueIdentifiers();
-        assertEquals("Expected 2 messages, found: "+list.length, 2, list.length);
-        
-        POP3MessageInfo p3i = m_pop3Protocol.listUniqueIdentifier(1);
-        assertNotNull(p3i);
-        
-        manager.deleteMailbox("#mail.foo.INBOX", session);
-
-
-    }
-
-    public void testMiscCommandsWithWithoutAuth() throws Exception {
-        finishSetUp(m_testConfiguration);
-
-        m_usersRepository.addUser("foo", "bar");
-        
-        m_pop3Protocol = new POP3Client();
-        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-
-        m_pop3Protocol.sendCommand("noop");
-        assertEquals(0, m_pop3Protocol.getState());
-        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-
-        m_pop3Protocol.sendCommand("stat");
-        assertEquals(0, m_pop3Protocol.getState());
-        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-
-        m_pop3Protocol.sendCommand("pass");
-        assertEquals(0, m_pop3Protocol.getState());
-        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-
-        m_pop3Protocol.sendCommand("auth");
-        assertEquals(0, m_pop3Protocol.getState());
-        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-
-        m_pop3Protocol.sendCommand("rset");
-        assertEquals(0, m_pop3Protocol.getState());
-        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-        
-        m_pop3Protocol.login("foo", "bar");
-
-        POP3MessageInfo[] list = m_pop3Protocol.listUniqueIdentifiers();
-        assertEquals("Found unexpected messages", 0, list.length);
-
-        m_pop3Protocol.sendCommand("noop");
-        assertEquals(1, m_pop3Protocol.getState());
-
-        m_pop3Protocol.sendCommand("pass");
-        assertEquals(1, m_pop3Protocol.getState());
-        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-
-        m_pop3Protocol.sendCommand("auth");
-        assertEquals(1, m_pop3Protocol.getState());
-        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-
-        m_pop3Protocol.sendCommand("user");
-        assertEquals(1, m_pop3Protocol.getState());
-        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-
-        m_pop3Protocol.sendCommand("rset");
-        assertEquals(1, m_pop3Protocol.getState());
-        
-    }
-
-    public void testKnownUserInboxWithMessages() throws Exception {
-        finishSetUp(m_testConfiguration);
-
-        m_pop3Protocol = new POP3Client();
-        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-
-        m_usersRepository.addUser("foo2", "bar2");
-        
-        String mailboxName = "#mail.foo2.INBOX";
-        MailboxSession session = manager.login("foo2", "bar2", new SimpleLog("Test"));
-        
-        if (manager.mailboxExists(mailboxName, session) == false) {
-            manager.createMailbox(mailboxName, session);
-        }
-        
-        setupTestMails(session,manager.getMailbox(mailboxName, session));
-        
-        m_pop3Protocol.sendCommand("retr","1");
-        assertEquals(0, m_pop3Protocol.getState());
-        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-
-        m_pop3Protocol.login("foo2", "bar2");
-        assertEquals(1, m_pop3Protocol.getState());
-
-        POP3MessageInfo[] entries = m_pop3Protocol.listMessages();
-
-        assertNotNull(entries);
-        assertEquals(2, entries.length);
-        assertEquals(1, m_pop3Protocol.getState());
-
-        Reader r = m_pop3Protocol.retrieveMessageTop(entries[0].number, 0);
-
-        assertNotNull(r);
-
-        r.close();
-
-        Reader r2 = m_pop3Protocol.retrieveMessage(entries[0].number);
-        assertNotNull(r2);
-        r2.close();
-
-        // existing message
-        boolean deleted = m_pop3Protocol.deleteMessage(entries[0].number);
-        assertTrue(deleted);
-
-        // already deleted message
-        deleted = m_pop3Protocol.deleteMessage(entries[0].number);
-        
-        // TODO: Understand why this fails...
-        //assertFalse(deleted);
-
-        // unexisting message
-        deleted = m_pop3Protocol.deleteMessage(10);
-        assertFalse(deleted);
-
-        m_pop3Protocol.sendCommand("quit");
-        m_pop3Protocol.disconnect();
-
-        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-
-        m_pop3Protocol.login("foo2", "bar2");
-        assertEquals(1, m_pop3Protocol.getState());
-
-        entries = null;
-
-        POP3MessageInfo stats = m_pop3Protocol.status();
-        assertEquals(1, stats.number);
-        assertEquals(5, stats.size);
-
-        entries = m_pop3Protocol.listMessages();
-
-        assertNotNull(entries);
-        assertEquals(1, entries.length);
-        assertEquals(1, m_pop3Protocol.getState());
-
-        // top without arguments
-        m_pop3Protocol.sendCommand("top");
-        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-        
-        Reader r3 = m_pop3Protocol.retrieveMessageTop(entries[0].number, 0);
-        assertNotNull(r3);
-        r3.close();
-        manager.deleteMailbox(mailboxName, session);
-    }
-
-    private void setupTestMails(MailboxSession session, Mailbox mailbox) throws MessagingException {
-        byte[] content =        ("Return-path: return@test.com\r\n"+
-                                 "Content-Transfer-Encoding: plain\r\n"+
-                                 "Subject: test\r\n\r\n"+
-                                 "Body Text POP3ServerTest.setupTestMails\r\n").getBytes();
-        
-        mailbox.appendMessage(new ByteArrayInputStream(content), new Date(), session, true, new Flags());
-        byte[] content2 = ("EMPTY").getBytes();
-        mailbox.appendMessage(new ByteArrayInputStream(content2), new Date(), session, true, new Flags());
-    }
-
-    /*
-    public void testTwoSimultaneousMails() throws Exception {
-        finishSetUp(m_testConfiguration);
-
-        // make two user/repositories, open both
-        m_usersRepository.addUser("foo1", "bar1");
-        InMemorySpoolRepository mailRep1 = new InMemorySpoolRepository();
-        setupTestMails(mailRep1);
-        m_mailServer.setUserInbox("foo1", mailRep1);
-
-        m_usersRepository.addUser("foo2", "bar2");
-        InMemorySpoolRepository mailRep2 = new InMemorySpoolRepository();
-        //do not setupTestMails, this is done later
-        m_mailServer.setUserInbox("foo2", mailRep2);
-
-        POP3Client pop3Protocol2 = null;
-        try {
-            // open two connections
-            m_pop3Protocol = new POP3Client();
-            m_pop3Protocol.connect("127.0.0.1", m_pop3ListenerPort);
-            pop3Protocol2 = new POP3Client();
-            pop3Protocol2.connect("127.0.0.1", m_pop3ListenerPort);
-
-            assertEquals("first connection taken", 0, m_pop3Protocol.getState());
-            assertEquals("second connection taken", 0, pop3Protocol2.getState());
-
-            // open two accounts
-            m_pop3Protocol.login("foo1", "bar1");
-
-            pop3Protocol2.login("foo2", "bar2");
-
-            POP3MessageInfo[] entries = m_pop3Protocol.listMessages();
-            assertEquals("foo1 has mails", 2, entries.length);
-
-            entries = pop3Protocol2.listMessages();
-            assertEquals("foo2 has no mails", 0, entries.length);
-
-        } finally {
-            // put both to rest, field var is handled by tearDown()
-            if (pop3Protocol2 != null) {
-                pop3Protocol2.sendCommand("quit");
-                pop3Protocol2.disconnect();
-            }
-        }
-    }
-    */
-    
-    public void testIpStored() throws Exception {
-        finishSetUp(m_testConfiguration);
-
-        m_pop3Protocol = new POP3Client();
-        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-
-        String pass = "password";
-        m_usersRepository.addUser("foo", pass);
-
-        m_pop3Protocol.login("foo", pass);
-        assertEquals(1, m_pop3Protocol.getState());
-        assertTrue(POP3BeforeSMTPHelper.isAuthorized("127.0.0.1"));
-    }
-    
-    public void testCapa() throws Exception {
-         finishSetUp(m_testConfiguration);
-
-         m_pop3Protocol = new POP3Client();
-         m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-
-         String pass = "password";
-         m_usersRepository.addUser("foo", pass);
-
-         assertEquals(POP3Reply.OK, m_pop3Protocol.sendCommand("CAPA"));
-         
-         m_pop3Protocol.getAdditionalReply();
-         m_pop3Protocol.getReplyString();
-         List<String> replies = Arrays.asList(m_pop3Protocol.getReplyStrings());
-         
-         assertTrue("contains USER", replies.contains("USER"));
-         
-         m_pop3Protocol.login("foo", pass);
-         assertEquals(POP3Reply.OK, m_pop3Protocol.sendCommand("CAPA"));
-         
-         m_pop3Protocol.getAdditionalReply();
-         m_pop3Protocol.getReplyString();
-         replies = Arrays.asList(m_pop3Protocol.getReplyStrings());
-         assertTrue("contains USER", replies.contains("USER"));
-         assertTrue("contains UIDL", replies.contains("UIDL"));
-         assertTrue("contains TOP", replies.contains("TOP"));
-
-    }
-    
-
-    /*
-     * See JAMES-649
-     * The same happens when using RETR
-     *     
-     * Comment to not broke the builds!
-     *
-    public void testOOMTop() throws Exception {
-        finishSetUp(m_testConfiguration);
-
-        int messageCount = 30000;
-        m_pop3Protocol = new POP3Client();
-        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-
-        m_usersRepository.addUser("foo", "bar");
-        InMemorySpoolRepository mockMailRepository = new InMemorySpoolRepository();
-        
-        Mail m = new MailImpl();
-        m.setMessage(Util.createMimeMessage("X-TEST", "test"));
-        for (int i = 1; i < messageCount+1; i++ ) {
-            m.setName("test" + i);
-            mockMailRepository.store(m);
-        }
-
-        m_mailServer.setUserInbox("foo", mockMailRepository);
-
-        // not authenticated
-        POP3MessageInfo[] entries = m_pop3Protocol.listMessages();
-        assertNull(entries);
-
-        m_pop3Protocol.login("foo", "bar");
-        System.err.println(m_pop3Protocol.getState());
-        assertEquals(1, m_pop3Protocol.getState());
-
-        entries = m_pop3Protocol.listMessages();
-        assertEquals(1, m_pop3Protocol.getState());
-
-        assertNotNull(entries);
-        assertEquals(entries.length, messageCount);
-        
-        for (int i = 1; i < messageCount+1; i++ ) {
-            Reader r = m_pop3Protocol.retrieveMessageTop(i, 100);
-            assertNotNull(r);
-            r.close();
-        }
-        
-        ContainerUtil.dispose(mockMailRepository);
-    }
-    */
-    
-}
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.pop3server;
+
+import org.apache.commons.logging.impl.SimpleLog;
+import org.apache.james.pop3server.mina.AsyncPOP3Server;
+
+public class AsyncPOP3ServerTest extends AbstractAsyncPOP3ServerTest{
+
+    private AsyncPOP3Server m_pop3Server;
+
+    @Override
+    protected void initPOP3Server(POP3TestConfiguration testConfiguration) throws Exception {
+        m_pop3Server.configure(testConfiguration);
+        m_pop3Server.init();
+    }
+
+    @Override
+    protected void setUpPOP3Server() throws Exception {
+        
+        m_pop3Server = new AsyncPOP3Server();
+        m_pop3Server.setDNSService(dnsservice);
+        m_pop3Server.setFileSystem(fSystem);
+        m_pop3Server.setProtocolHandlerChain(chain);
+       
+        
+        SimpleLog log = new SimpleLog("Mock");
+        log.setLevel(SimpleLog.LOG_LEVEL_DEBUG);
+        m_pop3Server.setLog(log);
+        m_pop3Server.setMailServer(m_mailServer);        
+    }
+
+}

Added: james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/NioPOP3ServerTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/NioPOP3ServerTest.java?rev=932468&view=auto
==============================================================================
--- james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/NioPOP3ServerTest.java (added)
+++ james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/NioPOP3ServerTest.java Fri Apr  9 15:44:46 2010
@@ -0,0 +1,50 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.pop3server;
+
+import org.apache.commons.logging.impl.SimpleLog;
+import org.apache.james.pop3server.netty.NioPOP3Server;
+
+public class NioPOP3ServerTest extends AbstractAsyncPOP3ServerTest{
+
+    private NioPOP3Server m_pop3Server;
+
+    @Override
+    protected void initPOP3Server(POP3TestConfiguration testConfiguration) throws Exception {
+        m_pop3Server.configure(testConfiguration);
+        m_pop3Server.init();
+    }
+
+    @Override
+    protected void setUpPOP3Server() throws Exception {
+        
+        m_pop3Server = new NioPOP3Server();
+        m_pop3Server.setDNSService(dnsservice);
+        m_pop3Server.setFileSystem(fSystem);
+        m_pop3Server.setProtocolHandlerChain(chain);
+       
+        
+        SimpleLog log = new SimpleLog("Mock");
+        log.setLevel(SimpleLog.LOG_LEVEL_DEBUG);
+        m_pop3Server.setLog(log);
+        m_pop3Server.setMailServer(m_mailServer);        
+    }
+
+}

Modified: james/server/trunk/smtpserver/pom.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/pom.xml?rev=932468&r1=932467&r2=932468&view=diff
==============================================================================
--- james/server/trunk/smtpserver/pom.xml (original)
+++ james/server/trunk/smtpserver/pom.xml Fri Apr  9 15:44:46 2010
@@ -80,6 +80,10 @@
       <artifactId>james-server-mina-socket</artifactId>
     </dependency>
     <dependency>
+      <groupId>org.apache.james</groupId>
+      <artifactId>james-server-netty-socket</artifactId>
+    </dependency>
+    <dependency>
       <groupId>${javax.activation.groupId}</groupId>
       <artifactId>${javax.activation.artifactId}</artifactId>
     </dependency>

Modified: james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/AsyncSMTPServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/AsyncSMTPServer.java?rev=932468&r1=932467&r2=932468&view=diff
==============================================================================
--- james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/AsyncSMTPServer.java (original)
+++ james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/AsyncSMTPServer.java Fri Apr  9 15:44:46 2010
@@ -313,4 +313,5 @@ public class AsyncSMTPServer extends Abs
         return new SMTPIoHandler(handlerChain, theConfigData,getLogger(),getSslContextFactory());
     }
     
+
 }

Added: james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/NioSMTPServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/NioSMTPServer.java?rev=932468&view=auto
==============================================================================
--- james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/NioSMTPServer.java (added)
+++ james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/NioSMTPServer.java Fri Apr  9 15:44:46 2010
@@ -0,0 +1,296 @@
+package org.apache.james.smtpserver.netty;
+
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.james.api.dnsservice.util.NetMatcher;
+import org.apache.james.protocols.api.ProtocolHandlerChain;
+import org.apache.james.protocols.smtp.SMTPConfiguration;
+import org.apache.james.protocols.smtp.SMTPServerMBean;
+import org.apache.james.socket.netty.AbstractAsyncServer;
+import org.apache.james.socket.netty.AbstractChannelPipelineFactory;
+import org.jboss.netty.channel.ChannelPipelineFactory;
+import org.jboss.netty.channel.ChannelUpstreamHandler;
+import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
+
+public class NioSMTPServer extends AbstractAsyncServer implements SMTPServerMBean{
+
+    
+    /**
+     * The handler chain - SMTPhandlers can lookup handlerchain to obtain
+     * Command handlers , Message handlers and connection handlers
+     * Constructed during initialisation to allow dependency injection.
+     */
+    private ProtocolHandlerChain handlerChain;
+
+    /**
+     * Whether authentication is required to use
+     * this SMTP server.
+     */
+    private final static int AUTH_DISABLED = 0;
+    private final static int AUTH_REQUIRED = 1;
+    private final static int AUTH_ANNOUNCE = 2;
+    private int authRequired = AUTH_DISABLED;
+
+    /**
+     * Whether the server needs helo to be send first
+     */
+    private boolean heloEhloEnforcement = false;
+
+    /**
+     * SMTPGreeting to use 
+     */
+    private String smtpGreeting = null;
+
+    /**
+     * This is a Network Matcher that should be configured to contain
+     * authorized networks that bypass SMTP AUTH requirements.
+     */
+    private NetMatcher authorizedNetworks = null;
+
+    /**
+     * The maximum message size allowed by this SMTP server.  The default
+     * value, 0, means no limit.
+     */
+    private long maxMessageSize = 0;
+
+    /**
+     * The number of bytes to read before resetting
+     * the connection timeout timer.  Defaults to
+     * 20 KB.
+     */
+    private int lengthReset = 20 * 1024;
+
+    /**
+     * The configuration data to be passed to the handler
+     */
+    private SMTPConfiguration theConfigData
+    = new SMTPHandlerConfigurationDataImpl();
+
+    private boolean addressBracketsEnforcement = true;
+
+    
+
+    public void setProtocolHandlerChain(ProtocolHandlerChain handlerChain) {
+        this.handlerChain = handlerChain;
+    }
+
+    
+    public void doConfigure(final HierarchicalConfiguration configuration) throws ConfigurationException {
+        if (isEnabled()) {
+            HierarchicalConfiguration handlerConfiguration = configuration.configurationAt("handler");
+            String authRequiredString = handlerConfiguration.getString("authRequired","false").trim().toLowerCase();
+            if (authRequiredString.equals("true")) authRequired = AUTH_REQUIRED;
+            else if (authRequiredString.equals("announce")) authRequired = AUTH_ANNOUNCE;
+            else authRequired = AUTH_DISABLED;
+            if (authRequired != AUTH_DISABLED) {
+                getLogger().info("This SMTP server requires authentication.");
+            } else {
+                getLogger().info("This SMTP server does not require authentication.");
+            }
+
+            String authorizedAddresses = handlerConfiguration.getString("authorizedAddresses",null);
+            if (authRequired == AUTH_DISABLED && authorizedAddresses == null) {
+                /* if SMTP AUTH is not requred then we will use
+                 * authorizedAddresses to determine whether or not to
+                 * relay e-mail.  Therefore if SMTP AUTH is not
+                 * required, we will not relay e-mail unless the
+                 * sending IP address is authorized.
+                 *
+                 * Since this is a change in behavior for James v2,
+                 * create a default authorizedAddresses network of
+                 * 0.0.0.0/0, which matches all possible addresses, thus
+                 * preserving the current behavior.
+                 *
+                 * James v3 should require the <authorizedAddresses>
+                 * element.
+                 */
+                authorizedAddresses = "0.0.0.0/0.0.0.0";
+            }
+
+            if (authorizedAddresses != null) {
+                java.util.StringTokenizer st = new java.util.StringTokenizer(authorizedAddresses, ", ", false);
+                java.util.Collection<String> networks = new java.util.ArrayList<String>();
+                while (st.hasMoreTokens()) {
+                    String addr = st.nextToken();
+                    networks.add(addr);
+                }
+                authorizedNetworks = new NetMatcher(networks, getDNSService());
+            }
+
+            if (authorizedNetworks != null) {
+                getLogger().info("Authorized addresses: " + authorizedNetworks.toString());
+            }
+
+            // get the message size limit from the conf file and multiply
+            // by 1024, to put it in bytes
+            maxMessageSize = handlerConfiguration.getLong( "maxmessagesize",maxMessageSize ) * 1024;
+            if (maxMessageSize > 0) {
+                getLogger().info("The maximum allowed message size is " + maxMessageSize + " bytes.");
+            } else {
+                getLogger().info("No maximum message size is enforced for this server.");
+            }
+            // How many bytes to read before updating the timer that data is being transfered
+            lengthReset = configuration.getInt("lengthReset", lengthReset);
+            if (lengthReset <= 0) {
+                throw new ConfigurationException("The configured value for the idle timeout reset, " + lengthReset + ", is not valid.");
+            }
+            if (getLogger().isInfoEnabled()) {
+                getLogger().info("The idle timeout will be reset every " + lengthReset + " bytes.");
+            }
+
+            heloEhloEnforcement = handlerConfiguration.getBoolean("heloEhloEnforcement",true);
+
+            if (authRequiredString.equals("true")) authRequired = AUTH_REQUIRED;
+
+            // get the smtpGreeting
+            smtpGreeting = handlerConfiguration.getString("smtpGreeting",null);
+
+            addressBracketsEnforcement = handlerConfiguration.getBoolean("addressBracketsEnforcement",true);
+        }
+    }
+
+    /**
+     * @see org.apache.james.socket.mina.AbstractAsyncServer#getDefaultPort()
+     */
+    protected int getDefaultPort() {
+        return 25;
+    }
+
+    /**
+     * @see org.apache.james.core.AbstractProtocolServer#getServiceType()
+     */
+    public String getServiceType() {
+        return "SMTP Service";
+    }
+
+
+    /**
+     * A class to provide SMTP handler configuration to the handlers
+     */
+    private class SMTPHandlerConfigurationDataImpl implements SMTPConfiguration {
+
+        /**
+         * @see org.apache.james.protocols.smtp.SMTPConfiguration#getHelloName()
+         */
+        public String getHelloName() {
+            if (NioSMTPServer.this.getHelloName() == null) {
+                return NioSMTPServer.this.getMailServer().getHelloName();
+            } else {
+                return NioSMTPServer.this.getHelloName();
+            }
+        }
+
+        /**
+         * @see org.apache.james.protocols.smtp.SMTPConfiguration#getResetLength()
+         */
+        public int getResetLength() {
+            return NioSMTPServer.this.lengthReset;
+        }
+
+        /**
+         * @see org.apache.james.protocols.smtp.SMTPConfiguration#getMaxMessageSize()
+         */
+        public long getMaxMessageSize() {
+            return NioSMTPServer.this.maxMessageSize;
+        }
+
+        /**
+         * @see org.apache.james.protocols.smtp.SMTPConfiguration#isAuthSupported(String)
+         */
+        public boolean isRelayingAllowed(String remoteIP) {
+            boolean relayingAllowed = false;
+            if (authorizedNetworks != null) {
+                relayingAllowed = NioSMTPServer.this.authorizedNetworks.matchInetNetwork(remoteIP);
+            }
+            return relayingAllowed;
+        }
+
+        /**
+         * @see org.apache.james.protocols.smtp.SMTPConfiguration#useHeloEhloEnforcement()
+         */
+        public boolean useHeloEhloEnforcement() {
+            return NioSMTPServer.this.heloEhloEnforcement;
+        }
+
+
+        /**
+         * @see org.apache.james.protocols.smtp.SMTPConfiguration#getSMTPGreeting()
+         */
+        public String getSMTPGreeting() {
+            return NioSMTPServer.this.smtpGreeting;
+        }
+
+        /**
+         * @see org.apache.james.protocols.smtp.SMTPConfiguration#useAddressBracketsEnforcement()
+         */
+        public boolean useAddressBracketsEnforcement() {
+            return NioSMTPServer.this.addressBracketsEnforcement;
+        }
+
+        /**
+         * @see org.apache.james.protocols.smtp.SMTPConfiguration#isAuthRequired(java.lang.String)
+         */
+        public boolean isAuthRequired(String remoteIP) {
+            if (NioSMTPServer.this.authRequired == AUTH_ANNOUNCE) return true;
+            boolean authRequired = NioSMTPServer.this.authRequired != AUTH_DISABLED;
+            if (authorizedNetworks != null) {
+                authRequired = authRequired && !NioSMTPServer.this.authorizedNetworks.matchInetNetwork(remoteIP);
+            }
+            return authRequired;
+        }
+
+        /**
+         * @see org.apache.james.protocols.smtp.SMTPConfiguration#isStartTLSSupported()
+         */
+        public boolean isStartTLSSupported() {
+            return NioSMTPServer.this.isStartTLSSupported();
+        }
+
+    }
+    
+    /**
+     * (non-Javadoc)
+     * @see org.apache.james.protocols.smtp.SMTPServerMBean#getNetworkInterface()
+     */
+    public String getNetworkInterface() {
+        return "unkown";
+    }
+
+    /**
+     * (non-Javadoc)
+     * @see org.apache.james.protocols.smtp.SMTPServerMBean#getSocketType()
+     */
+    public String getSocketType() {
+        return "plain";
+    }
+
+    
+    @Override
+    protected ChannelPipelineFactory createPipelineFactory() {
+        return new AbstractChannelPipelineFactory() {
+            
+            @Override
+            protected ChannelUpstreamHandler createHandler() {
+                return new SMTPChannelUpstreamHandler(NioSMTPServer.this.getProtocolHandlerChain(), getSMTPConfiguration(),getLogger());
+            }
+            
+            @Override
+            protected OneToOneEncoder createEncoder() {
+                return new SMTPResponseEncoder();
+            }
+
+            @Override
+            protected int getTimeout() {
+                return NioSMTPServer.this.getTimeout();
+            }
+        };
+    }
+    
+    protected final ProtocolHandlerChain getProtocolHandlerChain() {
+        return handlerChain;
+    }
+    
+    protected final SMTPConfiguration getSMTPConfiguration() {
+        return theConfigData;
+    }
+}

Added: james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPChannelUpstreamHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPChannelUpstreamHandler.java?rev=932468&view=auto
==============================================================================
--- james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPChannelUpstreamHandler.java (added)
+++ james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPChannelUpstreamHandler.java Fri Apr  9 15:44:46 2010
@@ -0,0 +1,59 @@
+package org.apache.james.smtpserver.netty;
+
+import org.apache.commons.logging.Log;
+import org.apache.james.lifecycle.LifecycleUtil;
+import org.apache.james.protocols.api.ProtocolHandlerChain;
+import org.apache.james.protocols.api.ProtocolSession;
+import org.apache.james.protocols.smtp.SMTPConfiguration;
+import org.apache.james.protocols.smtp.SMTPResponse;
+import org.apache.james.protocols.smtp.SMTPRetCode;
+import org.apache.james.protocols.smtp.SMTPSession;
+import org.apache.james.smtpserver.SMTPConstants;
+import org.apache.james.socket.netty.AbstractChannelUpstreamHandler;
+import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.channel.ChannelStateEvent;
+import org.jboss.netty.channel.ExceptionEvent;
+
+public class SMTPChannelUpstreamHandler extends AbstractChannelUpstreamHandler{
+    private Log logger;
+    private SMTPConfiguration conf;
+
+    public SMTPChannelUpstreamHandler(ProtocolHandlerChain chain,
+            SMTPConfiguration conf, Log logger) {
+        super(chain);
+        this.conf = conf;
+        this.logger = logger;
+    }
+    
+    @Override
+    protected ProtocolSession createSession(ChannelHandlerContext ctx) throws Exception {
+        SMTPSession smtpSession= new SMTPNettySession(conf, logger, ctx);
+           
+        return smtpSession;
+    }
+
+    @Override
+    public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
+        logger.info("Dispose objects while closing channel " + ctx.getChannel().getId());
+        // Make sure we dispose everything on exit on session close
+        SMTPSession smtpSession = (SMTPSession) attributes.get(ctx.getChannel());
+        
+        if (smtpSession != null) {
+            LifecycleUtil.dispose(smtpSession.getState().get(SMTPConstants.MAIL));
+            LifecycleUtil.dispose(smtpSession.getState().get(SMTPConstants.DATA_MIMEMESSAGE_STREAMSOURCE));
+            LifecycleUtil.dispose(smtpSession.getState().get(SMTPConstants.DATA_MIMEMESSAGE_OUTPUTSTREAM));
+        }
+        super.channelDisconnected(ctx, e);
+    }
+
+    @Override
+    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {        
+        Channel channel = ctx.getChannel();
+        if (channel.isConnected()) {
+            ctx.getChannel().write(new SMTPResponse(SMTPRetCode.LOCAL_ERROR, "Unable to process smtp request"));
+        }
+    }
+
+    
+}

Added: james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPNettySession.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPNettySession.java?rev=932468&view=auto
==============================================================================
--- james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPNettySession.java (added)
+++ james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPNettySession.java Fri Apr  9 15:44:46 2010
@@ -0,0 +1,207 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.smtpserver.netty;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+import org.apache.commons.logging.Log;
+import org.apache.james.protocols.api.LineHandler;
+import org.apache.james.protocols.smtp.SMTPConfiguration;
+import org.apache.james.protocols.smtp.SMTPSession;
+import org.apache.james.socket.netty.AbstractNettySession;
+import org.apache.james.socket.netty.LineHandlerUpstreamHandler;
+import org.jboss.netty.channel.ChannelHandlerContext;
+
+public class SMTPNettySession extends AbstractNettySession implements SMTPSession{
+    public final static String SMTP_SESSION = "SMTP_SESSION";
+    
+    private static Random random = new Random();
+
+    private boolean relayingAllowed;
+
+    private String smtpID;
+
+    private Map<String, Object> connectionState;
+
+    private SMTPConfiguration theConfigData;
+
+    private int lineHandlerCount = 0;
+
+    public SMTPNettySession(SMTPConfiguration theConfigData, Log logger, ChannelHandlerContext handlerContext) {
+        super(logger, handlerContext);
+        this.theConfigData = theConfigData;
+        connectionState = new HashMap<String, Object>();
+        smtpID = random.nextInt(1024) + "";
+
+        relayingAllowed = theConfigData.isRelayingAllowed(getRemoteIPAddress());    
+    }
+    
+
+    /**
+     * @see org.apache.james.protocols.smtp.SMTPSession#getConnectionState()
+     */
+    public Map<String, Object> getConnectionState() {
+        return connectionState;
+    }
+    
+    /**
+     * @see org.apache.james.protocols.smtp.SMTPSession#getSessionID()
+     */
+    public String getSessionID() {
+        return smtpID;
+    }
+
+    /**
+     * @see org.apache.james.protocols.smtp.SMTPSession#getState()
+     */
+    @SuppressWarnings("unchecked")
+    public Map<String, Object> getState() {
+        Map<String, Object> res = (Map<String, Object>) getConnectionState()
+                .get(SMTPSession.SESSION_STATE_MAP);
+        if (res == null) {
+            res = new HashMap<String, Object>();
+            getConnectionState().put(SMTPSession.SESSION_STATE_MAP, res);
+        }
+        return res;
+    }
+
+    /**
+     * @see org.apache.james.protocols.smtp.SMTPSession#isRelayingAllowed()
+     */
+    public boolean isRelayingAllowed() {
+        return relayingAllowed;
+    }
+
+    /**
+     * @see org.apache.james.protocols.smtp.SMTPSession#resetState()
+     */
+    public void resetState() {
+        // remember the ehlo mode between resets
+        Object currentHeloMode = getState().get(CURRENT_HELO_MODE);
+
+        getState().clear();
+
+        // start again with the old helo mode
+        if (currentHeloMode != null) {
+            getState().put(CURRENT_HELO_MODE, currentHeloMode);
+        }
+    }
+
+    /**
+     * @see org.apache.james.protocols.smtp.SMTPSession#popLineHandler()
+     */
+    public void popLineHandler() {
+        getChannelHandlerContext().getPipeline()
+                .remove("lineHandler" + lineHandlerCount);
+        lineHandlerCount--;
+    }
+
+    /**
+     * @see org.apache.james.protocols.smtp.SMTPSession#pushLineHandler(org.apache.james.smtpserver.protocol.LineHandler)
+     */
+    public void pushLineHandler(LineHandler<SMTPSession> overrideCommandHandler) {
+        lineHandlerCount++;
+        getChannelHandlerContext().getPipeline().addBefore("coreHandler",
+                "lineHandler" + lineHandlerCount,
+                new LineHandlerUpstreamHandler<SMTPSession>(overrideCommandHandler));
+    }
+
+
+
+    /**
+     * @see org.apache.james.protocols.smtp.SMTPSession#getHelloName()
+     */
+    public String getHelloName() {
+        return theConfigData.getHelloName();
+    }
+
+
+    /**
+     * @see org.apache.james.protocols.smtp.SMTPSession#getMaxMessageSize()
+     */
+    public long getMaxMessageSize() {
+        return theConfigData.getMaxMessageSize();
+    }
+
+
+    /**
+     * @see org.apache.james.protocols.smtp.SMTPSession#getRcptCount()
+     */
+    @SuppressWarnings("unchecked")
+    public int getRcptCount() {
+        int count = 0;
+
+        // check if the key exists
+        if (getState().get(SMTPSession.RCPT_LIST) != null) {
+            count = ((Collection) getState().get(SMTPSession.RCPT_LIST)).size();
+        }
+
+        return count;
+    }
+
+    /**
+     * @see org.apache.james.protocols.smtp.SMTPSession#getSMTPGreeting()
+     */
+    public String getSMTPGreeting() {
+        return theConfigData.getSMTPGreeting();
+    }
+
+
+    /**
+     * @see org.apache.james.protocols.smtp.SMTPSession#isAuthSupported()
+     */
+    public boolean isAuthSupported() {
+        return theConfigData.isAuthRequired(socketAddress.getAddress().getHostAddress());
+    }
+
+
+    /**
+     * @see org.apache.james.protocols.smtp.SMTPSession#setRelayingAllowed(boolean)
+     */
+    public void setRelayingAllowed(boolean relayingAllowed) {
+        this.relayingAllowed = relayingAllowed;
+    }
+
+
+    /**
+     * @see org.apache.james.protocols.smtp.SMTPSession#sleep(long)
+     */
+    public void sleep(long ms) {
+        //session.getFilterChain().addAfter("connectionFilter", "tarpitFilter",new TarpitFilter(ms));
+    }
+
+
+    /**
+     * @see org.apache.james.protocols.smtp.SMTPSession#useAddressBracketsEnforcement()
+     */
+    public boolean useAddressBracketsEnforcement() {
+        return theConfigData.useAddressBracketsEnforcement();
+    }
+
+    /**
+     * @see org.apache.james.protocols.smtp.SMTPSession#useHeloEhloEnforcement()
+     */
+    public boolean useHeloEhloEnforcement() {
+        return theConfigData.useHeloEhloEnforcement();
+    }
+
+}

Added: james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPResponseEncoder.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPResponseEncoder.java?rev=932468&view=auto
==============================================================================
--- james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPResponseEncoder.java (added)
+++ james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPResponseEncoder.java Fri Apr  9 15:44:46 2010
@@ -0,0 +1,37 @@
+package org.apache.james.smtpserver.netty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.james.protocols.smtp.SMTPResponse;
+import org.apache.james.socket.netty.AbstractResponseEncoder;
+
+public class SMTPResponseEncoder extends AbstractResponseEncoder<SMTPResponse>{
+
+    public SMTPResponseEncoder() {
+        super(SMTPResponse.class, "US-ASCII");
+    }
+
+    @Override
+    protected List<String> getResponse(SMTPResponse response) {
+        List<String> responseList = new ArrayList<String>();
+        
+        for (int k = 0; k < response.getLines().size(); k++) {
+            StringBuffer respBuff = new StringBuffer(256);
+            respBuff.append(response.getRetCode());
+            if (k == response.getLines().size() - 1) {
+                respBuff.append(" ");
+                respBuff.append(response.getLines().get(k));
+
+            } else {
+                respBuff.append("-");
+                respBuff.append(response.getLines().get(k));
+
+            }
+            responseList.add(respBuff.toString());
+        }
+        
+        return responseList;
+    }
+
+}

Copied: james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java (from r932257, james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java)
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java?p2=james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java&p1=james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java&r1=932257&r2=932468&rev=932468&view=diff
==============================================================================
--- james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java (original)
+++ james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java Fri Apr  9 15:44:46 2010
@@ -48,7 +48,6 @@ import org.apache.james.api.vut.VirtualU
 import org.apache.james.lifecycle.LifecycleUtil;
 import org.apache.james.services.FileSystem;
 import org.apache.james.services.MailServer;
-import org.apache.james.smtpserver.mina.AsyncSMTPServer;
 import org.apache.james.socket.ProtocolHandlerChainImpl;
 import org.apache.james.socket.mina.codec.CRLFTerminatedLineDecoder;
 import org.apache.james.test.mock.DummyVirtualUserTableStore;
@@ -62,7 +61,7 @@ import org.apache.mailet.HostAddress;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailAddress;
 
-public class AsyncSMTPServerTest extends TestCase {
+public abstract class AbstractSMTPServerTest extends TestCase {
 
     final class AlterableDNSServer implements DNSService {
 
@@ -144,7 +143,7 @@ public class AsyncSMTPServerTest extends
 
     protected final int m_smtpListenerPort;
     protected MockMailServer m_mailServer;
-    private AsyncSMTPServer m_smtpServer;
+    //private SMTPServer m_smtpServer;
     protected SMTPTestConfiguration m_testConfiguration;
     protected MockUsersRepository m_usersRepository = new MockUsersRepository();
     protected FakeLoader m_serviceManager;
@@ -152,9 +151,9 @@ public class AsyncSMTPServerTest extends
     protected MockStore store;
     protected MockFileSystem fileSystem;
     protected SMTPServerDNSServiceAdapter dnsAdapter;
-    private ProtocolHandlerChainImpl chain;
+    protected ProtocolHandlerChainImpl chain;
     
-    public AsyncSMTPServerTest() {
+    public AbstractSMTPServerTest() {
         super("AsyncSMTPServerTest");
         m_smtpListenerPort = Util.getNonPrivilegedPort();
     }
@@ -165,30 +164,27 @@ public class AsyncSMTPServerTest extends
         log.setLevel(SimpleLog.LOG_LEVEL_ALL);
         m_testConfiguration = new SMTPTestConfiguration(m_smtpListenerPort);
 
-        m_smtpServer = new AsyncSMTPServer();
-        m_smtpServer.setDNSService(m_dnsServer);
-        m_smtpServer.setFileSystem(fileSystem);
         
         chain = new ProtocolHandlerChainImpl();
         chain.setInstanceFactory(m_serviceManager);
         chain.setLog(log);
-        
-        m_smtpServer.setProtocolHandlerChain(chain);
-        
-        m_smtpServer.setLog(log);
-        m_smtpServer.setMailServer(m_mailServer);
+        setUpSMTPServer();
     }
 
+    protected abstract void setUpSMTPServer() throws Exception;
+    protected abstract void initSMTPServer(SMTPTestConfiguration testConfiguration) throws Exception;
+
     protected void finishSetUp(SMTPTestConfiguration testConfiguration) throws Exception {
         testConfiguration.init();
         chain.configure(testConfiguration.configurationAt("handler.handlerchain"));        
-        m_smtpServer.configure(testConfiguration);
         chain.init();
         
-        m_smtpServer.init();
+        initSMTPServer(testConfiguration);
+        
         m_mailServer.setMaxMessageSizeBytes(m_testConfiguration.getMaxMessageSize() * 1024);
     }
 
+
     protected void tearDown() throws Exception {
         LifecycleUtil.dispose(m_mailServer);
         super.tearDown();



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