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