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 2019/02/25 03:16:17 UTC
[james-project] branch master updated (8b213a0 -> 49df4ff)
This is an automated email from the ASF dual-hosted git repository.
btellier pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git.
from 8b213a0 MAILBOX-378 refactor tests for MessageMapper
new 012ed9b MAILBOX-379 Moving MetadataWithMailboxId to use in other places
new ff5f453 MAILBOX-379 Introduce PreDeletionHook API
new f29f69a MAILBOX-379 Plug PreDeletionHooks to StoreMessageIdManager
new d2c5ca5 MAILBOX-379 Plug PreDeletionHook to MailboxStoreManager
new 59a4b7e MAILBOX-379 Plug PreDeletionHook to Memory MailboxStoreManager
new 0dc6204 MAILBOX-379 Use LF line break in spring xml files
new cccdf6a MAILBOX-379 Inject empty hooks to Spring related MailboxManagers
new 9788e41 MAILBOX-379 Plug PreDeletionHook to MailboxStoreManager
new 4a27826 MAILBOX-379 Introduce PreDeletionHook API
new d2a1754 MAILBOX-381 refactor findMessage unlimited constant replacements
new 062cecd MAILBOX-379 Run preDeletion hooks only for messages marked as deleted upon expunge
new 5967f8f MAILBOX-380 Create CassandraEventDeadLettersModule With DAO and Table
new 71fa3cc MAILBOX-380 Implement CassandraEventDeadLetters
new 42e0567 MAILBOX-378 add message to RuntimeExceptions
new 59c63de JAMES-2660 Fix sample mariadb jpa file
new 49df4ff MAILBOX-380 Create CassandraEventDeadLettersGroupTable With DAO
The 16 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
...strationKey.java => MetadataWithMailboxId.java} | 49 ++---
.../james/mailbox/events/EventDeadLetters.java | 5 +
.../james/mailbox/extension/PreDeletionHook.java | 113 +++++++++++
.../apache/james/mailbox/MailboxManagerTest.java | 219 +++++++++++++++++++++
.../james/mailbox/MetadataWithMailboxIdTest.java | 6 +-
.../mailbox/events/EventDeadLettersContract.java | 9 +-
.../mailbox/extension/PreDeletionHookTest.java | 48 ++---
.../mailbox/cassandra/CassandraMailboxManager.java | 11 +-
.../mailbox/cassandra/CassandraMessageManager.java | 8 +-
.../CassandraCombinationManagerTestSystem.java | 3 +-
.../cassandra/CassandraMailboxManagerProvider.java | 8 +-
.../CassandraMailboxManagerStressTest.java | 3 +-
.../cassandra/CassandraMailboxManagerTest.java | 3 +-
.../CassandraMessageIdManagerSideEffectTest.java | 7 +-
.../CassandraMessageIdManagerStorageTest.java | 3 +-
.../CassandraMessageIdManagerTestSystem.java | 11 +-
.../cassandra/CassandraTestSystemFixture.java | 11 +-
.../CassandraMailboxManagerAttachmentTest.java | 5 +-
.../ElasticSearchIntegrationTest.java | 7 +-
.../event/event-cassandra}/pom.xml | 58 +++---
.../mailbox/events/CassandraEventDeadLetters.java} | 43 ++--
.../events/CassandraEventDeadLettersDAO.java | 131 ++++++++++++
.../events/CassandraEventDeadLettersGroupDAO.java | 68 +++----
.../events/CassandraEventDeadLettersModule.java | 21 +-
.../CassandraEventDeadLettersGroupTable.java | 10 +-
.../tables/CassandraEventDeadLettersTable.java | 12 +-
.../events/CassandraEventDeadLettersDAOTest.java | 104 ++++++++++
.../CassandraEventDeadLettersGroupDAOTest.java | 51 +++--
.../events/CassandraEventDeadLettersTest.java | 54 +++++
.../mailbox/events/MemoryEventDeadLetters.java | 4 -
.../james/mailbox/jpa/JPAMailboxManager.java | 3 +-
.../james/mailbox/jpa/JPAMessageManager.java | 3 +-
.../james/mailbox/jpa/mail/JPAMessageMapper.java | 4 +-
.../james/mailbox/jpa/JPAMailboxManagerTest.java | 7 +
.../search/LuceneMessageSearchIndexTest.java | 7 +-
.../mailbox/maildir/mail/MaildirMessageMapper.java | 4 +-
.../resources/META-INF/spring/mailbox-maildir.xml | 135 ++++++-------
.../DomainUserMaildirMailboxManagerTest.java | 10 +
.../maildir/FullUserMaildirMailboxManagerTest.java | 9 +
.../maildir/MaildirMailboxManagerProvider.java | 3 +-
.../mailbox/inmemory/InMemoryMailboxManager.java | 11 +-
.../mailbox/inmemory/InMemoryMessageManager.java | 7 +-
.../inmemory/mail/InMemoryMessageMapper.java | 2 +-
.../resources/META-INF/spring/mailbox-memory.xml | 115 +++++------
.../inmemory/MemoryMailboxManagerProvider.java | 7 +-
.../inmemory/MemoryMailboxManagerStressTest.java | 3 +-
.../mailbox/inmemory/MemoryMailboxManagerTest.java | 3 +-
.../mail/InMemoryMailboxManagerAttachmentTest.java | 5 +-
.../manager/InMemoryIntegrationResources.java | 35 +++-
.../InMemoryMessageIdManagerSideEffectTest.java | 11 +-
mailbox/pom.xml | 1 +
.../store/search/SimpleMessageSearchIndexTest.java | 4 +-
mailbox/store/pom.xml | 20 +-
.../james/mailbox/store/StoreMailboxManager.java | 16 +-
.../james/mailbox/store/StoreMessageIdManager.java | 46 ++---
.../james/mailbox/store/StoreMessageManager.java | 40 +++-
.../mailbox/store/mail/AbstractMessageMapper.java | 3 +-
.../store/quota/CurrentQuotaCalculator.java | 4 +-
.../store/search/LazyMessageSearchIndex.java | 2 +-
.../store/search/ListeningMessageSearchIndex.java | 2 +-
.../store/search/SimpleMessageSearchIndex.java | 6 +-
.../AbstractMessageIdManagerSideEffectTest.java | 150 +++++++++++++-
.../mailbox/store/StoreMailboxManagerTest.java | 3 +-
.../tools/indexer/CassandraReIndexerImplTest.java | 4 +-
.../cassandra/host/CassandraHostSystem.java | 3 +-
.../host/ElasticSearchHostSystem.java | 4 +-
.../lucenesearch/host/LuceneSearchHostSystem.java | 4 +-
.../maildir/host/MaildirHostSystem.java | 3 +-
.../sample-configuration/james-database.properties | 2 +-
.../org/apache/james/modules/MailboxModule.java | 3 +
70 files changed, 1342 insertions(+), 447 deletions(-)
copy mailbox/api/src/main/java/org/apache/james/mailbox/{events/MailboxIdRegistrationKey.java => MetadataWithMailboxId.java} (59%)
create mode 100644 mailbox/api/src/main/java/org/apache/james/mailbox/extension/PreDeletionHook.java
copy server/blob/mail-store/src/test/java/org/apache/james/blob/mail/MimeMessagePartsIdTest.java => mailbox/api/src/test/java/org/apache/james/mailbox/MetadataWithMailboxIdTest.java (91%)
copy server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/api/MailKeyTest.java => mailbox/api/src/test/java/org/apache/james/mailbox/extension/PreDeletionHookTest.java (63%)
copy {server/container/mailbox-jmx => mailbox/event/event-cassandra}/pom.xml (67%)
copy mailbox/event/{event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java => event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLetters.java} (62%)
create mode 100644 mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java
copy server/data/data-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/UrlsDao.java => mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersGroupDAO.java (51%)
copy event-sourcing/event-store-cassandra/src/main/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreModule.java => mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersModule.java (64%)
copy mailet/api/src/main/java/org/apache/mailet/Experimental.java => mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/tables/CassandraEventDeadLettersGroupTable.java (87%)
copy event-sourcing/event-store-cassandra/src/main/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreTable.java => mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/tables/CassandraEventDeadLettersTable.java (87%)
create mode 100644 mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAOTest.java
copy backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionDAOTest.java => mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersGroupDAOTest.java (56%)
create mode 100644 mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 10/16: MAILBOX-381 refactor findMessage unlimited
constant replacements
Posted by bt...@apache.org.
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 d2a1754f5ad520a31052c49c43f079f2c700b874
Author: tran tien duc <dt...@linagora.com>
AuthorDate: Thu Feb 21 18:37:35 2019 +0700
MAILBOX-381 refactor findMessage unlimited constant replacements
---
.../apache/james/mailbox/maildir/mail/MaildirMessageMapper.java | 2 +-
.../james/mailbox/inmemory/mail/InMemoryMessageMapper.java | 2 +-
.../java/org/apache/james/mailbox/store/StoreMailboxManager.java | 4 +++-
.../java/org/apache/james/mailbox/store/StoreMessageManager.java | 9 +++------
.../apache/james/mailbox/store/mail/AbstractMessageMapper.java | 3 ++-
.../apache/james/mailbox/store/quota/CurrentQuotaCalculator.java | 4 +++-
.../james/mailbox/store/search/LazyMessageSearchIndex.java | 2 +-
.../james/mailbox/store/search/ListeningMessageSearchIndex.java | 2 +-
.../james/mailbox/store/search/SimpleMessageSearchIndex.java | 6 ++++--
9 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
index 8cab401..104aa75 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
@@ -153,7 +153,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper {
final List<UpdatedFlags> updatedFlags = new ArrayList<>();
final MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
- Iterator<MailboxMessage> it = findInMailbox(mailbox, set, FetchType.Metadata, -1);
+ Iterator<MailboxMessage> it = findInMailbox(mailbox, set, FetchType.Metadata, UNLIMITED);
while (it.hasNext()) {
final MailboxMessage member = it.next();
Flags originalFlags = member.createFlags();
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
index 7d6e598..dfd2450 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
@@ -137,7 +137,7 @@ public class InMemoryMessageMapper extends AbstractMessageMapper {
public List<MessageUid> retrieveMessagesMarkedForDeletion(Mailbox mailbox, MessageRange messageRange) {
List<MessageUid> filteredResult = new ArrayList<>();
- Iterator<MailboxMessage> it = findInMailbox(mailbox, messageRange, FetchType.Metadata, -1);
+ Iterator<MailboxMessage> it = findInMailbox(mailbox, messageRange, FetchType.Metadata, UNLIMITED);
while (it.hasNext()) {
MailboxMessage member = it.next();
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 22af4a8..09ca79f 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -19,6 +19,8 @@
package org.apache.james.mailbox.store;
+import static org.apache.james.mailbox.store.mail.AbstractMessageMapper.UNLIMITED;
+
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.EnumSet;
@@ -393,7 +395,7 @@ public class StoreMailboxManager implements MailboxManager {
QuotaRoot quotaRoot = quotaRootResolver.getQuotaRoot(mailboxPath);
long messageCount = messageMapper.countMessagesInMailbox(mailbox);
- long totalSize = Iterators.toStream(messageMapper.findInMailbox(mailbox, MessageRange.all(), MessageMapper.FetchType.Metadata, -1))
+ long totalSize = Iterators.toStream(messageMapper.findInMailbox(mailbox, MessageRange.all(), MessageMapper.FetchType.Metadata, UNLIMITED))
.mapToLong(Message::getFullContentOctets)
.sum();
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 1de663a..0a18a65 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
@@ -20,6 +20,7 @@
package org.apache.james.mailbox.store;
import static org.apache.james.mailbox.extension.PreDeletionHook.DeleteOperation;
+import static org.apache.james.mailbox.store.mail.AbstractMessageMapper.UNLIMITED;
import java.io.File;
import java.io.FileOutputStream;
@@ -94,12 +95,10 @@ import org.apache.james.mime4j.stream.MimeTokenStream;
import org.apache.james.mime4j.stream.RecursionMode;
import org.apache.james.util.BodyOffsetInputStream;
import org.apache.james.util.IteratorWrapper;
-import org.apache.james.util.StreamUtils;
import org.apache.james.util.streams.Iterators;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.github.fge.lambdas.Throwing;
import com.github.steveash.guavate.Guavate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSortedMap;
@@ -120,8 +119,6 @@ import reactor.core.scheduler.Schedulers;
*
*/
public class StoreMessageManager implements MessageManager {
-
- private static final int NO_LIMIT = -1;
private static final MailboxCounters ZERO_MAILBOX_COUNTERS = MailboxCounters.builder()
.count(0)
.unseen(0)
@@ -734,7 +731,7 @@ public class StoreMessageManager implements MessageManager {
DeleteOperation deleteOperation = Flux.fromIterable(MessageRange.toRanges(uids))
.publishOn(Schedulers.elastic())
- .flatMap(range -> Mono.fromCallable(() -> messageMapper.findInMailbox(mailbox, range, FetchType.Metadata, NO_LIMIT))
+ .flatMap(range -> Mono.fromCallable(() -> messageMapper.findInMailbox(mailbox, range, FetchType.Metadata, UNLIMITED))
.flatMapMany(iterator -> Flux.fromStream(Iterators.toStream(iterator))))
.map(mailboxMessage -> MetadataWithMailboxId.from(mailboxMessage.metaData(), mailboxMessage.getMailboxId()))
.collect(Guavate.toImmutableList())
@@ -862,7 +859,7 @@ public class StoreMessageManager implements MessageManager {
private Iterator<MailboxMessage> retrieveOriginalRows(MessageRange set, MailboxSession session) throws MailboxException {
MessageMapper messageMapper = mapperFactory.getMessageMapper(session);
- return messageMapper.findInMailbox(mailbox, set, FetchType.Full, -1);
+ return messageMapper.findInMailbox(mailbox, set, FetchType.Full, UNLIMITED);
}
private SortedMap<MessageUid, MessageMetaData> collectMetadata(Iterator<MessageMetaData> ids) {
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
index f1f24be..31be149 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
+
import javax.mail.Flags;
import org.apache.james.mailbox.MailboxSession;
@@ -78,7 +79,7 @@ public abstract class AbstractMessageMapper extends TransactionalMapper implemen
@Override
public Iterator<UpdatedFlags> updateFlags(Mailbox mailbox, FlagsUpdateCalculator flagsUpdateCalculator, MessageRange set) throws MailboxException {
final List<UpdatedFlags> updatedFlags = new ArrayList<>();
- Iterator<MailboxMessage> messages = findInMailbox(mailbox, set, FetchType.Metadata, -1);
+ Iterator<MailboxMessage> messages = findInMailbox(mailbox, set, FetchType.Metadata, UNLIMITED);
long modSeq = -1;
if (messages.hasNext()) {
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/CurrentQuotaCalculator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/CurrentQuotaCalculator.java
index fbf4480..ea41989 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/CurrentQuotaCalculator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/CurrentQuotaCalculator.java
@@ -19,6 +19,8 @@
package org.apache.james.mailbox.store.quota;
+import static org.apache.james.mailbox.store.mail.AbstractMessageMapper.UNLIMITED;
+
import java.util.Iterator;
import java.util.List;
@@ -56,7 +58,7 @@ public class CurrentQuotaCalculator {
long messagesSizes = 0;
long messageCount = 0;
for (Mailbox mailbox : mailboxes) {
- Iterator<MailboxMessage> messages = mapper.findInMailbox(mailbox, MessageRange.all(), MessageMapper.FetchType.Metadata, -1);
+ Iterator<MailboxMessage> messages = mapper.findInMailbox(mailbox, MessageRange.all(), MessageMapper.FetchType.Metadata, UNLIMITED);
messageCount += mapper.countMessagesInMailbox(mailbox);
while (messages.hasNext()) {
messagesSizes += messages.next().getFullContentOctets();
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
index 0a05fd3..8ab47bf 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
@@ -116,7 +116,7 @@ public class LazyMessageSearchIndex extends ListeningMessageSearchIndex {
done = oldDone;
}
synchronized (done) {
- Iterator<MailboxMessage> messages = factory.getMessageMapper(session).findInMailbox(mailbox, MessageRange.all(), FetchType.Full, -1);
+ Iterator<MailboxMessage> messages = factory.getMessageMapper(session).findInMailbox(mailbox, MessageRange.all(), FetchType.Full, UNLIMITED);
while (messages.hasNext()) {
final MailboxMessage message = messages.next();
try {
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
index 53d9ac7..f010e0e 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
@@ -48,7 +48,7 @@ import com.google.common.collect.ImmutableList;
public abstract class ListeningMessageSearchIndex implements MessageSearchIndex, MailboxListener.GroupMailboxListener {
private static final Logger LOGGER = LoggerFactory.getLogger(ListeningMessageSearchIndex.class);
- private static final int UNLIMITED = -1;
+ protected static final int UNLIMITED = -1;
private final MailboxSessionMapperFactory factory;
private final SessionProvider sessionProvider;
private static final ImmutableList<Class<? extends Event>> INTERESTING_EVENTS = ImmutableList.of(Added.class, Expunged.class, FlagsUpdated.class, MailboxDeletion.class);
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
index ce22aa9..4093e50 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
@@ -18,6 +18,8 @@
****************************************************************/
package org.apache.james.mailbox.store.search;
+import static org.apache.james.mailbox.store.mail.AbstractMessageMapper.UNLIMITED;
+
import java.util.Collection;
import java.util.EnumSet;
import java.util.Iterator;
@@ -124,14 +126,14 @@ public class SimpleMessageSearchIndex implements MessageSearchIndex {
// only fetching this uid range
UidRange[] ranges = uidCrit.getOperator().getRange();
for (UidRange r : ranges) {
- Iterator<MailboxMessage> it = mapper.findInMailbox(mailbox, MessageRange.range(r.getLowValue(), r.getHighValue()), FetchType.Metadata, -1);
+ Iterator<MailboxMessage> it = mapper.findInMailbox(mailbox, MessageRange.range(r.getLowValue(), r.getHighValue()), FetchType.Metadata, UNLIMITED);
while (it.hasNext()) {
hitSet.add(it.next());
}
}
} else {
// we have to fetch all messages
- Iterator<MailboxMessage> messages = mapper.findInMailbox(mailbox, MessageRange.all(), FetchType.Full, -1);
+ Iterator<MailboxMessage> messages = mapper.findInMailbox(mailbox, MessageRange.all(), FetchType.Full, UNLIMITED);
while (messages.hasNext()) {
MailboxMessage m = messages.next();
hitSet.add(m);
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 11/16: MAILBOX-379 Run preDeletion hooks only for
messages marked as deleted upon expunge
Posted by bt...@apache.org.
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 062cecdf20a975b9dd04851a8444b7fb606c2bd5
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Feb 22 15:58:23 2019 +0700
MAILBOX-379 Run preDeletion hooks only for messages marked as deleted upon expunge
Also avoid running the hooks when nothing to delete
---
.../apache/james/mailbox/MailboxManagerTest.java | 57 ++++++++++++++++++++--
.../james/mailbox/store/StoreMessageManager.java | 5 ++
2 files changed, 57 insertions(+), 5 deletions(-)
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index ae6e3c9..87272e8 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -27,6 +27,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import java.nio.charset.StandardCharsets;
@@ -1362,6 +1363,7 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
@Test
void expungeShouldCallAllPreDeletionHooks() throws Exception {
ComposedMessageId composeId = inboxManager.appendMessage(AppendCommand.builder()
+ .withFlags(new Flags(Flags.Flag.DELETED))
.build(message), session);
inboxManager.expunge(MessageRange.one(composeId.getUid()), session);
@@ -1381,8 +1383,12 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
@Test
void expungeShouldCallAllPreDeletionHooksOnEachMessageDeletionCall() throws Exception {
- ComposedMessageId composeId1 = inboxManager.appendMessage(AppendCommand.builder().build(message), session);
- ComposedMessageId composeId2 = inboxManager.appendMessage(AppendCommand.builder().build(message), session);
+ ComposedMessageId composeId1 = inboxManager.appendMessage(AppendCommand.builder()
+ .withFlags(new Flags(Flags.Flag.DELETED))
+ .build(message), session);
+ ComposedMessageId composeId2 = inboxManager.appendMessage(AppendCommand.builder()
+ .withFlags(new Flags(Flags.Flag.DELETED))
+ .build(message), session);
inboxManager.expunge(MessageRange.one(composeId1.getUid()), session);
inboxManager.expunge(MessageRange.one(composeId2.getUid()), session);
@@ -1402,9 +1408,48 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
}
@Test
+ void expungeShouldCallAllPreDeletionHooksOnlyOnMessagesMarkedAsDeleted() throws Exception {
+ ComposedMessageId composeId1 = inboxManager.appendMessage(AppendCommand.builder()
+ .withFlags(new Flags(Flags.Flag.DELETED))
+ .build(message), session);
+ inboxManager.appendMessage(AppendCommand.builder()
+ .build(message), session);
+
+ inboxManager.expunge(MessageRange.all(), session);
+
+ ArgumentCaptor<PreDeletionHook.DeleteOperation> preDeleteCaptor1 = ArgumentCaptor.forClass(PreDeletionHook.DeleteOperation.class);
+ ArgumentCaptor<PreDeletionHook.DeleteOperation> preDeleteCaptor2 = ArgumentCaptor.forClass(PreDeletionHook.DeleteOperation.class);
+ verify(preDeletionHook1, times(1)).notifyDelete(preDeleteCaptor1.capture());
+ verify(preDeletionHook2, times(1)).notifyDelete(preDeleteCaptor2.capture());
+
+ assertThat(preDeleteCaptor1.getValue().getDeletionMetadataList())
+ .hasSize(1)
+ .hasSameElementsAs(preDeleteCaptor2.getValue().getDeletionMetadataList())
+ .allSatisfy(deleteMetadata -> SoftAssertions.assertSoftly(softy -> {
+ softy.assertThat(deleteMetadata.getMailboxId()).isEqualTo(inboxId);
+ softy.assertThat(deleteMetadata.getMessageMetaData().getMessageId()).isEqualTo(composeId1.getMessageId());
+ }));
+ }
+
+ @Test
+ void expungeShouldNotCallPredeletionHooksWhenNoMessagesMarkedAsDeleted() throws Exception {
+ inboxManager.appendMessage(AppendCommand.builder()
+ .build(message), session);
+
+ inboxManager.expunge(MessageRange.all(), session);
+
+ verifyZeroInteractions(preDeletionHook1);
+ verifyZeroInteractions(preDeletionHook2);
+ }
+
+ @Test
void expungeShouldCallAllPreDeletionHooksOnEachMessageDeletionOnDifferentMailboxes() throws Exception {
- ComposedMessageId composeId1 = inboxManager.appendMessage(AppendCommand.builder().build(message), session);
- ComposedMessageId composeId2 = anotherMailboxManager.appendMessage(AppendCommand.builder().build(message), session);
+ ComposedMessageId composeId1 = inboxManager.appendMessage(AppendCommand.builder()
+ .withFlags(new Flags(Flags.Flag.DELETED))
+ .build(message), session);
+ ComposedMessageId composeId2 = anotherMailboxManager.appendMessage(AppendCommand.builder()
+ .withFlags(new Flags(Flags.Flag.DELETED))
+ .build(message), session);
inboxManager.expunge(MessageRange.one(composeId1.getUid()), session);
anotherMailboxManager.expunge(MessageRange.one(composeId2.getUid()), session);
@@ -1432,7 +1477,9 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
when(preDeletionHook1.notifyDelete(any(PreDeletionHook.DeleteOperation.class)))
.thenThrow(new RuntimeException("throw at hook 1"));
- ComposedMessageId composeId1 = inboxManager.appendMessage(AppendCommand.builder().build(message), session);
+ ComposedMessageId composeId1 = inboxManager.appendMessage(AppendCommand.builder()
+ .withFlags(new Flags(Flags.Flag.DELETED))
+ .build(message), session);
assertThatThrownBy(() -> inboxManager.expunge(MessageRange.one(composeId1.getUid()), session))
.isInstanceOf(RuntimeException.class);
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 0a18a65..f0d6ddd 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
@@ -101,6 +101,7 @@ import org.slf4j.LoggerFactory;
import com.github.steveash.guavate.Guavate;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSortedMap;
import reactor.core.publisher.Flux;
@@ -291,6 +292,10 @@ public class StoreMessageManager implements MessageManager {
}
private Map<MessageUid, MessageMetaData> deleteMessages(List<MessageUid> messageUids, MailboxSession session) throws MailboxException {
+ if (messageUids.isEmpty()) {
+ return ImmutableMap.of();
+ }
+
MessageMapper messageMapper = mapperFactory.getMessageMapper(session);
runPredeletionHooks(messageUids, session);
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 12/16: MAILBOX-380 Create
CassandraEventDeadLettersModule With DAO and Table
Posted by bt...@apache.org.
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 5967f8fed6e22de9bd7df6b88498c5777098cbc3
Author: datph <dp...@linagora.com>
AuthorDate: Fri Feb 22 09:41:46 2019 +0700
MAILBOX-380 Create CassandraEventDeadLettersModule With DAO and Table
---
mailbox/event/event-cassandra/pom.xml | 51 ++++++++
.../events/CassandraEventDeadLettersDAO.java | 131 +++++++++++++++++++++
.../events/CassandraEventDeadLettersModule.java | 41 +++++++
.../tables/CassandraEventDeadLettersTable.java | 29 +++++
.../events/CassandraEventDeadLettersDAOTest.java | 124 +++++++++++++++++++
mailbox/pom.xml | 1 +
6 files changed, 377 insertions(+)
diff --git a/mailbox/event/event-cassandra/pom.xml b/mailbox/event/event-cassandra/pom.xml
new file mode 100644
index 0000000..1bc6222
--- /dev/null
+++ b/mailbox/event/event-cassandra/pom.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <artifactId>apache-james-mailbox</artifactId>
+ <groupId>org.apache.james</groupId>
+ <version>3.4.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>apache-james-mailbox-event-cassandra</artifactId>
+ <name>Apache James :: Mailbox :: Event :: In Cassandra implementation</name>
+ <description>In Cassandra implementation for the eventDeadLetter API</description>
+
+ <dependencies>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>apache-james-backends-cassandra</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>apache-james-mailbox-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>apache-james-mailbox-event-json</artifactId>
+ </dependency>
+ </dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java
new file mode 100644
index 0000000..0eab33b
--- /dev/null
+++ b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java
@@ -0,0 +1,131 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.mailbox.events;
+
+import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.delete;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
+import static org.apache.james.mailbox.events.tables.CassandraEventDeadLettersTable.EVENT;
+import static org.apache.james.mailbox.events.tables.CassandraEventDeadLettersTable.EVENT_ID;
+import static org.apache.james.mailbox.events.tables.CassandraEventDeadLettersTable.GROUP;
+import static org.apache.james.mailbox.events.tables.CassandraEventDeadLettersTable.TABLE_NAME;
+
+import javax.inject.Inject;
+
+import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
+import org.apache.james.event.json.EventSerializer;
+
+import com.datastax.driver.core.PreparedStatement;
+import com.datastax.driver.core.Session;
+import com.github.fge.lambdas.Throwing;
+
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+public class CassandraEventDeadLettersDAO {
+ private final CassandraAsyncExecutor executor;
+ private final EventSerializer eventSerializer;
+ private final PreparedStatement insertStatement;
+ private final PreparedStatement deleteStatement;
+ private final PreparedStatement selectAllGroupStatement;
+ private final PreparedStatement selectEventStatement;
+ private final PreparedStatement selectEventIdsWithGroupStatement;
+
+ @Inject
+ CassandraEventDeadLettersDAO(Session session, EventSerializer eventSerializer) {
+ this.executor = new CassandraAsyncExecutor(session);
+ this.eventSerializer = eventSerializer;
+ this.insertStatement = prepareInsertStatement(session);
+ this.deleteStatement = prepareDeleteStatement(session);
+ this.selectAllGroupStatement = prepareSelectAllGroupStatement(session);
+ this.selectEventStatement = prepareSelectEventStatement(session);
+ this.selectEventIdsWithGroupStatement = prepareSelectEventIdsWithGroupStatement(session);
+ }
+
+ private PreparedStatement prepareInsertStatement(Session session) {
+ return session.prepare(insertInto(TABLE_NAME)
+ .value(GROUP, bindMarker(GROUP))
+ .value(EVENT_ID, bindMarker(EVENT_ID))
+ .value(EVENT, bindMarker(EVENT)));
+ }
+
+ private PreparedStatement prepareDeleteStatement(Session session) {
+ return session.prepare(delete()
+ .from(TABLE_NAME)
+ .where(eq(GROUP, bindMarker(GROUP)))
+ .and(eq(EVENT_ID, bindMarker(EVENT_ID))));
+ }
+
+ private PreparedStatement prepareSelectAllGroupStatement(Session session) {
+ return session.prepare(select(GROUP)
+ .from(TABLE_NAME));
+ }
+
+ private PreparedStatement prepareSelectEventStatement(Session session) {
+ return session.prepare(select(EVENT)
+ .from(TABLE_NAME)
+ .where(eq(GROUP, bindMarker(GROUP)))
+ .and(eq(EVENT_ID, bindMarker(EVENT_ID))));
+ }
+
+ private PreparedStatement prepareSelectEventIdsWithGroupStatement(Session session) {
+ return session.prepare(select(EVENT_ID)
+ .from(TABLE_NAME)
+ .where(eq(GROUP, bindMarker(GROUP))));
+ }
+
+ Mono<Void> store(Group group, Event failedEvent) {
+ return executor.executeVoid(insertStatement.bind()
+ .setString(GROUP, group.asString())
+ .setUUID(EVENT_ID, failedEvent.getEventId().getId())
+ .setString(EVENT, eventSerializer.toJson(failedEvent)));
+ }
+
+ Mono<Void> removeEvent(Group group, Event.EventId failedEventId) {
+ return executor.executeVoid(deleteStatement.bind()
+ .setString(GROUP, group.asString())
+ .setUUID(EVENT_ID, failedEventId.getId()));
+ }
+
+ Mono<Event> retrieveFailedEvent(Group group, Event.EventId failedEventId) {
+ return executor.executeSingleRow(selectEventStatement.bind()
+ .setString(GROUP, group.asString())
+ .setUUID(EVENT_ID, failedEventId.getId()))
+ .map(row -> deserializeEvent(row.getString(EVENT)));
+ }
+
+ Flux<Event.EventId> retrieveEventIdsWithGroup(Group group) {
+ return executor.executeRows(selectEventIdsWithGroupStatement.bind()
+ .setString(GROUP, group.asString()))
+ .map(row -> Event.EventId.of(row.getUUID(EVENT_ID)));
+ }
+
+ Flux<Group> retrieveAllGroups() {
+ return executor.executeRows(selectAllGroupStatement.bind())
+ .map(Throwing.function(row -> Group.deserialize(row.getString(GROUP))))
+ .distinct();
+ }
+
+ private Event deserializeEvent(String serializedEvent) {
+ return eventSerializer.fromJson(serializedEvent).get();
+ }
+}
diff --git a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersModule.java b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersModule.java
new file mode 100644
index 0000000..f8b1e30
--- /dev/null
+++ b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersModule.java
@@ -0,0 +1,41 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.mailbox.events;
+
+import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.backends.cassandra.utils.CassandraConstants;
+import org.apache.james.mailbox.events.tables.CassandraEventDeadLettersTable;
+
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.schemabuilder.SchemaBuilder;
+
+public interface CassandraEventDeadLettersModule {
+ CassandraModule MODULE = CassandraModule.builder()
+ .table(CassandraEventDeadLettersTable.TABLE_NAME)
+ .comment("Holds event dead letter")
+ .options(options -> options
+ .caching(SchemaBuilder.KeyCaching.ALL,
+ SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION)))
+ .statement(statement -> statement
+ .addPartitionKey(CassandraEventDeadLettersTable.GROUP, DataType.text())
+ .addClusteringColumn(CassandraEventDeadLettersTable.EVENT_ID, DataType.uuid())
+ .addColumn(CassandraEventDeadLettersTable.EVENT, DataType.text()))
+ .build();
+}
diff --git a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/tables/CassandraEventDeadLettersTable.java b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/tables/CassandraEventDeadLettersTable.java
new file mode 100644
index 0000000..2418ffe
--- /dev/null
+++ b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/tables/CassandraEventDeadLettersTable.java
@@ -0,0 +1,29 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.mailbox.events.tables;
+
+public interface CassandraEventDeadLettersTable {
+
+ String TABLE_NAME = "event_dead_letters";
+
+ String GROUP = "group";
+ String EVENT_ID = "eventId";
+ String EVENT = "event";
+}
diff --git a/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAOTest.java b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAOTest.java
new file mode 100644
index 0000000..7bc66a7
--- /dev/null
+++ b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAOTest.java
@@ -0,0 +1,124 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.mailbox.events;
+
+import static org.apache.james.mailbox.events.EventDeadLettersContract.EVENT_1;
+import static org.apache.james.mailbox.events.EventDeadLettersContract.EVENT_2;
+import static org.apache.james.mailbox.events.EventDeadLettersContract.EVENT_3;
+import static org.apache.james.mailbox.events.EventDeadLettersContract.EVENT_ID_1;
+import static org.apache.james.mailbox.events.EventDeadLettersContract.EVENT_ID_2;
+import static org.apache.james.mailbox.events.EventDeadLettersContract.EVENT_ID_3;
+import static org.apache.james.mailbox.events.EventDeadLettersContract.GROUP_A;
+import static org.apache.james.mailbox.events.EventDeadLettersContract.GROUP_B;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.event.json.EventSerializer;
+import org.apache.james.mailbox.model.TestId;
+import org.apache.james.mailbox.model.TestMessageId;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+class CassandraEventDeadLettersDAOTest {
+
+ @RegisterExtension
+ static CassandraClusterExtension cassandraClusterExtension = new CassandraClusterExtension(CassandraEventDeadLettersModule.MODULE);
+
+ private CassandraEventDeadLettersDAO cassandraEventDeadLettersDAO;
+
+ @BeforeEach
+ void setUp(CassandraCluster cassandraCluster) {
+ EventSerializer eventSerializer = new EventSerializer(new TestId.Factory(), new TestMessageId.Factory());
+ cassandraEventDeadLettersDAO = new CassandraEventDeadLettersDAO(cassandraCluster.getConf(), eventSerializer);
+ }
+
+ @Test
+ void removeEventShouldSucceededWhenRemoveStoredEvent() {
+ cassandraEventDeadLettersDAO.store(GROUP_A, EVENT_1).block();
+
+ cassandraEventDeadLettersDAO.removeEvent(GROUP_A, EVENT_ID_1).block();
+
+ assertThat(cassandraEventDeadLettersDAO
+ .retrieveAllGroups()
+ .collectList().block())
+ .isEmpty();
+ }
+
+ @Test
+ void retrieveFailedEventShouldReturnEmptyWhenDefault() {
+ assertThat(cassandraEventDeadLettersDAO
+ .retrieveFailedEvent(GROUP_A, EVENT_ID_1)
+ .blockOptional().isPresent())
+ .isFalse();
+ }
+
+ @Test
+ void retrieveFailedEventShouldReturnStoredEvent() {
+ cassandraEventDeadLettersDAO.store(GROUP_A, EVENT_1).block();
+ cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_2).block();
+
+ assertThat(cassandraEventDeadLettersDAO
+ .retrieveFailedEvent(GROUP_B, EVENT_ID_2)
+ .blockOptional().get())
+ .isEqualTo(EVENT_2);
+ }
+
+ @Test
+ void retrieveEventIdsWithGroupShouldReturnEmptyWhenDefault() {
+ assertThat(cassandraEventDeadLettersDAO
+ .retrieveEventIdsWithGroup(GROUP_A)
+ .collectList().block())
+ .isEmpty();
+ }
+
+ @Test
+ void retrieveEventIdsWithGroupShouldReturnStoredEventId() {
+ cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_1).block();
+ cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_2).block();
+ cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_3).block();
+
+ assertThat(cassandraEventDeadLettersDAO
+ .retrieveEventIdsWithGroup(GROUP_B)
+ .collectList().block())
+ .containsOnly(EVENT_ID_1, EVENT_ID_2, EVENT_ID_3);
+ }
+
+ @Test
+ void retrieveAllGroupsShouldReturnEmptyWhenDefault() {
+ assertThat(cassandraEventDeadLettersDAO
+ .retrieveAllGroups()
+ .collectList().block())
+ .isEmpty();
+ }
+
+ @Test
+ void retrieveAllGroupsShouldReturnStoredGroups() {
+ cassandraEventDeadLettersDAO.store(GROUP_A, EVENT_1).block();
+ cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_2).block();
+ cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_3).block();
+
+ assertThat(cassandraEventDeadLettersDAO
+ .retrieveAllGroups()
+ .collectList().block())
+ .containsOnly(GROUP_A, GROUP_B);
+ }
+}
diff --git a/mailbox/pom.xml b/mailbox/pom.xml
index 08102cc..55fa3ab 100644
--- a/mailbox/pom.xml
+++ b/mailbox/pom.xml
@@ -41,6 +41,7 @@
<module>cassandra</module>
<module>elasticsearch</module>
+ <module>event/event-cassandra</module>
<module>event/event-memory</module>
<module>event/event-rabbitmq</module>
<module>event/json</module>
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 07/16: MAILBOX-379 Inject empty hooks to Spring
related MailboxManagers
Posted by bt...@apache.org.
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 cccdf6a5c85cb076551a84427bfa81499215c679
Author: tran tien duc <dt...@linagora.com>
AuthorDate: Thu Feb 21 11:00:55 2019 +0700
MAILBOX-379 Inject empty hooks to Spring related MailboxManagers
---
mailbox/maildir/src/main/resources/META-INF/spring/mailbox-maildir.xml | 1 +
mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml | 1 +
2 files changed, 2 insertions(+)
diff --git a/mailbox/maildir/src/main/resources/META-INF/spring/mailbox-maildir.xml b/mailbox/maildir/src/main/resources/META-INF/spring/mailbox-maildir.xml
index de43601..3c7f7e9 100644
--- a/mailbox/maildir/src/main/resources/META-INF/spring/mailbox-maildir.xml
+++ b/mailbox/maildir/src/main/resources/META-INF/spring/mailbox-maildir.xml
@@ -46,6 +46,7 @@
<constructor-arg index="8" ref="quotaComponents" />
<constructor-arg index="9" ref="indexer" />
<constructor-arg index="10" ref="no-mailbox-configuration" />
+ <constructor-arg index="11"><set/></constructor-arg>
</bean>
<bean id ="no-mailbox-configuration" class="org.apache.james.mailbox.store.MailboxManagerConfiguration.NoMailboxConfiguration"/>
diff --git a/mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml b/mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml
index 4dd811f..39aeaa6 100644
--- a/mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml
+++ b/mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml
@@ -42,6 +42,7 @@
<constructor-arg index="7" ref="storeRightManager" />
<constructor-arg index="8" ref="quotaComponents" />
<constructor-arg index="9" ref="indexer" />
+ <constructor-arg index="10"><set/></constructor-arg>
</bean>
<bean id ="memory-subscriptionManager" class="org.apache.james.mailbox.store.StoreSubscriptionManager">
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 14/16: MAILBOX-378 add message to RuntimeExceptions
Posted by bt...@apache.org.
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 42e056730b8ed8205ce5c903ab114bfa7e56af49
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Feb 22 17:43:27 2019 +0700
MAILBOX-378 add message to RuntimeExceptions
---
.../main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java | 4 ++--
.../org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java | 2 +-
2 files changed, 3 insertions(+), 3 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 53e62a6..6ce10b4 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
@@ -237,7 +237,7 @@ public class JPAMessageMapper extends JPATransactionalMapper implements MessageM
case ALL:
return findDeletedMessagesInMailbox(mailboxId);
default:
- throw new RuntimeException();
+ throw new RuntimeException("Cannot find deleted messages, range type " + messageRange.getType() + " doesn't exist");
}
}
@@ -259,7 +259,7 @@ public class JPAMessageMapper extends JPATransactionalMapper implements MessageM
deleteDeletedMessagesInMailbox(mailboxId);
break;
default:
- throw new RuntimeException();
+ throw new RuntimeException("Cannot delete messages, range type " + messageRange.getType() + " doesn't exist");
}
}
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
index 104aa75..501076b 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
@@ -242,7 +242,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper {
case ALL:
return findMessagesInMailbox(mailbox, MaildirMessageName.FILTER_DELETED_MESSAGES, -1);
default:
- throw new RuntimeException();
+ throw new RuntimeException("Cannot find deleted messages, range type " + messageRange.getType() + " doesn't exist");
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 02/16: MAILBOX-379 Introduce PreDeletionHook API
Posted by bt...@apache.org.
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 ff5f4538b413d9d479f05dafb2407ebf998fd377
Author: tran tien duc <dt...@linagora.com>
AuthorDate: Tue Feb 19 13:00:33 2019 +0700
MAILBOX-379 Introduce PreDeletionHook API
---
.../james/mailbox/extension/PreDeletionHook.java | 106 +++++++++++++++++++++
.../mailbox/extension/PreDeletionHookTest.java | 47 +++++++++
mailbox/store/pom.xml | 20 +++-
3 files changed, 168 insertions(+), 5 deletions(-)
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/extension/PreDeletionHook.java b/mailbox/api/src/main/java/org/apache/james/mailbox/extension/PreDeletionHook.java
new file mode 100644
index 0000000..41df20d
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/extension/PreDeletionHook.java
@@ -0,0 +1,106 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.mailbox.extension;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.UUID;
+
+import org.apache.james.mailbox.MetadataWithMailboxId;
+import org.reactivestreams.Publisher;
+
+public interface PreDeletionHook {
+
+ class DeletionId {
+
+ public static DeletionId random() {
+ return new DeletionId(UUID.randomUUID());
+ }
+
+ public static DeletionId of(UUID uuid) {
+ return new DeletionId(uuid);
+ }
+
+ private final UUID id;
+
+ private DeletionId(UUID id) {
+ this.id = id;
+ }
+
+ public String asString() {
+ return id.toString();
+ }
+
+ @Override
+ public final boolean equals(Object o) {
+ if (o instanceof DeletionId) {
+ DeletionId that = (DeletionId) o;
+ return Objects.equals(this.id, that.id);
+ }
+ return false;
+ }
+
+ @Override
+ public final int hashCode() {
+ return Objects.hash(id);
+ }
+ }
+
+ class DeleteOperation {
+
+ public static DeleteOperation from(List<MetadataWithMailboxId> deletionMetadataList) {
+ return new DeleteOperation(DeletionId.random(), deletionMetadataList);
+ }
+
+ private final DeletionId deletionId;
+ private final List<MetadataWithMailboxId> deletionMetadataList;
+
+ private DeleteOperation(DeletionId deletionId, List<MetadataWithMailboxId> deletionMetadataList) {
+ this.deletionId = deletionId;
+ this.deletionMetadataList = deletionMetadataList;
+ }
+
+ public DeletionId getDeletionId() {
+ return deletionId;
+ }
+
+ public List<MetadataWithMailboxId> getDeletionMetadataList() {
+ return deletionMetadataList;
+ }
+
+ @Override
+ public final boolean equals(Object o) {
+ if (o instanceof DeleteOperation) {
+ DeleteOperation that = (DeleteOperation) o;
+
+ return Objects.equals(this.deletionId, that.deletionId)
+ && Objects.equals(this.deletionMetadataList, that.deletionMetadataList);
+ }
+ return false;
+ }
+
+ @Override
+ public final int hashCode() {
+ return Objects.hash(deletionId, deletionMetadataList);
+ }
+ }
+
+ Publisher<Void> notifyDelete(DeleteOperation deleteOperation);
+}
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/extension/PreDeletionHookTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/extension/PreDeletionHookTest.java
new file mode 100644
index 0000000..2b19ce1
--- /dev/null
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/extension/PreDeletionHookTest.java
@@ -0,0 +1,47 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+package org.apache.james.mailbox.extension;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+class PreDeletionHookTest {
+
+ @Nested
+ class DeletionIdTest {
+
+ @Test
+ void shouldMatchBeanContract() {
+ EqualsVerifier.forClass(PreDeletionHook.DeletionId.class)
+ .verify();
+ }
+ }
+
+ @Nested
+ class DeleteOperationTest {
+
+ @Test
+ void shouldMatchBeanContract() {
+ EqualsVerifier.forClass(PreDeletionHook.DeleteOperation.class)
+ .verify();
+ }
+ }
+}
\ No newline at end of file
diff --git a/mailbox/store/pom.xml b/mailbox/store/pom.xml
index 572fd84..dbca17c 100644
--- a/mailbox/store/pom.xml
+++ b/mailbox/store/pom.xml
@@ -109,11 +109,6 @@
<artifactId>javax.inject</artifactId>
</dependency>
<dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
<groupId>net.javacrumbs.json-unit</groupId>
<artifactId>json-unit-assertj</artifactId>
<scope>test</scope>
@@ -138,6 +133,21 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>org.junit.jupiter</groupId>
+ <artifactId>junit-jupiter-engine</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.platform</groupId>
+ <artifactId>junit-platform-launcher</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.vintage</groupId>
+ <artifactId>junit-vintage-engine</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 15/16: JAMES-2660 Fix sample mariadb jpa file
Posted by bt...@apache.org.
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 59c63dea6066c8a1ea03a0c5f14921fb10c98c51
Author: Simon Levesque <si...@simonlevesque.com>
AuthorDate: Wed Feb 20 16:19:29 2019 -0500
JAMES-2660 Fix sample mariadb jpa file
---
.../jpa-smtp-mariadb/sample-configuration/james-database.properties | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server/container/guice/jpa-smtp-mariadb/sample-configuration/james-database.properties b/server/container/guice/jpa-smtp-mariadb/sample-configuration/james-database.properties
index 209de00..80fe839 100644
--- a/server/container/guice/jpa-smtp-mariadb/sample-configuration/james-database.properties
+++ b/server/container/guice/jpa-smtp-mariadb/sample-configuration/james-database.properties
@@ -28,7 +28,7 @@ database.password=app
# Supported adapters are:
# DB2, DERBY, H2, HSQL, INFORMIX, MYSQL, ORACLE, POSTGRESQL, SQL_SERVER, SYBASE
-vendorAdapter.database=mariaDB
+vendorAdapter.database=MYSQL
# Use streaming for Blobs
# This is only supported on a limited set of databases atm. You should check if its supported by your DB before enable
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 03/16: MAILBOX-379 Plug PreDeletionHooks to
StoreMessageIdManager
Posted by bt...@apache.org.
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 f29f69a60227268bc5817dedd7cbf1ac6d6eebfc
Author: tran tien duc <dt...@linagora.com>
AuthorDate: Wed Feb 20 15:20:19 2019 +0700
MAILBOX-379 Plug PreDeletionHooks to StoreMessageIdManager
---
.../james/mailbox/extension/PreDeletionHook.java | 5 +
.../CassandraCombinationManagerTestSystem.java | 3 +-
.../CassandraMessageIdManagerSideEffectTest.java | 7 +-
.../CassandraMessageIdManagerStorageTest.java | 3 +-
.../CassandraMessageIdManagerTestSystem.java | 11 +-
.../cassandra/CassandraTestSystemFixture.java | 9 +-
.../ElasticSearchIntegrationTest.java | 4 +-
.../search/LuceneMessageSearchIndexTest.java | 4 +-
.../manager/InMemoryIntegrationResources.java | 4 +-
.../InMemoryMessageIdManagerSideEffectTest.java | 8 +-
.../store/search/SimpleMessageSearchIndexTest.java | 4 +-
.../james/mailbox/store/StoreMessageIdManager.java | 24 +++-
.../AbstractMessageIdManagerSideEffectTest.java | 150 ++++++++++++++++++++-
.../org/apache/james/modules/MailboxModule.java | 3 +
14 files changed, 217 insertions(+), 22 deletions(-)
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/extension/PreDeletionHook.java b/mailbox/api/src/main/java/org/apache/james/mailbox/extension/PreDeletionHook.java
index 41df20d..022e511 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/extension/PreDeletionHook.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/extension/PreDeletionHook.java
@@ -21,11 +21,14 @@ package org.apache.james.mailbox.extension;
import java.util.List;
import java.util.Objects;
+import java.util.Set;
import java.util.UUID;
import org.apache.james.mailbox.MetadataWithMailboxId;
import org.reactivestreams.Publisher;
+import com.google.common.collect.ImmutableSet;
+
public interface PreDeletionHook {
class DeletionId {
@@ -102,5 +105,7 @@ public interface PreDeletionHook {
}
}
+ Set<PreDeletionHook> NO_PRE_DELETION_HOOK = ImmutableSet.of();
+
Publisher<Void> notifyDelete(DeleteOperation deleteOperation);
}
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTestSystem.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTestSystem.java
index 4878a9b..31e3c87 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTestSystem.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTestSystem.java
@@ -26,6 +26,7 @@ import org.apache.james.mailbox.MessageIdManager;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.events.EventBus;
import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.quota.QuotaManager;
import org.apache.james.mailbox.store.CombinationManagerTestSystem;
@@ -39,7 +40,7 @@ public class CassandraCombinationManagerTestSystem extends CombinationManagerTes
public static CombinationManagerTestSystem createTestingData(CassandraCluster cassandra, QuotaManager quotaManager, EventBus eventBus) {
CassandraMailboxSessionMapperFactory mapperFactory = CassandraTestSystemFixture.createMapperFactory(cassandra);
- return new CassandraCombinationManagerTestSystem(CassandraTestSystemFixture.createMessageIdManager(mapperFactory, quotaManager, eventBus),
+ return new CassandraCombinationManagerTestSystem(CassandraTestSystemFixture.createMessageIdManager(mapperFactory, quotaManager, eventBus, PreDeletionHook.NO_PRE_DELETION_HOOK),
mapperFactory,
CassandraTestSystemFixture.createMailboxManager(mapperFactory));
}
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerSideEffectTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerSideEffectTest.java
index 3b70449..2d76328 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerSideEffectTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerSideEffectTest.java
@@ -19,10 +19,13 @@
package org.apache.james.mailbox.cassandra;
+import java.util.Set;
+
import org.apache.james.backends.cassandra.CassandraCluster;
import org.apache.james.backends.cassandra.DockerCassandraRule;
import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
import org.apache.james.mailbox.events.EventBus;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.quota.QuotaManager;
import org.apache.james.mailbox.store.AbstractMessageIdManagerSideEffectTest;
import org.apache.james.mailbox.store.MessageIdManagerTestSystem;
@@ -60,7 +63,7 @@ public class CassandraMessageIdManagerSideEffectTest extends AbstractMessageIdMa
}
@Override
- protected MessageIdManagerTestSystem createTestSystem(QuotaManager quotaManager, EventBus eventBus) {
- return CassandraMessageIdManagerTestSystem.createTestingData(cassandra, quotaManager, eventBus);
+ protected MessageIdManagerTestSystem createTestSystem(QuotaManager quotaManager, EventBus eventBus, Set<PreDeletionHook> preDeletionHooks) {
+ return CassandraMessageIdManagerTestSystem.createTestingData(cassandra, quotaManager, eventBus, preDeletionHooks);
}
}
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerStorageTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerStorageTest.java
index 0902dce..99a9093 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerStorageTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerStorageTest.java
@@ -24,6 +24,7 @@ import org.apache.james.backends.cassandra.DockerCassandraRule;
import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
import org.apache.james.mailbox.events.InVMEventBus;
import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.store.AbstractMessageIdManagerStorageTest;
import org.apache.james.mailbox.store.MessageIdManagerTestSystem;
import org.apache.james.mailbox.store.quota.NoQuotaManager;
@@ -64,6 +65,6 @@ public class CassandraMessageIdManagerStorageTest extends AbstractMessageIdManag
@Override
protected MessageIdManagerTestSystem createTestingData() {
InVMEventBus eventBus = new InVMEventBus(new InVmEventDelivery(new NoopMetricFactory()));
- return CassandraMessageIdManagerTestSystem.createTestingData(cassandra, new NoQuotaManager(), eventBus);
+ return CassandraMessageIdManagerTestSystem.createTestingData(cassandra, new NoQuotaManager(), eventBus, PreDeletionHook.NO_PRE_DELETION_HOOK);
}
}
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java
index 0bdeb45..c0dd20d 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java
@@ -19,9 +19,12 @@
package org.apache.james.mailbox.cassandra;
+import java.util.Set;
+
import org.apache.james.backends.cassandra.CassandraCluster;
import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
import org.apache.james.mailbox.events.EventBus;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.quota.CurrentQuotaManager;
import org.apache.james.mailbox.quota.QuotaManager;
import org.apache.james.mailbox.store.MessageIdManagerTestSystem;
@@ -30,10 +33,11 @@ import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
class CassandraMessageIdManagerTestSystem {
- static MessageIdManagerTestSystem createTestingData(CassandraCluster cassandra, QuotaManager quotaManager, EventBus eventBus) {
+ static MessageIdManagerTestSystem createTestingData(CassandraCluster cassandra, QuotaManager quotaManager, EventBus eventBus,
+ Set<PreDeletionHook> preDeletionHooks) {
CassandraMailboxSessionMapperFactory mapperFactory = CassandraTestSystemFixture.createMapperFactory(cassandra);
- return new MessageIdManagerTestSystem(CassandraTestSystemFixture.createMessageIdManager(mapperFactory, quotaManager, eventBus),
+ return new MessageIdManagerTestSystem(CassandraTestSystemFixture.createMessageIdManager(mapperFactory, quotaManager, eventBus, preDeletionHooks),
new CassandraMessageId.Factory(),
mapperFactory,
CassandraTestSystemFixture.createMailboxManager(mapperFactory)) {
@@ -48,7 +52,8 @@ class CassandraMessageIdManagerTestSystem {
(StoreCurrentQuotaManager) currentQuotaManager,
mailboxManager.getQuotaComponents().getQuotaRootResolver(), mailboxManager.getEventBus(), quotaManager);
mailboxManager.getEventBus().register(listeningCurrentQuotaUpdater);
- return new MessageIdManagerTestSystem(CassandraTestSystemFixture.createMessageIdManager(mapperFactory, quotaManager, mailboxManager.getEventBus()),
+ return new MessageIdManagerTestSystem(CassandraTestSystemFixture.createMessageIdManager(mapperFactory, quotaManager, mailboxManager.getEventBus(),
+ PreDeletionHook.NO_PRE_DELETION_HOOK),
new CassandraMessageId.Factory(),
mapperFactory,
mailboxManager);
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
index b1bef0a..4c32722 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
@@ -21,6 +21,8 @@ package org.apache.james.mailbox.cassandra;
import static org.mockito.Mockito.mock;
+import java.util.Set;
+
import org.apache.james.backends.cassandra.CassandraCluster;
import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
@@ -33,6 +35,7 @@ import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaManager;
import org.apache.james.mailbox.events.EventBus;
import org.apache.james.mailbox.events.InVMEventBus;
import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.quota.CurrentQuotaManager;
import org.apache.james.mailbox.quota.MaxQuotaManager;
import org.apache.james.mailbox.quota.QuotaManager;
@@ -82,7 +85,8 @@ class CassandraTestSystemFixture {
return cassandraMailboxManager;
}
- static StoreMessageIdManager createMessageIdManager(CassandraMailboxSessionMapperFactory mapperFactory, QuotaManager quotaManager, EventBus eventBus) {
+ static StoreMessageIdManager createMessageIdManager(CassandraMailboxSessionMapperFactory mapperFactory, QuotaManager quotaManager, EventBus eventBus,
+ Set<PreDeletionHook> preDeletionHooks) {
CassandraMailboxManager mailboxManager = createMailboxManager(mapperFactory);
return new StoreMessageIdManager(
mailboxManager,
@@ -90,7 +94,8 @@ class CassandraTestSystemFixture {
eventBus,
new CassandraMessageId.Factory(),
quotaManager,
- new DefaultUserQuotaRootResolver(mailboxManager.getSessionProvider(), mapperFactory));
+ new DefaultUserQuotaRootResolver(mailboxManager.getSessionProvider(), mapperFactory),
+ preDeletionHooks);
}
static MaxQuotaManager createMaxQuotaManager(CassandraCluster cassandra) {
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
index 4556681..e49c063 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
@@ -42,6 +42,7 @@ import org.apache.james.mailbox.elasticsearch.query.QueryConverter;
import org.apache.james.mailbox.elasticsearch.search.ElasticSearchSearcher;
import org.apache.james.mailbox.events.InVMEventBus;
import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.inmemory.InMemoryId;
import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
@@ -159,7 +160,8 @@ public class ElasticSearchIntegrationTest extends AbstractMessageSearchIndexTest
eventBus,
storeMailboxManager.getMessageIdFactory(),
quotaComponents.getQuotaManager(),
- quotaComponents.getQuotaRootResolver());
+ quotaComponents.getQuotaRootResolver(),
+ PreDeletionHook.NO_PRE_DELETION_HOOK);
eventBus.register(elasticSearchListeningMessageSearchIndex);
this.messageSearchIndex = elasticSearchListeningMessageSearchIndex;
diff --git a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
index 9dffa1d..d82be9c 100644
--- a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
+++ b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
@@ -24,6 +24,7 @@ import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
import org.apache.james.mailbox.events.InVMEventBus;
import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.inmemory.InMemoryId;
import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
@@ -85,7 +86,8 @@ public class LuceneMessageSearchIndexTest extends AbstractMessageSearchIndexTest
eventBus,
storeMailboxManager.getMessageIdFactory(),
quotaComponents.getQuotaManager(),
- quotaComponents.getQuotaRootResolver());
+ quotaComponents.getQuotaRootResolver(),
+ PreDeletionHook.NO_PRE_DELETION_HOOK);
eventBus.register(luceneMessageSearchIndex);
this.messageSearchIndex = luceneMessageSearchIndex;
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
index 1f5beff..9e5e5a5 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
@@ -26,6 +26,7 @@ import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
import org.apache.james.mailbox.events.EventBus;
import org.apache.james.mailbox.events.InVMEventBus;
import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
import org.apache.james.mailbox.inmemory.InMemoryMessageId;
@@ -193,7 +194,8 @@ public class InMemoryIntegrationResources implements IntegrationResources<StoreM
mailboxManager.getEventBus(),
factory,
quotaComponents.getQuotaManager(),
- quotaComponents.getQuotaRootResolver());
+ quotaComponents.getQuotaRootResolver(),
+ PreDeletionHook.NO_PRE_DELETION_HOOK);
}
@Override
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryMessageIdManagerSideEffectTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryMessageIdManagerSideEffectTest.java
index e270749..c99bb6b 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryMessageIdManagerSideEffectTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryMessageIdManagerSideEffectTest.java
@@ -19,9 +19,12 @@
package org.apache.james.mailbox.inmemory.manager;
+import java.util.Set;
+
import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
import org.apache.james.mailbox.events.EventBus;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
import org.apache.james.mailbox.inmemory.InMemoryMessageId;
@@ -55,7 +58,7 @@ public class InMemoryMessageIdManagerSideEffectTest extends AbstractMessageIdMan
}
@Override
- protected MessageIdManagerTestSystem createTestSystem(QuotaManager quotaManager, EventBus eventBus) {
+ protected MessageIdManagerTestSystem createTestSystem(QuotaManager quotaManager, EventBus eventBus, Set<PreDeletionHook> preDeletionHooks) {
InMemoryMailboxSessionMapperFactory mapperFactory = new InMemoryMailboxSessionMapperFactory();
FakeAuthenticator fakeAuthenticator = new FakeAuthenticator();
@@ -87,7 +90,8 @@ public class InMemoryMessageIdManagerSideEffectTest extends AbstractMessageIdMan
eventBus,
messageIdFactory,
quotaManager,
- quotaComponents.getQuotaRootResolver());
+ quotaComponents.getQuotaRootResolver(),
+ preDeletionHooks);
return new MessageIdManagerTestSystem(messageIdManager, messageIdFactory, mapperFactory, mailboxManager);
}
}
diff --git a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
index 38cd886..8b423d6 100644
--- a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
+++ b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
@@ -21,6 +21,7 @@ package org.apache.james.mailbox.store.search;
import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
import org.apache.james.mailbox.store.StoreMessageIdManager;
import org.junit.Ignore;
@@ -47,7 +48,8 @@ public class SimpleMessageSearchIndexTest extends AbstractMessageSearchIndexTest
storeMailboxManager.getEventBus(),
storeMailboxManager.getMessageIdFactory(),
storeMailboxManager.getQuotaComponents().getQuotaManager(),
- storeMailboxManager.getQuotaComponents().getQuotaRootResolver());
+ storeMailboxManager.getQuotaComponents().getQuotaRootResolver(),
+ PreDeletionHook.NO_PRE_DELETION_HOOK);
}
/**
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
index 3031b9b..808f8aa 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
@@ -37,10 +37,12 @@ import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageIdManager;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.MetadataWithMailboxId;
import org.apache.james.mailbox.events.EventBus;
import org.apache.james.mailbox.events.MailboxIdRegistrationKey;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.MailboxNotFoundException;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.model.DeleteResult;
import org.apache.james.mailbox.model.MailboxACL.Right;
import org.apache.james.mailbox.model.MailboxId;
@@ -95,17 +97,19 @@ public class StoreMessageIdManager implements MessageIdManager {
private final MessageId.Factory messageIdFactory;
private final QuotaManager quotaManager;
private final QuotaRootResolver quotaRootResolver;
+ private final Set<PreDeletionHook> preDeletionHooks;
@Inject
public StoreMessageIdManager(MailboxManager mailboxManager, MailboxSessionMapperFactory mailboxSessionMapperFactory,
EventBus eventBus, MessageId.Factory messageIdFactory,
- QuotaManager quotaManager, QuotaRootResolver quotaRootResolver) {
+ QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, Set<PreDeletionHook> preDeletionHooks) {
this.mailboxManager = mailboxManager;
this.mailboxSessionMapperFactory = mailboxSessionMapperFactory;
this.eventBus = eventBus;
this.messageIdFactory = messageIdFactory;
this.quotaManager = quotaManager;
this.quotaRootResolver = quotaRootResolver;
+ this.preDeletionHooks = preDeletionHooks;
}
@Override
@@ -167,7 +171,7 @@ public class StoreMessageIdManager implements MessageIdManager {
.collect(Guavate.toImmutableList());
if (!messageList.isEmpty()) {
- delete(messageIdMapper, messageList, mailboxSession);
+ deleteWithPreHooks(messageIdMapper, messageList, mailboxSession);
return DeleteResult.destroyed(messageId);
}
return DeleteResult.notFound(messageId);
@@ -187,7 +191,7 @@ public class StoreMessageIdManager implements MessageIdManager {
.collect(Guavate.toImmutableSet());
Sets.SetView<MessageId> nonAccessibleMessages = Sets.difference(ImmutableSet.copyOf(messageIds), accessibleMessages);
- delete(messageIdMapper, messageList, mailboxSession);
+ deleteWithPreHooks(messageIdMapper, messageList, mailboxSession);
return DeleteResult.builder()
.addDestroyed(accessibleMessages)
@@ -195,11 +199,21 @@ public class StoreMessageIdManager implements MessageIdManager {
.build();
}
- private void delete(MessageIdMapper messageIdMapper, List<MailboxMessage> messageList, MailboxSession mailboxSession) throws MailboxException {
+ private void deleteWithPreHooks(MessageIdMapper messageIdMapper, List<MailboxMessage> messageList, MailboxSession mailboxSession) throws MailboxException {
ImmutableList<MetadataWithMailboxId> metadataWithMailbox = messageList.stream()
- .map(MetadataWithMailboxId::from)
+ .map(mailboxMessage -> MetadataWithMailboxId.from(mailboxMessage.metaData(), mailboxMessage.getMailboxId()))
.collect(Guavate.toImmutableList());
+ PreDeletionHook.DeleteOperation deleteOperation = PreDeletionHook.DeleteOperation.from(metadataWithMailbox);
+ Flux.fromIterable(preDeletionHooks)
+ .flatMap(preDeletionHook -> preDeletionHook.notifyDelete(deleteOperation))
+ .then(Mono.fromRunnable(Throwing.runnable(
+ () -> delete(messageIdMapper, messageList, mailboxSession, metadataWithMailbox))))
+ .block();
+ }
+
+ private void delete(MessageIdMapper messageIdMapper, List<MailboxMessage> messageList, MailboxSession mailboxSession,
+ ImmutableList<MetadataWithMailboxId> metadataWithMailbox) throws MailboxException {
messageIdMapper.delete(
messageList.stream()
.collect(Guavate.toImmutableListMultimap(
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
index b798123..f26e772 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
@@ -21,11 +21,16 @@ package org.apache.james.mailbox.store;
import static org.apache.james.mailbox.fixture.MailboxFixture.ALICE;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
import javax.mail.Flags;
@@ -37,6 +42,7 @@ import org.apache.james.mailbox.MessageIdManager;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.MessageManager.FlagsUpdateMode;
import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.MetadataWithMailboxId;
import org.apache.james.mailbox.events.EventBus;
import org.apache.james.mailbox.events.InVMEventBus;
import org.apache.james.mailbox.events.MailboxListener;
@@ -44,6 +50,7 @@ import org.apache.james.mailbox.events.MessageMoveEvent;
import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.OverQuotaException;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.fixture.MailboxFixture;
import org.apache.james.mailbox.model.FetchGroupImpl;
import org.apache.james.mailbox.model.MessageId;
@@ -58,13 +65,18 @@ import org.apache.james.mailbox.util.EventCollector;
import org.apache.james.metrics.api.NoopMetricFactory;
import org.assertj.core.api.AbstractListAssert;
import org.assertj.core.api.ObjectAssert;
+import org.assertj.core.api.SoftAssertions;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
+import org.mockito.ArgumentCaptor;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedMap;
+import reactor.core.publisher.Mono;
+
public abstract class AbstractMessageIdManagerSideEffectTest {
private static final Quota<QuotaCount> OVER_QUOTA = Quota.<QuotaCount>builder()
.used(QuotaCount.count(102))
@@ -87,8 +99,10 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
private MessageIdManagerTestSystem testingData;
private EventCollector eventCollector;
private EventBus eventBus;
+ private PreDeletionHook preDeletionHook1;
+ private PreDeletionHook preDeletionHook2;
- protected abstract MessageIdManagerTestSystem createTestSystem(QuotaManager quotaManager, EventBus eventBus) throws Exception;
+ protected abstract MessageIdManagerTestSystem createTestSystem(QuotaManager quotaManager, EventBus eventBus, Set<PreDeletionHook> preDeletionHooks) throws Exception;
public void setUp() throws Exception {
eventBus = new InVMEventBus(new InVmEventDelivery(new NoopMetricFactory()));
@@ -96,7 +110,8 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
quotaManager = mock(QuotaManager.class);
session = MailboxSessionUtil.create(ALICE);
- testingData = createTestSystem(quotaManager, eventBus);
+ setupMockForPreDeletionHooks();
+ testingData = createTestSystem(quotaManager, eventBus, ImmutableSet.of(preDeletionHook1, preDeletionHook2));
messageIdManager = testingData.getMessageIdManager();
mailbox1 = testingData.createMailbox(MailboxFixture.INBOX_ALICE, session);
@@ -104,6 +119,15 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
mailbox3 = testingData.createMailbox(MailboxFixture.SENT_ALICE, session);
}
+ private void setupMockForPreDeletionHooks() {
+ preDeletionHook1 = mock(PreDeletionHook.class);
+ when(preDeletionHook1.notifyDelete(any(PreDeletionHook.DeleteOperation.class)))
+ .thenReturn(Mono.empty());
+
+ preDeletionHook2 = mock(PreDeletionHook.class);
+ when(preDeletionHook2.notifyDelete(any(PreDeletionHook.DeleteOperation.class)))
+ .thenReturn(Mono.empty());
+ }
@Test
public void deleteShouldCallEventDispatcher() throws Exception {
givenUnlimitedQuota();
@@ -164,6 +188,128 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
}
@Test
+ public void deletesShouldCallAllPreDeletionHooks() throws Exception {
+ givenUnlimitedQuota();
+
+ MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
+ messageIdManager.delete(messageId, ImmutableList.of(mailbox1.getMailboxId()), session);
+
+ ArgumentCaptor<PreDeletionHook.DeleteOperation> preDeleteCaptor1 = ArgumentCaptor.forClass(PreDeletionHook.DeleteOperation.class);
+ ArgumentCaptor<PreDeletionHook.DeleteOperation> preDeleteCaptor2 = ArgumentCaptor.forClass(PreDeletionHook.DeleteOperation.class);
+ verify(preDeletionHook1, times(1)).notifyDelete(preDeleteCaptor1.capture());
+ verify(preDeletionHook2, times(1)).notifyDelete(preDeleteCaptor2.capture());
+
+ assertThat(preDeleteCaptor1.getValue().getDeletionMetadataList())
+ .hasSize(1)
+ .hasSameElementsAs(preDeleteCaptor2.getValue().getDeletionMetadataList())
+ .allSatisfy(deleteMetadata -> SoftAssertions.assertSoftly(softy -> {
+ softy.assertThat(deleteMetadata.getMailboxId()).isEqualTo(mailbox1.getMailboxId());
+ softy.assertThat(deleteMetadata.getMessageMetaData().getMessageId()).isEqualTo(messageId);
+ softy.assertThat(deleteMetadata.getMessageMetaData().getFlags()).isEqualTo(FLAGS);
+ }));
+
+ }
+
+ @Test
+ public void deletesShouldCallAllPreDeletionHooksOnEachMessageDeletionCall() throws Exception {
+ givenUnlimitedQuota();
+
+ MessageId messageId1 = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
+ MessageId messageId2 = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
+ messageIdManager.delete(messageId1, ImmutableList.of(mailbox1.getMailboxId()), session);
+ messageIdManager.delete(messageId2, ImmutableList.of(mailbox1.getMailboxId()), session);
+
+ ArgumentCaptor<PreDeletionHook.DeleteOperation> preDeleteCaptor1 = ArgumentCaptor.forClass(PreDeletionHook.DeleteOperation.class);
+ ArgumentCaptor<PreDeletionHook.DeleteOperation> preDeleteCaptor2 = ArgumentCaptor.forClass(PreDeletionHook.DeleteOperation.class);
+ verify(preDeletionHook1, times(2)).notifyDelete(preDeleteCaptor1.capture());
+ verify(preDeletionHook2, times(2)).notifyDelete(preDeleteCaptor2.capture());
+
+ assertThat(preDeleteCaptor1.getAllValues())
+ .hasSize(2)
+ .hasSameElementsAs(preDeleteCaptor2.getAllValues())
+ .flatExtracting(PreDeletionHook.DeleteOperation::getDeletionMetadataList)
+ .allSatisfy(deleteMetadata -> SoftAssertions.assertSoftly(softy -> {
+ softy.assertThat(deleteMetadata.getMailboxId()).isEqualTo(mailbox1.getMailboxId());
+ softy.assertThat(deleteMetadata.getMessageMetaData().getFlags()).isEqualTo(FLAGS);
+ }))
+ .extracting(deleteMetadata -> deleteMetadata.getMessageMetaData().getMessageId())
+ .containsOnly(messageId1, messageId2);
+
+ }
+
+ @Test
+ public void deletesShouldCallAllPreDeletionHooksOnEachMessageDeletionOnDifferentMailboxes() throws Exception {
+ givenUnlimitedQuota();
+
+ MessageId messageId1 = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
+ MessageId messageId2 = testingData.persist(mailbox2.getMailboxId(), messageUid1, FLAGS, session);
+ messageIdManager.delete(messageId1, ImmutableList.of(mailbox1.getMailboxId()), session);
+ messageIdManager.delete(messageId2, ImmutableList.of(mailbox2.getMailboxId()), session);
+
+ ArgumentCaptor<PreDeletionHook.DeleteOperation> preDeleteCaptor1 = ArgumentCaptor.forClass(PreDeletionHook.DeleteOperation.class);
+ ArgumentCaptor<PreDeletionHook.DeleteOperation> preDeleteCaptor2 = ArgumentCaptor.forClass(PreDeletionHook.DeleteOperation.class);
+ verify(preDeletionHook1, times(2)).notifyDelete(preDeleteCaptor1.capture());
+ verify(preDeletionHook2, times(2)).notifyDelete(preDeleteCaptor2.capture());
+
+ assertThat(preDeleteCaptor1.getAllValues())
+ .hasSameElementsAs(preDeleteCaptor2.getAllValues())
+ .flatExtracting(PreDeletionHook.DeleteOperation::getDeletionMetadataList)
+ .extracting(deleteMetadata -> deleteMetadata.getMessageMetaData().getMessageId())
+ .containsOnly(messageId1, messageId2);
+
+ assertThat(preDeleteCaptor1.getAllValues())
+ .hasSameElementsAs(preDeleteCaptor2.getAllValues())
+ .flatExtracting(PreDeletionHook.DeleteOperation::getDeletionMetadataList)
+ .extracting(MetadataWithMailboxId::getMailboxId)
+ .containsOnly(mailbox1.getMailboxId(), mailbox2.getMailboxId());
+ }
+
+ @Test
+ public void deletesShouldNotBeExecutedWhenOneOfPreDeleteHooksFails() throws Exception {
+ givenUnlimitedQuota();
+ when(preDeletionHook1.notifyDelete(any(PreDeletionHook.DeleteOperation.class)))
+ .thenThrow(new RuntimeException("throw at hook 1"));
+
+ MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
+ assertThatThrownBy(() -> messageIdManager.delete(messageId, ImmutableList.of(mailbox1.getMailboxId()), session))
+ .isInstanceOf(RuntimeException.class);
+
+ assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session)
+ .stream()
+ .map(MessageResult::getMessageId))
+ .hasSize(1)
+ .containsOnly(messageId);
+ }
+
+ @Test
+ public void deletesShouldBeExecutedAfterAllHooksFinish() throws Exception {
+ givenUnlimitedQuota();
+
+ CountDownLatch latchForHook1 = new CountDownLatch(1);
+ when(preDeletionHook1.notifyDelete(any(PreDeletionHook.DeleteOperation.class)))
+ .thenAnswer(invocation -> {
+ latchForHook1.countDown();
+ return Mono.empty();
+ });
+
+ CountDownLatch latchForHook2 = new CountDownLatch(1);
+ when(preDeletionHook2.notifyDelete(any(PreDeletionHook.DeleteOperation.class)))
+ .thenAnswer(invocation -> {
+ latchForHook2.countDown();
+ return Mono.empty();
+ });
+
+ MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
+ messageIdManager.delete(messageId, ImmutableList.of(mailbox1.getMailboxId()), session);
+
+ latchForHook1.await();
+ latchForHook2.await();
+
+ assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session))
+ .isEmpty();
+ }
+
+ @Test
public void setInMailboxesShouldNotCallDispatcherWhenMessageAlreadyInMailbox() throws Exception {
givenUnlimitedQuota();
MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxModule.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxModule.java
index f95e235..82ba294 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxModule.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxModule.java
@@ -23,6 +23,7 @@ import org.apache.james.mailbox.acl.GroupMembershipResolver;
import org.apache.james.mailbox.acl.MailboxACLResolver;
import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.store.SystemMailboxesProviderImpl;
import org.apache.james.utils.GuiceProbe;
@@ -48,6 +49,8 @@ public class MailboxModule extends AbstractModule {
bind(SystemMailboxesProviderImpl.class).in(Scopes.SINGLETON);
bind(SystemMailboxesProvider.class).to(SystemMailboxesProviderImpl.class);
+
+ Multibinder<PreDeletionHook> noPreDeletionHooks = Multibinder.newSetBinder(binder(), PreDeletionHook.class);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 05/16: MAILBOX-379 Plug PreDeletionHook to Memory
MailboxStoreManager
Posted by bt...@apache.org.
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 59a4b7e39caa04e264829fc65ce6afe9360fddae
Author: tran tien duc <dt...@linagora.com>
AuthorDate: Wed Feb 20 19:04:40 2019 +0700
MAILBOX-379 Plug PreDeletionHook to Memory MailboxStoreManager
---
.../mailbox/inmemory/InMemoryMailboxManager.java | 3 +-
.../mailbox/inmemory/InMemoryMessageManager.java | 6 ++--
.../inmemory/MemoryMailboxManagerProvider.java | 7 +++--
.../inmemory/MemoryMailboxManagerStressTest.java | 3 +-
.../mailbox/inmemory/MemoryMailboxManagerTest.java | 9 +-----
.../manager/InMemoryIntegrationResources.java | 32 +++++++++++++++++-----
6 files changed, 39 insertions(+), 21 deletions(-)
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
index bd25f42..66c261e 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
@@ -87,6 +87,7 @@ public class InMemoryMailboxManager extends StoreMailboxManager {
getMessageParser(),
getMessageIdFactory(),
configuration.getBatchSizes(),
- getStoreRightManager());
+ getStoreRightManager(),
+ getPreDeletionHooks());
}
}
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java
index 645d0fb..9dcb5ca 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java
@@ -1,6 +1,7 @@
package org.apache.james.mailbox.inmemory;
import java.util.List;
+import java.util.Set;
import javax.mail.Flags;
@@ -38,10 +39,11 @@ public class InMemoryMessageManager extends StoreMessageManager {
MessageParser messageParser,
MessageId.Factory messageIdFactory,
BatchSizes batchSizes,
- StoreRightManager storeRightManager) {
+ StoreRightManager storeRightManager,
+ Set<PreDeletionHook> preDeletionHooks) {
super(InMemoryMailboxManager.MESSAGE_CAPABILITIES, mapperFactory, index, eventBus, locker, mailbox, quotaManager, quotaRootResolver,
- messageParser, messageIdFactory, batchSizes, storeRightManager, PreDeletionHook.NO_PRE_DELETION_HOOK);
+ messageParser, messageIdFactory, batchSizes, storeRightManager, preDeletionHooks);
this.mapperFactory = (InMemoryMailboxSessionMapperFactory) mapperFactory;
}
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerProvider.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerProvider.java
index 7504574..ba24881 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerProvider.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerProvider.java
@@ -19,17 +19,20 @@
package org.apache.james.mailbox.inmemory;
+import java.util.Set;
+
import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
public class MemoryMailboxManagerProvider {
private static final int LIMIT_ANNOTATIONS = 3;
private static final int LIMIT_ANNOTATION_SIZE = 30;
- public static InMemoryMailboxManager provideMailboxManager() {
+ public static InMemoryMailboxManager provideMailboxManager(Set<PreDeletionHook> preDeletionHooks) {
return new InMemoryIntegrationResources()
.createResources(new SimpleGroupMembershipResolver(),
- LIMIT_ANNOTATIONS, LIMIT_ANNOTATION_SIZE)
+ LIMIT_ANNOTATIONS, LIMIT_ANNOTATION_SIZE, preDeletionHooks)
.getMailboxManager();
}
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerStressTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerStressTest.java
index f264ef3..a9e572e 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerStressTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerStressTest.java
@@ -21,6 +21,7 @@ package org.apache.james.mailbox.inmemory;
import org.apache.james.mailbox.MailboxManagerStressTest;
import org.apache.james.mailbox.events.EventBus;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.junit.Before;
public class MemoryMailboxManagerStressTest extends MailboxManagerStressTest<InMemoryMailboxManager> {
@@ -33,7 +34,7 @@ public class MemoryMailboxManagerStressTest extends MailboxManagerStressTest<InM
@Override
protected InMemoryMailboxManager provideManager() {
- return MemoryMailboxManagerProvider.provideMailboxManager();
+ return MemoryMailboxManagerProvider.provideMailboxManager(PreDeletionHook.NO_PRE_DELETION_HOOK);
}
@Override
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerTest.java
index 889f35d..a878764 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerTest.java
@@ -21,19 +21,12 @@ package org.apache.james.mailbox.inmemory;
import org.apache.james.mailbox.MailboxManagerTest;
import org.apache.james.mailbox.events.EventBus;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Nested;
public class MemoryMailboxManagerTest extends MailboxManagerTest<InMemoryMailboxManager> {
- @Disabled("will enable at later commits")
- @Nested
- class HookTests {
- }
-
@Override
protected InMemoryMailboxManager provideMailboxManager() {
- return MemoryMailboxManagerProvider.provideMailboxManager();
+ return MemoryMailboxManagerProvider.provideMailboxManager(preDeletionHooks());
}
@Override
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
index 8ae5009..7006099 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
@@ -19,6 +19,8 @@
package org.apache.james.mailbox.inmemory.manager;
+import java.util.Set;
+
import org.apache.james.mailbox.MessageIdManager;
import org.apache.james.mailbox.acl.GroupMembershipResolver;
import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
@@ -118,11 +120,16 @@ public class InMemoryIntegrationResources implements IntegrationResources<StoreM
}
public Resources createResources(GroupMembershipResolver groupMembershipResolver, int limitAnnotationCount, int limitAnnotationSize) {
+ return createResources(groupMembershipResolver, limitAnnotationCount, limitAnnotationSize, PreDeletionHook.NO_PRE_DELETION_HOOK);
+ }
+
+ public Resources createResources(GroupMembershipResolver groupMembershipResolver, int limitAnnotationCount, int limitAnnotationSize,
+ Set<PreDeletionHook> preDeletionHooks) {
FakeAuthenticator fakeAuthenticator = new FakeAuthenticator();
fakeAuthenticator.addUser(ManagerTestResources.USER, ManagerTestResources.USER_PASS);
fakeAuthenticator.addUser(ManagerTestResources.OTHER_USER, ManagerTestResources.OTHER_USER_PASS);
- return createResources(groupMembershipResolver, fakeAuthenticator, FakeAuthorizator.defaultReject(), limitAnnotationCount, limitAnnotationSize);
+ return createResources(groupMembershipResolver, fakeAuthenticator, FakeAuthorizator.defaultReject(), limitAnnotationCount, limitAnnotationSize, preDeletionHooks);
}
public StoreMailboxManager createMailboxManager(GroupMembershipResolver groupMembershipResolver, Authenticator authenticator, Authorizator authorizator) {
@@ -138,15 +145,26 @@ public class InMemoryIntegrationResources implements IntegrationResources<StoreM
int limitAnnotationCount, int limitAnnotationSize) {
return createResources(new InVMEventBus(new InVmEventDelivery(new NoopMetricFactory())),
- groupMembershipResolver, authenticator, authorizator, limitAnnotationCount, limitAnnotationSize);
+ groupMembershipResolver, authenticator, authorizator, limitAnnotationCount, limitAnnotationSize, PreDeletionHook.NO_PRE_DELETION_HOOK);
+ }
+
+ private Resources createResources(GroupMembershipResolver groupMembershipResolver,
+ Authenticator authenticator, Authorizator authorizator,
+ int limitAnnotationCount, int limitAnnotationSize, Set<PreDeletionHook> preDeletionHooks) {
+
+ return createResources(new InVMEventBus(new InVmEventDelivery(new NoopMetricFactory())),
+ groupMembershipResolver, authenticator, authorizator, limitAnnotationCount, limitAnnotationSize, preDeletionHooks);
}
public Resources createResources(EventBus eventBus, Authenticator authenticator, Authorizator authorizator) {
return createResources(eventBus,
- new SimpleGroupMembershipResolver(), authenticator, authorizator, MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE);
+ new SimpleGroupMembershipResolver(), authenticator, authorizator, MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE,
+ PreDeletionHook.NO_PRE_DELETION_HOOK);
}
- private Resources createResources(EventBus eventBus, GroupMembershipResolver groupMembershipResolver, Authenticator authenticator, Authorizator authorizator, int limitAnnotationCount, int limitAnnotationSize) {
+ private Resources createResources(EventBus eventBus, GroupMembershipResolver groupMembershipResolver, Authenticator authenticator, Authorizator authorizator,
+ int limitAnnotationCount, int limitAnnotationSize,
+ Set<PreDeletionHook> preDeletionHooks) {
InMemoryMailboxSessionMapperFactory mailboxSessionMapperFactory = new InMemoryMailboxSessionMapperFactory();
StoreRightManager storeRightManager = new StoreRightManager(mailboxSessionMapperFactory, new UnionMailboxACLResolver(),
groupMembershipResolver, eventBus);
@@ -174,7 +192,7 @@ public class InMemoryIntegrationResources implements IntegrationResources<StoreM
storeRightManager,
quotaComponents,
index,
- PreDeletionHook.NO_PRE_DELETION_HOOK);
+ preDeletionHooks);
eventBus.register(listeningCurrentQuotaUpdater);
eventBus.register(new MailboxAnnotationListener(mailboxSessionMapperFactory, sessionProvider));
@@ -196,9 +214,9 @@ public class InMemoryIntegrationResources implements IntegrationResources<StoreM
factory,
quotaComponents.getQuotaManager(),
quotaComponents.getQuotaRootResolver(),
- PreDeletionHook.NO_PRE_DELETION_HOOK);
+ mailboxManager.getPreDeletionHooks());
}
-
+
@Override
public QuotaManager retrieveQuotaManager(StoreMailboxManager mailboxManager) {
return mailboxManager.getQuotaComponents().getQuotaManager();
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 04/16: MAILBOX-379 Plug PreDeletionHook to
MailboxStoreManager
Posted by bt...@apache.org.
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 d2c5ca54f57baca2848266f6db37777d8e1208b5
Author: tran tien duc <dt...@linagora.com>
AuthorDate: Wed Feb 20 18:15:52 2019 +0700
MAILBOX-379 Plug PreDeletionHook to MailboxStoreManager
- Implement hook tests and enable them for Memory & Cassandra tests
- Disable hook tests for Maildir, JPA mailbox managers, because feature
seems like be not supported, when running hook tests I saw DefaultMessageId
doesn't support equals method which is used in hook tests.
- Disable temporally Memory hook tests, I see a messy setup for Memory
mailbox system, it hard to inject hooks to tested instance. Will address
it in next commits
---
.../apache/james/mailbox/MailboxManagerTest.java | 172 +++++++++++++++++++++
.../mailbox/cassandra/CassandraMailboxManager.java | 11 +-
.../mailbox/cassandra/CassandraMessageManager.java | 8 +-
.../cassandra/CassandraMailboxManagerProvider.java | 8 +-
.../CassandraMailboxManagerStressTest.java | 3 +-
.../cassandra/CassandraMailboxManagerTest.java | 3 +-
.../cassandra/CassandraTestSystemFixture.java | 2 +-
.../CassandraMailboxManagerAttachmentTest.java | 5 +-
.../ElasticSearchIntegrationTest.java | 3 +-
.../james/mailbox/jpa/JPAMailboxManager.java | 3 +-
.../james/mailbox/jpa/JPAMessageManager.java | 3 +-
.../james/mailbox/jpa/JPAMailboxManagerTest.java | 7 +
.../search/LuceneMessageSearchIndexTest.java | 3 +-
.../DomainUserMaildirMailboxManagerTest.java | 10 ++
.../maildir/FullUserMaildirMailboxManagerTest.java | 9 ++
.../maildir/MaildirMailboxManagerProvider.java | 3 +-
.../mailbox/inmemory/InMemoryMailboxManager.java | 8 +-
.../mailbox/inmemory/InMemoryMessageManager.java | 3 +-
.../mailbox/inmemory/MemoryMailboxManagerTest.java | 8 +
.../mail/InMemoryMailboxManagerAttachmentTest.java | 5 +-
.../manager/InMemoryIntegrationResources.java | 3 +-
.../InMemoryMessageIdManagerSideEffectTest.java | 3 +-
.../james/mailbox/store/StoreMailboxManager.java | 12 +-
.../james/mailbox/store/StoreMessageManager.java | 34 +++-
.../mailbox/store/StoreMailboxManagerTest.java | 3 +-
.../tools/indexer/CassandraReIndexerImplTest.java | 4 +-
.../cassandra/host/CassandraHostSystem.java | 3 +-
.../host/ElasticSearchHostSystem.java | 4 +-
.../lucenesearch/host/LuceneSearchHostSystem.java | 4 +-
.../maildir/host/MaildirHostSystem.java | 3 +-
30 files changed, 317 insertions(+), 33 deletions(-)
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index db11402..ae6e3c9 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -23,11 +23,18 @@ import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.SoftAssertions.assertSoftly;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.List;
import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
import javax.mail.Flags;
@@ -42,8 +49,10 @@ import org.apache.james.mailbox.events.MessageMoveEvent;
import org.apache.james.mailbox.exception.AnnotationException;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.TooLongMailboxNameException;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.mock.DataProvisioner;
import org.apache.james.mailbox.model.ComposedMessageId;
+import org.apache.james.mailbox.model.FetchGroupImpl;
import org.apache.james.mailbox.model.MailboxACL;
import org.apache.james.mailbox.model.MailboxAnnotation;
import org.apache.james.mailbox.model.MailboxAnnotationKey;
@@ -53,6 +62,7 @@ import org.apache.james.mailbox.model.MailboxMetaData;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.model.MessageId;
import org.apache.james.mailbox.model.MessageRange;
+import org.apache.james.mailbox.model.MessageResult;
import org.apache.james.mailbox.model.MultimailboxesSearchQuery;
import org.apache.james.mailbox.model.Quota;
import org.apache.james.mailbox.model.QuotaRoot;
@@ -61,15 +71,19 @@ import org.apache.james.mailbox.model.search.MailboxQuery;
import org.apache.james.mailbox.util.EventCollector;
import org.apache.james.mime4j.dom.Message;
import org.apache.james.util.concurrency.ConcurrentTestRunner;
+import org.assertj.core.api.SoftAssertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
+import reactor.core.publisher.Mono;
+
/**
* Test the {@link MailboxManager} methods that
* are not covered by the protocol-tester suite.
@@ -88,12 +102,20 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
private MailboxSession session;
private Message.Builder message;
+ private PreDeletionHook preDeletionHook1;
+ private PreDeletionHook preDeletionHook2;
+
protected abstract T provideMailboxManager();
protected abstract EventBus retrieveEventBus(T mailboxManager);
+ protected Set<PreDeletionHook> preDeletionHooks() {
+ return ImmutableSet.of(preDeletionHook1, preDeletionHook2);
+ }
+
@BeforeEach
void setUp() throws Exception {
+ setupMockForPreDeletionHooks();
this.mailboxManager = provideMailboxManager();
this.message = Message.Builder.of()
@@ -101,6 +123,16 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
.setBody("testmail", StandardCharsets.UTF_8);
}
+ private void setupMockForPreDeletionHooks() {
+ preDeletionHook1 = mock(PreDeletionHook.class);
+ when(preDeletionHook1.notifyDelete(any(PreDeletionHook.DeleteOperation.class)))
+ .thenReturn(Mono.empty());
+
+ preDeletionHook2 = mock(PreDeletionHook.class);
+ when(preDeletionHook2.notifyDelete(any(PreDeletionHook.DeleteOperation.class)))
+ .thenReturn(Mono.empty());
+ }
+
@AfterEach
void tearDown() throws Exception {
mailboxManager.logout(session, false);
@@ -1300,4 +1332,144 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
assertThat(session.isOpen()).isFalse();
}
}
+
+ @Nested
+ class HookTests {
+
+ @Nested
+ class PreDeletion {
+
+ private final QuotaRoot quotaRoot = QuotaRoot.quotaRoot("#private&USER_1", Optional.empty());
+ private MailboxPath inbox;
+ private MailboxId inboxId;
+ private MailboxId anotherMailboxId;
+ private MessageManager inboxManager;
+ private MessageManager anotherMailboxManager;
+
+ @BeforeEach
+ void setUp() throws Exception {
+ session = mailboxManager.createSystemSession(USER_1);
+ inbox = MailboxPath.inbox(session);
+
+ MailboxPath anotherMailboxPath = MailboxPath.forUser(USER_1, "anotherMailbox");
+ anotherMailboxId = mailboxManager.createMailbox(anotherMailboxPath, session).get();
+
+ inboxId = mailboxManager.createMailbox(inbox, session).get();
+ inboxManager = mailboxManager.getMailbox(inbox, session);
+ anotherMailboxManager = mailboxManager.getMailbox(anotherMailboxPath, session);
+ }
+
+ @Test
+ void expungeShouldCallAllPreDeletionHooks() throws Exception {
+ ComposedMessageId composeId = inboxManager.appendMessage(AppendCommand.builder()
+ .build(message), session);
+ inboxManager.expunge(MessageRange.one(composeId.getUid()), session);
+
+ ArgumentCaptor<PreDeletionHook.DeleteOperation> preDeleteCaptor1 = ArgumentCaptor.forClass(PreDeletionHook.DeleteOperation.class);
+ ArgumentCaptor<PreDeletionHook.DeleteOperation> preDeleteCaptor2 = ArgumentCaptor.forClass(PreDeletionHook.DeleteOperation.class);
+ verify(preDeletionHook1, times(1)).notifyDelete(preDeleteCaptor1.capture());
+ verify(preDeletionHook2, times(1)).notifyDelete(preDeleteCaptor2.capture());
+
+ assertThat(preDeleteCaptor1.getValue().getDeletionMetadataList())
+ .hasSize(1)
+ .hasSameElementsAs(preDeleteCaptor2.getValue().getDeletionMetadataList())
+ .allSatisfy(deleteMetadata -> SoftAssertions.assertSoftly(softy -> {
+ softy.assertThat(deleteMetadata.getMailboxId()).isEqualTo(inboxId);
+ softy.assertThat(deleteMetadata.getMessageMetaData().getMessageId()).isEqualTo(composeId.getMessageId());
+ }));
+ }
+
+ @Test
+ void expungeShouldCallAllPreDeletionHooksOnEachMessageDeletionCall() throws Exception {
+ ComposedMessageId composeId1 = inboxManager.appendMessage(AppendCommand.builder().build(message), session);
+ ComposedMessageId composeId2 = inboxManager.appendMessage(AppendCommand.builder().build(message), session);
+
+ inboxManager.expunge(MessageRange.one(composeId1.getUid()), session);
+ inboxManager.expunge(MessageRange.one(composeId2.getUid()), session);
+
+ ArgumentCaptor<PreDeletionHook.DeleteOperation> preDeleteCaptor1 = ArgumentCaptor.forClass(PreDeletionHook.DeleteOperation.class);
+ ArgumentCaptor<PreDeletionHook.DeleteOperation> preDeleteCaptor2 = ArgumentCaptor.forClass(PreDeletionHook.DeleteOperation.class);
+ verify(preDeletionHook1, times(2)).notifyDelete(preDeleteCaptor1.capture());
+ verify(preDeletionHook2, times(2)).notifyDelete(preDeleteCaptor2.capture());
+
+ assertThat(preDeleteCaptor1.getAllValues())
+ .hasSize(2)
+ .hasSameElementsAs(preDeleteCaptor2.getAllValues())
+ .flatExtracting(PreDeletionHook.DeleteOperation::getDeletionMetadataList)
+ .allSatisfy(deleteMetadata -> assertThat(deleteMetadata.getMailboxId()).isEqualTo(inboxId))
+ .extracting(deleteMetadata -> deleteMetadata.getMessageMetaData().getMessageId())
+ .containsOnly(composeId1.getMessageId(), composeId2.getMessageId());
+ }
+
+ @Test
+ void expungeShouldCallAllPreDeletionHooksOnEachMessageDeletionOnDifferentMailboxes() throws Exception {
+ ComposedMessageId composeId1 = inboxManager.appendMessage(AppendCommand.builder().build(message), session);
+ ComposedMessageId composeId2 = anotherMailboxManager.appendMessage(AppendCommand.builder().build(message), session);
+
+ inboxManager.expunge(MessageRange.one(composeId1.getUid()), session);
+ anotherMailboxManager.expunge(MessageRange.one(composeId2.getUid()), session);
+
+ ArgumentCaptor<PreDeletionHook.DeleteOperation> preDeleteCaptor1 = ArgumentCaptor.forClass(PreDeletionHook.DeleteOperation.class);
+ ArgumentCaptor<PreDeletionHook.DeleteOperation> preDeleteCaptor2 = ArgumentCaptor.forClass(PreDeletionHook.DeleteOperation.class);
+ verify(preDeletionHook1, times(2)).notifyDelete(preDeleteCaptor1.capture());
+ verify(preDeletionHook2, times(2)).notifyDelete(preDeleteCaptor2.capture());
+
+ assertThat(preDeleteCaptor1.getAllValues())
+ .hasSameElementsAs(preDeleteCaptor2.getAllValues())
+ .flatExtracting(PreDeletionHook.DeleteOperation::getDeletionMetadataList)
+ .extracting(deleteMetadata -> deleteMetadata.getMessageMetaData().getMessageId())
+ .containsOnly(composeId1.getMessageId(), composeId2.getMessageId());
+
+ assertThat(preDeleteCaptor1.getAllValues())
+ .hasSameElementsAs(preDeleteCaptor2.getAllValues())
+ .flatExtracting(PreDeletionHook.DeleteOperation::getDeletionMetadataList)
+ .extracting(MetadataWithMailboxId::getMailboxId)
+ .containsOnly(inboxId, anotherMailboxId);
+ }
+
+ @Test
+ void expungeShouldNotBeExecutedWhenOneOfPreDeleteHooksFails() throws Exception {
+ when(preDeletionHook1.notifyDelete(any(PreDeletionHook.DeleteOperation.class)))
+ .thenThrow(new RuntimeException("throw at hook 1"));
+
+ ComposedMessageId composeId1 = inboxManager.appendMessage(AppendCommand.builder().build(message), session);
+ assertThatThrownBy(() -> inboxManager.expunge(MessageRange.one(composeId1.getUid()), session))
+ .isInstanceOf(RuntimeException.class);
+
+ assertThat(ImmutableList.copyOf(inboxManager.getMessages(MessageRange.one(composeId1.getUid()), FetchGroupImpl.MINIMAL, session))
+ .stream()
+ .map(MessageResult::getMessageId))
+ .hasSize(1)
+ .containsOnly(composeId1.getMessageId());
+ }
+
+ @Test
+ void expungeShouldBeExecutedAfterAllHooksFinish() throws Exception {
+ CountDownLatch latchForHook1 = new CountDownLatch(1);
+ when(preDeletionHook1.notifyDelete(any(PreDeletionHook.DeleteOperation.class)))
+ .thenAnswer(invocation -> {
+ latchForHook1.countDown();
+ return Mono.empty();
+ });
+
+ CountDownLatch latchForHook2 = new CountDownLatch(1);
+ when(preDeletionHook2.notifyDelete(any(PreDeletionHook.DeleteOperation.class)))
+ .thenAnswer(invocation -> {
+ latchForHook2.countDown();
+ return Mono.empty();
+ });
+
+ ComposedMessageId composeId1 = inboxManager.appendMessage(AppendCommand.builder().build(message), session);
+ inboxManager.setFlags(new Flags(Flags.Flag.DELETED), MessageManager.FlagsUpdateMode.ADD,
+ MessageRange.one(composeId1.getUid()), session);
+ inboxManager.expunge(MessageRange.all(), session);
+
+ latchForHook1.await();
+ latchForHook2.await();
+
+ assertThat(inboxManager.getMessages(MessageRange.one(composeId1.getUid()), FetchGroupImpl.MINIMAL, session))
+ .isEmpty();
+ }
+ }
+ }
}
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
index 44a00ad..e1b4442 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
@@ -20,6 +20,7 @@
package org.apache.james.mailbox.cassandra;
import java.util.EnumSet;
+import java.util.Set;
import javax.inject.Inject;
@@ -27,6 +28,7 @@ import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxPathLocker;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.events.EventBus;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.model.MailboxACL;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.model.MessageId;
@@ -64,7 +66,8 @@ public class CassandraMailboxManager extends StoreMailboxManager {
MessageId.Factory messageIdFactory, EventBus eventBus,
StoreMailboxAnnotationManager annotationManager, StoreRightManager storeRightManager,
QuotaComponents quotaComponents, MessageSearchIndex index,
- MailboxManagerConfiguration configuration) {
+ MailboxManagerConfiguration configuration,
+ Set<PreDeletionHook> preDeletionHooks) {
super(mapperFactory,
sessionProvider,
locker,
@@ -75,7 +78,8 @@ public class CassandraMailboxManager extends StoreMailboxManager {
storeRightManager,
quotaComponents,
index,
- configuration);
+ configuration,
+ preDeletionHooks);
this.locker = locker;
this.mapperFactory = mapperFactory;
}
@@ -109,7 +113,8 @@ public class CassandraMailboxManager extends StoreMailboxManager {
getMessageParser(),
getMessageIdFactory(),
configuration.getBatchSizes(),
- getStoreRightManager());
+ getStoreRightManager(),
+ getPreDeletionHooks());
}
}
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java
index 918dd1d..29114a4 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java
@@ -20,6 +20,7 @@
package org.apache.james.mailbox.cassandra;
import java.util.List;
+import java.util.Set;
import javax.mail.Flags;
@@ -27,6 +28,7 @@ import org.apache.james.mailbox.MailboxPathLocker;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.events.EventBus;
import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.model.MessageAttachment;
import org.apache.james.mailbox.model.MessageId;
import org.apache.james.mailbox.quota.QuotaManager;
@@ -53,9 +55,11 @@ public class CassandraMessageManager extends StoreMessageManager {
EventBus eventBus, MailboxPathLocker locker, Mailbox mailbox, QuotaManager quotaManager,
QuotaRootResolver quotaRootResolver, MessageParser messageParser, MessageId.Factory messageIdFactory,
BatchSizes batchSizes,
- StoreRightManager storeRightManager) {
+ StoreRightManager storeRightManager,
+ Set<PreDeletionHook> preDeletionHooks) {
super(CassandraMailboxManager.MESSAGE_CAPABILITIES, mapperFactory, index, eventBus, locker, mailbox,
- quotaManager, quotaRootResolver, messageParser, messageIdFactory, batchSizes, storeRightManager);
+ quotaManager, quotaRootResolver, messageParser, messageIdFactory, batchSizes, storeRightManager,
+ preDeletionHooks);
this.mapperFactory = mapperFactory;
}
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
index 5849e2f..cdfe721 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
@@ -19,6 +19,8 @@
package org.apache.james.mailbox.cassandra;
+import java.util.Set;
+
import org.apache.james.backends.cassandra.init.CassandraTypesProvider;
import org.apache.james.mailbox.acl.GroupMembershipResolver;
import org.apache.james.mailbox.acl.MailboxACLResolver;
@@ -32,6 +34,7 @@ import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaDao;
import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaManager;
import org.apache.james.mailbox.events.InVMEventBus;
import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.quota.QuotaRootResolver;
import org.apache.james.mailbox.store.Authenticator;
import org.apache.james.mailbox.store.Authorizator;
@@ -57,7 +60,8 @@ public class CassandraMailboxManagerProvider {
private static final int LIMIT_ANNOTATIONS = 3;
private static final int LIMIT_ANNOTATION_SIZE = 30;
- public static CassandraMailboxManager provideMailboxManager(Session session, CassandraTypesProvider cassandraTypesProvider) {
+ public static CassandraMailboxManager provideMailboxManager(Session session, CassandraTypesProvider cassandraTypesProvider,
+ Set<PreDeletionHook> preDeletionHooks) {
CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory();
CassandraMailboxSessionMapperFactory mapperFactory = TestCassandraMailboxSessionMapperFactory.forTests(
@@ -90,7 +94,7 @@ public class CassandraMailboxManagerProvider {
CassandraMailboxManager manager = new CassandraMailboxManager(mapperFactory, sessionProvider, new NoMailboxPathLocker(),
messageParser, messageIdFactory, eventBus, annotationManager, storeRightManager,
- quotaComponents, index, MailboxManagerConfiguration.DEFAULT);
+ quotaComponents, index, MailboxManagerConfiguration.DEFAULT, preDeletionHooks);
eventBus.register(quotaUpdater);
eventBus.register(new MailboxAnnotationListener(mapperFactory, sessionProvider));
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
index 94d3092..4569fbd 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
@@ -24,6 +24,7 @@ import org.apache.james.backends.cassandra.DockerCassandraRule;
import org.apache.james.mailbox.MailboxManagerStressTest;
import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
import org.apache.james.mailbox.events.EventBus;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
@@ -48,7 +49,7 @@ public class CassandraMailboxManagerStressTest extends MailboxManagerStressTest<
@Override
protected CassandraMailboxManager provideManager() {
- return CassandraMailboxManagerProvider.provideMailboxManager(cassandra.getConf(), cassandra.getTypesProvider());
+ return CassandraMailboxManagerProvider.provideMailboxManager(cassandra.getConf(), cassandra.getTypesProvider(), PreDeletionHook.NO_PRE_DELETION_HOOK);
}
@Override
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
index 0408aa6..cb24d0e 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
@@ -32,7 +32,8 @@ public class CassandraMailboxManagerTest extends MailboxManagerTest<CassandraMai
protected CassandraMailboxManager provideMailboxManager() {
return CassandraMailboxManagerProvider.provideMailboxManager(
cassandra.getCassandraCluster().getConf(),
- cassandra.getCassandraCluster().getTypesProvider());
+ cassandra.getCassandraCluster().getTypesProvider(),
+ preDeletionHooks());
}
@Override
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
index 4c32722..aafe425 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
@@ -78,7 +78,7 @@ class CassandraTestSystemFixture {
MessageSearchIndex index = new SimpleMessageSearchIndex(mapperFactory, mapperFactory, new DefaultTextExtractor());
CassandraMailboxManager cassandraMailboxManager = new CassandraMailboxManager(mapperFactory, sessionProvider,
new NoMailboxPathLocker(), new MessageParser(), new CassandraMessageId.Factory(),
- eventBus, annotationManager, storeRightManager, quotaComponents, index, MailboxManagerConfiguration.DEFAULT);
+ eventBus, annotationManager, storeRightManager, quotaComponents, index, MailboxManagerConfiguration.DEFAULT, PreDeletionHook.NO_PRE_DELETION_HOOK);
eventBus.register(new MailboxAnnotationListener(mapperFactory, sessionProvider));
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
index d0ff808..23c9bb0 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
@@ -33,6 +33,7 @@ import org.apache.james.mailbox.cassandra.TestCassandraMailboxSessionMapperFacto
import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
import org.apache.james.mailbox.events.InVMEventBus;
import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.store.AbstractMailboxManagerAttachmentTest;
import org.apache.james.mailbox.store.Authenticator;
import org.apache.james.mailbox.store.Authorizator;
@@ -104,13 +105,13 @@ public class CassandraMailboxManagerAttachmentTest extends AbstractMailboxManage
mailboxManager = new CassandraMailboxManager(mailboxSessionMapperFactory, sessionProvider, new NoMailboxPathLocker(), new MessageParser(),
messageIdFactory, eventBus, annotationManager, storeRightManager, quotaComponents,
- index, MailboxManagerConfiguration.DEFAULT);
+ index, MailboxManagerConfiguration.DEFAULT, PreDeletionHook.NO_PRE_DELETION_HOOK);
MessageParser failingMessageParser = mock(MessageParser.class);
when(failingMessageParser.retrieveAttachments(any()))
.thenThrow(new RuntimeException("Message parser set to fail"));
parseFailingMailboxManager = new CassandraMailboxManager(mailboxSessionMapperFactory, sessionProvider,
new NoMailboxPathLocker(), failingMessageParser, messageIdFactory,
- eventBus, annotationManager, storeRightManager, quotaComponents, index, MailboxManagerConfiguration.DEFAULT);
+ eventBus, annotationManager, storeRightManager, quotaComponents, index, MailboxManagerConfiguration.DEFAULT, PreDeletionHook.NO_PRE_DELETION_HOOK);
}
@Override
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
index e49c063..0d1037a 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
@@ -152,7 +152,8 @@ public class ElasticSearchIntegrationTest extends AbstractMessageSearchIndexTest
annotationManager,
storeRightManager,
quotaComponents,
- elasticSearchListeningMessageSearchIndex);
+ elasticSearchListeningMessageSearchIndex,
+ PreDeletionHook.NO_PRE_DELETION_HOOK);
messageIdManager = new StoreMessageIdManager(
storeMailboxManager,
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxManager.java
index 86ae50f..b0240d5 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxManager.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxManager.java
@@ -24,6 +24,7 @@ import org.apache.james.mailbox.MailboxPathLocker;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.events.EventBus;
import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.jpa.mail.JPAMailboxMapper;
import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
import org.apache.james.mailbox.model.MailboxPath;
@@ -62,7 +63,7 @@ public abstract class JPAMailboxManager extends StoreMailboxManager {
super(mailboxSessionMapperFactory, sessionProvider, locker,
messageParser, messageIdFactory, annotationManager,
eventBus, storeRightManager, quotaComponents,
- index, MailboxManagerConfiguration.DEFAULT);
+ index, MailboxManagerConfiguration.DEFAULT, PreDeletionHook.NO_PRE_DELETION_HOOK);
}
@Override
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
index 3af130f..2ee3e8a 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
@@ -28,6 +28,7 @@ import org.apache.james.mailbox.MailboxPathLocker;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.events.EventBus;
import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMailboxMessage;
import org.apache.james.mailbox.model.MessageAttachment;
@@ -62,7 +63,7 @@ public class JPAMessageManager extends StoreMessageManager {
StoreRightManager storeRightManager) {
super(JPAMailboxManager.DEFAULT_NO_MESSAGE_CAPABILITIES, mapperFactory, index, eventBus, locker, mailbox,
- quotaManager, quotaRootResolver, messageParser, messageIdFactory, batchSizes, storeRightManager);
+ quotaManager, quotaRootResolver, messageParser, messageIdFactory, batchSizes, storeRightManager, PreDeletionHook.NO_PRE_DELETION_HOOK);
}
@Override
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
index b9e5073..0b5524b 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
@@ -26,10 +26,17 @@ import org.apache.james.mailbox.events.EventBus;
import org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
public class JPAMailboxManagerTest extends MailboxManagerTest<OpenJPAMailboxManager> {
+ @Disabled("JPAMailboxManager is using DefaultMessageId which doesn't support full feature of a messageId, which is an essential" +
+ "element of the Vault")
+ @Nested
+ class HookTests {
+ }
+
private static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(JPAMailboxFixture.MAILBOX_PERSISTANCE_CLASSES);
private Optional<OpenJPAMailboxManager> openJPAMailboxManager = Optional.empty();
diff --git a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
index d82be9c..955257f 100644
--- a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
+++ b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
@@ -78,7 +78,8 @@ public class LuceneMessageSearchIndexTest extends AbstractMessageSearchIndexTest
annotationManager,
storeRightManager,
quotaComponents,
- luceneMessageSearchIndex);
+ luceneMessageSearchIndex,
+ PreDeletionHook.NO_PRE_DELETION_HOOK);
messageIdManager = new StoreMessageIdManager(
storeMailboxManager,
diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerTest.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerTest.java
index d5be3b6..8885135 100644
--- a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerTest.java
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerTest.java
@@ -22,10 +22,18 @@ import org.apache.james.junit.TemporaryFolderExtension;
import org.apache.james.mailbox.MailboxManagerTest;
import org.apache.james.mailbox.events.EventBus;
import org.apache.james.mailbox.store.StoreMailboxManager;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.extension.RegisterExtension;
public class DomainUserMaildirMailboxManagerTest extends MailboxManagerTest<StoreMailboxManager> {
+ @Disabled("Maildir is using DefaultMessageId which doesn't support full feature of a messageId, which is an essential" +
+ "element of the Vault")
+ @Nested
+ class HookTests {
+ }
+
@RegisterExtension
TemporaryFolderExtension temporaryFolder = new TemporaryFolderExtension();
@@ -42,4 +50,6 @@ public class DomainUserMaildirMailboxManagerTest extends MailboxManagerTest<Stor
protected EventBus retrieveEventBus(StoreMailboxManager mailboxManager) {
return mailboxManager.getEventBus();
}
+
+
}
diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/FullUserMaildirMailboxManagerTest.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/FullUserMaildirMailboxManagerTest.java
index 08faae2..3e7280e 100644
--- a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/FullUserMaildirMailboxManagerTest.java
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/FullUserMaildirMailboxManagerTest.java
@@ -22,9 +22,18 @@ import org.apache.james.junit.TemporaryFolderExtension;
import org.apache.james.mailbox.MailboxManagerTest;
import org.apache.james.mailbox.events.EventBus;
import org.apache.james.mailbox.store.StoreMailboxManager;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.extension.RegisterExtension;
public class FullUserMaildirMailboxManagerTest extends MailboxManagerTest<StoreMailboxManager> {
+
+ @Disabled("Maildir is using DefaultMessageId which doesn't support full feature of a messageId, which is an essential" +
+ "element of the Vault")
+ @Nested
+ class HookTests {
+ }
+
@RegisterExtension
TemporaryFolderExtension temporaryFolder = new TemporaryFolderExtension();
diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxManagerProvider.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxManagerProvider.java
index 5eb0490..4604f53 100644
--- a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxManagerProvider.java
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxManagerProvider.java
@@ -29,6 +29,7 @@ import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
import org.apache.james.mailbox.events.InVMEventBus;
import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.store.Authenticator;
import org.apache.james.mailbox.store.Authorizator;
import org.apache.james.mailbox.store.JVMMailboxPathLocker;
@@ -72,7 +73,7 @@ public class MaildirMailboxManagerProvider {
StoreMailboxManager manager = new StoreMailboxManager(mf, sessionProvider, new JVMMailboxPathLocker(),
messageParser, new DefaultMessageId.Factory(), annotationManager, eventBus, storeRightManager,
- quotaComponents, index, MailboxManagerConfiguration.DEFAULT);
+ quotaComponents, index, MailboxManagerConfiguration.DEFAULT, PreDeletionHook.NO_PRE_DELETION_HOOK);
return manager;
}
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
index f6f6387..bd25f42 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
@@ -20,12 +20,14 @@
package org.apache.james.mailbox.inmemory;
import java.util.EnumSet;
+import java.util.Set;
import javax.inject.Inject;
import org.apache.james.mailbox.MailboxPathLocker;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.events.EventBus;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.model.MessageId;
import org.apache.james.mailbox.store.MailboxManagerConfiguration;
import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
@@ -56,9 +58,11 @@ public class InMemoryMailboxManager extends StoreMailboxManager {
StoreMailboxAnnotationManager annotationManager,
StoreRightManager storeRightManager,
QuotaComponents quotaComponents,
- MessageSearchIndex searchIndex) {
+ MessageSearchIndex searchIndex,
+ Set<PreDeletionHook> preDeletionHooks) {
super(mailboxSessionMapperFactory, sessionProvider, locker, messageParser, messageIdFactory,
- annotationManager, eventBus, storeRightManager, quotaComponents, searchIndex, MailboxManagerConfiguration.DEFAULT);
+ annotationManager, eventBus, storeRightManager, quotaComponents, searchIndex, MailboxManagerConfiguration.DEFAULT,
+ preDeletionHooks);
}
@Override
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java
index c331b6a..645d0fb 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java
@@ -8,6 +8,7 @@ import org.apache.james.mailbox.MailboxPathLocker;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.events.EventBus;
import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.model.MessageAttachment;
import org.apache.james.mailbox.model.MessageId;
import org.apache.james.mailbox.quota.QuotaManager;
@@ -40,7 +41,7 @@ public class InMemoryMessageManager extends StoreMessageManager {
StoreRightManager storeRightManager) {
super(InMemoryMailboxManager.MESSAGE_CAPABILITIES, mapperFactory, index, eventBus, locker, mailbox, quotaManager, quotaRootResolver,
- messageParser, messageIdFactory, batchSizes, storeRightManager);
+ messageParser, messageIdFactory, batchSizes, storeRightManager, PreDeletionHook.NO_PRE_DELETION_HOOK);
this.mapperFactory = (InMemoryMailboxSessionMapperFactory) mapperFactory;
}
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerTest.java
index 7ad8bcf..889f35d 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerTest.java
@@ -21,8 +21,16 @@ package org.apache.james.mailbox.inmemory;
import org.apache.james.mailbox.MailboxManagerTest;
import org.apache.james.mailbox.events.EventBus;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Nested;
public class MemoryMailboxManagerTest extends MailboxManagerTest<InMemoryMailboxManager> {
+
+ @Disabled("will enable at later commits")
+ @Nested
+ class HookTests {
+ }
+
@Override
protected InMemoryMailboxManager provideMailboxManager() {
return MemoryMailboxManagerProvider.provideMailboxManager();
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java
index 2cc6bae..ebf76fa 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java
@@ -30,6 +30,7 @@ import org.apache.james.mailbox.acl.GroupMembershipResolver;
import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
import org.apache.james.mailbox.events.InVMEventBus;
import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
import org.apache.james.mailbox.inmemory.InMemoryMessageId;
@@ -76,12 +77,12 @@ public class InMemoryMailboxManagerAttachmentTest extends AbstractMailboxManager
StoreMailboxAnnotationManager annotationManager = new StoreMailboxAnnotationManager(mailboxSessionMapperFactory, storeRightManager);
mailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, sessionProvider, new NoMailboxPathLocker(),
- new MessageParser(), messageIdFactory, eventBus, annotationManager, storeRightManager, quotaComponents, index);
+ new MessageParser(), messageIdFactory, eventBus, annotationManager, storeRightManager, quotaComponents, index, PreDeletionHook.NO_PRE_DELETION_HOOK);
MessageParser failingMessageParser = mock(MessageParser.class);
when(failingMessageParser.retrieveAttachments(any(InputStream.class)))
.thenThrow(new RuntimeException("Message parser set to fail"));
parseFailingMailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, sessionProvider, new NoMailboxPathLocker(),
- failingMessageParser, messageIdFactory, eventBus, annotationManager, storeRightManager, quotaComponents, index);
+ failingMessageParser, messageIdFactory, eventBus, annotationManager, storeRightManager, quotaComponents, index, PreDeletionHook.NO_PRE_DELETION_HOOK);
super.setUp();
}
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
index 9e5e5a5..8ae5009 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
@@ -173,7 +173,8 @@ public class InMemoryIntegrationResources implements IntegrationResources<StoreM
annotationManager,
storeRightManager,
quotaComponents,
- index);
+ index,
+ PreDeletionHook.NO_PRE_DELETION_HOOK);
eventBus.register(listeningCurrentQuotaUpdater);
eventBus.register(new MailboxAnnotationListener(mailboxSessionMapperFactory, sessionProvider));
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryMessageIdManagerSideEffectTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryMessageIdManagerSideEffectTest.java
index c99bb6b..0f84e06 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryMessageIdManagerSideEffectTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryMessageIdManagerSideEffectTest.java
@@ -83,7 +83,8 @@ public class InMemoryMessageIdManagerSideEffectTest extends AbstractMessageIdMan
new StoreMailboxAnnotationManager(mapperFactory, rightManager),
rightManager,
quotaComponents,
- index);
+ index,
+ preDeletionHooks);
StoreMessageIdManager messageIdManager = new StoreMessageIdManager(
mailboxManager,
mapperFactory,
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 7e46527..22af4a8 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -44,6 +44,7 @@ import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.MailboxExistsException;
import org.apache.james.mailbox.exception.MailboxNotFoundException;
import org.apache.james.mailbox.exception.TooLongMailboxNameException;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.model.MailboxACL;
import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
import org.apache.james.mailbox.model.MailboxACL.Right;
@@ -110,6 +111,7 @@ public class StoreMailboxManager implements MailboxManager {
private final QuotaRootResolver quotaRootResolver;
private final QuotaComponents quotaComponents;
private final MessageSearchIndex index;
+ private final Set<PreDeletionHook> preDeletionHooks;
protected final MailboxManagerConfiguration configuration;
@Inject
@@ -117,7 +119,8 @@ public class StoreMailboxManager implements MailboxManager {
MailboxPathLocker locker, MessageParser messageParser,
MessageId.Factory messageIdFactory, MailboxAnnotationManager annotationManager,
EventBus eventBus, StoreRightManager storeRightManager,
- QuotaComponents quotaComponents, MessageSearchIndex searchIndex, MailboxManagerConfiguration configuration) {
+ QuotaComponents quotaComponents, MessageSearchIndex searchIndex, MailboxManagerConfiguration configuration,
+ Set<PreDeletionHook> preDeletionHooks) {
Preconditions.checkNotNull(eventBus);
Preconditions.checkNotNull(mailboxSessionMapperFactory);
@@ -134,6 +137,7 @@ public class StoreMailboxManager implements MailboxManager {
this.quotaComponents = quotaComponents;
this.index = searchIndex;
this.configuration = configuration;
+ this.preDeletionHooks = preDeletionHooks;
}
public QuotaComponents getQuotaComponents() {
@@ -202,6 +206,10 @@ public class StoreMailboxManager implements MailboxManager {
return messageParser;
}
+ public Set<PreDeletionHook> getPreDeletionHooks() {
+ return preDeletionHooks;
+ }
+
/**
* Generate an return the next uid validity
*
@@ -251,7 +259,7 @@ public class StoreMailboxManager implements MailboxManager {
return new StoreMessageManager(DEFAULT_NO_MESSAGE_CAPABILITIES, getMapperFactory(), getMessageSearchIndex(), getEventBus(),
getLocker(), mailbox, quotaManager,
getQuotaComponents().getQuotaRootResolver(), getMessageParser(), getMessageIdFactory(), configuration.getBatchSizes(),
- getStoreRightManager());
+ getStoreRightManager(), preDeletionHooks);
}
/**
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 7b9c641..1de663a 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
@@ -19,6 +19,8 @@
package org.apache.james.mailbox.store;
+import static org.apache.james.mailbox.extension.PreDeletionHook.DeleteOperation;
+
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@@ -29,6 +31,7 @@ import java.util.EnumSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
@@ -44,6 +47,7 @@ import org.apache.james.mailbox.MailboxPathLocker;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.MetadataWithMailboxId;
import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
import org.apache.james.mailbox.events.EventBus;
import org.apache.james.mailbox.events.MailboxIdRegistrationKey;
@@ -51,6 +55,7 @@ import org.apache.james.mailbox.events.MailboxListener;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.ReadOnlyException;
import org.apache.james.mailbox.exception.UnsupportedRightException;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.model.ComposedMessageId;
import org.apache.james.mailbox.model.MailboxACL;
import org.apache.james.mailbox.model.MailboxCounters;
@@ -89,15 +94,19 @@ import org.apache.james.mime4j.stream.MimeTokenStream;
import org.apache.james.mime4j.stream.RecursionMode;
import org.apache.james.util.BodyOffsetInputStream;
import org.apache.james.util.IteratorWrapper;
+import org.apache.james.util.StreamUtils;
import org.apache.james.util.streams.Iterators;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.github.fge.lambdas.Throwing;
import com.github.steveash.guavate.Guavate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSortedMap;
import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+import reactor.core.scheduler.Schedulers;
/**
* Base class for {@link MessageManager}
@@ -112,6 +121,7 @@ import reactor.core.publisher.Flux;
*/
public class StoreMessageManager implements MessageManager {
+ private static final int NO_LIMIT = -1;
private static final MailboxCounters ZERO_MAILBOX_COUNTERS = MailboxCounters.builder()
.count(0)
.unseen(0)
@@ -148,12 +158,13 @@ public class StoreMessageManager implements MessageManager {
private final MessageParser messageParser;
private final Factory messageIdFactory;
private final BatchSizes batchSizes;
+ private final Set<PreDeletionHook> preDeletionHooks;
public StoreMessageManager(EnumSet<MailboxManager.MessageCapabilities> messageCapabilities, MailboxSessionMapperFactory mapperFactory,
MessageSearchIndex index, EventBus eventBus,
MailboxPathLocker locker, Mailbox mailbox,
QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, MessageParser messageParser, MessageId.Factory messageIdFactory, BatchSizes batchSizes,
- StoreRightManager storeRightManager) {
+ StoreRightManager storeRightManager, Set<PreDeletionHook> preDeletionHooks) {
this.messageCapabilities = messageCapabilities;
this.eventBus = eventBus;
this.mailbox = mailbox;
@@ -166,6 +177,7 @@ public class StoreMessageManager implements MessageManager {
this.messageIdFactory = messageIdFactory;
this.batchSizes = batchSizes;
this.storeRightManager = storeRightManager;
+ this.preDeletionHooks = preDeletionHooks;
}
protected Factory getMessageIdFactory() {
@@ -284,6 +296,8 @@ public class StoreMessageManager implements MessageManager {
private Map<MessageUid, MessageMetaData> deleteMessages(List<MessageUid> messageUids, MailboxSession session) throws MailboxException {
MessageMapper messageMapper = mapperFactory.getMessageMapper(session);
+ runPredeletionHooks(messageUids, session);
+
return messageMapper.execute(
() -> messageMapper.deleteMessages(getMailboxEntity(), messageUids));
}
@@ -715,6 +729,24 @@ public class StoreMessageManager implements MessageManager {
}
+ private void runPredeletionHooks(List<MessageUid> uids, MailboxSession session) throws MailboxException {
+ MessageMapper messageMapper = mapperFactory.getMessageMapper(session);
+
+ DeleteOperation deleteOperation = Flux.fromIterable(MessageRange.toRanges(uids))
+ .publishOn(Schedulers.elastic())
+ .flatMap(range -> Mono.fromCallable(() -> messageMapper.findInMailbox(mailbox, range, FetchType.Metadata, NO_LIMIT))
+ .flatMapMany(iterator -> Flux.fromStream(Iterators.toStream(iterator))))
+ .map(mailboxMessage -> MetadataWithMailboxId.from(mailboxMessage.metaData(), mailboxMessage.getMailboxId()))
+ .collect(Guavate.toImmutableList())
+ .map(DeleteOperation::from)
+ .block();
+
+ Flux.fromIterable(preDeletionHooks)
+ .publishOn(Schedulers.elastic())
+ .flatMap(hook -> hook.notifyDelete(deleteOperation))
+ .blockLast();
+ }
+
@Override
public Iterator<MessageUid> search(SearchQuery query, MailboxSession mailboxSession) throws MailboxException {
if (query.equals(new SearchQuery(SearchQuery.all()))) {
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
index b5b5ca1..b32ffa9 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
@@ -36,6 +36,7 @@ import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.MailboxNotFoundException;
import org.apache.james.mailbox.exception.NotAdminException;
import org.apache.james.mailbox.exception.UserDoesNotExistException;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.model.MailboxACL;
import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
@@ -93,7 +94,7 @@ public class StoreMailboxManagerTest {
storeMailboxManager = new StoreMailboxManager(mockedMapperFactory, sessionProvider,
new JVMMailboxPathLocker(), new MessageParser(), messageIdFactory,
- annotationManager, eventBus, storeRightManager, quotaComponents, index, MailboxManagerConfiguration.DEFAULT);
+ annotationManager, eventBus, storeRightManager, quotaComponents, index, MailboxManagerConfiguration.DEFAULT, PreDeletionHook.NO_PRE_DELETION_HOOK);
}
@Test(expected = MailboxNotFoundException.class)
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/CassandraReIndexerImplTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/CassandraReIndexerImplTest.java
index 7161b38..ca278ee 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/CassandraReIndexerImplTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/CassandraReIndexerImplTest.java
@@ -35,6 +35,7 @@ import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.cassandra.CassandraMailboxManager;
import org.apache.james.mailbox.cassandra.CassandraMailboxManagerProvider;
import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.indexer.ReIndexer;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
@@ -61,7 +62,8 @@ public class CassandraReIndexerImplTest {
@BeforeEach
void setUp(CassandraCluster cassandra) {
- mailboxManager = CassandraMailboxManagerProvider.provideMailboxManager(cassandra.getConf(), cassandra.getTypesProvider());
+ mailboxManager = CassandraMailboxManagerProvider.provideMailboxManager(cassandra.getConf(), cassandra.getTypesProvider(),
+ PreDeletionHook.NO_PRE_DELETION_HOOK);
MailboxSessionMapperFactory mailboxSessionMapperFactory = mailboxManager.getMapperFactory();
messageSearchIndex = mock(ListeningMessageSearchIndex.class);
reIndexer = new ReIndexerImpl(new ReIndexerPerformer(mailboxManager, messageSearchIndex, mailboxSessionMapperFactory),
diff --git a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
index 2b4d901..62a64a8 100644
--- a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
+++ b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
@@ -40,6 +40,7 @@ import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaDao;
import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaManager;
import org.apache.james.mailbox.events.InVMEventBus;
import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.quota.QuotaRootResolver;
import org.apache.james.mailbox.store.JVMMailboxPathLocker;
import org.apache.james.mailbox.store.MailboxManagerConfiguration;
@@ -112,7 +113,7 @@ public class CassandraHostSystem extends JamesImapHostSystem {
mailboxManager = new CassandraMailboxManager(mapperFactory, sessionProvider,
new JVMMailboxPathLocker(), new MessageParser(), messageIdFactory,
- eventBus, annotationManager, storeRightManager, quotaComponents, index, MailboxManagerConfiguration.DEFAULT);
+ eventBus, annotationManager, storeRightManager, quotaComponents, index, MailboxManagerConfiguration.DEFAULT, PreDeletionHook.NO_PRE_DELETION_HOOK);
eventBus.register(quotaUpdater);
diff --git a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
index d599899..e0c85b5 100644
--- a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
+++ b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
@@ -51,6 +51,7 @@ import org.apache.james.mailbox.elasticsearch.search.ElasticSearchSearcher;
import org.apache.james.mailbox.events.InVMEventBus;
import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.inmemory.InMemoryId;
import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
@@ -140,7 +141,8 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem {
annotationManager,
storeRightManager,
quotaComponents,
- searchIndex);
+ searchIndex,
+ PreDeletionHook.NO_PRE_DELETION_HOOK);
eventBus.register(searchIndex);
diff --git a/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java b/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
index 52756d6..a2a7c3d 100644
--- a/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
+++ b/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
@@ -37,6 +37,7 @@ import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
import org.apache.james.mailbox.events.InVMEventBus;
import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.inmemory.InMemoryId;
import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
@@ -118,7 +119,8 @@ public class LuceneSearchHostSystem extends JamesImapHostSystem {
new StoreMailboxAnnotationManager(mapperFactory, rightManager),
rightManager,
QuotaComponents.disabled(sessionProvider, mapperFactory),
- searchIndex);
+ searchIndex,
+ PreDeletionHook.NO_PRE_DELETION_HOOK);
searchIndex.setEnableSuffixMatch(true);
diff --git a/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java b/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
index ae23921..4612fea 100644
--- a/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
+++ b/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
@@ -35,6 +35,7 @@ import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
import org.apache.james.mailbox.events.InVMEventBus;
import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
+import org.apache.james.mailbox.extension.PreDeletionHook;
import org.apache.james.mailbox.maildir.MaildirMailboxSessionMapperFactory;
import org.apache.james.mailbox.maildir.MaildirStore;
import org.apache.james.mailbox.store.JVMMailboxPathLocker;
@@ -85,7 +86,7 @@ public class MaildirHostSystem extends JamesImapHostSystem {
mailboxManager = new StoreMailboxManager(mailboxSessionMapperFactory, sessionProvider, locker,
messageParser, new DefaultMessageId.Factory(), annotationManager, eventBus, storeRightManager, quotaComponents,
- index, MailboxManagerConfiguration.DEFAULT);
+ index, MailboxManagerConfiguration.DEFAULT, PreDeletionHook.NO_PRE_DELETION_HOOK);
ImapProcessor defaultImapProcessorFactory =
DefaultImapProcessorFactory.createDefaultProcessor(
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 13/16: MAILBOX-380 Implement
CassandraEventDeadLetters
Posted by bt...@apache.org.
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 71fa3cc45e56756fb4e25856897fbce99a8accec
Author: datph <dp...@linagora.com>
AuthorDate: Thu Feb 21 11:18:31 2019 +0700
MAILBOX-380 Implement CassandraEventDeadLetters
---
.../james/mailbox/events/EventDeadLetters.java | 5 ++
.../mailbox/events/EventDeadLettersContract.java | 7 +--
mailbox/event/event-cassandra/pom.xml | 42 +++++++++++++++++
.../mailbox/events/CassandraEventDeadLetters.java} | 39 +++++-----------
.../events/CassandraEventDeadLettersDAO.java | 2 +-
.../events/CassandraEventDeadLettersTest.java | 53 ++++++++++++++++++++++
.../mailbox/events/MemoryEventDeadLetters.java | 4 --
7 files changed, 117 insertions(+), 35 deletions(-)
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventDeadLetters.java b/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventDeadLetters.java
index ed3dee5..c505918 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventDeadLetters.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/events/EventDeadLetters.java
@@ -23,6 +23,11 @@ import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface EventDeadLetters {
+
+ String REGISTERED_GROUP_CANNOT_BE_NULL = "registeredGroup cannot be null";
+ String FAIL_DELIVERED_EVENT_CANNOT_BE_NULL = "failDeliveredEvent cannot be null";
+ String FAIL_DELIVERED_ID_EVENT_CANNOT_BE_NULL = "failDeliveredEventId cannot be null";
+
Mono<Void> store(Group registeredGroup, Event failDeliveredEvent);
Mono<Void> remove(Group registeredGroup, Event.EventId failDeliveredEventId);
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
index b0d21d9..d1d6a37 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
@@ -167,7 +167,7 @@ interface EventDeadLettersContract {
.operation((threadNumber, step) -> {
Event.EventId eventId = Event.EventId.random();
storedEventIds.put(threadNumber, eventId);
- eventDeadLetters.store(groups.get(threadNumber), event(eventId));
+ eventDeadLetters.store(groups.get(threadNumber), event(eventId)).subscribe();
})
.threadCount(THREAD_COUNT)
.operationCount(OPERATION_COUNT)
@@ -175,7 +175,7 @@ interface EventDeadLettersContract {
groups.forEach((groupId, group) -> {
Group storedGroup = groups.get(groupId);
- assertThat(eventDeadLetters.failedEventIds(storedGroup).toStream())
+ assertThat(eventDeadLetters.failedEventIds(storedGroup).collectList().block())
.hasSameElementsAs(storedEventIds.get(groupId));
});
}
@@ -265,7 +265,8 @@ interface EventDeadLettersContract {
ConcurrentTestRunner.builder()
.operation((threadNumber, step) -> {
int operationIndex = threadNumber * OPERATION_COUNT + step;
- eventDeadLetters.remove(groups.get(threadNumber), storedEventIds.get(operationIndex));
+ eventDeadLetters.remove(groups.get(threadNumber), storedEventIds.get(operationIndex))
+ .subscribe();
})
.threadCount(THREAD_COUNT)
.operationCount(OPERATION_COUNT)
diff --git a/mailbox/event/event-cassandra/pom.xml b/mailbox/event/event-cassandra/pom.xml
index 1bc6222..b3cc19e 100644
--- a/mailbox/event/event-cassandra/pom.xml
+++ b/mailbox/event/event-cassandra/pom.xml
@@ -39,12 +39,54 @@
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
+ <artifactId>apache-james-backends-cassandra</artifactId>
+ <scope>test</scope>
+ <type>test-jar</type>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
<artifactId>apache-james-mailbox-api</artifactId>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
+ <artifactId>apache-james-mailbox-api</artifactId>
+ <scope>test</scope>
+ <type>test-jar</type>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>apache-james-mailbox-cassandra</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
<artifactId>apache-james-mailbox-event-json</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.assertj</groupId>
+ <artifactId>assertj-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.jupiter</groupId>
+ <artifactId>junit-jupiter-engine</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.platform</groupId>
+ <artifactId>junit-platform-launcher</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.vintage</groupId>
+ <artifactId>junit-vintage-engine</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.testcontainers</groupId>
+ <artifactId>testcontainers</artifactId>
+ <scope>test</scope>
+ </dependency>
</dependencies>
diff --git a/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLetters.java
similarity index 62%
copy from mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java
copy to mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLetters.java
index 45fff05..6530d1d 100644
--- a/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java
+++ b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLetters.java
@@ -19,25 +19,20 @@
package org.apache.james.mailbox.events;
+import javax.inject.Inject;
+
import com.google.common.base.Preconditions;
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Multimaps;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
-import reactor.core.publisher.MonoProcessor;
-
-public class MemoryEventDeadLetters implements EventDeadLetters {
- private static final String REGISTERED_GROUP_CANNOT_BE_NULL = "registeredGroup cannot be null";
- private static final String FAIL_DELIVERED_EVENT_CANNOT_BE_NULL = "failDeliveredEvent cannot be null";
- private static final String FAIL_DELIVERED_ID_EVENT_CANNOT_BE_NULL = "failDeliveredEventId cannot be null";
+public class CassandraEventDeadLetters implements EventDeadLetters {
- private final Multimap<Group, Event> deadLetters;
+ private final CassandraEventDeadLettersDAO cassandraEventDeadLettersDAO;
- public MemoryEventDeadLetters() {
- this.deadLetters = Multimaps.synchronizedSetMultimap(HashMultimap.create());
+ @Inject
+ public CassandraEventDeadLetters(CassandraEventDeadLettersDAO cassandraEventDeadLettersDAO) {
+ this.cassandraEventDeadLettersDAO = cassandraEventDeadLettersDAO;
}
@Override
@@ -45,9 +40,7 @@ public class MemoryEventDeadLetters implements EventDeadLetters {
Preconditions.checkArgument(registeredGroup != null, REGISTERED_GROUP_CANNOT_BE_NULL);
Preconditions.checkArgument(failDeliveredEvent != null, FAIL_DELIVERED_EVENT_CANNOT_BE_NULL);
- return Mono.fromRunnable(() -> deadLetters.put(registeredGroup, failDeliveredEvent))
- .subscribeWith(MonoProcessor.create())
- .then();
+ return cassandraEventDeadLettersDAO.store(registeredGroup, failDeliveredEvent);
}
@Override
@@ -55,12 +48,7 @@ public class MemoryEventDeadLetters implements EventDeadLetters {
Preconditions.checkArgument(registeredGroup != null, REGISTERED_GROUP_CANNOT_BE_NULL);
Preconditions.checkArgument(failDeliveredEventId != null, FAIL_DELIVERED_ID_EVENT_CANNOT_BE_NULL);
- return Flux.fromIterable(deadLetters.get(registeredGroup))
- .filter(event -> event.getEventId().equals(failDeliveredEventId))
- .next()
- .doOnNext(event -> deadLetters.remove(registeredGroup, event))
- .subscribeWith(MonoProcessor.create())
- .then();
+ return cassandraEventDeadLettersDAO.removeEvent(registeredGroup, failDeliveredEventId);
}
@Override
@@ -68,21 +56,18 @@ public class MemoryEventDeadLetters implements EventDeadLetters {
Preconditions.checkArgument(registeredGroup != null, REGISTERED_GROUP_CANNOT_BE_NULL);
Preconditions.checkArgument(failDeliveredEventId != null, FAIL_DELIVERED_ID_EVENT_CANNOT_BE_NULL);
- return Flux.fromIterable(deadLetters.get(registeredGroup))
- .filter(event -> event.getEventId().equals(failDeliveredEventId))
- .next();
+ return cassandraEventDeadLettersDAO.retrieveFailedEvent(registeredGroup, failDeliveredEventId);
}
@Override
public Flux<Event.EventId> failedEventIds(Group registeredGroup) {
Preconditions.checkArgument(registeredGroup != null, REGISTERED_GROUP_CANNOT_BE_NULL);
- return Flux.fromIterable(deadLetters.get(registeredGroup))
- .map(Event::getEventId);
+ return cassandraEventDeadLettersDAO.retrieveEventIdsWithGroup(registeredGroup);
}
@Override
public Flux<Group> groupsWithFailedEvents() {
- return Flux.fromIterable(deadLetters.keySet());
+ return cassandraEventDeadLettersDAO.retrieveAllGroups();
}
}
diff --git a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java
index 0eab33b..2056f55 100644
--- a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java
+++ b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAO.java
@@ -110,7 +110,7 @@ public class CassandraEventDeadLettersDAO {
return executor.executeSingleRow(selectEventStatement.bind()
.setString(GROUP, group.asString())
.setUUID(EVENT_ID, failedEventId.getId()))
- .map(row -> deserializeEvent(row.getString(EVENT)));
+ .map(row -> deserializeEvent(row.getString(EVENT)));
}
Flux<Event.EventId> retrieveEventIdsWithGroup(Group group) {
diff --git a/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java
new file mode 100644
index 0000000..2c108d4
--- /dev/null
+++ b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java
@@ -0,0 +1,53 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.mailbox.events;
+
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.event.json.EventSerializer;
+import org.apache.james.mailbox.events.EventDeadLettersContract.FailedEventContract;
+import org.apache.james.mailbox.events.EventDeadLettersContract.FailedEventsContract;
+import org.apache.james.mailbox.events.EventDeadLettersContract.GroupsWithFailedEventsContract;
+import org.apache.james.mailbox.events.EventDeadLettersContract.RemoveContract;
+import org.apache.james.mailbox.events.EventDeadLettersContract.StoreContract;
+import org.apache.james.mailbox.model.TestId;
+import org.apache.james.mailbox.model.TestMessageId;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+class CassandraEventDeadLettersTest implements StoreContract, RemoveContract, FailedEventContract, FailedEventsContract,
+ GroupsWithFailedEventsContract {
+
+ @RegisterExtension
+ static CassandraClusterExtension cassandraClusterExtension = new CassandraClusterExtension(CassandraEventDeadLettersModule.MODULE);
+
+ private CassandraEventDeadLetters eventDeadLetters;
+
+ @BeforeEach
+ void setUp(CassandraCluster cassandraCluster) {
+ EventSerializer eventSerializer = new EventSerializer(new TestId.Factory(), new TestMessageId.Factory());
+ eventDeadLetters = new CassandraEventDeadLetters(new CassandraEventDeadLettersDAO(cassandraCluster.getConf(), eventSerializer));
+ }
+
+ @Override
+ public EventDeadLetters eventDeadLetters() {
+ return eventDeadLetters;
+ }
+}
diff --git a/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java b/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java
index 45fff05..fcddc5e 100644
--- a/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java
+++ b/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/MemoryEventDeadLetters.java
@@ -30,10 +30,6 @@ import reactor.core.publisher.MonoProcessor;
public class MemoryEventDeadLetters implements EventDeadLetters {
- private static final String REGISTERED_GROUP_CANNOT_BE_NULL = "registeredGroup cannot be null";
- private static final String FAIL_DELIVERED_EVENT_CANNOT_BE_NULL = "failDeliveredEvent cannot be null";
- private static final String FAIL_DELIVERED_ID_EVENT_CANNOT_BE_NULL = "failDeliveredEventId cannot be null";
-
private final Multimap<Group, Event> deadLetters;
public MemoryEventDeadLetters() {
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 16/16: MAILBOX-380 Create
CassandraEventDeadLettersGroupTable With DAO
Posted by bt...@apache.org.
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 49df4ff7a51c4754bec8679b0dffb6f2a2ad7382
Author: datph <dp...@linagora.com>
AuthorDate: Fri Feb 22 15:40:34 2019 +0700
MAILBOX-380 Create CassandraEventDeadLettersGroupTable With DAO
to increase the performance when retrieve all group of failed event
---
.../mailbox/events/EventDeadLettersContract.java | 2 +-
.../mailbox/events/CassandraEventDeadLetters.java | 10 +++-
.../events/CassandraEventDeadLettersGroupDAO.java | 70 ++++++++++++++++++++++
.../events/CassandraEventDeadLettersModule.java | 5 ++
.../CassandraEventDeadLettersGroupTable.java} | 22 ++-----
.../events/CassandraEventDeadLettersDAOTest.java | 22 +------
... => CassandraEventDeadLettersGroupDAOTest.java} | 45 ++++++++------
.../events/CassandraEventDeadLettersTest.java | 3 +-
8 files changed, 116 insertions(+), 63 deletions(-)
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
index d1d6a37..6bb00e6 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
@@ -396,7 +396,7 @@ interface EventDeadLettersContract {
eventDeadLetters.store(GROUP_A, EVENT_1).block();
eventDeadLetters.store(GROUP_B, EVENT_1).block();
- assertThat(eventDeadLetters.groupsWithFailedEvents().toStream())
+ assertThat(eventDeadLetters.groupsWithFailedEvents().collectList().block())
.containsOnly(GROUP_A, GROUP_B);
}
diff --git a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLetters.java b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLetters.java
index 6530d1d..b155b3b 100644
--- a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLetters.java
+++ b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLetters.java
@@ -29,10 +29,13 @@ import reactor.core.publisher.Mono;
public class CassandraEventDeadLetters implements EventDeadLetters {
private final CassandraEventDeadLettersDAO cassandraEventDeadLettersDAO;
+ private final CassandraEventDeadLettersGroupDAO cassandraEventDeadLettersGroupDAO;
@Inject
- public CassandraEventDeadLetters(CassandraEventDeadLettersDAO cassandraEventDeadLettersDAO) {
+ public CassandraEventDeadLetters(CassandraEventDeadLettersDAO cassandraEventDeadLettersDAO,
+ CassandraEventDeadLettersGroupDAO cassandraEventDeadLettersGroupDAO) {
this.cassandraEventDeadLettersDAO = cassandraEventDeadLettersDAO;
+ this.cassandraEventDeadLettersGroupDAO = cassandraEventDeadLettersGroupDAO;
}
@Override
@@ -40,7 +43,8 @@ public class CassandraEventDeadLetters implements EventDeadLetters {
Preconditions.checkArgument(registeredGroup != null, REGISTERED_GROUP_CANNOT_BE_NULL);
Preconditions.checkArgument(failDeliveredEvent != null, FAIL_DELIVERED_EVENT_CANNOT_BE_NULL);
- return cassandraEventDeadLettersDAO.store(registeredGroup, failDeliveredEvent);
+ return cassandraEventDeadLettersDAO.store(registeredGroup, failDeliveredEvent)
+ .then(cassandraEventDeadLettersGroupDAO.storeGroup(registeredGroup));
}
@Override
@@ -68,6 +72,6 @@ public class CassandraEventDeadLetters implements EventDeadLetters {
@Override
public Flux<Group> groupsWithFailedEvents() {
- return cassandraEventDeadLettersDAO.retrieveAllGroups();
+ return cassandraEventDeadLettersGroupDAO.retrieveAllGroups();
}
}
diff --git a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersGroupDAO.java b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersGroupDAO.java
new file mode 100644
index 0000000..bb37a3d
--- /dev/null
+++ b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersGroupDAO.java
@@ -0,0 +1,70 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.mailbox.events;
+
+import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
+import static org.apache.james.mailbox.events.tables.CassandraEventDeadLettersGroupTable.GROUP;
+import static org.apache.james.mailbox.events.tables.CassandraEventDeadLettersGroupTable.TABLE_NAME;
+
+import javax.inject.Inject;
+
+import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
+
+import com.datastax.driver.core.PreparedStatement;
+import com.datastax.driver.core.Session;
+import com.github.fge.lambdas.Throwing;
+
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+public class CassandraEventDeadLettersGroupDAO {
+ private final CassandraAsyncExecutor executor;
+ private final PreparedStatement insertStatement;
+ private final PreparedStatement selectAllStatement;
+
+ @Inject
+ CassandraEventDeadLettersGroupDAO(Session session) {
+ this.executor = new CassandraAsyncExecutor(session);
+ this.insertStatement = prepareInsertStatement(session);
+ this.selectAllStatement = prepareSelectStatement(session);
+ }
+
+ private PreparedStatement prepareInsertStatement(Session session) {
+ return session.prepare(insertInto(TABLE_NAME)
+ .value(GROUP, bindMarker(GROUP)));
+ }
+
+ private PreparedStatement prepareSelectStatement(Session session) {
+ return session.prepare(select(GROUP)
+ .from(TABLE_NAME));
+ }
+
+ Mono<Void> storeGroup(Group group) {
+ return executor.executeVoid(insertStatement.bind()
+ .setString(GROUP, group.asString()));
+ }
+
+ Flux<Group> retrieveAllGroups() {
+ return executor.executeRows(selectAllStatement.bind())
+ .map(Throwing.function(row -> Group.deserialize(row.getString(GROUP))));
+ }
+}
diff --git a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersModule.java b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersModule.java
index f8b1e30..72e354c 100644
--- a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersModule.java
+++ b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersModule.java
@@ -21,6 +21,7 @@ package org.apache.james.mailbox.events;
import org.apache.james.backends.cassandra.components.CassandraModule;
import org.apache.james.backends.cassandra.utils.CassandraConstants;
+import org.apache.james.mailbox.events.tables.CassandraEventDeadLettersGroupTable;
import org.apache.james.mailbox.events.tables.CassandraEventDeadLettersTable;
import com.datastax.driver.core.DataType;
@@ -37,5 +38,9 @@ public interface CassandraEventDeadLettersModule {
.addPartitionKey(CassandraEventDeadLettersTable.GROUP, DataType.text())
.addClusteringColumn(CassandraEventDeadLettersTable.EVENT_ID, DataType.uuid())
.addColumn(CassandraEventDeadLettersTable.EVENT, DataType.text()))
+ .table(CassandraEventDeadLettersGroupTable.TABLE_NAME)
+ .comment("Projection table for retrieving groups for all failed events")
+ .statement(statement -> statement
+ .addPartitionKey(CassandraEventDeadLettersGroupTable.GROUP, DataType.text()))
.build();
}
diff --git a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersModule.java b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/tables/CassandraEventDeadLettersGroupTable.java
similarity index 52%
copy from mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersModule.java
copy to mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/tables/CassandraEventDeadLettersGroupTable.java
index f8b1e30..b1d6219 100644
--- a/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/CassandraEventDeadLettersModule.java
+++ b/mailbox/event/event-cassandra/src/main/java/org/apache/james/mailbox/events/tables/CassandraEventDeadLettersGroupTable.java
@@ -17,25 +17,11 @@
* under the License. *
****************************************************************/
-package org.apache.james.mailbox.events;
+package org.apache.james.mailbox.events.tables;
-import org.apache.james.backends.cassandra.components.CassandraModule;
-import org.apache.james.backends.cassandra.utils.CassandraConstants;
-import org.apache.james.mailbox.events.tables.CassandraEventDeadLettersTable;
+public interface CassandraEventDeadLettersGroupTable {
-import com.datastax.driver.core.DataType;
-import com.datastax.driver.core.schemabuilder.SchemaBuilder;
+ String TABLE_NAME = "group_table";
-public interface CassandraEventDeadLettersModule {
- CassandraModule MODULE = CassandraModule.builder()
- .table(CassandraEventDeadLettersTable.TABLE_NAME)
- .comment("Holds event dead letter")
- .options(options -> options
- .caching(SchemaBuilder.KeyCaching.ALL,
- SchemaBuilder.rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION)))
- .statement(statement -> statement
- .addPartitionKey(CassandraEventDeadLettersTable.GROUP, DataType.text())
- .addClusteringColumn(CassandraEventDeadLettersTable.EVENT_ID, DataType.uuid())
- .addColumn(CassandraEventDeadLettersTable.EVENT, DataType.text()))
- .build();
+ String GROUP = "group";
}
diff --git a/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAOTest.java b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAOTest.java
index 7bc66a7..e5da4df 100644
--- a/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAOTest.java
+++ b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersDAOTest.java
@@ -58,7 +58,7 @@ class CassandraEventDeadLettersDAOTest {
cassandraEventDeadLettersDAO.removeEvent(GROUP_A, EVENT_ID_1).block();
assertThat(cassandraEventDeadLettersDAO
- .retrieveAllGroups()
+ .retrieveEventIdsWithGroup(GROUP_A)
.collectList().block())
.isEmpty();
}
@@ -101,24 +101,4 @@ class CassandraEventDeadLettersDAOTest {
.collectList().block())
.containsOnly(EVENT_ID_1, EVENT_ID_2, EVENT_ID_3);
}
-
- @Test
- void retrieveAllGroupsShouldReturnEmptyWhenDefault() {
- assertThat(cassandraEventDeadLettersDAO
- .retrieveAllGroups()
- .collectList().block())
- .isEmpty();
- }
-
- @Test
- void retrieveAllGroupsShouldReturnStoredGroups() {
- cassandraEventDeadLettersDAO.store(GROUP_A, EVENT_1).block();
- cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_2).block();
- cassandraEventDeadLettersDAO.store(GROUP_B, EVENT_3).block();
-
- assertThat(cassandraEventDeadLettersDAO
- .retrieveAllGroups()
- .collectList().block())
- .containsOnly(GROUP_A, GROUP_B);
- }
}
diff --git a/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersGroupDAOTest.java
similarity index 56%
copy from mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java
copy to mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersGroupDAOTest.java
index 2c108d4..c5bc092 100644
--- a/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java
+++ b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersGroupDAOTest.java
@@ -19,35 +19,42 @@
package org.apache.james.mailbox.events;
+import static org.apache.james.mailbox.events.EventDeadLettersContract.GROUP_A;
+import static org.apache.james.mailbox.events.EventDeadLettersContract.GROUP_B;
+import static org.assertj.core.api.Assertions.assertThat;
+
import org.apache.james.backends.cassandra.CassandraCluster;
import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.event.json.EventSerializer;
-import org.apache.james.mailbox.events.EventDeadLettersContract.FailedEventContract;
-import org.apache.james.mailbox.events.EventDeadLettersContract.FailedEventsContract;
-import org.apache.james.mailbox.events.EventDeadLettersContract.GroupsWithFailedEventsContract;
-import org.apache.james.mailbox.events.EventDeadLettersContract.RemoveContract;
-import org.apache.james.mailbox.events.EventDeadLettersContract.StoreContract;
-import org.apache.james.mailbox.model.TestId;
-import org.apache.james.mailbox.model.TestMessageId;
-import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
-class CassandraEventDeadLettersTest implements StoreContract, RemoveContract, FailedEventContract, FailedEventsContract,
- GroupsWithFailedEventsContract {
+public class CassandraEventDeadLettersGroupDAOTest {
@RegisterExtension
static CassandraClusterExtension cassandraClusterExtension = new CassandraClusterExtension(CassandraEventDeadLettersModule.MODULE);
- private CassandraEventDeadLetters eventDeadLetters;
+ private static CassandraEventDeadLettersGroupDAO GROUP_DAO;
+
+ @BeforeAll
+ static void setUp(CassandraCluster cassandraCluster) {
+ GROUP_DAO = new CassandraEventDeadLettersGroupDAO(cassandraCluster.getConf());
+ }
- @BeforeEach
- void setUp(CassandraCluster cassandraCluster) {
- EventSerializer eventSerializer = new EventSerializer(new TestId.Factory(), new TestMessageId.Factory());
- eventDeadLetters = new CassandraEventDeadLetters(new CassandraEventDeadLettersDAO(cassandraCluster.getConf(), eventSerializer));
+ @Test
+ void retrieveAllGroupsShouldReturnEmptyWhenDefault() {
+ assertThat(GROUP_DAO.retrieveAllGroups()
+ .collectList().block())
+ .isEmpty();
}
- @Override
- public EventDeadLetters eventDeadLetters() {
- return eventDeadLetters;
+ @Test
+ void retrieveAllGroupsShouldReturnStoredGroups() {
+ GROUP_DAO.storeGroup(GROUP_A).block();
+ GROUP_DAO.storeGroup(GROUP_B).block();
+
+ assertThat(GROUP_DAO.retrieveAllGroups()
+ .collectList().block())
+ .containsOnly(GROUP_A, GROUP_B);
}
}
diff --git a/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java
index 2c108d4..20810d3 100644
--- a/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java
+++ b/mailbox/event/event-cassandra/src/test/java/org/apache/james/mailbox/events/CassandraEventDeadLettersTest.java
@@ -43,7 +43,8 @@ class CassandraEventDeadLettersTest implements StoreContract, RemoveContract, Fa
@BeforeEach
void setUp(CassandraCluster cassandraCluster) {
EventSerializer eventSerializer = new EventSerializer(new TestId.Factory(), new TestMessageId.Factory());
- eventDeadLetters = new CassandraEventDeadLetters(new CassandraEventDeadLettersDAO(cassandraCluster.getConf(), eventSerializer));
+ eventDeadLetters = new CassandraEventDeadLetters(new CassandraEventDeadLettersDAO(cassandraCluster.getConf(), eventSerializer),
+ new CassandraEventDeadLettersGroupDAO(cassandraCluster.getConf()));
}
@Override
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 06/16: MAILBOX-379 Use LF line break in spring xml
files
Posted by bt...@apache.org.
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 0dc6204cb632473463c78cba6e0f314a3402d860
Author: tran tien duc <dt...@linagora.com>
AuthorDate: Thu Feb 21 10:59:50 2019 +0700
MAILBOX-379 Use LF line break in spring xml files
---
.../resources/META-INF/spring/mailbox-maildir.xml | 134 ++++++++++-----------
.../resources/META-INF/spring/mailbox-memory.xml | 114 +++++++++---------
2 files changed, 124 insertions(+), 124 deletions(-)
diff --git a/mailbox/maildir/src/main/resources/META-INF/spring/mailbox-maildir.xml b/mailbox/maildir/src/main/resources/META-INF/spring/mailbox-maildir.xml
index 13a40a0..de43601 100644
--- a/mailbox/maildir/src/main/resources/META-INF/spring/mailbox-maildir.xml
+++ b/mailbox/maildir/src/main/resources/META-INF/spring/mailbox-maildir.xml
@@ -1,67 +1,67 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
-
- <!--
- Mailbox Maildir
- WARNING: Maildir does only work on UNIX like operation systems
- -->
- <bean id="maildir-mailboxIdFactory" class="org.apache.james.mailbox.maildir.MaildirId.Factory" />
-
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="ignoreUnresolvablePlaceholders" value="true"/>
- <property name ="location" value="classpath:mailbox-maildir.properties"/>
- </bean>
-
- <bean id="maildir-mailboxmanager" class="org.apache.james.mailbox.store.StoreMailboxManager">
- <constructor-arg index="0" ref="maildir-sessionMapperFactory"/>
- <constructor-arg index="1" ref="sessionProvider"/>
- <constructor-arg index="2" ref="memory-locker"/>
- <constructor-arg index="3" ref="messageParser"/>
- <constructor-arg index="4" ref="messageIdFactory" />
- <constructor-arg index="5" ref="storeMailboxAnnotationManager" />
- <constructor-arg index="6" ref="event-bus" />
- <constructor-arg index="7" ref="storeRightManager" />
- <constructor-arg index="8" ref="quotaComponents" />
- <constructor-arg index="9" ref="indexer" />
- <constructor-arg index="10" ref="no-mailbox-configuration" />
- </bean>
-
- <bean id ="no-mailbox-configuration" class="org.apache.james.mailbox.store.MailboxManagerConfiguration.NoMailboxConfiguration"/>
-
- <bean id ="maildir-subscriptionManager" class="org.apache.james.mailbox.store.StoreSubscriptionManager">
- <constructor-arg index="0" ref="maildir-sessionMapperFactory"/>
- </bean>
- <bean id="maildir-sessionMapperFactory" class="org.apache.james.mailbox.maildir.MaildirMailboxSessionMapperFactory">
- <constructor-arg index="0" ref="maildirStore"/>
- </bean>
- <bean id="maildirStore" class="org.apache.james.mailbox.maildir.MaildirStore">
- <constructor-arg index="0" value="${maildir.folder}"/>
- <property name="messageNameStrictParse" value="${maildir.messageNameParser.strictMode}"/>
- </bean>
- <alias name="jvm-locker" alias="maildir-locker"/>
-
- <bean id="maildir-mailbox-id-deserializer" class="org.apache.james.mailbox.maildir.MaildirMailboxIdDeserializer"/>
-
-</beans>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+ <!--
+ Mailbox Maildir
+ WARNING: Maildir does only work on UNIX like operation systems
+ -->
+ <bean id="maildir-mailboxIdFactory" class="org.apache.james.mailbox.maildir.MaildirId.Factory" />
+
+ <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+ <property name="ignoreUnresolvablePlaceholders" value="true"/>
+ <property name ="location" value="classpath:mailbox-maildir.properties"/>
+ </bean>
+
+ <bean id="maildir-mailboxmanager" class="org.apache.james.mailbox.store.StoreMailboxManager">
+ <constructor-arg index="0" ref="maildir-sessionMapperFactory"/>
+ <constructor-arg index="1" ref="sessionProvider"/>
+ <constructor-arg index="2" ref="memory-locker"/>
+ <constructor-arg index="3" ref="messageParser"/>
+ <constructor-arg index="4" ref="messageIdFactory" />
+ <constructor-arg index="5" ref="storeMailboxAnnotationManager" />
+ <constructor-arg index="6" ref="event-bus" />
+ <constructor-arg index="7" ref="storeRightManager" />
+ <constructor-arg index="8" ref="quotaComponents" />
+ <constructor-arg index="9" ref="indexer" />
+ <constructor-arg index="10" ref="no-mailbox-configuration" />
+ </bean>
+
+ <bean id ="no-mailbox-configuration" class="org.apache.james.mailbox.store.MailboxManagerConfiguration.NoMailboxConfiguration"/>
+
+ <bean id ="maildir-subscriptionManager" class="org.apache.james.mailbox.store.StoreSubscriptionManager">
+ <constructor-arg index="0" ref="maildir-sessionMapperFactory"/>
+ </bean>
+ <bean id="maildir-sessionMapperFactory" class="org.apache.james.mailbox.maildir.MaildirMailboxSessionMapperFactory">
+ <constructor-arg index="0" ref="maildirStore"/>
+ </bean>
+ <bean id="maildirStore" class="org.apache.james.mailbox.maildir.MaildirStore">
+ <constructor-arg index="0" value="${maildir.folder}"/>
+ <property name="messageNameStrictParse" value="${maildir.messageNameParser.strictMode}"/>
+ </bean>
+ <alias name="jvm-locker" alias="maildir-locker"/>
+
+ <bean id="maildir-mailbox-id-deserializer" class="org.apache.james.mailbox.maildir.MaildirMailboxIdDeserializer"/>
+
+</beans>
diff --git a/mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml b/mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml
index 4366588..4dd811f 100644
--- a/mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml
+++ b/mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml
@@ -1,57 +1,57 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
-
- <bean id="memory-mailboxIdFactory" class="org.apache.james.mailbox.inmemory.InMemoryId.Factory" />
-
- <!--
- Mailbox Memory
- -->
- <!-- WARNING: Memory does not persist the mailbox. -->
- <!-- Information will be lost after jvm restart. -->
-
- <bean id="memory-mailboxManager" class="org.apache.james.mailbox.inmemory.InMemoryMailboxManager">
- <constructor-arg index="0" ref="memory-sessionMapperFactory"/>
- <constructor-arg index="1" ref="sessionProvider"/>
- <constructor-arg index="2" ref="memory-locker"/>
- <constructor-arg index="3" ref="messageParser"/>
- <constructor-arg index="4" ref="messageIdFactory" />
- <constructor-arg index="5" ref="event-bus" />
- <constructor-arg index="6" ref="storeMailboxAnnotationManager" />
- <constructor-arg index="7" ref="storeRightManager" />
- <constructor-arg index="8" ref="quotaComponents" />
- <constructor-arg index="9" ref="indexer" />
- </bean>
-
- <bean id ="memory-subscriptionManager" class="org.apache.james.mailbox.store.StoreSubscriptionManager">
- <constructor-arg index="0" ref="memory-sessionMapperFactory"/>
- </bean>
-
- <bean id="memory-sessionMapperFactory" class="org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory" />
-
- <alias name="jvm-locker" alias="memory-locker"/>
-
- <bean id="memory-mailbox-id-deserializer" class="org.apache.james.mailbox.inmemory.InMemoryMailboxIdDeserializer"/>
-
-</beans>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+ <bean id="memory-mailboxIdFactory" class="org.apache.james.mailbox.inmemory.InMemoryId.Factory" />
+
+ <!--
+ Mailbox Memory
+ -->
+ <!-- WARNING: Memory does not persist the mailbox. -->
+ <!-- Information will be lost after jvm restart. -->
+
+ <bean id="memory-mailboxManager" class="org.apache.james.mailbox.inmemory.InMemoryMailboxManager">
+ <constructor-arg index="0" ref="memory-sessionMapperFactory"/>
+ <constructor-arg index="1" ref="sessionProvider"/>
+ <constructor-arg index="2" ref="memory-locker"/>
+ <constructor-arg index="3" ref="messageParser"/>
+ <constructor-arg index="4" ref="messageIdFactory" />
+ <constructor-arg index="5" ref="event-bus" />
+ <constructor-arg index="6" ref="storeMailboxAnnotationManager" />
+ <constructor-arg index="7" ref="storeRightManager" />
+ <constructor-arg index="8" ref="quotaComponents" />
+ <constructor-arg index="9" ref="indexer" />
+ </bean>
+
+ <bean id ="memory-subscriptionManager" class="org.apache.james.mailbox.store.StoreSubscriptionManager">
+ <constructor-arg index="0" ref="memory-sessionMapperFactory"/>
+ </bean>
+
+ <bean id="memory-sessionMapperFactory" class="org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory" />
+
+ <alias name="jvm-locker" alias="memory-locker"/>
+
+ <bean id="memory-mailbox-id-deserializer" class="org.apache.james.mailbox.inmemory.InMemoryMailboxIdDeserializer"/>
+
+</beans>
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 01/16: MAILBOX-379 Moving MetadataWithMailboxId to
use in other places
Posted by bt...@apache.org.
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 012ed9be872113e3923b05502821eea4a3eb3079
Author: tran tien duc <dt...@linagora.com>
AuthorDate: Tue Feb 19 15:19:50 2019 +0700
MAILBOX-379 Moving MetadataWithMailboxId to use in other places
Will be used in StoreMessageManager
---
.../james/mailbox/MetadataWithMailboxId.java | 64 ++++++++++++++++++++++
.../james/mailbox/MetadataWithMailboxIdTest.java | 33 +++++++++++
.../james/mailbox/store/StoreMessageIdManager.java | 24 ++------
3 files changed, 102 insertions(+), 19 deletions(-)
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MetadataWithMailboxId.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MetadataWithMailboxId.java
new file mode 100644
index 0000000..a33345e
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MetadataWithMailboxId.java
@@ -0,0 +1,64 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.mailbox;
+
+import java.util.Objects;
+
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MessageMetaData;
+
+public class MetadataWithMailboxId {
+
+ public static MetadataWithMailboxId from(MessageMetaData messageMetaData, MailboxId mailboxId) {
+ return new MetadataWithMailboxId(messageMetaData, mailboxId);
+ }
+
+ private final MessageMetaData messageMetaData;
+ private final MailboxId mailboxId;
+
+ private MetadataWithMailboxId(MessageMetaData messageMetaData, MailboxId mailboxId) {
+ this.messageMetaData = messageMetaData;
+ this.mailboxId = mailboxId;
+ }
+
+ public MessageMetaData getMessageMetaData() {
+ return messageMetaData;
+ }
+
+ public MailboxId getMailboxId() {
+ return mailboxId;
+ }
+
+ @Override
+ public final boolean equals(Object o) {
+ if (o instanceof MetadataWithMailboxId) {
+ MetadataWithMailboxId that = (MetadataWithMailboxId) o;
+
+ return Objects.equals(this.messageMetaData, that.messageMetaData)
+ && Objects.equals(this.mailboxId, that.mailboxId);
+ }
+ return false;
+ }
+
+ @Override
+ public final int hashCode() {
+ return Objects.hash(messageMetaData, mailboxId);
+ }
+}
\ No newline at end of file
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MetadataWithMailboxIdTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MetadataWithMailboxIdTest.java
new file mode 100644
index 0000000..3e795c3
--- /dev/null
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MetadataWithMailboxIdTest.java
@@ -0,0 +1,33 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.mailbox;
+
+import org.junit.jupiter.api.Test;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+class MetadataWithMailboxIdTest {
+
+ @Test
+ void shouldMatchBeanContract() {
+ EqualsVerifier.forClass(MetadataWithMailboxId.class)
+ .verify();
+ }
+}
\ No newline at end of file
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
index 0ed5694..3031b9b 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
@@ -80,20 +80,6 @@ import reactor.core.publisher.Mono;
public class StoreMessageIdManager implements MessageIdManager {
- private static class MetadataWithMailboxId {
- private final MessageMetaData messageMetaData;
- private final MailboxId mailboxId;
-
- public MetadataWithMailboxId(MessageMetaData messageMetaData, MailboxId mailboxId) {
- this.messageMetaData = messageMetaData;
- this.mailboxId = mailboxId;
- }
- }
-
- private static MetadataWithMailboxId toMetadataWithMailboxId(MailboxMessage message) {
- return new MetadataWithMailboxId(message.metaData(), message.getMailboxId());
- }
-
public static ImmutableSet<MailboxId> toMailboxIds(List<MailboxMessage> mailboxMessages) {
return mailboxMessages
.stream()
@@ -211,7 +197,7 @@ public class StoreMessageIdManager implements MessageIdManager {
private void delete(MessageIdMapper messageIdMapper, List<MailboxMessage> messageList, MailboxSession mailboxSession) throws MailboxException {
ImmutableList<MetadataWithMailboxId> metadataWithMailbox = messageList.stream()
- .map(StoreMessageIdManager::toMetadataWithMailboxId)
+ .map(MetadataWithMailboxId::from)
.collect(Guavate.toImmutableList());
messageIdMapper.delete(
@@ -222,14 +208,14 @@ public class StoreMessageIdManager implements MessageIdManager {
MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession);
Flux.fromIterable(metadataWithMailbox)
- .flatMap(Throwing.<StoreMessageIdManager.MetadataWithMailboxId, Mono<Void>>function(
+ .flatMap(Throwing.<MetadataWithMailboxId, Mono<Void>>function(
metadataWithMailboxId -> eventBus.dispatch(EventFactory.expunged()
.randomEventId()
.mailboxSession(mailboxSession)
- .mailbox(mailboxMapper.findMailboxById(metadataWithMailboxId.mailboxId))
- .addMetaData(metadataWithMailboxId.messageMetaData)
+ .mailbox(mailboxMapper.findMailboxById(metadataWithMailboxId.getMailboxId()))
+ .addMetaData(metadataWithMailboxId.getMessageMetaData())
.build(),
- new MailboxIdRegistrationKey(metadataWithMailboxId.mailboxId)))
+ new MailboxIdRegistrationKey(metadataWithMailboxId.getMailboxId())))
.sneakyThrow())
.then()
.block();
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 08/16: MAILBOX-379 Plug PreDeletionHook to
MailboxStoreManager
Posted by bt...@apache.org.
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 9788e41fbc4915c3781852ff77b8c108cab6cbad
Author: tran tien duc <dt...@linagora.com>
AuthorDate: Thu Feb 21 14:18:29 2019 +0700
MAILBOX-379 Plug PreDeletionHook to MailboxStoreManager
---
.../test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java | 2 +-
.../james/mailbox/maildir/DomainUserMaildirMailboxManagerTest.java | 2 +-
.../apache/james/mailbox/maildir/FullUserMaildirMailboxManagerTest.java | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
index 0b5524b..ea377f2 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
@@ -32,7 +32,7 @@ import org.junit.jupiter.api.Test;
public class JPAMailboxManagerTest extends MailboxManagerTest<OpenJPAMailboxManager> {
@Disabled("JPAMailboxManager is using DefaultMessageId which doesn't support full feature of a messageId, which is an essential" +
- "element of the Vault")
+ " element of the Vault")
@Nested
class HookTests {
}
diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerTest.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerTest.java
index 8885135..e31212b 100644
--- a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerTest.java
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerTest.java
@@ -29,7 +29,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
public class DomainUserMaildirMailboxManagerTest extends MailboxManagerTest<StoreMailboxManager> {
@Disabled("Maildir is using DefaultMessageId which doesn't support full feature of a messageId, which is an essential" +
- "element of the Vault")
+ " element of the Vault")
@Nested
class HookTests {
}
diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/FullUserMaildirMailboxManagerTest.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/FullUserMaildirMailboxManagerTest.java
index 3e7280e..8915f66 100644
--- a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/FullUserMaildirMailboxManagerTest.java
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/FullUserMaildirMailboxManagerTest.java
@@ -29,7 +29,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
public class FullUserMaildirMailboxManagerTest extends MailboxManagerTest<StoreMailboxManager> {
@Disabled("Maildir is using DefaultMessageId which doesn't support full feature of a messageId, which is an essential" +
- "element of the Vault")
+ " element of the Vault")
@Nested
class HookTests {
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org
[james-project] 09/16: MAILBOX-379 Introduce PreDeletionHook API
Posted by bt...@apache.org.
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 4a278263563ce9ae7acdac3e4ff96abe151eed42
Author: tran tien duc <dt...@linagora.com>
AuthorDate: Thu Feb 21 18:27:09 2019 +0700
MAILBOX-379 Introduce PreDeletionHook API
---
.../java/org/apache/james/mailbox/extension/PreDeletionHook.java | 2 ++
.../org/apache/james/mailbox/extension/PreDeletionHookTest.java | 9 +++++++++
2 files changed, 11 insertions(+)
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/extension/PreDeletionHook.java b/mailbox/api/src/main/java/org/apache/james/mailbox/extension/PreDeletionHook.java
index 022e511..1f41593 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/extension/PreDeletionHook.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/extension/PreDeletionHook.java
@@ -27,6 +27,7 @@ import java.util.UUID;
import org.apache.james.mailbox.MetadataWithMailboxId;
import org.reactivestreams.Publisher;
+import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
public interface PreDeletionHook {
@@ -44,6 +45,7 @@ public interface PreDeletionHook {
private final UUID id;
private DeletionId(UUID id) {
+ Preconditions.checkNotNull(id, "id for deletion cannot be null");
this.id = id;
}
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/extension/PreDeletionHookTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/extension/PreDeletionHookTest.java
index 2b19ce1..b32a2cf 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/extension/PreDeletionHookTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/extension/PreDeletionHookTest.java
@@ -18,6 +18,8 @@
****************************************************************/
package org.apache.james.mailbox.extension;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
@@ -33,6 +35,13 @@ class PreDeletionHookTest {
EqualsVerifier.forClass(PreDeletionHook.DeletionId.class)
.verify();
}
+
+ @Test
+ void shouldThrowWhenPassingNullId() {
+ assertThatThrownBy(() -> PreDeletionHook.DeletionId.of(null))
+ .isInstanceOf(NullPointerException.class)
+ .hasMessage("id for deletion cannot be null");
+ }
}
@Nested
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org