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 cfd5c833d26a7b3e342521808b5e92d9ab5d17c7
Author: Rene Cordier <rcord...@linagora.com>
AuthorDate: Wed Feb 20 09:47:16 2019 +0700

    MAILBOX-378 refactor MessageManager::expunge
---
 .../org/apache/james/mailbox/MessageManager.java   |  8 +++-
 .../cassandra/mail/CassandraMessageMapper.java     | 11 ++++-
 .../james/mailbox/store/StoreMessageManager.java   | 53 +++++++++++++++-------
 .../james/mailbox/store/mail/MessageMapper.java    | 32 ++++++++-----
 4 files changed, 74 insertions(+), 30 deletions(-)

diff --git 
a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java 
b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
index ee4596b..896389b 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
@@ -105,7 +105,8 @@ public interface MessageManager {
     Iterator<MessageUid> search(SearchQuery searchQuery, MailboxSession 
mailboxSession) throws MailboxException;
 
     /**
-     * Expunges messages in the given range from this mailbox.
+     * Expunges messages in the given range from this mailbox by first 
retrieving the messages to be deleted
+     * and then deleting them.
      * 
      * @param set
      *            not null
@@ -118,6 +119,11 @@ public interface MessageManager {
     Iterator<MessageUid> expunge(MessageRange set, MailboxSession 
mailboxSession) throws MailboxException;
 
     /**
+     * Deletes a list of messages given their uids in the mailbox.
+     */
+    void delete(List<MessageUid> uids, MailboxSession mailboxSession) throws 
MailboxException;
+
+    /**
      * Sets flags on messages within the given range. The new flags are 
returned
      * for each message altered.
      * 
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
index 5f0ee84..fe6dbc7 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
@@ -199,11 +199,20 @@ public class CassandraMessageMapper implements 
MessageMapper {
     }
 
     @Override
-    public Map<MessageUid, MessageMetaData> 
expungeMarkedForDeletionInMailbox(Mailbox mailbox, MessageRange messageRange) {
+    public List<MessageUid> retrieveMessagesMarkedForDeletion(Mailbox mailbox, 
MessageRange messageRange) {
         CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
 
         return deletedMessageDAO.retrieveDeletedMessage(mailboxId, 
messageRange)
             .limitRate(cassandraConfiguration.getExpungeChunkSize())
+            .collect(Guavate.toImmutableList())
+            .block();
+    }
+
+    public Map<MessageUid, MessageMetaData> deleteMessages(Mailbox mailbox, 
List<MessageUid> uids) throws MailboxException {
+        CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
+
+        return Flux.fromStream(uids.stream())
+            .limitRate(cassandraConfiguration.getExpungeChunkSize())
             .flatMap(messageUid -> expungeOne(mailboxId, messageUid))
             .collect(Guavate.<SimpleMailboxMessage, MessageUid, 
MessageMetaData>toImmutableMap(MailboxMessage::getUid, 
MailboxMessage::metaData))
             .block();
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
index 020eb0e..7b9c641 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
@@ -100,7 +100,7 @@ import com.google.common.collect.ImmutableSortedMap;
 import reactor.core.publisher.Flux;
 
 /**
- * Base class for {@link org.apache.james.mailbox.MessageManager}
+ * Base class for {@link MessageManager}
  * implementations.
  * 
  * This base class take care of dispatching events to the registered
@@ -110,7 +110,7 @@ import reactor.core.publisher.Flux;
  * 
  * 
  */
-public class StoreMessageManager implements 
org.apache.james.mailbox.MessageManager {
+public class StoreMessageManager implements MessageManager {
 
     private static final MailboxCounters ZERO_MAILBOX_COUNTERS = 
MailboxCounters.builder()
         .count(0)
@@ -259,17 +259,44 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
         if (!isWriteable(mailboxSession)) {
             throw new ReadOnlyException(getMailboxPath(), 
mailboxSession.getPathDelimiter());
         }
-        Map<MessageUid, MessageMetaData> uids = deleteMarkedInMailbox(set, 
mailboxSession);
 
+        List<MessageUid> uids = retrieveMessagesMarkedForDeletion(set, 
mailboxSession);
+        Map<MessageUid, MessageMetaData> deletedMessages = 
deleteMessages(uids, mailboxSession);
+
+        dispatchExpungeEvent(mailboxSession, deletedMessages);
+        return deletedMessages.keySet().iterator();
+    }
+
+    private List<MessageUid> retrieveMessagesMarkedForDeletion(MessageRange 
messageRange, MailboxSession session) throws MailboxException {
+        MessageMapper messageMapper = mapperFactory.getMessageMapper(session);
+
+        return messageMapper.execute(
+            () -> 
messageMapper.retrieveMessagesMarkedForDeletion(getMailboxEntity(), 
messageRange));
+    }
+
+    @Override
+    public void delete(List<MessageUid> messageUids, MailboxSession 
mailboxSession) throws MailboxException {
+        Map<MessageUid, MessageMetaData> deletedMessages = 
deleteMessages(messageUids, mailboxSession);
+
+        dispatchExpungeEvent(mailboxSession, deletedMessages);
+    }
+
+    private Map<MessageUid, MessageMetaData> deleteMessages(List<MessageUid> 
messageUids, MailboxSession session) throws MailboxException {
+        MessageMapper messageMapper = mapperFactory.getMessageMapper(session);
+
+        return messageMapper.execute(
+            () -> messageMapper.deleteMessages(getMailboxEntity(), 
messageUids));
+    }
+
+    private void dispatchExpungeEvent(MailboxSession mailboxSession, 
Map<MessageUid, MessageMetaData> deletedMessages) throws MailboxException {
         eventBus.dispatch(EventFactory.expunged()
-            .randomEventId()
-            .mailboxSession(mailboxSession)
-            .mailbox(getMailboxEntity())
-            .metaData(ImmutableSortedMap.copyOf(uids))
-            .build(),
+                .randomEventId()
+                .mailboxSession(mailboxSession)
+                .mailbox(getMailboxEntity())
+                .metaData(ImmutableSortedMap.copyOf(deletedMessages))
+                .build(),
             new MailboxIdRegistrationKey(mailbox.getMailboxId()))
             .block();
-        return uids.keySet().iterator();
     }
 
     @Override
@@ -688,14 +715,6 @@ public class StoreMessageManager implements 
org.apache.james.mailbox.MessageMana
 
     }
 
-    protected Map<MessageUid, MessageMetaData> deleteMarkedInMailbox(final 
MessageRange range, MailboxSession session) throws MailboxException {
-
-        final MessageMapper messageMapper = 
mapperFactory.getMessageMapper(session);
-
-        return messageMapper.execute(
-            () -> 
messageMapper.expungeMarkedForDeletionInMailbox(getMailboxEntity(), range));
-    }
-
     @Override
     public Iterator<MessageUid> search(SearchQuery query, MailboxSession 
mailboxSession) throws MailboxException {
         if (query.equals(new SearchQuery(SearchQuery.all()))) {
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
index dc3ee27..0a2f49a 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
@@ -57,12 +57,12 @@ public interface MessageMapper extends Mapper {
             throws MailboxException;
 
     /**
-     * Return a {@link Iterator} which holds the uids for all deleted Messages 
for the given {@link MessageRange} which are marked for deletion
-     * The list must be ordered
+     *
+     * @param mailbox
+     * @param messageRange
+     * @return list of {@link MessageUid} which are marked as deleted
      */
-    Map<MessageUid, MessageMetaData> expungeMarkedForDeletionInMailbox(
-            Mailbox mailbox, MessageRange set)
-            throws MailboxException;
+    List<MessageUid> retrieveMessagesMarkedForDeletion(Mailbox mailbox, 
MessageRange messageRange);
 
     /**
      * Return the count of messages in the mailbox
@@ -79,7 +79,7 @@ public interface MessageMapper extends Mapper {
      * 
      * @param mailbox
      * @return unseenCount
-     * @throws StorageException
+     * @throws MailboxException
      */
     long countUnseenMessagesInMailbox(Mailbox mailbox)
             throws MailboxException;
@@ -91,17 +91,27 @@ public interface MessageMapper extends Mapper {
      * 
      * @param mailbox
      * @param message
-     * @throws StorageException
+     * @throws MailboxException
      */
     void delete(Mailbox mailbox, MailboxMessage message) throws 
MailboxException;
 
     /**
+     * Delete the given list of {@link MessageUid}
+     *
+     * @param mailbox
+     * @param uids
+     * @return a {@link Map} which holds the uids and metadata for all deleted 
messages
+     * @throws MailboxException
+     */
+    Map<MessageUid, MessageMetaData> deleteMessages(Mailbox mailbox, 
List<MessageUid> uids) throws MailboxException;
+
+    /**
      * Return the uid of the first unseen message. If non can be found null 
will get returned
      * 
      * 
      * @param mailbox
      * @return uid or null
-     * @throws StorageException
+     * @throws MailboxException
      */
     MessageUid findFirstUnseenMessageUid(Mailbox mailbox) throws 
MailboxException;
 
@@ -120,7 +130,7 @@ public interface MessageMapper extends Mapper {
      * @param mailbox
      * @param message
      * @return uid
-     * @throws StorageException
+     * @throws MailboxException
      */
     MessageMetaData add(Mailbox mailbox, MailboxMessage message) throws 
MailboxException;
     
@@ -142,7 +152,7 @@ public interface MessageMapper extends Mapper {
      * 
      * @param mailbox the Mailbox to copy to
      * @param original the original to copy
-     * @throws StorageException
+     * @throws MailboxException
      */
     MessageMetaData copy(Mailbox mailbox,MailboxMessage original) throws 
MailboxException;
     
@@ -152,7 +162,7 @@ public interface MessageMapper extends Mapper {
      * 
      * @param mailbox the Mailbox to move to
      * @param original the original to move
-     * @throws StorageException
+     * @throws MailboxException
      */
     MessageMetaData move(Mailbox mailbox,MailboxMessage original) throws 
MailboxException;
     


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

Reply via email to