Author: norman
Date: Sat Sep 17 18:33:25 2011
New Revision: 1172041

URL: http://svn.apache.org/viewvc?rev=1172041&view=rev
Log:
Fix race-condition in pop3server. Now it works again without deadlocking 

Added:
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ChannelUpstreamHandler.java
   (with props)
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ProtocolTransport.java
   (with props)
Modified:
    
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

Added: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ChannelUpstreamHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ChannelUpstreamHandler.java?rev=1172041&view=auto
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ChannelUpstreamHandler.java
 (added)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ChannelUpstreamHandler.java
 Sat Sep 17 18:33:25 2011
@@ -0,0 +1,60 @@
+/****************************************************************
+ * 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 javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+
+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.impl.BasicChannelUpstreamHandler;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.slf4j.Logger;
+
+public class POP3ChannelUpstreamHandler extends BasicChannelUpstreamHandler{
+
+    private boolean zeroCopy;
+
+    public POP3ChannelUpstreamHandler(ProtocolHandlerChain chain, 
ProtocolSessionFactory sessionFactory, Logger logger, boolean zeroCopy) {
+        super(chain, sessionFactory, logger);
+        this.zeroCopy = zeroCopy;
+    }
+
+    public POP3ChannelUpstreamHandler(ProtocolHandlerChain chain, 
ProtocolSessionFactory sessionFactory, Logger logger, SSLContext context, 
String[] enabledCipherSuites, boolean zeroCopy) {
+        super(chain, sessionFactory, logger, context, enabledCipherSuites);
+        this.zeroCopy = zeroCopy;
+    }
+
+    @Override
+    protected ProtocolSession createSession(ChannelHandlerContext ctx) throws 
Exception {
+        SSLEngine engine = null;
+        if (context != null) {
+            engine = context.createSSLEngine();
+            if (enabledCipherSuites != null && enabledCipherSuites.length > 0) 
{
+                engine.setEnabledCipherSuites(enabledCipherSuites);
+            }
+        }
+        
+        return sessionFactory.newSession(new 
POP3ProtocolTransport(ctx.getChannel(), engine, zeroCopy));
+    }
+
+
+}

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

Added: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ProtocolTransport.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ProtocolTransport.java?rev=1172041&view=auto
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ProtocolTransport.java
 (added)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ProtocolTransport.java
 Sat Sep 17 18:33:25 2011
@@ -0,0 +1,83 @@
+/****************************************************************
+ * 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.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.channels.FileChannel;
+
+import javax.net.ssl.SSLEngine;
+
+import org.apache.james.pop3server.POP3StreamResponse;
+import org.apache.james.protocols.api.ProtocolSession;
+import org.apache.james.protocols.api.Response;
+import org.apache.james.protocols.impl.NettyProtocolTransport;
+import org.jboss.netty.buffer.ChannelBuffers;
+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;
+
+public class POP3ProtocolTransport extends NettyProtocolTransport{
+
+    private Channel channel;
+    private boolean zeroCopy;
+
+    public POP3ProtocolTransport(Channel channel, SSLEngine engine, boolean 
zeroCopy) {
+        super(channel, engine);
+        this.channel = channel;
+        this.zeroCopy = zeroCopy;
+    }
+
+    @Override
+    public void writeResponse(Response response, ProtocolSession session) {
+        super.writeResponse(response, session);
+
+        if (response instanceof POP3StreamResponse) {
+
+            InputStream stream = ((POP3StreamResponse) response).getStream();
+            if (stream != null && channel.isConnected()) {
+
+                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 ex) {
+                        // Catch the exception and just pass it so we get the 
exception later
+                        channel.write(new ChunkedStream(stream));
+
+                    }
+                } else {
+                    channel.write(new ChunkedStream(stream));
+
+                }
+            }
+            channel.write(ChannelBuffers.wrappedBuffer(".\r\n".getBytes()));
+        } 
+    }
+
+}

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

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=1172041&r1=1172040&r2=1172041&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 18:33:25 2011
@@ -18,34 +18,34 @@
  ****************************************************************/
 package org.apache.james.pop3server.netty;
 
-import static org.jboss.netty.channel.Channels.write;
+import static org.jboss.netty.buffer.ChannelBuffers.copiedBuffer;
 
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.channels.FileChannel;
 import java.nio.charset.Charset;
+import java.util.List;
 
 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.SimpleChannelDownstreamHandler;
 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{
+public class POP3ResponseEncoder extends SimpleChannelDownstreamHandler{
    
     private boolean zeroCopy;
-
+    private Charset charset = Charset.forName("US-ASCII");
 
     public POP3ResponseEncoder(boolean zeroCopy) {
-        super(POP3Response.class, Charset.forName("US-ASCII"));
         this.zeroCopy = zeroCopy;
     }
     
@@ -55,31 +55,41 @@ public class POP3ResponseEncoder extends
         if (evt instanceof MessageEvent) {
             MessageEvent e = (MessageEvent) evt;
             Object originalMessage = e.getMessage();
+            Channel channel = ctx.getChannel();
 
-            super.handleDownstream(ctx, evt);
-            
+            if (originalMessage instanceof POP3Response) {
+                    StringBuilder builder = new StringBuilder();
+                    POP3Response response = (POP3Response) originalMessage;
+                    List<CharSequence> lines = response.getLines();
+                    for (int i = 0; i < lines.size(); i++) {
+                        builder.append(lines.get(i));
+                        if (i < lines.size()) {
+                            builder.append("\r\n");
+                        }
+                    }
+                    channel.write(copiedBuffer(builder.toString(), charset));  
              
+            }
             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());
+                                channel.write(new DefaultFileRegion(fc, 
fc.position(), fc.size()));
 
                             } else {
-                                write(ctx, e.getFuture(), new 
ChunkedNioFile(fc, 8192), e.getRemoteAddress());
+                                channel.write(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());
+                            channel.write(new ChunkedStream(stream));
 
                         }
                     } else {
-                        write(ctx, e.getFuture(), new ChunkedStream(stream), 
e.getRemoteAddress());
+                        channel.write(new ChunkedStream(stream));
 
                     }
                 }

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=1172041&r1=1172040&r2=1172041&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 18:33:25 2011
@@ -18,8 +18,11 @@
  ****************************************************************/
 package org.apache.james.pop3server.netty;
 
+import java.nio.charset.Charset;
+
 import org.apache.james.pop3server.POP3HandlerConfigurationData;
 import org.apache.james.pop3server.POP3Protocol;
+import org.apache.james.pop3server.POP3Response;
 import org.apache.james.pop3server.core.CoreCmdHandlerLoader;
 import org.apache.james.pop3server.jmx.JMXHandlersLoader;
 import org.apache.james.protocols.api.HandlersPackage;
@@ -38,7 +41,7 @@ import org.jboss.netty.handler.stream.Ch
  */
 public class POP3Server extends AbstractProtocolAsyncServer implements 
POP3ServerMBean {
 
-    private final static ResponseEncoder POP3_RESPONSE_ENCODER =  new 
POP3ResponseEncoder(false);
+    private final static ResponseEncoder POP3_RESPONSE_ENCODER =  new 
ResponseEncoder(POP3Response.class, Charset.forName("US-ASCII"));
     /**
      * The configuration data to be passed to the handler
      */
@@ -91,7 +94,7 @@ public class POP3Server extends Abstract
     protected void preInit() throws Exception {
         super.preInit();
         POP3Protocol protocol = new POP3Protocol(getProtocolHandlerChain(), 
theConfigData, getLogger());
-        coreHandler = new 
BasicChannelUpstreamHandler(getProtocolHandlerChain(), 
protocol.getProtocolSessionFactory(), getLogger(), getSSLContext(), 
getEnabledCipherSuites());
+        coreHandler = new 
POP3ChannelUpstreamHandler(getProtocolHandlerChain(), 
protocol.getProtocolSessionFactory(), getLogger(), getSSLContext(), 
getEnabledCipherSuites(), false);
     }
 
 



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

Reply via email to