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 bt...@apache.org on 2020/03/02 03:16:20 UTC
[james-project] 23/29: JAMES-2985 JPAMessageMapper should also
delete messages not marked as deleted
This is an automated email from the ASF dual-hosted git repository.
btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit d37340bbd0f406803a1a7c53805e718ff05c7eb7
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Feb 28 10:32:39 2020 +0700
JAMES-2985 JPAMessageMapper should also delete messages not marked as deleted
---
.../james/mailbox/jpa/mail/JPAMessageMapper.java | 96 +++++++++++-----------
.../model/openjpa/AbstractJPAMailboxMessage.java | 8 +-
.../store/mail/model/MessageMapperTest.java | 13 +++
3 files changed, 64 insertions(+), 53 deletions(-)
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 601a731..b1b8f71 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
@@ -43,6 +43,7 @@ import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMailboxMessage;
import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAStreamingMailboxMessage;
import org.apache.james.mailbox.model.Mailbox;
import org.apache.james.mailbox.model.MailboxCounters;
+import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MessageMetaData;
import org.apache.james.mailbox.model.MessageRange;
import org.apache.james.mailbox.model.MessageRange.Type;
@@ -95,33 +96,30 @@ public class JPAMessageMapper extends JPATransactionalMapper implements MessageM
@Override
public Iterator<MailboxMessage> findInMailbox(Mailbox mailbox, MessageRange set, FetchType fType, int max)
throws MailboxException {
+
+ return findAsList(mailbox.getMailboxId(), set, max).iterator();
+ }
+
+ private List<MailboxMessage> findAsList(MailboxId mailboxId, MessageRange set, int max) throws MailboxException {
try {
- List<MailboxMessage> results;
MessageUid from = set.getUidFrom();
- final MessageUid to = set.getUidTo();
- final Type type = set.getType();
- JPAId mailboxId = (JPAId) mailbox.getMailboxId();
+ MessageUid to = set.getUidTo();
+ Type type = set.getType();
+ JPAId jpaId = (JPAId) mailboxId;
switch (type) {
- default:
- case ALL:
- results = findMessagesInMailbox(mailboxId, max);
- break;
- case FROM:
- results = findMessagesInMailboxAfterUID(mailboxId, from, max);
- break;
- case ONE:
- results = findMessagesInMailboxWithUID(mailboxId, from);
- break;
- case RANGE:
- results = findMessagesInMailboxBetweenUIDs(mailboxId, from, to, max);
- break;
+ default:
+ case ALL:
+ return findMessagesInMailbox(jpaId, max);
+ case FROM:
+ return findMessagesInMailboxAfterUID(jpaId, from, max);
+ case ONE:
+ return findMessagesInMailboxWithUID(jpaId, from);
+ case RANGE:
+ return findMessagesInMailboxBetweenUIDs(jpaId, from, to, max);
}
-
- return results.iterator();
-
} catch (PersistenceException e) {
- throw new MailboxException("Search of MessageRange " + set + " failed in mailbox " + mailbox, e);
+ throw new MailboxException("Search of MessageRange " + set + " failed in mailbox " + mailboxId.serialize(), e);
}
}
@@ -229,21 +227,6 @@ public class JPAMessageMapper extends JPATransactionalMapper implements MessageM
}
}
- @Override
- public Map<MessageUid, MessageMetaData> deleteMessages(Mailbox mailbox, List<MessageUid> uids) throws MailboxException {
- JPAId mailboxId = (JPAId) mailbox.getMailboxId();
- Map<MessageUid, MessageMetaData> data = new HashMap<>();
- List<MessageRange> ranges = MessageRange.toRanges(uids);
-
- ranges.forEach(range -> {
- List<MailboxMessage> messages = findDeletedMessages(range, mailboxId);
- data.putAll(createMetaData(messages));
- deleteDeletedMessages(range, mailboxId);
- });
-
- return data;
- }
-
private List<MailboxMessage> findDeletedMessages(MessageRange messageRange, JPAId mailboxId) {
MessageUid from = messageRange.getUidFrom();
MessageUid to = messageRange.getUidTo();
@@ -262,22 +245,37 @@ public class JPAMessageMapper extends JPATransactionalMapper implements MessageM
}
}
- private void deleteDeletedMessages(MessageRange messageRange, JPAId mailboxId) {
+ @Override
+ public Map<MessageUid, MessageMetaData> deleteMessages(Mailbox mailbox, List<MessageUid> uids) throws MailboxException {
+ JPAId mailboxId = (JPAId) mailbox.getMailboxId();
+ Map<MessageUid, MessageMetaData> data = new HashMap<>();
+ List<MessageRange> ranges = MessageRange.toRanges(uids);
+
+ ranges.forEach(Throwing.<MessageRange>consumer(range -> {
+ List<MailboxMessage> messages = findAsList(mailboxId, range, JPAMessageMapper.UNLIMITED);
+ data.putAll(createMetaData(messages));
+ deleteMessages(range, mailboxId);
+ }).sneakyThrow());
+
+ return data;
+ }
+
+ private void deleteMessages(MessageRange messageRange, JPAId mailboxId) {
MessageUid from = messageRange.getUidFrom();
MessageUid to = messageRange.getUidTo();
switch (messageRange.getType()) {
case ONE:
- deleteDeletedMessagesInMailboxWithUID(mailboxId, from);
+ deleteMessagesInMailboxWithUID(mailboxId, from);
break;
case RANGE:
- deleteDeletedMessagesInMailboxBetweenUIDs(mailboxId, from, to);
+ deleteMessagesInMailboxBetweenUIDs(mailboxId, from, to);
break;
case FROM:
- deleteDeletedMessagesInMailboxAfterUID(mailboxId, from);
+ deleteMessagesInMailboxAfterUID(mailboxId, from);
break;
case ALL:
- deleteDeletedMessagesInMailbox(mailboxId);
+ deleteMessagesInMailbox(mailboxId);
break;
default:
throw new RuntimeException("Cannot delete messages, range type " + messageRange.getType() + " doesn't exist");
@@ -438,23 +436,23 @@ public class JPAMessageMapper extends JPATransactionalMapper implements MessageM
.collect(Guavate.toImmutableList());
}
- private int deleteDeletedMessagesInMailbox(JPAId mailboxId) {
- return getEntityManager().createNamedQuery("deleteDeletedMessagesInMailbox")
+ private int deleteMessagesInMailbox(JPAId mailboxId) {
+ return getEntityManager().createNamedQuery("deleteMessagesInMailbox")
.setParameter("idParam", mailboxId.getRawId()).executeUpdate();
}
- private int deleteDeletedMessagesInMailboxAfterUID(JPAId mailboxId, MessageUid from) {
- return getEntityManager().createNamedQuery("deleteDeletedMessagesInMailboxAfterUID")
+ private int deleteMessagesInMailboxAfterUID(JPAId mailboxId, MessageUid from) {
+ return getEntityManager().createNamedQuery("deleteMessagesInMailboxAfterUID")
.setParameter("idParam", mailboxId.getRawId()).setParameter("uidParam", from.asLong()).executeUpdate();
}
- private int deleteDeletedMessagesInMailboxWithUID(JPAId mailboxId, MessageUid from) {
- return getEntityManager().createNamedQuery("deleteDeletedMessagesInMailboxWithUID")
+ private int deleteMessagesInMailboxWithUID(JPAId mailboxId, MessageUid from) {
+ return getEntityManager().createNamedQuery("deleteMessagesInMailboxWithUID")
.setParameter("idParam", mailboxId.getRawId()).setParameter("uidParam", from.asLong()).executeUpdate();
}
- private int deleteDeletedMessagesInMailboxBetweenUIDs(JPAId mailboxId, MessageUid from, MessageUid to) {
- return getEntityManager().createNamedQuery("deleteDeletedMessagesInMailboxBetweenUIDs")
+ private int deleteMessagesInMailboxBetweenUIDs(JPAId mailboxId, MessageUid from, MessageUid to) {
+ return getEntityManager().createNamedQuery("deleteMessagesInMailboxBetweenUIDs")
.setParameter("idParam", mailboxId.getRawId()).setParameter("fromParam", from.asLong())
.setParameter("toParam", to.asLong()).executeUpdate();
}
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 18bcf7c..cfebd40 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
@@ -84,10 +84,10 @@ import com.google.common.base.Objects;
@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 = "deleteMessagesInMailbox", query = "DELETE FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam"),
+ @NamedQuery(name = "deleteMessagesInMailboxBetweenUIDs", query = "DELETE FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid BETWEEN :fromParam AND :toParam"),
+ @NamedQuery(name = "deleteMessagesInMailboxWithUID", query = "DELETE FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid=:uidParam"),
+ @NamedQuery(name = "deleteMessagesInMailboxAfterUID", query = "DELETE FROM MailboxMessage message WHERE message.mailbox.mailboxId = :idParam AND message.uid>=:uidParam"),
@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"),
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
index bd3b111..14341ee 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
@@ -1162,6 +1162,19 @@ public abstract class MessageMapperTest {
}
@Test
+ void deleteMessagesShouldNotRequireMessagesToBeMarkedAsDeleted() throws Exception {
+ saveMessages();
+
+ messageMapper.deleteMessages(benwaInboxMailbox, ImmutableList.of(message2.getUid(), message3.getUid()));
+
+ assertThat(messageMapper.listAllMessageUids(benwaInboxMailbox))
+ .toIterable()
+ .containsOnly(message1.getUid(),
+ message4.getUid(),
+ message5.getUid());
+ }
+
+ @Test
void getUidsShouldNotReturnUidsOfDeletedMessages() throws Exception {
saveMessages();
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org