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