Author: norman
Date: Wed Mar 23 11:28:26 2011
New Revision: 1084542

URL: http://svn.apache.org/viewvc?rev=1084542&view=rev
Log:
Make sure UIDL/STAT/LIST commands are still work in a consistent way when more 
the one client connections to the same mailbox. See JAMES-1202

Added:
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/MessageMetaData.java
Modified:
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/DeleCmdHandler.java
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/ListCmdHandler.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/RsetCmdHandler.java
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/StatCmdHandler.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/UidlCmdHandler.java
    
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java

Modified: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/DeleCmdHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/DeleCmdHandler.java?rev=1084542&r1=1084541&r2=1084542&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/DeleCmdHandler.java
 (original)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/DeleCmdHandler.java
 Wed Mar 23 11:28:26 2011
@@ -44,6 +44,7 @@ public class DeleCmdHandler implements C
      * mailbox.         
      * 
         */
+    @SuppressWarnings("unchecked")
     public Response onCommand(POP3Session session, Request request) {
         POP3Response response = null;
         if (session.getHandlerState() == POP3Session.TRANSACTION) {
@@ -55,10 +56,10 @@ public class DeleCmdHandler implements C
                 return response;
             }
             try {
-                List<Long> uidList = (List<Long>) 
session.getState().get(POP3Session.UID_LIST);
+                List<MessageMetaData> uidList = (List<MessageMetaData>) 
session.getState().get(POP3Session.UID_LIST);
                 List<Long> deletedUidList = (List<Long>) 
session.getState().get(POP3Session.DELETED_UID_LIST);
 
-                Long uid = uidList.get(num -1);
+                Long uid = uidList.get(num -1).getUid();
                 
                 if (deletedUidList.contains(uid)) {
                     StringBuilder responseBuffer =
@@ -68,7 +69,7 @@ public class DeleCmdHandler implements C
                                 .append(") already deleted.");
                     response = new 
POP3Response(POP3Response.ERR_RESPONSE,responseBuffer.toString());
                 } else {
-                       deletedUidList.add(uid);
+                    deletedUidList.add(uid);
                     // we are replacing our reference with "DELETED", so we 
have
                     // to dispose the no-more-referenced mail object.
                     response = new 
POP3Response(POP3Response.OK_RESPONSE,"Message deleted");

Modified: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/ListCmdHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/ListCmdHandler.java?rev=1084542&r1=1084541&r2=1084542&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/ListCmdHandler.java
 (original)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/ListCmdHandler.java
 Wed Mar 23 11:28:26 2011
@@ -21,15 +21,8 @@ package org.apache.james.pop3server.core
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.List;
 
-import org.apache.james.mailbox.MailboxException;
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.MessageRange;
-import org.apache.james.mailbox.MessageResult;
-import org.apache.james.mailbox.MessageResult.FetchGroup;
-import org.apache.james.mailbox.util.FetchGroupImpl;
 import org.apache.james.pop3server.POP3Response;
 import org.apache.james.pop3server.POP3Session;
 import org.apache.james.protocols.api.CommandHandler;
@@ -50,59 +43,46 @@ public class ListCmdHandler implements C
      *            the first argument parsed by the parseCommand method
      */
 
+    @SuppressWarnings("unchecked")
     public Response onCommand(POP3Session session, Request request) {
         POP3Response response = null;
         String parameters = request.getArgument();
-        List<Long> uidList = (List<Long>) 
session.getState().get(POP3Session.UID_LIST);
+        List<MessageMetaData> uidList = (List<MessageMetaData>) 
session.getState().get(POP3Session.UID_LIST);
         List<Long> deletedUidList = (List<Long>) 
session.getState().get(POP3Session.DELETED_UID_LIST);
 
-        MailboxSession mailboxSession = (MailboxSession) 
session.getState().get(POP3Session.MAILBOX_SESSION);
         if (session.getHandlerState() == POP3Session.TRANSACTION) {
             if (parameters == null) {
 
-                try {
-                    long size = 0;
-                    int count = 0;
-                    List<MessageResult> validResults = new 
ArrayList<MessageResult>();
-
-                    if (uidList.isEmpty() == false) {
-                        Iterator<MessageResult> results;
-                        if (uidList.size() > 1) {
-                            results = 
session.getUserMailbox().getMessages(MessageRange.range(uidList.get(0), 
uidList.get(uidList.size() - 1)), new FetchGroupImpl(FetchGroup.MINIMAL), 
mailboxSession);
-                        } else {
-                            results = 
session.getUserMailbox().getMessages(MessageRange.one(uidList.get(0)), new 
FetchGroupImpl(FetchGroup.MINIMAL), mailboxSession);
-                        }
-
-                        while (results.hasNext()) {
-                            MessageResult result = results.next();
-                            if (deletedUidList.contains(result.getUid()) == 
false) {
-                                size += result.getSize();
-                                count++;
-                                validResults.add(result);
-                            }
+                long size = 0;
+                int count = 0;
+                List<MessageMetaData> validResults = new 
ArrayList<MessageMetaData>();
+                if (uidList.isEmpty() == false) {
+
+                    for (int i = 0; i < uidList.size(); i++) {
+                        MessageMetaData data = uidList.get(i);
+                        if (deletedUidList.contains(data.getUid()) == false) {
+                            size += data.getSize();
+                            count++;
+                            validResults.add(data);
                         }
                     }
-                    StringBuilder responseBuffer = new 
StringBuilder(32).append(count).append(" ").append(size);
-                    response = new POP3Response(POP3Response.OK_RESPONSE, 
responseBuffer.toString());
-                    count = 0;
-                    for (int i = 0; i < validResults.size(); i++) {
-                        responseBuffer = new StringBuilder(16).append(i + 
1).append(" ").append(validResults.get(i).getSize());
-                        response.appendLine(responseBuffer.toString());
-
-                    }
-                    response.appendLine(".");
-                } catch (MailboxException me) {
-                    response = new POP3Response(POP3Response.ERR_RESPONSE);
                 }
+                StringBuilder responseBuffer = new 
StringBuilder(32).append(count).append(" ").append(size);
+                response = new POP3Response(POP3Response.OK_RESPONSE, 
responseBuffer.toString());
+                count = 0;
+                for (int i = 0; i < validResults.size(); i++) {
+                    responseBuffer = new StringBuilder(16).append(i + 
1).append(" ").append(validResults.get(i).getSize());
+                    response.appendLine(responseBuffer.toString());
+                }
+                response.appendLine(".");
             } else {
                 int num = 0;
                 try {
                     num = Integer.parseInt(parameters);
-                    Long uid = uidList.get(num - 1);
-                    if (deletedUidList.contains(uid) == false) {
-                        Iterator<MessageResult> results = 
session.getUserMailbox().getMessages(MessageRange.one(uid), new 
FetchGroupImpl(FetchGroup.MINIMAL), mailboxSession);
-
-                        StringBuilder responseBuffer = new 
StringBuilder(64).append(num).append(" ").append(results.next().getSize());
+                    MessageMetaData data = uidList.get(num - 1);
+                    if (deletedUidList.contains(data.getUid()) == false) {
+                       
+                        StringBuilder responseBuffer = new 
StringBuilder(64).append(num).append(" ").append(data.getSize());
                         response = new POP3Response(POP3Response.OK_RESPONSE, 
responseBuffer.toString());
                     } else {
                         StringBuilder responseBuffer = new 
StringBuilder(64).append("Message (").append(num).append(") already deleted.");
@@ -114,9 +94,7 @@ public class ListCmdHandler implements C
                 } catch (NumberFormatException nfe) {
                     StringBuilder responseBuffer = new 
StringBuilder(64).append(parameters).append(" is not a valid number");
                     response = new POP3Response(POP3Response.ERR_RESPONSE, 
responseBuffer.toString());
-                } catch (MailboxException me) {
-                    response = new POP3Response(POP3Response.ERR_RESPONSE);
-                }
+                } 
             }
         } else {
             response = new POP3Response(POP3Response.ERR_RESPONSE);

Added: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/MessageMetaData.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/MessageMetaData.java?rev=1084542&view=auto
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/MessageMetaData.java
 (added)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/MessageMetaData.java
 Wed Mar 23 11:28:26 2011
@@ -0,0 +1,54 @@
+/****************************************************************
+ * 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.core;
+
+
+/**
+ * Hold meta data for a message
+ * 
+ *
+ */
+public final class MessageMetaData {
+
+    private long uid;
+    private long size;
+
+    public MessageMetaData(long uid, long size) {
+        this.uid = uid;
+        this.size = size;
+    }
+    
+    /**
+     * Return the uid of the message
+     * 
+     * @return uid
+     */
+    public long getUid() {
+        return uid;
+    }
+    
+    /**
+     * Return the size of a message
+     * 
+     * @return size
+     */
+    public long getSize() {
+        return size;
+    }
+}

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=1084542&r1=1084541&r2=1084542&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
 Wed Mar 23 11:28:26 2011
@@ -28,6 +28,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
+import java.util.NoSuchElementException;
 
 import org.apache.james.mailbox.Content;
 import org.apache.james.mailbox.InputStreamContent;
@@ -55,6 +56,7 @@ public class RetrCmdHandler implements C
      * retrieves a particular mail message from the mailbox.
      * 
      */
+    @SuppressWarnings("unchecked")
     public Response onCommand(POP3Session session, Request request) {
         POP3Response response = null;
         String parameters = request.getArgument();
@@ -67,35 +69,41 @@ public class RetrCmdHandler implements C
                 return response;
             }
             try {
-                List<Long> uidList = (List<Long>) 
session.getState().get(POP3Session.UID_LIST);
+                List<MessageMetaData> uidList = (List<MessageMetaData>) 
session.getState().get(POP3Session.UID_LIST);
                 List<Long> deletedUidList = (List<Long>) 
session.getState().get(POP3Session.DELETED_UID_LIST);
 
                 MailboxSession mailboxSession = (MailboxSession) 
session.getState().get(POP3Session.MAILBOX_SESSION);
-                Long uid = uidList.get(num - 1);
+                Long uid = uidList.get(num - 1).getUid();
                 if (deletedUidList.contains(uid) == false) {
                     Iterator<MessageResult> results = 
session.getUserMailbox().getMessages(MessageRange.one(uid), new 
FetchGroupImpl(FetchGroup.FULL_CONTENT), mailboxSession);
                     
-                    session.writeStream(new 
ByteArrayInputStream((POP3Response.OK_RESPONSE + " Message 
follows\r\n").getBytes()));
-                    // response = new POP3Response(POP3Response.OK_RESPONSE,
-                    // "Message follows");
-                    try {
+                    if (results.hasNext()) {
                         MessageResult result = results.next();
-                        Content content = result.getFullContent();
-                        InputStream in;
-                        if (content instanceof InputStreamContent) {
-                            in =((InputStreamContent) 
content).getInputStream();
-                        } else {
-                            in = createInputStream(content);
+
+                        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();
+                            InputStream in;
+                            if (content instanceof InputStreamContent) {
+                                in =((InputStreamContent) 
content).getInputStream();
+                            } else {
+                                in = createInputStream(content);
+                            }
+                            //session.writeStream(new ExtraDotInputStream(in));
+                            session.writeStream(new ExtraDotInputStream(new 
CRLFTerminatedInputStream(in)));
+
+                        } finally {                         
+                            // write a single dot to mark message as complete
+                            session.writeStream(new 
ByteArrayInputStream(".\r\n".getBytes()));
                         }
-                        //session.writeStream(new ExtraDotInputStream(in));
-                        session.writeStream(new ExtraDotInputStream(new 
CRLFTerminatedInputStream(in)));
 
-                    } finally {                         
-                        // write a single dot to mark message as complete
-                        session.writeStream(new 
ByteArrayInputStream(".\r\n".getBytes()));
+                        return null;
+                    } else {
+                        StringBuilder responseBuffer = new 
StringBuilder(64).append("Message (").append(num).append(") does not exist.");
+                        response = new POP3Response(POP3Response.ERR_RESPONSE, 
responseBuffer.toString());
                     }
-
-                    return null;
                 } else {
 
                     StringBuilder responseBuffer = new 
StringBuilder(64).append("Message (").append(num).append(") already deleted.");
@@ -108,6 +116,9 @@ public class RetrCmdHandler implements C
             } catch (IndexOutOfBoundsException iob) {
                 StringBuilder responseBuffer = new 
StringBuilder(64).append("Message (").append(num).append(") does not exist.");
                 response = new POP3Response(POP3Response.ERR_RESPONSE, 
responseBuffer.toString());
+            } catch (NoSuchElementException e) {
+                StringBuilder responseBuffer = new 
StringBuilder(64).append("Message (").append(num).append(") does not exist.");
+                response = new POP3Response(POP3Response.ERR_RESPONSE, 
responseBuffer.toString());
             }
         } else {
             response = new POP3Response(POP3Response.ERR_RESPONSE);

Modified: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RsetCmdHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RsetCmdHandler.java?rev=1084542&r1=1084541&r2=1084542&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RsetCmdHandler.java
 (original)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RsetCmdHandler.java
 Wed Mar 23 11:28:26 2011
@@ -69,10 +69,12 @@ public class RsetCmdHandler implements C
         try {
             MailboxSession mailboxSession = (MailboxSession) 
session.getState().get(POP3Session.MAILBOX_SESSION);
 
-            List<Long> uids = new ArrayList<Long>();
+            List<MessageMetaData> uids = new ArrayList<MessageMetaData>();
             Iterator<MessageResult> it = 
session.getUserMailbox().getMessages(MessageRange.all(), new 
FetchGroupImpl(FetchGroup.MINIMAL), mailboxSession);
             while (it.hasNext()) {
-                uids.add(it.next().getUid());
+                MessageResult result = it.next();
+                uids.add(new MessageMetaData(result.getUid(), 
result.getSize()));
+                
             }
             session.getState().put(POP3Session.UID_LIST, uids);
             session.getState().put(POP3Session.DELETED_UID_LIST, new 
ArrayList<Long>());

Modified: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/StatCmdHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/StatCmdHandler.java?rev=1084542&r1=1084541&r2=1084542&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/StatCmdHandler.java
 (original)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/StatCmdHandler.java
 Wed Mar 23 11:28:26 2011
@@ -21,15 +21,8 @@ package org.apache.james.pop3server.core
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.List;
 
-import org.apache.james.mailbox.MailboxException;
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.MessageRange;
-import org.apache.james.mailbox.MessageResult;
-import org.apache.james.mailbox.MessageResult.FetchGroup;
-import org.apache.james.mailbox.util.FetchGroupImpl;
 import org.apache.james.pop3server.POP3Response;
 import org.apache.james.pop3server.POP3Session;
 import org.apache.james.protocols.api.CommandHandler;
@@ -47,34 +40,29 @@ public class StatCmdHandler implements C
      * of messages in the mailbox and its aggregate size.
      * 
      */
+    @SuppressWarnings("unchecked")
     public Response onCommand(POP3Session session, Request request) {
         POP3Response response = null;
         if (session.getHandlerState() == POP3Session.TRANSACTION) {
 
-            try {
-                List<Long> uidList = (List<Long>) 
session.getState().get(POP3Session.UID_LIST);
-                List<Long> deletedUidList = (List<Long>) 
session.getState().get(POP3Session.DELETED_UID_LIST);
-                long size = 0;
-                int count = 0;
-                if (uidList.isEmpty() == false) {
-                    MailboxSession mailboxSession = (MailboxSession) 
session.getState().get(POP3Session.MAILBOX_SESSION);
-                    Iterator<MessageResult> results = 
session.getUserMailbox().getMessages(MessageRange.range(uidList.get(0), 
uidList.get(uidList.size() - 1)), new FetchGroupImpl(FetchGroup.MINIMAL), 
mailboxSession);
-
-                    List<MessageResult> validResults = new 
ArrayList<MessageResult>();
-                    while (results.hasNext()) {
-                        MessageResult result = results.next();
-                        if (deletedUidList.contains(result.getUid()) == false) 
{
-                            size += result.getSize();
-                            count++;
-                            validResults.add(result);
-                        }
+            List<MessageMetaData> uidList = (List<MessageMetaData>) 
session.getState().get(POP3Session.UID_LIST);
+            List<Long> deletedUidList = (List<Long>) 
session.getState().get(POP3Session.DELETED_UID_LIST);
+            long size = 0;
+            int count = 0;
+            if (uidList.isEmpty() == false) {                    
+                List<MessageMetaData> validResults = new 
ArrayList<MessageMetaData>();
+                for (int i = 0; i < uidList.size(); i++) {
+                    MessageMetaData data = uidList.get(i);
+                    if (deletedUidList.contains(data.getUid()) == false) {
+                        size += data.getSize();
+                        count++;
+                        validResults.add(data);
                     }
                 }
-                StringBuilder responseBuffer = new 
StringBuilder(32).append(count).append(" ").append(size);
-                response = new POP3Response(POP3Response.OK_RESPONSE, 
responseBuffer.toString());
-            } catch (MailboxException me) {
-                response = new POP3Response(POP3Response.ERR_RESPONSE);
             }
+            StringBuilder responseBuffer = new 
StringBuilder(32).append(count).append(" ").append(size);
+            response = new POP3Response(POP3Response.OK_RESPONSE, 
responseBuffer.toString());
+           
         } else {
             response = new POP3Response(POP3Response.ERR_RESPONSE);
         }

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=1084542&r1=1084541&r2=1084542&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
 Wed Mar 23 11:28:26 2011
@@ -31,6 +31,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
+import java.util.NoSuchElementException;
 
 import org.apache.james.mailbox.Content;
 import org.apache.james.mailbox.InputStreamContent;
@@ -89,54 +90,59 @@ public class TopCmdHandler extends RetrC
                 return response;
             }
             try {
-                List<Long> uidList = (List<Long>) 
session.getState().get(POP3Session.UID_LIST);
+                List<MessageMetaData> uidList = (List<MessageMetaData>) 
session.getState().get(POP3Session.UID_LIST);
                 List<Long> deletedUidList = (List<Long>) 
session.getState().get(POP3Session.DELETED_UID_LIST);
 
                 MailboxSession mailboxSession = (MailboxSession) 
session.getState().get(POP3Session.MAILBOX_SESSION);
-                Long uid = uidList.get(num - 1);
+                Long uid = uidList.get(num - 1).getUid();
                 if (deletedUidList.contains(uid) == false) {
                     FetchGroupImpl fetchGroup = new 
FetchGroupImpl(FetchGroup.BODY_CONTENT);
                     fetchGroup.or(FetchGroup.HEADERS);
                     Iterator<MessageResult> results = 
session.getUserMailbox().getMessages(MessageRange.one(uid), fetchGroup, 
mailboxSession);
                     
-                    session.writeStream(new 
ByteArrayInputStream((POP3Response.OK_RESPONSE + " Message 
follows\r\n").getBytes()));
-                    try {
+                    if (results.hasNext()) {
                         MessageResult result = results.next();
+                       
+                        session.writeStream(new 
ByteArrayInputStream((POP3Response.OK_RESPONSE + " Message 
follows\r\n").getBytes()));
+                        try {
 
-                        ByteArrayOutputStream headersOut = new 
ByteArrayOutputStream();
-                        WritableByteChannel headersChannel = 
Channels.newChannel(headersOut);
+                            ByteArrayOutputStream headersOut = new 
ByteArrayOutputStream();
+                            WritableByteChannel headersChannel = 
Channels.newChannel(headersOut);
                         
-                        // write headers
-                        Iterator<Header> headers = result.headers();
-                        while (headers.hasNext()) {
-                            headers.next().writeTo(headersChannel);
-
-                            // we need to write out the CRLF after each header
+                            // write headers
+                            Iterator<Header> headers = result.headers();
+                            while (headers.hasNext()) {
+                                headers.next().writeTo(headersChannel);
+
+                                // we need to write out the CRLF after each 
header
+                                
headersChannel.write(ByteBuffer.wrap("\r\n".getBytes()));
+                            }
+                            // headers and body are seperated by a CRLF
                             
headersChannel.write(ByteBuffer.wrap("\r\n".getBytes()));
-
-                        }
-                        // headers and body are seperated by a CRLF
-                        
headersChannel.write(ByteBuffer.wrap("\r\n".getBytes()));
-                        session.writeStream(new 
ByteArrayInputStream(headersOut.toByteArray()));
+                            session.writeStream(new 
ByteArrayInputStream(headersOut.toByteArray()));
                         
-                        InputStream bodyIn;
-                        Content content = result.getBody();
-                        if (content instanceof InputStreamContent) {
-                            bodyIn = ((InputStreamContent) 
content).getInputStream();
-                        } else {
-                            bodyIn = createInputStream(content);
+                            InputStream bodyIn;
+                            Content content = result.getBody();
+                            if (content instanceof InputStreamContent) {
+                                bodyIn = ((InputStreamContent) 
content).getInputStream();
+                            } else {
+                                bodyIn = createInputStream(content);
+                            }
+                            // write body
+                            session.writeStream(new 
CountingBodyInputStream(new CRLFTerminatedInputStream(bodyIn), lines));
+
+                        } finally {
+                            // write a single dot to mark message as complete
+                            session.writeStream(new 
ByteArrayInputStream(".\r\n".getBytes()));
+                       
                         }
-                        // write body
-                        session.writeStream(new CountingBodyInputStream(new 
CRLFTerminatedInputStream(bodyIn), lines));
 
-                    } finally {
-                        // write a single dot to mark message as complete
-                        session.writeStream(new 
ByteArrayInputStream(".\r\n".getBytes()));
-                       
+                        return null;
+                    } else {
+                        StringBuilder exceptionBuffer = new 
StringBuilder(64).append("Message (").append(num).append(") does not exist.");
+                        response = new POP3Response(POP3Response.ERR_RESPONSE, 
exceptionBuffer.toString());
                     }
-
-                    return null;
-
+                    
                 } else {
                     StringBuilder responseBuffer = new 
StringBuilder(64).append("Message (").append(num).append(") already deleted.");
                     response = new POP3Response(POP3Response.ERR_RESPONSE, 
responseBuffer.toString());
@@ -148,8 +154,9 @@ public class TopCmdHandler extends RetrC
             } catch (IndexOutOfBoundsException iob) {
                 StringBuilder exceptionBuffer = new 
StringBuilder(64).append("Message (").append(num).append(") does not exist.");
                 response = new POP3Response(POP3Response.ERR_RESPONSE, 
exceptionBuffer.toString());
-            } catch (Exception e) {
-                e.printStackTrace();
+            } catch (NoSuchElementException iob) {
+                StringBuilder exceptionBuffer = new 
StringBuilder(64).append("Message (").append(num).append(") does not exist.");
+                response = new POP3Response(POP3Response.ERR_RESPONSE, 
exceptionBuffer.toString());
             }
         } else {
             response = new POP3Response(POP3Response.ERR_RESPONSE);

Modified: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java?rev=1084542&r1=1084541&r2=1084542&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java
 (original)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java
 Wed Mar 23 11:28:26 2011
@@ -40,17 +40,18 @@ public class UidlCmdHandler implements C
      * of message ids to the client.
      * 
      */
+    @SuppressWarnings("unchecked")
     public Response onCommand(POP3Session session, Request request) {
         POP3Response response = null;
         String parameters = request.getArgument();
         if (session.getHandlerState() == POP3Session.TRANSACTION) {
-            List<Long> uidList = (List<Long>) 
session.getState().get(POP3Session.UID_LIST);
+            List<MessageMetaData> uidList = (List<MessageMetaData>) 
session.getState().get(POP3Session.UID_LIST);
             List<Long> deletedUidList = (List<Long>) 
session.getState().get(POP3Session.DELETED_UID_LIST);
 
             if (parameters == null) {
                 response = new POP3Response(POP3Response.OK_RESPONSE, 
"unique-id listing follows");
                 for (int i = 0; i < uidList.size(); i++) {
-                    Long uid = uidList.get(i);
+                    Long uid = uidList.get(i).getUid();
                     if (deletedUidList.contains(uid) == false) {
                         StringBuilder responseBuffer = new 
StringBuilder(64).append(i + 1).append(" ").append(uid);
                         response.appendLine(responseBuffer.toString());
@@ -62,7 +63,7 @@ public class UidlCmdHandler implements C
                 int num = 0;
                 try {
                     num = Integer.parseInt(parameters);
-                    Long uid = uidList.get(num - 1);
+                    Long uid = uidList.get(num - 1).getUid();
                     if (deletedUidList.contains(uid) == false) {
 
                         StringBuilder responseBuffer = new 
StringBuilder(64).append(num).append(" ").append(uid.hashCode());

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=1084542&r1=1084541&r2=1084542&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
 Wed Mar 23 11:28:26 2011
@@ -491,6 +491,89 @@ public class POP3ServerTest extends Test
 
         manager.deleteMailbox(mailboxPath, session);
     }
+    
+    // Test for JAMES-1202
+    // This was failing before as the more then one connection to the same 
mailbox was not handled the right way
+    public void testStatUidlListTwoConnections() throws Exception {
+        finishSetUp(m_testConfiguration);
+
+        m_pop3Protocol = new POP3Client();
+        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
+
+        m_usersRepository.addUser("foo2", "bar2");
+
+        MailboxPath mailboxPath = new 
MailboxPath(MailboxConstants.USER_NAMESPACE, "foo2", "INBOX");
+        MailboxSession session = manager.login("foo2", "bar2", 
LoggerFactory.getLogger("Test"));
+        
+        if (manager.mailboxExists(mailboxPath, session) == false) {
+            manager.createMailbox(mailboxPath, session);
+        }
+        
+        int msgCount = 100;
+        for (int i = 0; i < msgCount;i++) {
+            manager.getMailbox(mailboxPath, session).appendMessage(new 
ByteArrayInputStream(("Subject: test\r\n\r\n" +i).getBytes()), new Date(), 
session, true, new Flags());
+        }
+        
+        m_pop3Protocol.login("foo2", "bar2");
+        assertEquals(1, m_pop3Protocol.getState());
+
+        POP3MessageInfo[] listEntries = m_pop3Protocol.listMessages();
+        POP3MessageInfo[] uidlEntries = m_pop3Protocol.listUniqueIdentifiers();
+        POP3MessageInfo statInfo = m_pop3Protocol.status();
+        assertEquals(msgCount, listEntries.length);
+        assertEquals(msgCount, uidlEntries.length);
+        assertEquals(msgCount, statInfo.number);
+
+        POP3Client m_pop3Protocol2 = new POP3Client();
+        m_pop3Protocol2.connect("127.0.0.1",m_pop3ListenerPort);
+        m_pop3Protocol2.login("foo2", "bar2");
+        assertEquals(1, m_pop3Protocol2.getState());
+
+        POP3MessageInfo[] listEntries2 = m_pop3Protocol2.listMessages();
+        POP3MessageInfo[] uidlEntries2 = 
m_pop3Protocol2.listUniqueIdentifiers();
+        POP3MessageInfo statInfo2 = m_pop3Protocol2.status();
+        assertEquals(msgCount, listEntries2.length);
+        assertEquals(msgCount, uidlEntries2.length);
+        assertEquals(msgCount, statInfo2.number);
+
+        m_pop3Protocol.deleteMessage(1);
+        listEntries = m_pop3Protocol.listMessages();
+        uidlEntries = m_pop3Protocol.listUniqueIdentifiers();
+        statInfo = m_pop3Protocol.status();
+        assertEquals(msgCount - 1, listEntries.length);
+        assertEquals(msgCount - 1, uidlEntries.length);
+        assertEquals(msgCount - 1, statInfo.number);
+        
+        
+        // even after the message was deleted it should get displayed in the 
second connection
+        listEntries2 = m_pop3Protocol2.listMessages();
+        uidlEntries2 = m_pop3Protocol2.listUniqueIdentifiers();
+        statInfo2 = m_pop3Protocol2.status();
+        assertEquals(msgCount, listEntries2.length);
+        assertEquals(msgCount, uidlEntries2.length);
+        assertEquals(msgCount, statInfo2.number);
+
+        assertTrue(m_pop3Protocol.logout());
+        m_pop3Protocol.disconnect();
+        
+        // even after the message was deleted and the session was quit it 
should get displayed in the second connection
+        listEntries2 = m_pop3Protocol2.listMessages();
+        uidlEntries2 = m_pop3Protocol2.listUniqueIdentifiers();
+        statInfo2 = m_pop3Protocol2.status();
+        assertEquals(msgCount, listEntries2.length);
+        assertEquals(msgCount, uidlEntries2.length);
+        assertEquals(msgCount, statInfo2.number);
+
+        // This both should error and so return null
+        assertNull(m_pop3Protocol2.retrieveMessageTop(1, 100));
+        assertNull(m_pop3Protocol2.retrieveMessage(1));
+
+        m_pop3Protocol2.sendCommand("quit");
+        m_pop3Protocol2.disconnect();
+        
+        manager.deleteMailbox(mailboxPath, session);
+    }
+
     /*
     public void testTwoSimultaneousMails() throws Exception {
         finishSetUp(m_testConfiguration);



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

Reply via email to