Author: norman
Date: Tue Jun  7 07:31:07 2011
New Revision: 1132888

URL: http://svn.apache.org/viewvc?rev=1132888&view=rev
Log:
Make sure the UIDL is unique across mailboxes. See JAMES-1264

Modified:
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java

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=1132888&r1=1132887&r2=1132888&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
 Tue Jun  7 07:31:07 2011
@@ -23,6 +23,10 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageManager.MetaData;
+import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
 import org.apache.james.pop3server.POP3Response;
 import org.apache.james.pop3server.POP3Session;
 import org.apache.james.protocols.api.CommandHandler;
@@ -46,40 +50,49 @@ public class UidlCmdHandler implements C
         if (session.getHandlerState() == POP3Session.TRANSACTION) {
             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).getUid();
-                    if (deletedUidList.contains(uid) == false) {
-                        StringBuilder responseBuffer = new 
StringBuilder(64).append(i + 1).append(" ").append(uid);
-                        response.appendLine(responseBuffer.toString());
+            MailboxSession mailboxSession = (MailboxSession) 
session.getState().get(POP3Session.MAILBOX_SESSION);
+            try {
+                MetaData mData = session.getUserMailbox().getMetaData(false, 
mailboxSession, FetchGroup.NO_COUNT);
+                long validity = mData.getUidValidity();
+                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).getUid();
+                        if (deletedUidList.contains(uid) == false) {
+                            // construct unique UIDL. See JAMES-1264
+                            StringBuilder responseBuffer = new 
StringBuilder(64).append(i + 1).append(" 
").append(validity).append("-").append(uid);
+                            response.appendLine(responseBuffer.toString());
+                        }
                     }
-                }
-
-                response.appendLine(".");
-            } else {
-                int num = 0;
-                try {
-                    num = Integer.parseInt(parameters);
-                    Long uid = uidList.get(num - 1).getUid();
-                    if (deletedUidList.contains(uid) == false) {
 
-                        StringBuilder responseBuffer = new 
StringBuilder(64).append(num).append(" ").append(uid.hashCode());
-                        response = new POP3Response(POP3Response.OK_RESPONSE, 
responseBuffer.toString());
-
-                    } else {
-                        StringBuilder responseBuffer = new 
StringBuilder(64).append("Message (").append(num).append(") already deleted.");
+                    response.appendLine(".");
+                } else {
+                    int num = 0;
+                    try {
+                        num = Integer.parseInt(parameters);
+                        Long uid = uidList.get(num - 1).getUid();
+                        if (deletedUidList.contains(uid) == false) {
+                            // construct unique UIDL. See JAMES-1264
+                            StringBuilder responseBuffer = new 
StringBuilder(64).append(num).append(" 
").append(validity).append("-").append(uid);
+                            response = new 
POP3Response(POP3Response.OK_RESPONSE, responseBuffer.toString());
+
+                        } else {
+                            StringBuilder responseBuffer = new 
StringBuilder(64).append("Message (").append(num).append(") already deleted.");
+                            response = new 
POP3Response(POP3Response.ERR_RESPONSE, responseBuffer.toString());
+                        }
+                    } catch (IndexOutOfBoundsException npe) {
+                        StringBuilder responseBuffer = new 
StringBuilder(64).append("Message (").append(num).append(") does not exist.");
+                        response = new POP3Response(POP3Response.ERR_RESPONSE, 
responseBuffer.toString());
+                    } 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 (IndexOutOfBoundsException npe) {
-                    StringBuilder responseBuffer = new 
StringBuilder(64).append("Message (").append(num).append(") does not exist.");
-                    response = new POP3Response(POP3Response.ERR_RESPONSE, 
responseBuffer.toString());
-                } 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 e) {
+                response = new POP3Response(POP3Response.ERR_RESPONSE);
+                return response;
             }
+            
         } else {
             response = new POP3Response(POP3Response.ERR_RESPONSE);
         }



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

Reply via email to