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]