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