Author: norman
Date: Sat Sep 17 14:06:40 2011
New Revision: 1171984

URL: http://svn.apache.org/viewvc?rev=1171984&view=rev
Log:
Refactor pop3server for latest protocols refactoring

Added:
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3Protocol.java
   (with props)
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3SessionImpl.java
      - copied, changed from r1171924, 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3NettySession.java
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3StreamResponse.java
   (with props)
Removed:
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ChannelUpstreamHandler.java
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3NettySession.java
Modified:
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3Response.java
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3Session.java
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RetrCmdHandler.java
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/WelcomeMessageHandler.java
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ResponseEncoder.java
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
    
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java

Added: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3Protocol.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3Protocol.java?rev=1171984&view=auto
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3Protocol.java
 (added)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3Protocol.java
 Sat Sep 17 14:06:40 2011
@@ -0,0 +1,67 @@
+/****************************************************************
+ * 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.james.protocols.api.Protocol;
+import org.apache.james.protocols.api.ProtocolHandlerChain;
+import org.apache.james.protocols.api.ProtocolSession;
+import org.apache.james.protocols.api.ProtocolSessionFactory;
+import org.apache.james.protocols.api.ProtocolTransport;
+import org.apache.james.protocols.api.Response;
+import org.slf4j.Logger;
+
+public class POP3Protocol implements Protocol{
+
+    private ProtocolHandlerChain chain;
+    private POP3HandlerConfigurationData config;
+    private Logger logger;
+    
+    public POP3Protocol(ProtocolHandlerChain chain, 
POP3HandlerConfigurationData config, Logger logger) {
+        this.chain = chain;
+        this.config = config;
+        this.logger = logger;
+    }
+    @Override
+    public ProtocolHandlerChain getProtocolChain() {
+        return chain;
+    }
+
+    @Override
+    public ProtocolSessionFactory getProtocolSessionFactory() {
+        return new ProtocolSessionFactory() {
+            
+            @Override
+            public ProtocolSession newSession(ProtocolTransport transport) {
+                return new POP3SessionImpl(logger, transport, config);
+            }
+        };
+    }
+
+    @Override
+    public boolean isStartTLSSupported() {
+        return config.isStartTLSSupported();
+    }
+
+    @Override
+    public Class<? extends Response> getResponseClass() {
+        return POP3Response.class;
+    }
+
+}

Propchange: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3Protocol.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3Response.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3Response.java?rev=1171984&r1=1171983&r2=1171984&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3Response.java
 (original)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3Response.java
 Sat Sep 17 14:06:40 2011
@@ -19,6 +19,7 @@
 
 package org.apache.james.pop3server;
 
+import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -98,7 +99,15 @@ public class POP3Response implements Ret
      * @return all responseLines
      */
     public List<CharSequence> getLines() {
-        return lines;
+        List<CharSequence> responseList = new ArrayList<CharSequence>();
+        for (int i = 0; i < lines.size(); i++) {
+            if (i == 0) {
+                responseList.add(getRetCode() + " " +lines.get(i));
+            } else {
+                responseList.add(lines.get(i));
+            }
+        }
+        return responseList;
     }
 
     /**

Modified: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3Session.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3Session.java?rev=1171984&r1=1171983&r2=1171984&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3Session.java
 (original)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3Session.java
 Sat Sep 17 14:06:40 2011
@@ -19,8 +19,6 @@
 
 package org.apache.james.pop3server;
 
-import java.io.InputStream;
-
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.protocols.api.TLSSupportedSession;
 
@@ -81,6 +79,4 @@ public interface POP3Session extends TLS
      *            mailbox
      */
     void setUserMailbox(MessageManager mailbox);
-    
-    void writeStream(InputStream in);
 }

Copied: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3SessionImpl.java
 (from r1171924, 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3NettySession.java)
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3SessionImpl.java?p2=james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3SessionImpl.java&p1=james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3NettySession.java&r1=1171924&r2=1171984&rev=1171984&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3NettySession.java
 (original)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3SessionImpl.java
 Sat Sep 17 14:06:40 2011
@@ -16,32 +16,21 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-package org.apache.james.pop3server.netty;
+package org.apache.james.pop3server;
 
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.channels.FileChannel;
 import java.util.HashMap;
 import java.util.Map;
 
-import javax.net.ssl.SSLEngine;
-
 import org.apache.james.mailbox.MessageManager;
-import org.apache.james.pop3server.POP3HandlerConfigurationData;
-import org.apache.james.pop3server.POP3Session;
-import org.apache.james.protocols.impl.AbstractSession;
-import org.jboss.netty.channel.Channel;
-import org.jboss.netty.channel.DefaultFileRegion;
-import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
-import org.jboss.netty.handler.stream.ChunkedNioFile;
-import org.jboss.netty.handler.stream.ChunkedStream;
+import org.apache.james.protocols.api.AbstractSession;
+import org.apache.james.protocols.api.ProtocolTransport;
+import org.apache.james.protocols.api.Response;
 import org.slf4j.Logger;
 
 /**
  * {@link POP3Session} implementation which use Netty
  */
-public class POP3NettySession extends AbstractSession implements POP3Session {
+public class POP3SessionImpl extends AbstractSession implements POP3Session {
     private POP3HandlerConfigurationData configData;
 
     private Map<String, Object> state = new HashMap<String, Object>();
@@ -50,22 +39,12 @@ public class POP3NettySession extends Ab
 
     private MessageManager mailbox;
 
-    private boolean zeroCopy;
-
-    public POP3NettySession(POP3HandlerConfigurationData configData, Logger 
logger,  Channel channel) {
-        this(configData, logger, channel, null);
-    }
-
-    public POP3NettySession(POP3HandlerConfigurationData configData, Logger 
logger, Channel channel, SSLEngine engine) {
-        this(configData, logger, channel, engine, true);
-    }
-
-    public POP3NettySession(POP3HandlerConfigurationData configData, Logger 
logger,  Channel channel, SSLEngine engine, boolean zeroCopy) {
-        super(logger, channel, engine);
+    
+    public POP3SessionImpl(Logger logger, ProtocolTransport transport, 
POP3HandlerConfigurationData configData) {
+        super(logger, transport);
         this.configData = configData;
-        this.zeroCopy = zeroCopy;
     }
-    
+
     /*
      * (non-Javadoc)
      * 
@@ -133,29 +112,17 @@ public class POP3NettySession extends Ab
         this.mailbox = mailbox;
     }
 
-    /*
-     * (non-Javadoc)
-     * @see 
org.apache.james.protocols.api.ProtocolSession#writeStream(java.io.InputStream)
-     */
-    public void writeStream(InputStream stream) {
-        if (stream != null && channel.isConnected()) {
+    @Override
+    public Response newLineTooLongResponse() {
+        return null;
+    }
 
-            if (stream instanceof FileInputStream  && channel.getFactory() 
instanceof NioServerSocketChannelFactory) {
-                FileChannel fc = ((FileInputStream) stream).getChannel();
-                try {
-                    if (zeroCopy) {
-                        channel.write(new DefaultFileRegion(fc, fc.position(), 
fc.size()));
-                    } else {
-                        channel.write(new ChunkedNioFile(fc, 8192));
-                    }
-                } catch (IOException e) {
-                    // Catch the exception and just pass it so we get the 
exception later
-                    channel.write(new ChunkedStream(stream));
-                }
-            } else {
-                channel.write(new ChunkedStream(stream));
-            }
-        }
+    @Override
+    public Response newFatalErrorResponse() {
+        return null;
     }
 
+
+
+
 }

Added: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3StreamResponse.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3StreamResponse.java?rev=1171984&view=auto
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3StreamResponse.java
 (added)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3StreamResponse.java
 Sat Sep 17 14:06:40 2011
@@ -0,0 +1,36 @@
+/****************************************************************
+ * 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.InputStream;
+
+public class POP3StreamResponse extends POP3Response {
+
+    private InputStream stream;
+
+    public POP3StreamResponse(String code, CharSequence description, 
InputStream stream) {
+        super(code, description);
+        this.stream = stream;
+    }
+
+    public InputStream getStream() {
+        return stream;
+    }
+}

Propchange: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/POP3StreamResponse.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RetrCmdHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RetrCmdHandler.java?rev=1171984&r1=1171983&r2=1171984&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RetrCmdHandler.java
 (original)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RetrCmdHandler.java
 Sat Sep 17 14:06:40 2011
@@ -19,8 +19,8 @@
 
 package org.apache.james.pop3server.core;
 
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
@@ -36,6 +36,7 @@ import org.apache.james.mailbox.MessageR
 import org.apache.james.mailbox.MessageResult.FetchGroup;
 import org.apache.james.pop3server.POP3Response;
 import org.apache.james.pop3server.POP3Session;
+import org.apache.james.pop3server.POP3StreamResponse;
 import org.apache.james.protocols.api.CommandHandler;
 import org.apache.james.protocols.api.Request;
 import org.apache.james.protocols.api.Response;
@@ -87,21 +88,13 @@ public class RetrCmdHandler implements C
                     if (results.hasNext()) {
                         MessageResult result = results.next();
 
-                        try {
-                            session.writeStream(new 
ByteArrayInputStream((POP3Response.OK_RESPONSE + " Message 
follows\r\n").getBytes()));
-                            // response = new
-                            // POP3Response(POP3Response.OK_RESPONSE,
-                            // "Message follows");
-                            Content content = result.getFullContent();         
                  
-                            // session.writeStream(new 
ExtraDotInputStream(in));
-                            session.writeStream(new 
CRLFTerminatedInputStream(new ExtraDotInputStream(content.getInputStream())));
-
-                        } finally {
-                            // write a single dot to mark message as complete
-                            session.writeStream(new 
ByteArrayInputStream(".\r\n".getBytes()));
-                        }
+                        Content content = result.getFullContent();             
              
+                        InputStream in = new CRLFTerminatedInputStream(new 
ExtraDotInputStream(content.getInputStream()));
+                        response = new 
POP3StreamResponse(POP3Response.OK_RESPONSE, "Message follows", in);
+                        return response;
+
+                        
 
-                        return null;
                     } else {
                         StringBuilder responseBuffer = new 
StringBuilder(64).append("Message (").append(num).append(") does not exist.");
                         response = new POP3Response(POP3Response.ERR_RESPONSE, 
responseBuffer.toString());

Modified: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java?rev=1171984&r1=1171983&r2=1171984&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java
 (original)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java
 Sat Sep 17 14:06:40 2011
@@ -40,6 +40,7 @@ import org.apache.james.mailbox.MessageR
 import org.apache.james.mailbox.MessageResult.FetchGroup;
 import org.apache.james.pop3server.POP3Response;
 import org.apache.james.pop3server.POP3Session;
+import org.apache.james.pop3server.POP3StreamResponse;
 import org.apache.james.protocols.api.Request;
 import org.apache.james.protocols.api.Response;
 
@@ -110,23 +111,15 @@ public class TopCmdHandler extends RetrC
                     if (results.hasNext()) {
                         MessageResult result = results.next();
 
-                        session.writeStream(new 
ByteArrayInputStream((POP3Response.OK_RESPONSE + " Message 
follows\r\n").getBytes()));
-                        try {
+                        InputStream headersIn = 
result.getHeaders().getInputStream();
+                        InputStream bodyIn = new CountingBodyInputStream(new 
ExtraDotInputStream(new 
CRLFTerminatedInputStream(result.getBody().getInputStream())), lines);
 
-                          
-                            InputStream headersIn = 
result.getHeaders().getInputStream();
-                            InputStream bodyIn = new 
CountingBodyInputStream(new ExtraDotInputStream(new 
CRLFTerminatedInputStream(result.getBody().getInputStream())), lines);
-
-                            // write body
-                            session.writeStream(new 
SequenceInputStream(Collections.enumeration(Arrays.asList(headersIn, new 
ByteArrayInputStream("\r\n".getBytes()), bodyIn))));
-
-                        } finally {
-                            // write a single dot to mark message as complete
-                            session.writeStream(new 
ByteArrayInputStream(".\r\n".getBytes()));
+                        // write body
+                        InputStream in = new 
SequenceInputStream(Collections.enumeration(Arrays.asList(headersIn, new 
ByteArrayInputStream("\r\n".getBytes()), bodyIn)));
 
-                        }
+                        response = new 
POP3StreamResponse(POP3Response.OK_RESPONSE, "Message follows", in);
+                        return response;
 
-                        return null;
                     } else {
                         StringBuilder exceptionBuffer = new 
StringBuilder(64).append("Message (").append(num).append(") does not exist.");
                         response = new POP3Response(POP3Response.ERR_RESPONSE, 
exceptionBuffer.toString());

Modified: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/WelcomeMessageHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/WelcomeMessageHandler.java?rev=1171984&r1=1171983&r2=1171984&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/WelcomeMessageHandler.java
 (original)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/WelcomeMessageHandler.java
 Sat Sep 17 14:06:40 2011
@@ -33,7 +33,6 @@ public class WelcomeMessageHandler imple
      */
     public boolean onConnect(POP3Session session) {
         StringBuilder responseBuffer = new StringBuilder();
-
         // Initially greet the connector
         // Format is: Sat, 24 Jan 1998 13:16:09 -0500
         
responseBuffer.append(session.getConfigurationData().getHelloName()).append(" 
POP3 server (").append(softwaretype).append(") ready ");

Modified: 
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=1171984&r1=1171983&r2=1171984&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ResponseEncoder.java
 (original)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ResponseEncoder.java
 Sat Sep 17 14:06:40 2011
@@ -1,59 +1,93 @@
-/****************************************************************
- * 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.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.james.pop3server.POP3Response;
-import org.apache.james.protocols.impl.AbstractResponseEncoder;
-import org.jboss.netty.channel.ChannelHandler.Sharable;
-
-
-/**
- * {@link AbstractResponseEncoder} implementation which handles
- * {@link POP3Response} messages
- */
-@Sharable
-public class POP3ResponseEncoder extends AbstractResponseEncoder<POP3Response> 
{
-
-    public POP3ResponseEncoder() {
-        super(POP3Response.class, Charset.forName("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;
-    }
-
-}
+/****************************************************************
+ * 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 static org.jboss.netty.channel.Channels.write;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.channels.FileChannel;
+import java.nio.charset.Charset;
+
+import org.apache.james.pop3server.POP3Response;
+import org.apache.james.pop3server.POP3StreamResponse;
+import org.apache.james.protocols.impl.ResponseEncoder;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelEvent;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.channel.DefaultFileRegion;
+import org.jboss.netty.channel.MessageEvent;
+import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
+import org.jboss.netty.handler.stream.ChunkedNioFile;
+import org.jboss.netty.handler.stream.ChunkedStream;
+
+public class POP3ResponseEncoder extends ResponseEncoder{
+   
+    private boolean zeroCopy;
+
+
+    public POP3ResponseEncoder(boolean zeroCopy) {
+        super(POP3Response.class, Charset.forName("US-ASCII"));
+        this.zeroCopy = zeroCopy;
+    }
+    
+    
+    @Override
+    public void handleDownstream(ChannelHandlerContext ctx, ChannelEvent evt) 
throws Exception {
+        if (evt instanceof MessageEvent) {
+            MessageEvent e = (MessageEvent) evt;
+            Object originalMessage = e.getMessage();
+
+            super.handleDownstream(ctx, evt);
+            
+            if (originalMessage instanceof POP3StreamResponse) {
+
+                InputStream stream = ((POP3StreamResponse) 
originalMessage).getStream();
+                Channel channel = ctx.getChannel();
+                if (stream != null && channel.isConnected()) {
+
+                    if (stream instanceof FileInputStream  && 
channel.getFactory() instanceof NioServerSocketChannelFactory) {
+                        FileChannel fc = ((FileInputStream) 
stream).getChannel();
+                        try {
+                            if (zeroCopy) {
+                                write(ctx, e.getFuture(), new 
DefaultFileRegion(fc, fc.position(), fc.size()), e.getRemoteAddress());
+
+                            } else {
+                                write(ctx, e.getFuture(), new 
ChunkedNioFile(fc, 8192), e.getRemoteAddress());
+                            }
+                        } catch (IOException ex) {
+                            // Catch the exception and just pass it so we get 
the exception later
+                            write(ctx, e.getFuture(), new 
ChunkedStream(stream), e.getRemoteAddress());
+
+                        }
+                    } else {
+                        write(ctx, e.getFuture(), new ChunkedStream(stream), 
e.getRemoteAddress());
+
+                    }
+                }
+                
channel.write(ChannelBuffers.wrappedBuffer(".\r\n".getBytes()));
+            }
+        } else {
+            super.handleDownstream(ctx, evt);
+        }
+    }
+
+}

Modified: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java?rev=1171984&r1=1171983&r2=1171984&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
 (original)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
 Sat Sep 17 14:06:40 2011
@@ -19,24 +19,31 @@
 package org.apache.james.pop3server.netty;
 
 import org.apache.james.pop3server.POP3HandlerConfigurationData;
+import org.apache.james.pop3server.POP3Protocol;
 import org.apache.james.pop3server.core.CoreCmdHandlerLoader;
 import org.apache.james.pop3server.jmx.JMXHandlersLoader;
 import org.apache.james.protocols.api.HandlersPackage;
+import org.apache.james.protocols.impl.BasicChannelUpstreamHandler;
+import org.apache.james.protocols.impl.ResponseEncoder;
 import org.apache.james.protocols.lib.netty.AbstractProtocolAsyncServer;
+import org.jboss.netty.channel.ChannelPipeline;
+import org.jboss.netty.channel.ChannelPipelineFactory;
 import org.jboss.netty.channel.ChannelUpstreamHandler;
+import org.jboss.netty.channel.group.ChannelGroup;
 import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
+import org.jboss.netty.handler.stream.ChunkedWriteHandler;
 
 /**
  * NIO POP3 Server which use Netty
  */
 public class POP3Server extends AbstractProtocolAsyncServer implements 
POP3ServerMBean {
 
-    private final static POP3ResponseEncoder POP3_RESPONSE_ENCODER =  new 
POP3ResponseEncoder();
+    private final static ResponseEncoder POP3_RESPONSE_ENCODER =  new 
POP3ResponseEncoder(false);
     /**
      * The configuration data to be passed to the handler
      */
     private POP3HandlerConfigurationData theConfigData = new 
POP3HandlerConfigurationDataImpl();
-    private POP3ChannelUpstreamHandler coreHandler;
+    private BasicChannelUpstreamHandler coreHandler;
     
     @Override
     protected int getDefaultPort() {
@@ -83,8 +90,24 @@ public class POP3Server extends Abstract
     @Override
     protected void preInit() throws Exception {
         super.preInit();
-        coreHandler = new 
POP3ChannelUpstreamHandler(getProtocolHandlerChain(), theConfigData, 
getLogger(), getSSLContext(), getEnabledCipherSuites());
-        
+        POP3Protocol protocol = new POP3Protocol(getProtocolHandlerChain(), 
theConfigData, getLogger());
+        coreHandler = new 
BasicChannelUpstreamHandler(getProtocolHandlerChain(), 
protocol.getProtocolSessionFactory(), getLogger(), getSSLContext(), 
getEnabledCipherSuites());
+    }
+
+
+    @Override
+    protected ChannelPipelineFactory createPipelineFactory(ChannelGroup group) 
{
+         
+        final ChannelPipelineFactory cpf = super.createPipelineFactory(group);
+        return new ChannelPipelineFactory() {
+            
+            @Override
+            public ChannelPipeline getPipeline() throws Exception {
+                ChannelPipeline cp = cpf.getPipeline();
+                cp.addAfter("framer", "chunkHandler", new 
ChunkedWriteHandler());
+                return cp;
+            }
+        };
     }
 
 

Modified: 
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java?rev=1171984&r1=1171983&r2=1171984&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
 (original)
+++ 
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
 Sat Sep 17 14:06:40 2011
@@ -153,7 +153,7 @@ public class POP3ServerTest extends Test
 
     public void testAuthenticationFail() throws Exception {
         finishSetUp(m_testConfiguration);
-
+        
         m_pop3Protocol = new POP3Client();
         m_pop3Protocol.connect("127.0.0.1", m_pop3ListenerPort);
 



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

Reply via email to