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 ad...@apache.org on 2016/10/10 10:34:26 UTC

[08/11] james-project git commit: JAMES-1825 use a MessageUid strong type instead of long in the whole code base

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
index 3bb57da..84c4c22 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
@@ -30,6 +30,7 @@ import javax.persistence.PersistenceException;
 import javax.persistence.Query;
 
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.JPAId;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
@@ -49,6 +50,8 @@ import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.openjpa.persistence.ArgumentException;
 
+import com.google.common.collect.ImmutableList;
+
 /**
  * JPA implementation of a {@link MessageMapper}. This class is not thread-safe!
  */
@@ -128,8 +131,8 @@ public class JPAMessageMapper extends AbstractMessageMapper implements MessageMa
             throws MailboxException {
         try {
             List<MailboxMessage> results;
-            long from = set.getUidFrom();
-            final long to = set.getUidTo();
+            MessageUid from = set.getUidFrom();
+            final MessageUid to = set.getUidTo();
             final Type type = set.getType();
             JPAId mailboxId = (JPAId) mailbox.getMailboxId();
 
@@ -194,11 +197,9 @@ public class JPAMessageMapper extends AbstractMessageMapper implements MessageMa
         }
     }
 
-    /**
-     * @see org.apache.james.mailbox.store.mail.MessageMapper#findFirstUnseenMessageUid(Mailbox)
-     */
+    @Override
     @SuppressWarnings("unchecked")
-    public Long findFirstUnseenMessageUid(Mailbox mailbox) throws MailboxException {
+    public MessageUid findFirstUnseenMessageUid(Mailbox mailbox) throws MailboxException {
         try {
             JPAId mailboxId = (JPAId) mailbox.getMailboxId();
             Query query = getEntityManager().createNamedQuery("findUnseenMessagesInMailboxOrderByUid").setParameter(
@@ -215,29 +216,31 @@ public class JPAMessageMapper extends AbstractMessageMapper implements MessageMa
         }
     }
 
-    /**
-     * @see org.apache.james.mailbox.store.mail.MessageMapper#findRecentMessageUidsInMailbox(Mailbox)
-     */
     @SuppressWarnings("unchecked")
-    public List<Long> findRecentMessageUidsInMailbox(Mailbox mailbox) throws MailboxException {
+    public List<MessageUid> findRecentMessageUidsInMailbox(Mailbox mailbox) throws MailboxException {
         try {
             JPAId mailboxId = (JPAId) mailbox.getMailboxId();
             Query query = getEntityManager().createNamedQuery("findRecentMessageUidsInMailbox").setParameter("idParam",
                     mailboxId.getRawId());
-            return query.getResultList();
+            List<Long> resultList = query.getResultList();
+            ImmutableList.Builder<MessageUid> results = ImmutableList.builder();
+            for (long result: resultList) {
+                results.add(MessageUid.of(result));
+            }
+            return results.build();
         } catch (PersistenceException e) {
             throw new MailboxException("Search of recent messages failed in mailbox " + mailbox, e);
         }
     }
 
     @Override
-    public Map<Long, MessageMetaData> expungeMarkedForDeletionInMailbox(Mailbox mailbox, MessageRange set)
+    public Map<MessageUid, MessageMetaData> expungeMarkedForDeletionInMailbox(Mailbox mailbox, MessageRange set)
             throws MailboxException {
         try {
-            final Map<Long, MessageMetaData> data;
+            final Map<MessageUid, MessageMetaData> data;
             final List<MailboxMessage> results;
-            final long from = set.getUidFrom();
-            final long to = set.getUidTo();
+            final MessageUid from = set.getUidFrom();
+            final MessageUid to = set.getUidTo();
             JPAId mailboxId = (JPAId) mailbox.getMailboxId();
 
             switch (set.getType()) {
@@ -281,11 +284,8 @@ public class JPAMessageMapper extends AbstractMessageMapper implements MessageMa
         throw new UnsupportedOperationException("Not implemented - see https://issues.apache.org/jira/browse/IMAP-370");
     }
 
-    /**
-     * @see org.apache.james.mailbox.store.mail.AbstractMessageMapper#copy(Mailbox,
-     *      long, long, MailboxMessage)
-     */
-    protected MessageMetaData copy(Mailbox mailbox, long uid, long modSeq, MailboxMessage original)
+    @Override
+    protected MessageMetaData copy(Mailbox mailbox, MessageUid uid, long modSeq, MailboxMessage original)
             throws MailboxException {
         MailboxMessage copy;
         if (original instanceof JPAStreamingMailboxMessage) {
@@ -324,9 +324,9 @@ public class JPAMessageMapper extends AbstractMessageMapper implements MessageMa
     }
 
     @SuppressWarnings("unchecked")
-    private List<MailboxMessage> findMessagesInMailboxAfterUID(JPAId mailboxId, long uid, int batchSize) {
+    private List<MailboxMessage> findMessagesInMailboxAfterUID(JPAId mailboxId, MessageUid from, int batchSize) {
         Query query = getEntityManager().createNamedQuery("findMessagesInMailboxAfterUID")
-                .setParameter("idParam", mailboxId.getRawId()).setParameter("uidParam", uid);
+                .setParameter("idParam", mailboxId.getRawId()).setParameter("uidParam", from.asLong());
 
         if (batchSize > 0)
             query.setMaxResults(batchSize);
@@ -335,18 +335,18 @@ public class JPAMessageMapper extends AbstractMessageMapper implements MessageMa
     }
 
     @SuppressWarnings("unchecked")
-    private List<MailboxMessage> findMessagesInMailboxWithUID(JPAId mailboxId, long uid) {
+    private List<MailboxMessage> findMessagesInMailboxWithUID(JPAId mailboxId, MessageUid from) {
         return getEntityManager().createNamedQuery("findMessagesInMailboxWithUID")
-                .setParameter("idParam", mailboxId.getRawId()).setParameter("uidParam", uid).setMaxResults(1)
+                .setParameter("idParam", mailboxId.getRawId()).setParameter("uidParam", from.asLong()).setMaxResults(1)
                 .getResultList();
     }
 
     @SuppressWarnings("unchecked")
-    private List<MailboxMessage> findMessagesInMailboxBetweenUIDs(JPAId mailboxId, long from, long to,
+    private List<MailboxMessage> findMessagesInMailboxBetweenUIDs(JPAId mailboxId, MessageUid from, MessageUid to,
                                                                          int batchSize) {
         Query query = getEntityManager().createNamedQuery("findMessagesInMailboxBetweenUIDs")
-                .setParameter("idParam", mailboxId.getRawId()).setParameter("fromParam", from)
-                .setParameter("toParam", to);
+                .setParameter("idParam", mailboxId.getRawId()).setParameter("fromParam", from.asLong())
+                .setParameter("toParam", to.asLong());
 
         if (batchSize > 0)
             query.setMaxResults(batchSize);
@@ -363,8 +363,8 @@ public class JPAMessageMapper extends AbstractMessageMapper implements MessageMa
         return query.getResultList();
     }
 
-    private Map<Long, MessageMetaData> createMetaData(List<MailboxMessage> uids) {
-        final Map<Long, MessageMetaData> data = new HashMap<Long, MessageMetaData>();
+    private Map<MessageUid, MessageMetaData> createMetaData(List<MailboxMessage> uids) {
+        final Map<MessageUid, MessageMetaData> data = new HashMap<MessageUid, MessageMetaData>();
         for (MailboxMessage m : uids) {
             data.put(m.getUid(), new SimpleMessageMetaData(m));
         }
@@ -376,20 +376,20 @@ public class JPAMessageMapper extends AbstractMessageMapper implements MessageMa
                 .setParameter("idParam", mailboxId.getRawId()).executeUpdate();
     }
 
-    private int deleteDeletedMessagesInMailboxAfterUID(JPAId mailboxId, long uid) {
+    private int deleteDeletedMessagesInMailboxAfterUID(JPAId mailboxId, MessageUid from) {
         return getEntityManager().createNamedQuery("deleteDeletedMessagesInMailboxAfterUID")
-                .setParameter("idParam", mailboxId.getRawId()).setParameter("uidParam", uid).executeUpdate();
+                .setParameter("idParam", mailboxId.getRawId()).setParameter("uidParam", from.asLong()).executeUpdate();
     }
 
-    private int deleteDeletedMessagesInMailboxWithUID(JPAId mailboxId, long uid) {
+    private int deleteDeletedMessagesInMailboxWithUID(JPAId mailboxId, MessageUid from) {
         return getEntityManager().createNamedQuery("deleteDeletedMessagesInMailboxWithUID")
-                .setParameter("idParam", mailboxId.getRawId()).setParameter("uidParam", uid).executeUpdate();
+                .setParameter("idParam", mailboxId.getRawId()).setParameter("uidParam", from.asLong()).executeUpdate();
     }
 
-    private int deleteDeletedMessagesInMailboxBetweenUIDs(JPAId mailboxId, long from, long to) {
+    private int deleteDeletedMessagesInMailboxBetweenUIDs(JPAId mailboxId, MessageUid from, MessageUid to) {
         return getEntityManager().createNamedQuery("deleteDeletedMessagesInMailboxBetweenUIDs")
-                .setParameter("idParam", mailboxId.getRawId()).setParameter("fromParam", from)
-                .setParameter("toParam", to).executeUpdate();
+                .setParameter("idParam", mailboxId.getRawId()).setParameter("fromParam", from.asLong())
+                .setParameter("toParam", to.asLong()).executeUpdate();
     }
 
     @SuppressWarnings("unchecked")
@@ -399,22 +399,22 @@ public class JPAMessageMapper extends AbstractMessageMapper implements MessageMa
     }
 
     @SuppressWarnings("unchecked")
-    private List<MailboxMessage> findDeletedMessagesInMailboxAfterUID(JPAId mailboxId, long uid) {
+    private List<MailboxMessage> findDeletedMessagesInMailboxAfterUID(JPAId mailboxId, MessageUid from) {
         return getEntityManager().createNamedQuery("findDeletedMessagesInMailboxAfterUID")
-                .setParameter("idParam", mailboxId.getRawId()).setParameter("uidParam", uid).getResultList();
+                .setParameter("idParam", mailboxId.getRawId()).setParameter("uidParam", from.asLong()).getResultList();
     }
 
     @SuppressWarnings("unchecked")
-    private List<MailboxMessage> findDeletedMessagesInMailboxWithUID(JPAId mailboxId, long uid) {
+    private List<MailboxMessage> findDeletedMessagesInMailboxWithUID(JPAId mailboxId, MessageUid from) {
         return getEntityManager().createNamedQuery("findDeletedMessagesInMailboxWithUID")
-                .setParameter("idParam", mailboxId.getRawId()).setParameter("uidParam", uid).setMaxResults(1)
+                .setParameter("idParam", mailboxId.getRawId()).setParameter("uidParam", from.asLong()).setMaxResults(1)
                 .getResultList();
     }
 
     @SuppressWarnings("unchecked")
-    private List<MailboxMessage> findDeletedMessagesInMailboxBetweenUIDs(JPAId mailboxId, long from, long to) {
+    private List<MailboxMessage> findDeletedMessagesInMailboxBetweenUIDs(JPAId mailboxId, MessageUid from, MessageUid to) {
         return getEntityManager().createNamedQuery("findDeletedMessagesInMailboxBetweenUIDs")
-                .setParameter("idParam", mailboxId.getRawId()).setParameter("fromParam", from)
-                .setParameter("toParam", to).getResultList();
+                .setParameter("idParam", mailboxId.getRawId()).setParameter("fromParam", from.asLong())
+                .setParameter("toParam", to.asLong()).getResultList();
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java
index bd4f9c6..e7e5c21 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java
@@ -24,12 +24,15 @@ import javax.persistence.PersistenceException;
 
 import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.JPAId;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.store.mail.AbstractLockingUidProvider;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 
+import com.google.common.base.Optional;
+
 public class JPAUidProvider extends AbstractLockingUidProvider {
 
     private final EntityManagerFactory factory;
@@ -41,7 +44,7 @@ public class JPAUidProvider extends AbstractLockingUidProvider {
     
     
     @Override
-    public long lastUid(MailboxSession session, Mailbox mailbox) throws MailboxException {
+    public Optional<MessageUid> lastUid(MailboxSession session, Mailbox mailbox) throws MailboxException {
         EntityManager manager = null;
         try {
             manager = factory.createEntityManager();
@@ -49,7 +52,10 @@ public class JPAUidProvider extends AbstractLockingUidProvider {
             JPAId mailboxId = (JPAId) mailbox.getMailboxId();
             long uid = (Long) manager.createNamedQuery("findLastUid").setParameter("idParam", mailboxId.getRawId()).getSingleResult();
             manager.getTransaction().commit();
-            return uid;
+            if (uid == 0) {
+                return Optional.absent();
+            }
+            return Optional.of(MessageUid.of(uid));
         } catch (PersistenceException e) {
             if (manager != null && manager.getTransaction().isActive()) {
                 manager.getTransaction().rollback();
@@ -63,7 +69,7 @@ public class JPAUidProvider extends AbstractLockingUidProvider {
     }
 
     @Override
-    protected long lockedNextUid(MailboxSession session, Mailbox mailbox) throws MailboxException {
+    protected MessageUid lockedNextUid(MailboxSession session, Mailbox mailbox) throws MailboxException {
         EntityManager manager = null;
         try {
             manager = factory.createEntityManager();
@@ -73,7 +79,7 @@ public class JPAUidProvider extends AbstractLockingUidProvider {
             long uid = m.consumeUid();
             manager.persist(m);
             manager.getTransaction().commit();
-            return uid;
+            return MessageUid.of(uid);
         } catch (PersistenceException e) {
             if (manager != null && manager.getTransaction().isActive()) {
                 manager.getTransaction().rollback();

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
index d98533b..1efe777 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
@@ -23,6 +23,7 @@ import java.io.InputStream;
 import java.io.SequenceInputStream;
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
 
@@ -41,6 +42,7 @@ import javax.persistence.OneToMany;
 import javax.persistence.OrderBy;
 
 import org.apache.commons.lang.NotImplementedException;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.JPAId;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
@@ -53,64 +55,44 @@ import org.apache.james.mailbox.store.mail.model.FlagsBuilder;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.MessageId;
 import org.apache.james.mailbox.store.mail.model.Property;
-import org.apache.james.mailbox.store.mail.model.impl.MessageUidComparator;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
+import org.apache.james.mailbox.store.search.comparator.UidComparator;
 import org.apache.openjpa.persistence.jdbc.ElementJoinColumn;
 import org.apache.openjpa.persistence.jdbc.ElementJoinColumns;
 import org.apache.openjpa.persistence.jdbc.Index;
 
 /**
- * Abstract base class for JPA based implementations of {@link DelegatingMailboxMessage}
+ * Abstract base class for JPA based implementations of
+ * {@link DelegatingMailboxMessage}
  */
 @IdClass(AbstractJPAMailboxMessage.MailboxIdUidKey.class)
 @NamedQueries({
-    @NamedQuery(name="findRecentMessageUidsInMailbox",
-            query="SELECT message.uid FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.recent = TRUE ORDER BY message.uid ASC"),
-    @NamedQuery(name="findUnseenMessagesInMailboxOrderByUid",
-            query="SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.seen = FALSE ORDER BY message.uid ASC"),
-    @NamedQuery(name="findMessagesInMailbox",
-            query="SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam ORDER BY message.uid ASC"),
-    @NamedQuery(name="findMessagesInMailboxBetweenUIDs",
-            query="SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid BETWEEN :fromParam AND :toParam ORDER BY message.uid ASC"),
-    @NamedQuery(name="findMessagesInMailboxWithUID",
-            query="SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid=:uidParam ORDER BY message.uid ASC"),
-    @NamedQuery(name="findMessagesInMailboxAfterUID",
-            query="SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid>=:uidParam ORDER BY message.uid ASC"),
-    @NamedQuery(name="findDeletedMessagesInMailbox",
-            query="SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.deleted=TRUE ORDER BY message.uid ASC"),
-    @NamedQuery(name="findDeletedMessagesInMailboxBetweenUIDs",
-            query="SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid BETWEEN :fromParam AND :toParam AND message.deleted=TRUE ORDER BY message.uid ASC"),
-    @NamedQuery(name="findDeletedMessagesInMailboxWithUID",
-            query="SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid=:uidParam AND message.deleted=TRUE ORDER BY message.uid ASC"),
-    @NamedQuery(name="findDeletedMessagesInMailboxAfterUID",
-            query="SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid>=:uidParam AND message.deleted=TRUE ORDER BY message.uid ASC"),
-            
-    @NamedQuery(name="deleteDeletedMessagesInMailbox",
-            query="DELETE FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.deleted=TRUE"),
-    @NamedQuery(name="deleteDeletedMessagesInMailboxBetweenUIDs",
-            query="DELETE FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid BETWEEN :fromParam AND :toParam AND message.deleted=TRUE"),
-    @NamedQuery(name="deleteDeletedMessagesInMailboxWithUID",
-            query="DELETE FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid=:uidParam AND message.deleted=TRUE"),
-    @NamedQuery(name="deleteDeletedMessagesInMailboxAfterUID",
-            query="DELETE FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid>=:uidParam AND message.deleted=TRUE"),
-                    
-    @NamedQuery(name="countUnseenMessagesInMailbox",
-            query="SELECT COUNT(message) FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.seen=FALSE"),
-    @NamedQuery(name="countMessagesInMailbox",
-            query="SELECT COUNT(message) FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam"),
-    @NamedQuery(name="deleteMessages",
-            query="DELETE FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam"),
-    @NamedQuery(name="findLastUidInMailbox",
-            query="SELECT message.uid FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam ORDER BY message.uid DESC"),
-    @NamedQuery(name="findHighestModSeqInMailbox",
-            query="SELECT message.modSeq FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam ORDER BY message.modSeq DESC"),
-    @NamedQuery(name="deleteAllMemberships",
-            query="DELETE FROM MailboxMessage message")
-})
+        @NamedQuery(name = "findRecentMessageUidsInMailbox", query = "SELECT message.uid FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.recent = TRUE ORDER BY message.uid ASC"),
+        @NamedQuery(name = "findUnseenMessagesInMailboxOrderByUid", query = "SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.seen = FALSE ORDER BY message.uid ASC"),
+        @NamedQuery(name = "findMessagesInMailbox", query = "SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam ORDER BY message.uid ASC"),
+        @NamedQuery(name = "findMessagesInMailboxBetweenUIDs", query = "SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid BETWEEN :fromParam AND :toParam ORDER BY message.uid ASC"),
+        @NamedQuery(name = "findMessagesInMailboxWithUID", query = "SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid=:uidParam ORDER BY message.uid ASC"),
+        @NamedQuery(name = "findMessagesInMailboxAfterUID", query = "SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid>=:uidParam ORDER BY message.uid ASC"),
+        @NamedQuery(name = "findDeletedMessagesInMailbox", query = "SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.deleted=TRUE ORDER BY message.uid ASC"),
+        @NamedQuery(name = "findDeletedMessagesInMailboxBetweenUIDs", query = "SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid BETWEEN :fromParam AND :toParam AND message.deleted=TRUE ORDER BY message.uid ASC"),
+        @NamedQuery(name = "findDeletedMessagesInMailboxWithUID", query = "SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid=:uidParam AND message.deleted=TRUE ORDER BY message.uid ASC"),
+        @NamedQuery(name = "findDeletedMessagesInMailboxAfterUID", query = "SELECT message FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid>=:uidParam AND message.deleted=TRUE ORDER BY message.uid ASC"),
+
+        @NamedQuery(name = "deleteDeletedMessagesInMailbox", query = "DELETE FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.deleted=TRUE"),
+        @NamedQuery(name = "deleteDeletedMessagesInMailboxBetweenUIDs", query = "DELETE FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid BETWEEN :fromParam AND :toParam AND message.deleted=TRUE"),
+        @NamedQuery(name = "deleteDeletedMessagesInMailboxWithUID", query = "DELETE FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid=:uidParam AND message.deleted=TRUE"),
+        @NamedQuery(name = "deleteDeletedMessagesInMailboxAfterUID", query = "DELETE FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid>=:uidParam AND message.deleted=TRUE"),
+
+        @NamedQuery(name = "countUnseenMessagesInMailbox", query = "SELECT COUNT(message) FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.seen=FALSE"),
+        @NamedQuery(name = "countMessagesInMailbox", query = "SELECT COUNT(message) FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam"),
+        @NamedQuery(name = "deleteMessages", query = "DELETE FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam"),
+        @NamedQuery(name = "findLastUidInMailbox", query = "SELECT message.uid FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam ORDER BY message.uid DESC"),
+        @NamedQuery(name = "findHighestModSeqInMailbox", query = "SELECT message.modSeq FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam ORDER BY message.modSeq DESC"),
+        @NamedQuery(name = "deleteAllMemberships", query = "DELETE FROM MailboxMessage message") })
 @MappedSuperclass
 public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
 
-    private static final MessageUidComparator MESSAGE_UID_COMPARATOR = new MessageUidComparator();
+    private static final Comparator<MailboxMessage> MESSAGE_UID_COMPARATOR = new UidComparator();
     private static final String TOSTRING_SEPARATOR = " ";
 
     /** Identifies composite key */
@@ -118,11 +100,12 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
 
         private static final long serialVersionUID = 7847632032426660997L;
 
-        public MailboxIdUidKey() {}
+        public MailboxIdUidKey() {
+        }
 
         /** The value for the mailbox field */
         public long mailbox;
-        
+
         /** The value for the uid field */
         public long uid;
 
@@ -155,12 +138,7 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
 
     /** The value for the mailboxId field */
     @Id
-    @ManyToOne(
-            cascade = {
-                    CascadeType.PERSIST, 
-                    CascadeType.REFRESH, 
-                    CascadeType.MERGE}, 
-            fetch=FetchType.EAGER)
+    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE }, fetch = FetchType.EAGER)
     @Column(name = "MAILBOX_ID", nullable = true)
     private JPAMailbox mailbox;
 
@@ -212,52 +190,51 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
     @Index
     private boolean seen = false;
 
-    
     /** The first body octet */
     @Basic(optional = false)
     @Column(name = "MAIL_BODY_START_OCTET", nullable = false)
     private int bodyStartOctet;
-    
+
     /** Number of octets in the full document content */
     @Basic(optional = false)
     @Column(name = "MAIL_CONTENT_OCTETS_COUNT", nullable = false)
     private long contentOctets;
-    
+
     /** MIME media type */
     @Basic(optional = true)
     @Column(name = "MAIL_MIME_TYPE", nullable = true, length = 200)
     private String mediaType;
-    
+
     /** MIME sub type */
     @Basic(optional = true)
     @Column(name = "MAIL_MIME_SUBTYPE", nullable = true, length = 200)
     private String subType;
-    
+
     /** THE CRFL count when this document is textual, null otherwise */
     @Basic(optional = true)
     @Column(name = "MAIL_TEXTUAL_LINE_COUNT", nullable = true)
     private Long textualLineCount;
-    
 
     /** Meta data for this message */
-    @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
+    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
     @OrderBy("line")
-    @ElementJoinColumns({@ElementJoinColumn(name="MAILBOX_ID", referencedColumnName="MAILBOX_ID"),
-                @ElementJoinColumn(name="MAIL_UID", referencedColumnName="MAIL_UID")})
+    @ElementJoinColumns({ @ElementJoinColumn(name = "MAILBOX_ID", referencedColumnName = "MAILBOX_ID"),
+            @ElementJoinColumn(name = "MAIL_UID", referencedColumnName = "MAIL_UID") })
     private List<JPAProperty> properties;
 
-    @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER, orphanRemoval = true)
+    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
     @OrderBy("id")
-    @ElementJoinColumns({@ElementJoinColumn(name="MAILBOX_ID", referencedColumnName="MAILBOX_ID"),
-    @ElementJoinColumn(name="MAIL_UID", referencedColumnName="MAIL_UID")})
+    @ElementJoinColumns({ @ElementJoinColumn(name = "MAILBOX_ID", referencedColumnName = "MAILBOX_ID"),
+            @ElementJoinColumn(name = "MAIL_UID", referencedColumnName = "MAIL_UID") })
     private List<JPAUserFlag> userFlags;
-    
-    public AbstractJPAMailboxMessage(JPAMailbox mailbox, Date internalDate, Flags flags, long contentOctets, int bodyStartOctet, PropertyBuilder propertyBuilder) {
+
+    public AbstractJPAMailboxMessage(JPAMailbox mailbox, Date internalDate, Flags flags, long contentOctets,
+            int bodyStartOctet, PropertyBuilder propertyBuilder) {
         this.mailbox = mailbox;
         this.internalDate = internalDate;
         userFlags = new ArrayList<JPAUserFlag>();
 
-        setFlags(flags);        
+        setFlags(flags);
         this.contentOctets = contentOctets;
         this.bodyStartOctet = bodyStartOctet;
         this.textualLineCount = propertyBuilder.getTextualLineCount();
@@ -266,29 +243,35 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
         final List<Property> properties = propertyBuilder.toProperties();
         this.properties = new ArrayList<JPAProperty>(properties.size());
         int order = 0;
-        for (Property property:properties) {
+        for (Property property : properties) {
             this.properties.add(new JPAProperty(property, order++));
         }
-        
+
     }
 
     /**
-     * Constructs a copy of the given message.
-     * All properties are cloned except mailbox and UID.
-     * @param mailbox new mailbox
-     * @param uid new UID
-     * @param modSeq new modSeq
-     * @param original message to be copied, not null
+     * Constructs a copy of the given message. All properties are cloned except
+     * mailbox and UID.
+     * 
+     * @param mailbox
+     *            new mailbox
+     * @param uid
+     *            new UID
+     * @param modSeq
+     *            new modSeq
+     * @param original
+     *            message to be copied, not null
      */
-    public AbstractJPAMailboxMessage(JPAMailbox mailbox, long uid, long modSeq, MailboxMessage original) throws MailboxException {
+    public AbstractJPAMailboxMessage(JPAMailbox mailbox, MessageUid uid, long modSeq, MailboxMessage original)
+            throws MailboxException {
         super();
         this.mailbox = mailbox;
-        this.uid = uid;
+        this.uid = uid.asLong();
         this.modSeq = modSeq;
         this.userFlags = new ArrayList<JPAUserFlag>();
         setFlags(original.createFlags());
-        
-        // A copy of a message is recent 
+
+        // A copy of a message is recent
         // See MAILBOX-85
         this.recent = true;
 
@@ -296,7 +279,6 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
         this.bodyStartOctet = (int) (original.getFullContentOctets() - original.getBodyOctets());
         this.internalDate = original.getInternalDate();
 
-
         PropertyBuilder pBuilder = new PropertyBuilder(original.getProperties());
         this.textualLineCount = original.getTextualLineCount();
         this.mediaType = original.getMediaType();
@@ -304,7 +286,7 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
         final List<Property> properties = pBuilder.toProperties();
         this.properties = new ArrayList<JPAProperty>(properties.size());
         int order = 0;
-        for (Property property:properties) {
+        for (Property property : properties) {
             this.properties.add(new JPAProperty(property, order++));
         }
     }
@@ -329,10 +311,10 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
         final AbstractJPAMailboxMessage other = (AbstractJPAMailboxMessage) obj;
         if (getMailboxId() != null) {
             if (!getMailboxId().equals(other.getMailboxId()))
-            return false;
+                return false;
         } else {
             if (other.getMailboxId() != null)
-            return false;
+                return false;
         }
         if (uid != other.uid)
             return false;
@@ -352,7 +334,7 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
     public void setModSeq(long modSeq) {
         this.modSeq = modSeq;
     }
-    
+
     /**
      * Gets the top level MIME content media type.
      * 
@@ -361,7 +343,7 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
     public String getMediaType() {
         return mediaType;
     }
-    
+
     /**
      * Gets the MIME content subtype.
      * 
@@ -372,19 +354,20 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
     }
 
     /**
-     * Gets a read-only list of meta-data properties.
-     * For properties with multiple values, this list will contain
-     * several enteries with the same namespace and local name.
+     * Gets a read-only list of meta-data properties. For properties with
+     * multiple values, this list will contain several enteries with the same
+     * namespace and local name.
+     * 
      * @return unmodifiable list of meta-data, not null
      */
     public List<Property> getProperties() {
         return new ArrayList<Property>(properties);
     }
-    
+
     /**
      * Gets the number of CRLF in a textual document.
-     * @return CRLF count when document is textual,
-     * null otherwise
+     * 
+     * @return CRLF count when document is textual, null otherwise
      */
     public Long getTextualLineCount() {
         return textualLineCount;
@@ -400,7 +383,6 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
     protected int getBodyStartOctet() {
         return bodyStartOctet;
     }
-    
 
     /**
      * @see MailboxMessage#getInternalDate()
@@ -409,69 +391,52 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
         return internalDate;
     }
 
-    /**
-     * @see MailboxMessage#getMailboxId()
-     */
+    @Override
     public JPAId getMailboxId() {
         return getMailbox().getMailboxId();
     }
 
-    /**
-     * @see MailboxMessage#getUid()
-     */
-    public long getUid() {
-        return uid;
+    @Override
+    public MessageUid getUid() {
+        return MessageUid.of(uid);
     }
 
-    /**
-     * @see MailboxMessage#isAnswered()
-     */
+    @Override
     public boolean isAnswered() {
         return answered;
     }
 
-    /**
-     * @see MailboxMessage#isDeleted()
-     */
+    @Override
     public boolean isDeleted() {
         return deleted;
     }
 
-    /**
-     * @see MailboxMessage#isDraft()
-     */
+    @Override
     public boolean isDraft() {
         return draft;
     }
 
-    /**
-     * @see MailboxMessage#isFlagged()
-     */
+    @Override
     public boolean isFlagged() {
         return flagged;
     }
 
-    /**
-     * @see MailboxMessage#isRecent()
-     */
+    @Override
     public boolean isRecent() {
         return recent;
     }
 
-    /**
-     * @see MailboxMessage#isSeen()
-     */
+    @Override
     public boolean isSeen() {
         return seen;
     }
-    
-    public void setUid(long uid) {
-        this.uid = uid;
+
+    @Override
+    public void setUid(MessageUid uid) {
+        this.uid = uid.asLong();
     }
-    
-    /**
-     * @see MailboxMessage#setFlags(javax.mail.Flags)
-     */
+
+    @Override
     public void setFlags(Flags flags) {
         answered = flags.contains(Flags.Flag.ANSWERED);
         deleted = flags.contains(Flags.Flag.DELETED);
@@ -479,35 +444,8 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
         flagged = flags.contains(Flags.Flag.FLAGGED);
         recent = flags.contains(Flags.Flag.RECENT);
         seen = flags.contains(Flags.Flag.SEEN);
-        
-        /*
-        // Loop over the user flags and check which of them needs to get added / removed
-        List<String> uFlags = Arrays.asList(flags.getUserFlags());
-        for (int i = 0; i < userFlags.size(); i++) {
-            JPAUserFlag f = userFlags.get(i);
-            if (uFlags.contains(f.getName()) == false) {
-                userFlags.remove(f);
-                i++;
-            }
-        }
-        for (int i = 0; i < uFlags.size(); i++) {
-            boolean found = false;
-            String uFlag = uFlags.get(i);
-            for (int a = 0; a < userFlags.size(); a++) {
-                String userFlag = userFlags.get(a).getName();
-                if (userFlag.equals(uFlag)) {
-                    found = true;
-                    break;
-                }
-            }
-            if (found == false) {
-                userFlags.add(new JPAUserFlag(uFlag));
-            }
-            
-            
-        }
-        */
-        String[] userflags =  flags.getUserFlags();
+
+        String[] userflags = flags.getUserFlags();
         userFlags.clear();
         for (String userflag : userflags) {
             userFlags.add(new JPAUserFlag(userflag));
@@ -553,7 +491,7 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
 
     @Override
     public MessageId getMessageId() {
-        return new DefaultMessageId(getMailboxId(), uid);
+        return new DefaultMessageId(getMailboxId(), getUid());
     }
 
     @Override
@@ -562,19 +500,18 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
     }
 
     public String toString() {
-        return "message("
-        + "mailboxId = " + this.getMailboxId() + TOSTRING_SEPARATOR
-        + "uid = " + this.uid + TOSTRING_SEPARATOR
-        + "internalDate = " + this.internalDate + TOSTRING_SEPARATOR
-        + "answered = " + this.answered + TOSTRING_SEPARATOR
-        + "deleted = " + this.deleted + TOSTRING_SEPARATOR
-        + "draft = " + this.draft + TOSTRING_SEPARATOR
-        + "flagged = " + this.flagged + TOSTRING_SEPARATOR
-        + "recent = " + this.recent + TOSTRING_SEPARATOR
-        + "seen = " + this.seen + TOSTRING_SEPARATOR
-        + " )";
-    }
-    
+        return "message(" 
+                + "mailboxId = " + this.getMailboxId() + TOSTRING_SEPARATOR 
+                + "uid = " + this.uid + TOSTRING_SEPARATOR
+                + "internalDate = " + this.internalDate + TOSTRING_SEPARATOR 
+                + "answered = " + this.answered + TOSTRING_SEPARATOR
+                + "deleted = " + this.deleted + TOSTRING_SEPARATOR 
+                + "draft = " + this.draft + TOSTRING_SEPARATOR
+                + "flagged = " + this.flagged + TOSTRING_SEPARATOR 
+                + "recent = " + this.recent + TOSTRING_SEPARATOR 
+                + "seen = " + this.seen + TOSTRING_SEPARATOR 
+                + " )";
+    }
 
     @Override
     public List<MessageAttachment> getAttachments() {

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMailboxMessage.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMailboxMessage.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMailboxMessage.java
index 392dd59..2e8397d 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMailboxMessage.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMailboxMessage.java
@@ -33,6 +33,7 @@ import javax.persistence.Lob;
 import javax.persistence.Table;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -79,7 +80,7 @@ public class JPAEncryptedMailboxMessage extends AbstractJPAMailboxMessage {
         /**
          * Create a copy of the given message
          */
-        public JPAEncryptedMailboxMessage(JPAMailbox mailbox, long uid, long modSeq, MailboxMessage message) throws MailboxException{
+        public JPAEncryptedMailboxMessage(JPAMailbox mailbox, MessageUid uid, long modSeq, MailboxMessage message) throws MailboxException{
             super(mailbox, uid, modSeq, message);
             try {
                 this.body = IOUtils.toByteArray(message.getBodyContent());

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMailboxMessage.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMailboxMessage.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMailboxMessage.java
index 8f01525..4d69386 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMailboxMessage.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMailboxMessage.java
@@ -33,6 +33,7 @@ import javax.persistence.Lob;
 import javax.persistence.Table;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -73,7 +74,7 @@ public class JPAMailboxMessage extends AbstractJPAMailboxMessage {
     /**
      * Create a copy of the given message
      */
-    public JPAMailboxMessage(JPAMailbox mailbox, long uid, long modSeq, MailboxMessage message) throws MailboxException{
+    public JPAMailboxMessage(JPAMailbox mailbox, MessageUid uid, long modSeq, MailboxMessage message) throws MailboxException{
         super(mailbox, uid, modSeq, message);
         try {
             this.body = IOUtils.toByteArray(message.getBodyContent());

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMailboxMessage.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMailboxMessage.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMailboxMessage.java
index 2083e1d..d98bded 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMailboxMessage.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMailboxMessage.java
@@ -31,6 +31,7 @@ import javax.persistence.FetchType;
 import javax.persistence.Table;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -77,7 +78,7 @@ public class JPAStreamingMailboxMessage extends AbstractJPAMailboxMessage {
     /**
      * Create a copy of the given message
      */
-    public JPAStreamingMailboxMessage(JPAMailbox mailbox, long uid, long modSeq, MailboxMessage message) throws MailboxException {
+    public JPAStreamingMailboxMessage(JPAMailbox mailbox, MessageUid uid, long modSeq, MailboxMessage message) throws MailboxException {
         super(mailbox, uid, modSeq, message);
         try {
             this.content = new SharedByteArrayInputStream(IOUtils.toByteArray(message.getFullContent()));

http://git-wip-us.apache.org/repos/asf/james-project/blob/34242a5b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
index c87e8c2..a1557bb 100644
--- a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
+++ b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
@@ -42,6 +42,7 @@ import javax.mail.Flags.Flag;
 
 import org.apache.james.mailbox.MailboxManager.SearchCapabilities;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.UnsupportedSearchException;
 import org.apache.james.mailbox.model.MailboxId;
@@ -59,8 +60,8 @@ import org.apache.james.mailbox.model.SearchQuery.FlagCriterion;
 import org.apache.james.mailbox.model.SearchQuery.HeaderCriterion;
 import org.apache.james.mailbox.model.SearchQuery.HeaderOperator;
 import org.apache.james.mailbox.model.SearchQuery.NumericOperator;
-import org.apache.james.mailbox.model.SearchQuery.NumericRange;
 import org.apache.james.mailbox.model.SearchQuery.UidCriterion;
+import org.apache.james.mailbox.model.SearchQuery.UidRange;
 import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.mail.MessageMapperFactory;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -425,13 +426,11 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
     
     
     
-    /**
-     * @see org.apache.james.mailbox.store.search.MessageSearchIndex#search(org.apache.james.mailbox.MailboxSession, org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.model.SearchQuery)
-     */
-    public Iterator<Long> search(MailboxSession session, Mailbox mailbox, SearchQuery searchQuery) throws MailboxException {
+    @Override
+    public Iterator<MessageUid> search(MailboxSession session, Mailbox mailbox, SearchQuery searchQuery) throws MailboxException {
         Preconditions.checkArgument(session != null, "'session' is mandatory");
         MailboxId mailboxId = mailbox.getMailboxId();
-        Multimap<MailboxId, Long> results = 
+        Multimap<MailboxId, MessageUid> results = 
                 searchMultimap(
                     session, 
                     MultimailboxesSearchQuery
@@ -442,13 +441,13 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
     }
 
     @Override
-    public Map<MailboxId, Collection<Long>> search(MailboxSession session, MultimailboxesSearchQuery searchQuery) throws MailboxException {
+    public Map<MailboxId, Collection<MessageUid>> search(MailboxSession session, MultimailboxesSearchQuery searchQuery) throws MailboxException {
         Preconditions.checkArgument(session != null, "'session' is mandatory");
         return searchMultimap(session, searchQuery).asMap();
     }
     
-    private Multimap<MailboxId, Long> searchMultimap(MailboxSession session, MultimailboxesSearchQuery searchQuery) throws MailboxException {
-        Multimap<MailboxId, Long> results = LinkedHashMultimap.create();
+    private Multimap<MailboxId, MessageUid> searchMultimap(MailboxSession session, MultimailboxesSearchQuery searchQuery) throws MailboxException {
+        Multimap<MailboxId, MessageUid> results = LinkedHashMultimap.create();
         IndexSearcher searcher = null;
 
         Query inMailboxes = buildQueryFromMailboxes(searchQuery.getInMailboxes());
@@ -469,7 +468,7 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
             ScoreDoc[] sDocs = docs.scoreDocs;
             for (ScoreDoc sDoc : sDocs) {
                 Document doc = searcher.doc(sDoc.doc);
-                long uid = Long.valueOf(doc.get(UID_FIELD));
+                MessageUid uid = MessageUid.of(Long.valueOf(doc.get(UID_FIELD)));
                 MailboxId mailboxId = mailboxIdFactory.fromString(doc.get(MAILBOX_ID_FIELD));
                 results.put(mailboxId, uid);
             }
@@ -512,10 +511,10 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
         final Document doc = new Document();
         // TODO: Better handling
         doc.add(new Field(MAILBOX_ID_FIELD, membership.getMailboxId().serialize().toUpperCase(Locale.ENGLISH), Store.YES, Index.NOT_ANALYZED));
-        doc.add(new NumericField(UID_FIELD,Store.YES, true).setLongValue(membership.getUid()));
+        doc.add(new NumericField(UID_FIELD,Store.YES, true).setLongValue(membership.getUid().asLong()));
         
         // create an unqiue key for the document which can be used later on updates to find the document
-        doc.add(new Field(ID_FIELD, membership.getMailboxId().serialize().toUpperCase(Locale.ENGLISH) +"-" + Long.toString(membership.getUid()), Store.YES, Index.NOT_ANALYZED));
+        doc.add(new Field(ID_FIELD, membership.getMailboxId().serialize().toUpperCase(Locale.ENGLISH) +"-" + Long.toString(membership.getUid().asLong()), Store.YES, Index.NOT_ANALYZED));
 
         doc.add(new Field(INTERNAL_DATE_FIELD_YEAR_RESOLUTION, DateTools.dateToString(membership.getInternalDate(), DateTools.Resolution.YEAR), Store.NO, Index.NOT_ANALYZED));
         doc.add(new Field(INTERNAL_DATE_FIELD_MONTH_RESOLUTION, DateTools.dateToString(membership.getInternalDate(), DateTools.Resolution.MONTH), Store.NO, Index.NOT_ANALYZED));
@@ -891,20 +890,16 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
     
     /**
      * Return a {@link Query} which is build based on the given {@link SearchQuery.UidCriterion}
-     * 
-     * @param crit
-     * @return query
-     * @throws UnsupportedSearchException
      */
     private Query createUidQuery(SearchQuery.UidCriterion crit) throws UnsupportedSearchException {
-        NumericRange[] ranges = crit.getOperator().getRange();
+        UidRange[] ranges = crit.getOperator().getRange();
         if (ranges.length == 1) {
-            NumericRange range = ranges[0];
-            return NumericRangeQuery.newLongRange(UID_FIELD, range.getLowValue(), range.getHighValue(), true, true);
+            UidRange range = ranges[0];
+            return NumericRangeQuery.newLongRange(UID_FIELD, range.getLowValue().asLong(), range.getHighValue().asLong(), true, true);
         } else {
             BooleanQuery rangesQuery = new BooleanQuery();
-            for (NumericRange range : ranges) {
-                rangesQuery.add(NumericRangeQuery.newLongRange(UID_FIELD, range.getLowValue(), range.getHighValue(), true, true), BooleanClause.Occur.SHOULD);
+            for (UidRange range : ranges) {
+                rangesQuery.add(NumericRangeQuery.newLongRange(UID_FIELD, range.getLowValue().asLong(), range.getHighValue().asLong(), true, true), BooleanClause.Occur.SHOULD);
             }        
             return rangesQuery;
         }
@@ -940,7 +935,7 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
      * @return query
      * @throws UnsupportedSearchException
      */
-    private Query createFlagQuery(String flag, boolean isSet, Query inMailboxes, Collection<Long> recentUids) throws MailboxException, UnsupportedSearchException {
+    private Query createFlagQuery(String flag, boolean isSet, Query inMailboxes, Collection<MessageUid> recentUids) throws MailboxException, UnsupportedSearchException {
         BooleanQuery query = new BooleanQuery();
         
         if (isSet) {   
@@ -959,14 +954,14 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
         IndexSearcher searcher = null;
 
         try {
-            Set<Long> uids = new HashSet<Long>();
+            Set<MessageUid> uids = new HashSet<MessageUid>();
             searcher = new IndexSearcher(IndexReader.open(writer, true));
             
             // query for all the documents sorted by uid
             TopDocs docs = searcher.search(query, null, maxQueryResults, new Sort(UID_SORT));
             ScoreDoc[] sDocs = docs.scoreDocs;
             for (ScoreDoc sDoc : sDocs) {
-                long uid = Long.valueOf(searcher.doc(sDoc.doc).get(UID_FIELD));
+                MessageUid uid = MessageUid.of(Long.valueOf(searcher.doc(sDoc.doc).get(UID_FIELD)));
                 uids.add(uid);
             }
             
@@ -979,11 +974,11 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
                 }
             }
             
-            List<MessageRange> ranges = MessageRange.toRanges(new ArrayList<Long>(uids));
-            NumericRange[] nRanges = new NumericRange[ranges.size()];
+            List<MessageRange> ranges = MessageRange.toRanges(new ArrayList<MessageUid>(uids));
+            UidRange[] nRanges = new UidRange[ranges.size()];
             for (int i = 0; i < ranges.size(); i++) {
                 MessageRange range = ranges.get(i);
-                nRanges[i] = new NumericRange(range.getUidFrom(), range.getUidTo());
+                nRanges[i] = new UidRange(range.getUidFrom(), range.getUidTo());
             }
             return createUidQuery((UidCriterion) SearchQuery.uid(nRanges));
         } catch (IOException e) {
@@ -1169,7 +1164,7 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
      * @return query
      * @throws UnsupportedSearchException
      */
-    private Query createConjunctionQuery(SearchQuery.ConjunctionCriterion crit, Query inMailboxes, Collection<Long> recentUids) throws UnsupportedSearchException, MailboxException {
+    private Query createConjunctionQuery(SearchQuery.ConjunctionCriterion crit, Query inMailboxes, Collection<MessageUid> recentUids) throws UnsupportedSearchException, MailboxException {
         List<Criterion> crits = crit.getCriteria();
         BooleanQuery conQuery = new BooleanQuery();
         switch (crit.getType()) {
@@ -1205,7 +1200,7 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
      * @return query
      * @throws UnsupportedSearchException
      */
-    private Query createQuery(Criterion criterion, Query inMailboxes, Collection<Long> recentUids) throws UnsupportedSearchException, MailboxException {
+    private Query createQuery(Criterion criterion, Query inMailboxes, Collection<MessageUid> recentUids) throws UnsupportedSearchException, MailboxException {
         if (criterion instanceof SearchQuery.InternalDateCriterion) {
             SearchQuery.InternalDateCriterion crit = (SearchQuery.InternalDateCriterion) criterion;
             return createInternalDateQuery(crit);
@@ -1268,7 +1263,7 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
         }
     }
 
-    private void update(Mailbox mailbox, long uid, Flags f) throws MailboxException {
+    private void update(Mailbox mailbox, MessageUid uid, Flags f) throws MailboxException {
         IndexSearcher searcher = null;
         try {
             searcher = new IndexSearcher(IndexReader.open(writer, true));
@@ -1305,15 +1300,12 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
 
     /**
      * Index the {@link Flags} and add it to the {@link Document}
-     * 
-     * @param f
-     * @param doc
      */
     private Document createFlagsDocument(MailboxMessage message) {
         Document doc = new Document();
-        doc.add(new Field(ID_FIELD, "flags-" + message.getMailboxId().serialize() +"-" + Long.toString(message.getUid()), Store.YES, Index.NOT_ANALYZED));
+        doc.add(new Field(ID_FIELD, "flags-" + message.getMailboxId().serialize() +"-" + Long.toString(message.getUid().asLong()), Store.YES, Index.NOT_ANALYZED));
         doc.add(new Field(MAILBOX_ID_FIELD, message.getMailboxId().serialize(), Store.YES, Index.NOT_ANALYZED));
-        doc.add(new NumericField(UID_FIELD,Store.YES, true).setLongValue(message.getUid()));
+        doc.add(new NumericField(UID_FIELD,Store.YES, true).setLongValue(message.getUid().asLong()));
         
         indexFlags(doc, message.createFlags());
         return doc;
@@ -1348,16 +1340,20 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
     private Query createQuery(MessageRange range) {
         switch (range.getType()) {
         case ONE:
-            return NumericRangeQuery.newLongRange(UID_FIELD, range.getUidFrom(), range.getUidTo(), true, true);
+            return NumericRangeQuery.newLongRange(UID_FIELD, 
+                    range.getUidFrom().asLong(), 
+                    range.getUidTo().asLong(), true, true);
         case FROM:
-            return NumericRangeQuery.newLongRange(UID_FIELD, range.getUidFrom(), Long.MAX_VALUE, true, true);
+            return NumericRangeQuery.newLongRange(UID_FIELD, 
+                    range.getUidFrom().asLong(), 
+                    MessageUid.MAX_VALUE.asLong(), true, true);
         default:
-            return NumericRangeQuery.newLongRange(UID_FIELD, 0L, Long.MAX_VALUE, true, true);
+            return NumericRangeQuery.newLongRange(UID_FIELD, MessageUid.MIN_VALUE.asLong(), MessageUid.MAX_VALUE.asLong(), true, true);
         }
     }
 
     @Override
-    public void delete(MailboxSession session, Mailbox mailbox, List<Long> expungedUids) throws MailboxException {
+    public void delete(MailboxSession session, Mailbox mailbox, List<MessageUid> expungedUids) throws MailboxException {
         Collection<MessageRange> messageRanges = MessageRange.toRanges(expungedUids);
         for (MessageRange messageRange : messageRanges) {
             delete(mailbox, messageRange);


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