You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2011/05/27 21:53:24 UTC

svn commit: r1128435 - in /james/mailbox/trunk: jcr/src/main/java/org/apache/james/mailbox/jcr/mail/ jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/ jcr/src/main/resources/org/apache/james/mailbox/jcr/ jpa/src/main/java/org/apache/james/mail...

Author: norman
Date: Fri May 27 19:53:23 2011
New Revision: 1128435

URL: http://svn.apache.org/viewvc?rev=1128435&view=rev
Log:
Save the lastUid and the highestModSeq in a permanent fashion on expunge to make sure its not lost on a restart. See MAILBOX-75 

Modified:
    james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java
    james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailbox.java
    james/mailbox/trunk/jcr/src/main/resources/org/apache/james/mailbox/jcr/imap.cnd
    james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
    james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java
    james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
    james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java
    james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
    james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
    james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailbox.java
    james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
    james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/model/InMemoryMailbox.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/Mailbox.java
    james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/lucene/LuceneMessageSearchIndexTest.java

Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java?rev=1128435&r1=1128434&r2=1128435&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java (original)
+++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMessageMapper.java Fri May 27 19:53:23 2011
@@ -44,6 +44,7 @@ import org.apache.james.mailbox.MessageR
 import org.apache.james.mailbox.MessageRange.Type;
 import org.apache.james.mailbox.jcr.JCRImapConstants;
 import org.apache.james.mailbox.jcr.MailboxSessionJCRRepository;
+import org.apache.james.mailbox.jcr.mail.model.JCRMailbox;
 import org.apache.james.mailbox.jcr.mail.model.JCRMessage;
 import org.apache.james.mailbox.store.mail.AbstractMessageMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
@@ -700,4 +701,19 @@ public class JCRMessageMapper extends Ab
         }        
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#saveSequences(org.apache.james.mailbox.store.mail.model.Mailbox, long, long)
+     */
+    protected void saveSequences(Mailbox<String> mailbox, long lastUid, long highestModSeq) throws MailboxException {
+        try {
+            Node mailboxNode = getSession().getNodeByIdentifier(mailbox.getMailboxId());
+            mailboxNode.setProperty(JCRMailbox.HIGHESTKNOWNMODSEQ_PROPERTY, highestModSeq);
+            mailboxNode.setProperty(JCRMailbox.LASTKNOWNUID_PROPERTY, lastUid);
+           
+        } catch (RepositoryException e) {
+            throw new MailboxException("Unable to save sequences", e);
+        }
+    }
+
 }

Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailbox.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailbox.java?rev=1128435&r1=1128434&r2=1128435&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailbox.java (original)
+++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/model/JCRMailbox.java Fri May 27 19:53:23 2011
@@ -42,6 +42,8 @@ public class JCRMailbox implements Mailb
     public final static String NAMESPACE_PROPERTY = "jamesMailbox:mailboxNamespace";
     public final static String NAME_PROPERTY = "jamesMailbox:mailboxName";
     public final static String UIDVALIDITY_PROPERTY = "jamesMailbox:mailboxUidValidity";
+    public final static String LASTKNOWNUID_PROPERTY = "jamesMailbox:mailboxLastKnownUid";
+    public final static String HIGHESTKNOWNMODSEQ_PROPERTY = "jamesMailbox:mailboxHighestKnownModSeq";
 
     private String name;
     private long uidValidity;
@@ -51,6 +53,8 @@ public class JCRMailbox implements Mailb
 
     private String namespace;
     private String user;
+    private long lastKnownUid;
+    private long highestKnownModSeq;
     
     
     public JCRMailbox( final MailboxPath path, final long uidValidity, Logger logger) {
@@ -150,6 +154,8 @@ public class JCRMailbox implements Mailb
         }
         node.setProperty(USER_PROPERTY, user);
         node.setProperty(NAMESPACE_PROPERTY, getNamespace());
+        node.setProperty(HIGHESTKNOWNMODSEQ_PROPERTY, getHighestKnownModSeq());
+        node.setProperty(LASTKNOWNUID_PROPERTY, getLastKnownUid());
         this.node = node;
     }
     
@@ -275,4 +281,36 @@ public class JCRMailbox implements Mailb
             this.user = user;
         }        
     }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.mail.model.Mailbox#getLastKnownUid()
+     */
+    public long getLastKnownUid() {
+        if (isPersistent()) {
+            try {
+                return node.getProperty(LASTKNOWNUID_PROPERTY).getLong();
+            } catch (RepositoryException e) {
+                logger.error("Unable to access property " + LASTKNOWNUID_PROPERTY, e);
+            }
+        }
+        return lastKnownUid;
+    }
+
+    
+    
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.mail.model.Mailbox#getHighestKnownModSeq()
+     */
+    public long getHighestKnownModSeq() {
+        if (isPersistent()) {
+            try {
+                return node.getProperty(HIGHESTKNOWNMODSEQ_PROPERTY).getLong();
+            } catch (RepositoryException e) {
+                logger.error("Unable to access property " + HIGHESTKNOWNMODSEQ_PROPERTY, e);
+            }
+        }
+        return highestKnownModSeq;
+    }
 }

Modified: james/mailbox/trunk/jcr/src/main/resources/org/apache/james/mailbox/jcr/imap.cnd
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/resources/org/apache/james/mailbox/jcr/imap.cnd?rev=1128435&r1=1128434&r2=1128435&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/resources/org/apache/james/mailbox/jcr/imap.cnd (original)
+++ james/mailbox/trunk/jcr/src/main/resources/org/apache/james/mailbox/jcr/imap.cnd Fri May 27 19:53:23 2011
@@ -64,4 +64,7 @@
     - jamesMailbox:mailboxLastUid (LONG) 
     - jamesMailbox:mailboxNamespace (STRING) 
     - jamesMailbox:mailboxUser (STRING) 
+    - jamesMailbox:mailboxLastKnownUid (LONG) 
+    - jamesMailbox:mailboxHighestKnownModSeq (LONG) 
+
     + * (nt:unstructured) multiple

Modified: james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java?rev=1128435&r1=1128434&r2=1128435&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java (original)
+++ james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java Fri May 27 19:53:23 2011
@@ -433,4 +433,20 @@ public class JPAMessageMapper extends Ab
             throw new MailboxException("Save of message " + message + " failed in mailbox " + mailbox, e);
         }        
     }
+
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#saveSequences(org.apache.james.mailbox.store.mail.model.Mailbox, long, long)
+     */
+    protected void saveSequences(Mailbox<Long> mailbox, long lastUid, long highestModSeq) throws MailboxException {
+        try {
+            getEntityManager().createNamedQuery("updateSequences")
+            .setParameter("idParam", mailbox.getMailboxId())
+            .setParameter("lastKnownUid", lastUid)
+            .setParameter("lastKnowHighestModSeq", highestModSeq).executeUpdate();      
+        } catch (PersistenceException e) {
+            throw new MailboxException("Save of sequences for mailbox " + mailbox + " failed", e);
+        }
+    }
 }

Modified: james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java?rev=1128435&r1=1128434&r2=1128435&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java (original)
+++ james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java Fri May 27 19:53:23 2011
@@ -50,7 +50,10 @@ import org.apache.james.mailbox.store.ma
     @NamedQuery(name="countMailboxesWithNameLike",
         query="SELECT COUNT(mailbox) FROM Mailbox mailbox WHERE mailbox.name LIKE :nameParam and mailbox.user is NULL and mailbox.namespace= :namespaceParam"),
     @NamedQuery(name="listMailboxes",
-        query="SELECT mailbox FROM Mailbox mailbox")
+        query="SELECT mailbox FROM Mailbox mailbox"),
+    @NamedQuery(name="updateSequences", 
+        query= "UPDATE Mailbox mailbox SET mailbox.lastKnownUid = :lastKnownUidParam, SET mailbox.lastKnownHighestModSeq = :lastKnownHighestModSeq  WHERE mailbox.mailbox.mailboxId = :idParam")
+    
 })
 public class JPAMailbox implements Mailbox<Long> {
     
@@ -80,6 +83,14 @@ public class JPAMailbox implements Mailb
     @Column(name = "MAILBOX_NAMESPACE", nullable = false, length = 200)
     private String namespace;
 
+    @Basic(optional = false)
+    @Column(name = "MAILBOX_LAST_KNOWN_UID", nullable = false)
+    private long lastKnowUid;
+    
+    @Basic(optional = false)
+    @Column(name = "MAILBOX_HIGHEST_KNOWN_MODSEQ", nullable = false)
+    private long highestKnownModSeq;
+    
     /**
      * JPA only
      */
@@ -187,5 +198,23 @@ public class JPAMailbox implements Mailb
     public void setUser(String user) {
         this.user = user;
     }
+
+    
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.mail.model.Mailbox#getLastKnownUid()
+     */
+    public long getLastKnownUid() {
+        return lastKnowUid;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.mail.model.Mailbox#getHighestKnownModSeq()
+     */
+    public long getHighestKnownModSeq() {
+        return highestKnownModSeq;
+    }
     
 }

Modified: james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java?rev=1128435&r1=1128434&r2=1128435&view=diff
==============================================================================
--- james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java (original)
+++ james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java Fri May 27 19:53:23 2011
@@ -172,6 +172,14 @@ public class MaildirFolder {
         return lastUid;
     }
     
+    public long getHighestModSeq() throws IOException {
+        long newModified = getNewFolder().lastModified();
+        long curModified = getCurFolder().lastModified();
+        if (newModified  == 0L && curModified == 0L) {
+            throw new IOException("Unable to read highest modSeq");
+        }
+        return Math.max(newModified, curModified);
+    }
 
     /**
      * Read the lastUid of the given mailbox from the file system.

Modified: james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java?rev=1128435&r1=1128434&r2=1128435&view=diff
==============================================================================
--- james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java (original)
+++ james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirMailboxManager.java Fri May 27 19:53:23 2011
@@ -54,7 +54,7 @@ public class MaildirMailboxManager exten
     @Override
     protected Mailbox<Integer> doCreateMailbox(MailboxPath mailboxPath, MailboxSession session)
             throws MailboxException {
-        return new MaildirMailbox(mailboxPath, randomUidValidity(), 0);
+        return new MaildirMailbox(mailboxPath, randomUidValidity(), 0, 0);
     }
 
 }

Modified: james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java?rev=1128435&r1=1128434&r2=1128435&view=diff
==============================================================================
--- james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java (original)
+++ james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java Fri May 27 19:53:23 2011
@@ -112,10 +112,11 @@ public class MaildirStore {
         try {
             uidValidity = folder.getUidValidity();
             lastUid = folder.getLastUid();
+            return new MaildirMailbox(mailboxPath, uidValidity, lastUid, folder.getHighestModSeq());
+
         } catch (IOException e) {
             throw new MailboxException("Unable to load Mailbox " + mailboxPath, e);
         }
-        return new MaildirMailbox(mailboxPath, uidValidity, lastUid);
     }
     
     /**

Modified: james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java?rev=1128435&r1=1128434&r2=1128435&view=diff
==============================================================================
--- james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java (original)
+++ james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java Fri May 27 19:53:23 2011
@@ -473,13 +473,11 @@ public class MaildirMessageMapper extend
      */
     public long getHighestModSeq(Mailbox<Integer> mailbox) throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
-            
-        long newModified = folder.getNewFolder().lastModified();
-        long curModified = folder.getTmpFolder().lastModified();
-        if (newModified  == 0L && curModified == 0L) {
-            throw new MailboxException("Unable to read last modification time for mailbox " + mailbox);
+        try {
+            return folder.getHighestModSeq();
+        } catch (IOException e) {
+            throw new MailboxException("Unable to get highest mod-seq for mailbox " + mailbox, e);
         }
-        return Math.max(newModified, curModified);
             
        
     }

Modified: james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailbox.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailbox.java?rev=1128435&r1=1128434&r2=1128435&view=diff
==============================================================================
--- james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailbox.java (original)
+++ james/mailbox/trunk/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailbox.java Fri May 27 19:53:23 2011
@@ -29,13 +29,16 @@ public class MaildirMailbox implements M
     private String name;
     private long lastUid;
     private long uidValidity;
+    private long lastKnownUid;
+    private long highestKnownModSeq;
 
-    public MaildirMailbox(MailboxPath path, long uidValidity, long lastUid) {
+    public MaildirMailbox(MailboxPath path, long uidValidity, long lastKnownUid, long highestKnownModSeq) {
         this.namespace = path.getNamespace();
         this.user = path.getUser();
         this.name = path.getName();
         this.uidValidity = uidValidity;
-        this.lastUid = lastUid;
+        this.lastKnownUid = lastKnownUid;
+        this.highestKnownModSeq = highestKnownModSeq;
     }
     
     public MaildirMailbox(Mailbox<Integer> mailbox) {
@@ -173,4 +176,20 @@ public class MaildirMailbox implements M
         return namespace + ":" + user + ":" + name;
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.mail.model.Mailbox#getLastKnownUid()
+     */
+    public long getLastKnownUid() {
+        return lastKnownUid;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.mail.model.Mailbox#getHighestKnownModSeq()
+     */
+    public long getHighestKnownModSeq() {
+        return highestKnownModSeq;
+    }
+
 }

Modified: james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java?rev=1128435&r1=1128434&r2=1128435&view=diff
==============================================================================
--- james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java (original)
+++ james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java Fri May 27 19:53:23 2011
@@ -261,4 +261,12 @@ public class InMemoryMessageMapper exten
      */
     protected void rollback() throws MailboxException {        
     }
+
+    /**
+     * Do nothing
+     */
+    protected void saveSequences(Mailbox<Long> mailbox, long lastUid, long highestModSeq) throws MailboxException {
+        // Nothing todo as its a in memory implementation
+        
+    }
 }

Modified: james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/model/InMemoryMailbox.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/model/InMemoryMailbox.java?rev=1128435&r1=1128434&r2=1128435&view=diff
==============================================================================
--- james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/model/InMemoryMailbox.java (original)
+++ james/mailbox/trunk/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/model/InMemoryMailbox.java Fri May 27 19:53:23 2011
@@ -85,4 +85,20 @@ public class InMemoryMailbox implements 
     public long getUidValidity() {
         return uidValidity;
     }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.mail.model.Mailbox#getLastKnownUid()
+     */
+    public long getLastKnownUid() {
+        return 0;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.mailbox.store.mail.model.Mailbox#getHighestKnownModSeq()
+     */
+    public long getHighestKnownModSeq() {
+        return 0;
+    }
 }

Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java?rev=1128435&r1=1128434&r2=1128435&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java Fri May 27 19:53:23 2011
@@ -94,7 +94,7 @@ public abstract class AbstractMessageMap
         AtomicLong seq = seqs.get(mailbox.getMailboxId());
 
         if (seq == null) {
-            seq = new AtomicLong(calculateHigestModSeq(mailbox));
+            seq = new AtomicLong(higestModSeq(mailbox));
             AtomicLong cachedSeq = seqs.putIfAbsent(mailbox.getMailboxId(), seq);
             if (cachedSeq != null) {
                 seq = cachedSeq;
@@ -104,6 +104,14 @@ public abstract class AbstractMessageMap
         return seq;
     }
     
+    private long higestModSeq(Mailbox<Id> mailbox) throws MailboxException {
+        long modSeq = calculateHigestModSeq(mailbox);
+        if (modSeq < 1) {
+            modSeq = mailbox.getHighestKnownModSeq();
+        }
+        return modSeq;
+    }
+    
     /**
      * Retrieve the last uid for the {@link Mailbox} from cache or via lazy lookup.
      * 
@@ -115,7 +123,7 @@ public abstract class AbstractMessageMap
         AtomicLong uid = uids.get(mailbox.getMailboxId());
 
         if (uid == null) {
-            uid = new AtomicLong(calculateLastUid(mailbox));
+            uid = new AtomicLong(lastUid(mailbox));
             AtomicLong cachedUid = uids.putIfAbsent(mailbox.getMailboxId(), uid);
             if (cachedUid != null) {
                 uid = cachedUid;
@@ -125,6 +133,14 @@ public abstract class AbstractMessageMap
         return uid;
     }
     
+    private long lastUid(Mailbox<Id> mailbox) throws MailboxException {
+        long uid = calculateLastUid(mailbox);
+        if (uid < 1) {
+            uid = mailbox.getLastKnownUid();
+        }
+        return uid;
+    }
+    
     /*
      * (non-Javadoc)
      * @see org.apache.james.mailbox.store.mail.MessageMapper#expungeMarkedForDeletionInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.MessageRange)
@@ -132,14 +148,16 @@ public abstract class AbstractMessageMap
     public Map<Long, MessageMetaData> expungeMarkedForDeletionInMailbox(Mailbox<Id> mailbox, MessageRange set) throws MailboxException {
         Map<Long, MessageMetaData> data = expungeMarkedForDeletion(mailbox, set);
         if (data.isEmpty() == false) {
-            
-            // Increase the mod-sequence for this mailbox
-            nextModSeq(mailbox);
+
+            // Increase the mod-sequence  and the uid for this mailbox and save it permanent way
+            // See MAILBOX-75 
+            saveSequences(mailbox, nextUid(mailbox), nextModSeq(mailbox));
+
         }
         return data;
     }
 
-
+    
     /*
      * (non-Javadoc)
      * @see org.apache.james.mailbox.store.mail.MessageMapper#updateFlags(org.apache.james.mailbox.store.mail.model.Mailbox, javax.mail.Flags, boolean, boolean, org.apache.james.mailbox.MessageRange)
@@ -149,6 +167,11 @@ public abstract class AbstractMessageMap
         findInMailbox(mailbox, set, new MailboxMembershipCallback<Id>() {
 
             public void onMailboxMembers(List<Message<Id>> members) throws MailboxException {
+                
+                long modSeq = -1;
+                if (members.isEmpty() == false) {
+                    modSeq = nextModSeq(mailbox);
+                }
                 for (final Message<Id> member : members) {
                     Flags originalFlags = member.createFlags();
                     if (replace) {
@@ -165,7 +188,7 @@ public abstract class AbstractMessageMap
                     Flags newFlags = member.createFlags();
                     if (UpdatedFlags.flagsChanged(originalFlags, newFlags)) {
                         // increase the mod-seq as we changed the flags
-                        member.setModSeq(nextModSeq(mailbox));
+                        member.setModSeq(modSeq);
                         save(mailbox, member);
 
                     }
@@ -263,4 +286,14 @@ public abstract class AbstractMessageMap
      */
     protected abstract Map<Long, MessageMetaData> expungeMarkedForDeletion(Mailbox<Id> mailbox, MessageRange set) throws MailboxException;
 
+    /**
+     * Save the sequence meta-data for the mailbox in a permanent way
+     * 
+     * @param mailbox
+     * @param lastUid
+     * @param highestModSeq
+     * @throws MailboxException
+     */
+    protected abstract void saveSequences(Mailbox<Id> mailbox, long lastUid, long highestModSeq) throws MailboxException;
+    
 }

Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/Mailbox.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/Mailbox.java?rev=1128435&r1=1128434&r2=1128435&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/Mailbox.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/model/Mailbox.java Fri May 27 19:53:23 2011
@@ -70,4 +70,22 @@ public interface Mailbox<Id> {
      * @return uid validity
      */
     public abstract long getUidValidity();
+    
+    /**
+     * Return the last known uid for this mailbox which 
+     * was stored in a persist way. This does not guaranteer
+     * that there is no "higher" uid already allocated
+     * 
+     * @return lastKnownUid
+     */
+    public abstract long getLastKnownUid();
+    
+    /**
+     * Return the highest known mod-seq for this mailbox which 
+     * was stored in a persist way. This does not guaranteer
+     * that there is no "higher" mod-seq already allocated
+     * 
+     * @return highestKnownModSeq
+     */
+    public abstract long getHighestKnownModSeq();
 }
\ No newline at end of file

Modified: james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/lucene/LuceneMessageSearchIndexTest.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/lucene/LuceneMessageSearchIndexTest.java?rev=1128435&r1=1128434&r2=1128435&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/lucene/LuceneMessageSearchIndexTest.java (original)
+++ james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/lucene/LuceneMessageSearchIndexTest.java Fri May 27 19:53:23 2011
@@ -293,5 +293,17 @@ public class LuceneMessageSearchIndexTes
         public long getUidValidity() {
             return 0;
         }
+
+        @Override
+        public long getLastKnownUid() {
+            // TODO Auto-generated method stub
+            return 0;
+        }
+
+        @Override
+        public long getHighestKnownModSeq() {
+            // TODO Auto-generated method stub
+            return 0;
+        }
     }
 }



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