Author: norman
Date: Thu Sep 23 13:36:14 2010
New Revision: 1000465

URL: http://svn.apache.org/viewvc?rev=1000465&view=rev
Log:
Don't require the uid for the next append operation to be the same as the 
UIDNEXT value (IMAP-193)

Modified:
    
james/imap/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
    
james/imap/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java
    
james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
    
james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
    
james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
    
james/imap/trunk/mailbox/src/main/java/org/apache/james/mailbox/MessageManager.java
    
james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java
    
james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageManager.java
    
james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailbox.java
    
james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
    
james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryStoreMessageManager.java
    
james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
    
james/imap/trunk/protocol-tester/src/main/resources/org/apache/james/imap/scripts/Copy.test
    
james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/MapperStoreMessageManager.java
    
james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
    
james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
    
james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/Mailbox.java

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java?rev=1000465&r1=1000464&r2=1000465&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
 (original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
 Thu Sep 23 13:36:14 2010
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.james.mailbox.jcr;
 
+import java.util.concurrent.atomic.AtomicLong;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.james.mailbox.MailboxException;
@@ -52,8 +54,8 @@ public class JCRMailboxManager extends S
 
     
     @Override
-    protected MapperStoreMessageManager<String> 
createMessageManager(MailboxEventDispatcher dispatcher, Mailbox<String> 
mailboxEntity, MailboxSession session) throws MailboxException{
-        return new JCRMessageManager(mapperFactory, dispatcher, (JCRMailbox) 
mailboxEntity, logger, getDelimiter());
+    protected MapperStoreMessageManager<String> 
createMessageManager(AtomicLong lastUid, MailboxEventDispatcher dispatcher, 
Mailbox<String> mailboxEntity, MailboxSession session) throws MailboxException{
+        return new JCRMessageManager(mapperFactory, lastUid, dispatcher, 
(JCRMailbox) mailboxEntity, logger, getDelimiter());
     }
 
     @Override

Modified: 
james/imap/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java?rev=1000465&r1=1000464&r2=1000465&view=diff
==============================================================================
--- 
james/imap/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java
 (original)
+++ 
james/imap/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java
 Thu Sep 23 13:36:14 2010
@@ -22,6 +22,7 @@ import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicLong;
 
 import javax.mail.Flags;
 
@@ -44,9 +45,9 @@ public class JCRMessageManager extends M
 
     private final Log log;
 
-    public JCRMessageManager(JCRMailboxSessionMapperFactory mapperFactory,
+    public JCRMessageManager(JCRMailboxSessionMapperFactory mapperFactory, 
final AtomicLong lastUid,
             final MailboxEventDispatcher dispatcher, final JCRMailbox mailbox, 
final Log log, final char delimiter) throws MailboxException {
-        super(mapperFactory, dispatcher, mailbox);
+        super(mapperFactory, lastUid, dispatcher, mailbox);
         this.log = log;
     }
 

Modified: 
james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java?rev=1000465&r1=1000464&r2=1000465&view=diff
==============================================================================
--- 
james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
 (original)
+++ 
james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
 Thu Sep 23 13:36:14 2010
@@ -22,6 +22,7 @@ import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicLong;
 
 import javax.mail.Flags;
 
@@ -40,9 +41,9 @@ import org.apache.james.mailbox.util.Mai
  */
 public class JPAMessageManager extends MapperStoreMessageManager<Long> {
     
-    public JPAMessageManager(JPAMailboxSessionMapperFactory mapperFactory,
+    public JPAMessageManager(JPAMailboxSessionMapperFactory mapperFactory, 
AtomicLong lastUid,
             final MailboxEventDispatcher dispatcher,final Mailbox<Long> 
mailbox) throws MailboxException {
-        super(mapperFactory, dispatcher, mailbox);     
+        super(mapperFactory, lastUid, dispatcher, mailbox);     
     }
     
     @Override

Modified: 
james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java?rev=1000465&r1=1000464&r2=1000465&view=diff
==============================================================================
--- 
james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
 (original)
+++ 
james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
 Thu Sep 23 13:36:14 2010
@@ -20,6 +20,8 @@
 package org.apache.james.mailbox.jpa.openjpa;
 
 
+import java.util.concurrent.atomic.AtomicLong;
+
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.jpa.JPAMailboxManager;
@@ -47,8 +49,8 @@ public class OpenJPAMailboxManager exten
     }
 
     @Override
-    protected MapperStoreMessageManager<Long> 
createMessageManager(MailboxEventDispatcher dispatcher, Mailbox<Long> 
mailboxRow, MailboxSession session) throws MailboxException {
-        MapperStoreMessageManager<Long> result =  new 
OpenJPAMessageManager((JPAMailboxSessionMapperFactory) 
mailboxSessionMapperFactory, dispatcher, mailboxRow, useStreaming);
+    protected MapperStoreMessageManager<Long> createMessageManager(AtomicLong 
lastUid, MailboxEventDispatcher dispatcher, Mailbox<Long> mailboxRow, 
MailboxSession session) throws MailboxException {
+        MapperStoreMessageManager<Long> result =  new 
OpenJPAMessageManager((JPAMailboxSessionMapperFactory) 
mailboxSessionMapperFactory, lastUid, dispatcher, mailboxRow, useStreaming);
         return result;
     }
 }

Modified: 
james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java?rev=1000465&r1=1000464&r2=1000465&view=diff
==============================================================================
--- 
james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
 (original)
+++ 
james/imap/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
 Thu Sep 23 13:36:14 2010
@@ -23,6 +23,7 @@ import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicLong;
 
 import javax.mail.Flags;
 
@@ -45,14 +46,14 @@ public class OpenJPAMessageManager exten
 
     private final boolean useStreaming;
 
-    public OpenJPAMessageManager(JPAMailboxSessionMapperFactory mapperFactory,
+    public OpenJPAMessageManager(JPAMailboxSessionMapperFactory mapperFactory, 
AtomicLong lastUid,
             MailboxEventDispatcher dispatcher, Mailbox<Long> mailbox) throws 
MailboxException {
-        this(mapperFactory, dispatcher, mailbox, false);
+        this(mapperFactory, lastUid, dispatcher, mailbox, false);
     }
 
-    public OpenJPAMessageManager(JPAMailboxSessionMapperFactory mapperFactory,
+    public OpenJPAMessageManager(JPAMailboxSessionMapperFactory mapperFactory, 
AtomicLong lastUid,
             MailboxEventDispatcher dispatcher, Mailbox<Long> mailbox, final 
boolean useStreaming) throws MailboxException {
-        super(mapperFactory, dispatcher, mailbox);
+        super(mapperFactory, lastUid, dispatcher, mailbox);
         this.useStreaming = useStreaming;
     }
 

Modified: 
james/imap/trunk/mailbox/src/main/java/org/apache/james/mailbox/MessageManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/mailbox/src/main/java/org/apache/james/mailbox/MessageManager.java?rev=1000465&r1=1000464&r2=1000465&view=diff
==============================================================================
--- 
james/imap/trunk/mailbox/src/main/java/org/apache/james/mailbox/MessageManager.java
 (original)
+++ 
james/imap/trunk/mailbox/src/main/java/org/apache/james/mailbox/MessageManager.java
 Thu Sep 23 13:36:14 2010
@@ -171,7 +171,10 @@ public interface MessageManager {
         
 
         /**
-         * Gets the next UID predicted.
+         * Gets the next UID predicted. The returned UID is not guaranteed to 
be the 
+         * one that is assigned to the next message. Its only guaranteed that 
it will be 
+         * at least equals or bigger then the value
+         * 
          * @param mailboxSession not null
          * @return the uid that will be assigned to the next appended message
          */

Modified: 
james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java?rev=1000465&r1=1000464&r2=1000465&view=diff
==============================================================================
--- 
james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java
 (original)
+++ 
james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java
 Thu Sep 23 13:36:14 2010
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.james.mailbox.maildir;
 
+import java.util.concurrent.atomic.AtomicLong;
+
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxPath;
 import org.apache.james.mailbox.MailboxSession;
@@ -39,9 +41,9 @@ public class MaildirMailboxManager exten
     }
 
     @Override
-    protected MapperStoreMessageManager<Integer> 
createMessageManager(MailboxEventDispatcher dispatcher,
+    protected MapperStoreMessageManager<Integer> 
createMessageManager(AtomicLong lastUid, MailboxEventDispatcher dispatcher,
             Mailbox<Integer> mailboxEntiy, MailboxSession session) throws 
MailboxException {
-        return new MaildirMessageManager(mailboxSessionMapperFactory, 
dispatcher, mailboxEntiy);
+        return new MaildirMessageManager(mailboxSessionMapperFactory, lastUid, 
dispatcher, mailboxEntiy);
     }
 
     @Override

Modified: 
james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageManager.java?rev=1000465&r1=1000464&r2=1000465&view=diff
==============================================================================
--- 
james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageManager.java
 (original)
+++ 
james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMessageManager.java
 Thu Sep 23 13:36:14 2010
@@ -22,6 +22,7 @@ import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicLong;
 
 import javax.mail.Flags;
 
@@ -38,10 +39,10 @@ import org.apache.james.mailbox.util.Mai
 
 public class MaildirMessageManager extends MapperStoreMessageManager<Integer> {
 
-    public MaildirMessageManager(MailboxSessionMapperFactory<Integer> 
mapperFactory,
+    public MaildirMessageManager(MailboxSessionMapperFactory<Integer> 
mapperFactory, AtomicLong lastUid,
             MailboxEventDispatcher dispatcher, Mailbox<Integer> mailboxEntiy)
     throws MailboxException {
-        super(mapperFactory, dispatcher, mailboxEntiy);
+        super(mapperFactory, lastUid, dispatcher, mailboxEntiy);
     }
 
     @Override

Modified: 
james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailbox.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailbox.java?rev=1000465&r1=1000464&r2=1000465&view=diff
==============================================================================
--- 
james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailbox.java
 (original)
+++ 
james/imap/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailbox.java
 Thu Sep 23 13:36:14 2010
@@ -43,7 +43,6 @@ public class MaildirMailbox implements M
         this.namespace = mailbox.getNamespace();
         this.user = mailbox.getUser();
         this.name = mailbox.getName();
-        this.lastUid = mailbox.getLastUid();
         this.uidValidity = mailbox.getUidValidity();
     }
 
@@ -54,14 +53,6 @@ public class MaildirMailbox implements M
        public void consumeUid() {
                lastUid++;
        }
-
-       /*
-        * (non-Javadoc)
-        * @see org.apache.james.mailbox.store.mail.model.Mailbox#getLastUid()
-        */
-       public long getLastUid() {
-               return lastUid;
-       }
        
        public void setMailboxId(Integer id) {
         this.id = id;

Modified: 
james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java?rev=1000465&r1=1000464&r2=1000465&view=diff
==============================================================================
--- 
james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
 (original)
+++ 
james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
 Thu Sep 23 13:36:14 2010
@@ -19,6 +19,8 @@
 
 package org.apache.james.mailbox.inmemory;
 
+import java.util.concurrent.atomic.AtomicLong;
+
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxPath;
 import org.apache.james.mailbox.MailboxSession;
@@ -37,8 +39,8 @@ public class InMemoryMailboxManager exte
     }
 
     @Override
-    protected MapperStoreMessageManager<Long> 
createMessageManager(MailboxEventDispatcher dispatcher, Mailbox<Long> 
mailboxRow, MailboxSession session) throws MailboxException {
-        return new InMemoryStoreMessageManager(mailboxSessionMapperFactory, 
dispatcher, (InMemoryMailbox)mailboxRow);
+    protected MapperStoreMessageManager<Long> createMessageManager(AtomicLong 
lastUid, MailboxEventDispatcher dispatcher, Mailbox<Long> mailboxRow, 
MailboxSession session) throws MailboxException {
+        return new InMemoryStoreMessageManager(mailboxSessionMapperFactory, 
lastUid, dispatcher, (InMemoryMailbox)mailboxRow);
     }
 
     @Override

Modified: 
james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryStoreMessageManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryStoreMessageManager.java?rev=1000465&r1=1000464&r2=1000465&view=diff
==============================================================================
--- 
james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryStoreMessageManager.java
 (original)
+++ 
james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryStoreMessageManager.java
 Thu Sep 23 13:36:14 2010
@@ -23,6 +23,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.util.Date;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicLong;
 
 import javax.mail.Flags;
 
@@ -39,9 +40,9 @@ import org.apache.james.mailbox.util.Mai
 
 public class InMemoryStoreMessageManager extends 
MapperStoreMessageManager<Long> {
 
-    public InMemoryStoreMessageManager(MailboxSessionMapperFactory<Long> 
mapperFactory,
+    public InMemoryStoreMessageManager(MailboxSessionMapperFactory<Long> 
mapperFactory, AtomicLong lastUid,
             MailboxEventDispatcher dispatcher, InMemoryMailbox mailbox) throws 
MailboxException {
-        super(mapperFactory, dispatcher,mailbox);
+        super(mapperFactory, lastUid, dispatcher,mailbox);
     }
     
     @Override

Modified: 
james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java?rev=1000465&r1=1000464&r2=1000465&view=diff
==============================================================================
--- 
james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
 (original)
+++ 
james/imap/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
 Thu Sep 23 13:36:14 2010
@@ -216,8 +216,10 @@ public class InMemoryMessageMapper exten
      * @see 
org.apache.james.mailbox.store.mail.MessageMapper#copy(org.apache.james.mailbox.store.mail.model.Mailbox,
 org.apache.james.mailbox.store.mail.model.MailboxMembership)
      */
     public long copy(Mailbox<Long> mailbox, MailboxMembership<Long> original) 
throws MailboxException {
-        ((InMemoryMailbox) mailbox).consumeUid();
-        SimpleMailboxMembership membership = new 
SimpleMailboxMembership(mailbox.getMailboxId(), mailbox.getLastUid(), 
(SimpleMailboxMembership) original);
+        InMemoryMailbox iMailbox = (InMemoryMailbox) mailbox;
+        iMailbox.consumeUid();
+        
+        SimpleMailboxMembership membership = new 
SimpleMailboxMembership(mailbox.getMailboxId(), iMailbox.getLastUid(), 
(SimpleMailboxMembership) original);
         return save(mailbox, membership);
     }
     

Modified: 
james/imap/trunk/protocol-tester/src/main/resources/org/apache/james/imap/scripts/Copy.test
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/protocol-tester/src/main/resources/org/apache/james/imap/scripts/Copy.test?rev=1000465&r1=1000464&r2=1000465&view=diff
==============================================================================
--- 
james/imap/trunk/protocol-tester/src/main/resources/org/apache/james/imap/scripts/Copy.test
 (original)
+++ 
james/imap/trunk/protocol-tester/src/main/resources/org/apache/james/imap/scripts/Copy.test
 Thu Sep 23 13:36:14 2010
@@ -49,7 +49,7 @@ S: \* \d+ RECENT
 S: \* OK \[UIDVALIDITY \d+\]
 S: \* OK \[UNSEEN \d+\]
 S: \* OK \[PERMANENTFLAGS \(\\Answered \\Deleted \\Draft \\Flagged \\Seen\)\]
-S: \* OK \[UIDNEXT 4\]
+S: \* OK \[UIDNEXT \d+\]
 S: a7 OK \[READ-WRITE\] SELECT completed.
 
 C: a8 FETCH 1:3 (FLAGS)

Modified: 
james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/MapperStoreMessageManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/MapperStoreMessageManager.java?rev=1000465&r1=1000464&r2=1000465&view=diff
==============================================================================
--- 
james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/MapperStoreMessageManager.java
 (original)
+++ 
james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/MapperStoreMessageManager.java
 Thu Sep 23 13:36:14 2010
@@ -24,6 +24,7 @@ import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 import java.util.TreeSet;
+import java.util.concurrent.atomic.AtomicLong;
 
 import javax.mail.Flags;
 import javax.mail.MessagingException;
@@ -53,8 +54,8 @@ public abstract class MapperStoreMessage
     private MailboxSessionMapperFactory<Id> mapperFactory;
 
     
-    public MapperStoreMessageManager(MailboxSessionMapperFactory<Id> 
mapperFactory, final MailboxEventDispatcher dispatcher, final Mailbox<Id> 
mailbox) throws MailboxException {
-        super(dispatcher, mailbox);
+    public MapperStoreMessageManager(MailboxSessionMapperFactory<Id> 
mapperFactory, final AtomicLong lastUid, final MailboxEventDispatcher 
dispatcher, final Mailbox<Id> mailbox) throws MailboxException {
+        super(lastUid, dispatcher, mailbox);
         this.mapperFactory = mapperFactory;
     }
 

Modified: 
james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java?rev=1000465&r1=1000464&r2=1000465&view=diff
==============================================================================
--- 
james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
 (original)
+++ 
james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
 Thu Sep 23 13:36:14 2010
@@ -24,6 +24,9 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
 import java.util.Random;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -67,9 +70,9 @@ public abstract class StoreMailboxManage
     
     private final Authenticator authenticator;
     private final static Random RANDOM = new Random();
-
+    
     private Log log = LogFactory.getLog("org.apache.james.imap");
-
+    private ConcurrentMap<Id, AtomicLong> lastUids = new ConcurrentHashMap<Id, 
AtomicLong>();
     
     public StoreMailboxManager(MailboxSessionMapperFactory<Id> 
mailboxSessionMapperFactory, final Authenticator authenticator) {
         this.authenticator = authenticator;
@@ -156,10 +159,10 @@ public abstract class StoreMailboxManage
     }
     
     /**
-     * Default do nothing. Should be overridden by subclass if needed
+     * Close the {...@link MailboxSession} if not null
      */
     public void logout(MailboxSession session, boolean force) throws 
MailboxException {
-        // Do nothing by default
+        session.close();
     }
   
     /**
@@ -168,7 +171,7 @@ public abstract class StoreMailboxManage
      * @param mailboxRow
      * @return storeMailbox
      */
-    protected abstract StoreMessageManager<Id> 
createMessageManager(MailboxEventDispatcher dispatcher, Mailbox<Id> mailboxRow, 
MailboxSession session) throws MailboxException;
+    protected abstract StoreMessageManager<Id> createMessageManager(AtomicLong 
lastUid,MailboxEventDispatcher dispatcher, Mailbox<Id> mailboxRow, 
MailboxSession session) throws MailboxException;
 
     /**
      * Create a Mailbox for the given namespace and store it to the underlying 
storage
@@ -193,11 +196,31 @@ public abstract class StoreMailboxManage
 
         } else {
             getLog().debug("Loaded mailbox " + mailboxPath);
-
-            return createMessageManager(dispatcher, mailboxRow, session);
+            
+            // Get the lastuid for the mailbox and register the LastUidTracker 
to update it when messages 
+            // are added to the mailbox
+            final AtomicLong lastUid = getLastUid(mailboxRow.getMailboxId());
+            StoreMessageManager<Id>  m = createMessageManager(lastUid, 
dispatcher, mailboxRow, session);
+            addListener(mailboxPath, new LastUidTracker(lastUid, session), 
session);
+            return m;
         }
     }
 
+    
+    /**
+     * Return the lastUid for the mailbox. 
+     * 
+     * 
+     * @param mailboxId
+     * @return lastUid
+     * 
+     * TODO: Maybe we should do something smart here and remove it from the 
{...@link ConcurrentHashMap} once its not needed anymore
+     */
+    private AtomicLong getLastUid(Id mailboxId) {
+        lastUids.putIfAbsent(mailboxId, new AtomicLong(0));
+        return lastUids.get(mailboxId); 
+    }
+    
     /*
      * (non-Javadoc)
      * @see 
org.apache.james.mailbox.MailboxManager#createMailbox(org.apache.james.imap.api.MailboxPath,
 org.apache.james.mailbox.MailboxSession)
@@ -404,5 +427,39 @@ public abstract class StoreMailboxManage
         // do nothing
         
     }
+    
+    /**
+     * {...@link MailboxListener} which takes care of update the lastUid for a 
Mailbox.
+     * 
+     * 
+     *
+     */
+    private final class LastUidTracker implements MailboxListener {
+
+        private final AtomicLong lastUid;
+        private final MailboxSession session;
+
+        public LastUidTracker(AtomicLong lastUid, MailboxSession session) {
+            this.lastUid = lastUid;
+            this.session = session;
+        }
+        
+        public void event(Event event) {
+            if (event instanceof Added) {
+                long uid = ((Added) event).getSubjectUid();
+                if (uid > lastUid.get()) {
+                    lastUid.set(uid);
+                }
+            }
+        }
+
+        public boolean isClosed() {
+            if (session == null || session.isOpen() == false) {
+                return true;
+            }
+            return false;
+        }
+        
+    }
 
 }

Modified: 
james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java?rev=1000465&r1=1000464&r2=1000465&view=diff
==============================================================================
--- 
james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
 (original)
+++ 
james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
 Thu Sep 23 13:36:14 2010
@@ -31,6 +31,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.SortedMap;
 import java.util.TreeMap;
+import java.util.concurrent.atomic.AtomicLong;
 
 import javax.mail.Flags;
 import javax.mail.MessagingException;
@@ -38,7 +39,6 @@ import javax.mail.util.SharedFileInputSt
 
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxListener;
-import org.apache.james.mailbox.MailboxNotFoundException;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageRange;
 import org.apache.james.mailbox.store.mail.MessageMapper;
@@ -68,11 +68,16 @@ public abstract class StoreMessageManage
     
     private final MailboxEventDispatcher dispatcher;    
     
-    public StoreMessageManager(final MailboxEventDispatcher dispatcher, final 
Mailbox<Id> mailbox) throws MailboxException {
+    private final AtomicLong lastUid;
+    
+    public StoreMessageManager(final AtomicLong lastUid, final 
MailboxEventDispatcher dispatcher, final Mailbox<Id> mailbox) throws 
MailboxException {
         this.mailbox = mailbox;
         this.dispatcher = dispatcher;
+        this.lastUid = lastUid;
     }
     
+    
+    
     /**
      * Return the {...@link MailboxEventDispatcher} for this Mailbox
      * 
@@ -254,7 +259,7 @@ public abstract class StoreMessageManage
             }
             final MailboxMembership<Id> message = createMessage(internalDate, 
size, bodyStartOctet, tmpMsgIn.newStream(0, -1), flags, headers, 
propertyBuilder);
             long uid = appendMessageToStore(message, mailboxSession);
-            
+                        
             dispatcher.added(uid, mailboxSession.getSessionId(), new 
StoreMailboxPath<Id>(getMailboxEntity()));
             return uid;
         } catch (IOException e) {
@@ -350,16 +355,6 @@ public abstract class StoreMessageManage
     public void addListener(MailboxListener listener) throws MailboxException {
         dispatcher.addMailboxListener(listener);
     }
-
-    private long getUidNext(MailboxSession mailboxSession) throws 
MailboxException {
-        Mailbox<Id> mailbox = getMailboxEntity();
-        if (mailbox == null) {
-            throw new MailboxNotFoundException("Mailbox has been deleted");
-        } else {
-            final long lastUid = mailbox.getLastUid();
-            return lastUid + 1;
-        }
-    }
     
 
     /**
@@ -378,7 +373,7 @@ public abstract class StoreMessageManage
         final List<Long> recent = recent(resetRecent, mailboxSession);
         final Flags permanentFlags = getPermanentFlags();
         final long uidValidity = getMailboxEntity().getUidValidity();
-        final long uidNext = getUidNext(mailboxSession);
+        final long uidNext = lastUid.get() +1;
         final long messageCount = getMessageCount(mailboxSession);
         final long unseenCount;
         final Long firstUnseen;
@@ -464,8 +459,13 @@ public abstract class StoreMessageManage
     public void copyTo(MessageRange set, StoreMessageManager<Id> toMailbox, 
MailboxSession session) throws MailboxException {
         try {
             Iterator<Long> copiedUids = copy(set, toMailbox, session);
+            long highest = 0;
             while(copiedUids.hasNext()) {
-                dispatcher.added(copiedUids.next(), session.getSessionId(), 
new StoreMailboxPath<Id>(toMailbox.getMailboxEntity()));
+                long uid = copiedUids.next();
+                if (highest < uid) {
+                    highest = uid;
+                }
+                dispatcher.added(uid, session.getSessionId(), new 
StoreMailboxPath<Id>(toMailbox.getMailboxEntity()));
             }
         } catch (MessagingException e) {
             throw new MailboxException("Unable to parse message", e);

Modified: 
james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/Mailbox.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/Mailbox.java?rev=1000465&r1=1000464&r2=1000465&view=diff
==============================================================================
--- 
james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/Mailbox.java
 (original)
+++ 
james/imap/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/Mailbox.java
 Thu Sep 23 13:36:14 2010
@@ -24,12 +24,6 @@ package org.apache.james.mailbox.store.m
 public interface Mailbox<Id> {
 
     /**
-     * Gets the last UID.
-     * @return uid
-     */
-    public abstract long getLastUid();
-        
-    /**
      * Gets the unique mailbox ID.
      * @return mailbox id
      */



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

Reply via email to