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