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 rc...@apache.org on 2020/06/30 10:52:59 UTC
[james-project] 06/07: JAMES-3277 Rework MessageIdMapper APIs
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 0f5e381fac65f91e45559c25c8259d697be49239
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Jun 26 10:29:50 2020 +0700
JAMES-3277 Rework MessageIdMapper APIs
- Reactify delete (easy win)
- Copy in mailboxes should take as an argument the target mailbox so that we don't need to ensure it exists
---
.../cassandra/mail/CassandraMessageIdMapper.java | 17 +++++++-------
.../inmemory/mail/InMemoryMessageIdMapper.java | 4 ++--
.../james/mailbox/store/mail/MessageIdMapper.java | 8 ++++++-
.../store/mail/model/MessageIdMapperTest.java | 26 +++++-----------------
4 files changed, 23 insertions(+), 32 deletions(-)
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
index 2777ec4..b0293d1 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
@@ -35,6 +35,7 @@ import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.MailboxNotFoundException;
import org.apache.james.mailbox.model.ComposedMessageId;
import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
+import org.apache.james.mailbox.model.Mailbox;
import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MessageId;
import org.apache.james.mailbox.model.UpdatedFlags;
@@ -140,11 +141,10 @@ public class CassandraMessageIdMapper implements MessageIdMapper {
}
@Override
- public void copyInMailbox(MailboxMessage mailboxMessage) throws MailboxException {
- CassandraId mailboxId = (CassandraId) mailboxMessage.getMailboxId();
- MailboxReactorUtils.block(mailboxMapper.findMailboxById(mailboxId)
- .switchIfEmpty(Mono.error(() -> new MailboxNotFoundException(mailboxId)))
- .then(saveMessageMetadata(mailboxMessage, mailboxId)));
+ public void copyInMailbox(MailboxMessage mailboxMessage, Mailbox mailbox) throws MailboxException {
+ CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
+
+ MailboxReactorUtils.block(saveMessageMetadata(mailboxMessage, mailboxId));
}
private Mono<Void> saveMessageMetadata(MailboxMessage mailboxMessage, CassandraId mailboxId) {
@@ -172,10 +172,11 @@ public class CassandraMessageIdMapper implements MessageIdMapper {
@Override
public void delete(MessageId messageId, Collection<MailboxId> mailboxIds) {
- deleteAsMono(messageId, mailboxIds).block();
+ deleteReactive(messageId, mailboxIds).block();
}
- public Mono<Void> deleteAsMono(MessageId messageId, Collection<MailboxId> mailboxIds) {
+ @Override
+ public Mono<Void> deleteReactive(MessageId messageId, Collection<MailboxId> mailboxIds) {
CassandraMessageId cassandraMessageId = (CassandraMessageId) messageId;
return Flux.fromStream(mailboxIds.stream())
.flatMap(mailboxId -> retrieveAndDeleteIndices(cassandraMessageId, Optional.of((CassandraId) mailboxId)))
@@ -187,7 +188,7 @@ public class CassandraMessageIdMapper implements MessageIdMapper {
Flux.fromIterable(ids.asMap()
.entrySet())
.publishOn(Schedulers.elastic())
- .flatMap(entry -> deleteAsMono(entry.getKey(), entry.getValue()), cassandraConfiguration.getExpungeChunkSize())
+ .flatMap(entry -> deleteReactive(entry.getKey(), entry.getValue()), cassandraConfiguration.getExpungeChunkSize())
.then()
.block();
}
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapper.java
index 2fe2bee..c16968b 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapper.java
@@ -87,8 +87,8 @@ public class InMemoryMessageIdMapper implements MessageIdMapper {
}
@Override
- public void copyInMailbox(MailboxMessage mailboxMessage) throws MailboxException {
- boolean isAlreadyInMailbox = findMailboxes(mailboxMessage.getMessageId()).contains(mailboxMessage.getMailboxId());
+ public void copyInMailbox(MailboxMessage mailboxMessage, Mailbox mailbox) throws MailboxException {
+ boolean isAlreadyInMailbox = findMailboxes(mailboxMessage.getMessageId()).contains(mailbox.getMailboxId());
if (!isAlreadyInMailbox) {
save(mailboxMessage);
}
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageIdMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageIdMapper.java
index eeecd30..6e422e2 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageIdMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageIdMapper.java
@@ -26,6 +26,7 @@ import javax.mail.Flags;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.MailboxNotFoundException;
+import org.apache.james.mailbox.model.Mailbox;
import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MessageId;
import org.apache.james.mailbox.model.UpdatedFlags;
@@ -35,6 +36,7 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
import com.google.common.collect.Multimap;
import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
public interface MessageIdMapper {
@@ -48,12 +50,16 @@ public interface MessageIdMapper {
void save(MailboxMessage mailboxMessage) throws MailboxNotFoundException, MailboxException;
- void copyInMailbox(MailboxMessage mailboxMessage) throws MailboxNotFoundException, MailboxException;
+ void copyInMailbox(MailboxMessage mailboxMessage, Mailbox mailbox) throws MailboxException;
void delete(MessageId messageId);
void delete(MessageId messageId, Collection<MailboxId> mailboxIds);
+ default Mono<Void> deleteReactive(MessageId messageId, Collection<MailboxId> mailboxIds) {
+ return Mono.fromRunnable(() -> delete(messageId, mailboxIds));
+ }
+
default void delete(Multimap<MessageId, MailboxId> ids) {
ids.asMap()
.forEach(this::delete);
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
index 944301b..3abb0c9 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
@@ -202,22 +202,6 @@ public abstract class MessageIdMapperTest {
}
@Test
- void copyInMailboxShouldThrowWhenMailboxDoesntExist() throws Exception {
- message1.setUid(mapperProvider.generateMessageUid());
- message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
- sut.save(message1);
-
- Mailbox notPersistedMailbox = new Mailbox(MailboxPath.forUser(BENWA, "mybox"), UID_VALIDITY, mapperProvider.generateId());
-
- SimpleMailboxMessage message1InOtherMailbox = SimpleMailboxMessage.copy(notPersistedMailbox.getMailboxId(), message1);
- message1InOtherMailbox.setUid(mapperProvider.generateMessageUid());
- message1InOtherMailbox.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox));
-
- assertThatThrownBy(() -> sut.copyInMailbox(message1InOtherMailbox))
- .isInstanceOf(MailboxNotFoundException.class);
- }
-
- @Test
void copyInMailboxShouldSaveMessageInAnotherMailbox() throws Exception {
message1.setUid(mapperProvider.generateMessageUid());
message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
@@ -226,7 +210,7 @@ public abstract class MessageIdMapperTest {
SimpleMailboxMessage message1InOtherMailbox = SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1);
message1InOtherMailbox.setUid(mapperProvider.generateMessageUid());
message1InOtherMailbox.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox));
- sut.copyInMailbox(message1InOtherMailbox);
+ sut.copyInMailbox(message1InOtherMailbox, benwaWorkMailbox);
List<MailboxId> mailboxes = sut.findMailboxes(message1.getMessageId());
assertThat(mailboxes).containsOnly(benwaInboxMailbox.getMailboxId(), benwaWorkMailbox.getMailboxId());
@@ -241,8 +225,8 @@ public abstract class MessageIdMapperTest {
copiedMessage.setUid(mapperProvider.generateMessageUid());
copiedMessage.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox));
- sut.copyInMailbox(copiedMessage);
- sut.copyInMailbox(copiedMessage);
+ sut.copyInMailbox(copiedMessage, benwaWorkMailbox);
+ sut.copyInMailbox(copiedMessage, benwaWorkMailbox);
List<MailboxId> mailboxes = sut.findMailboxes(message1.getMessageId());
assertThat(mailboxes)
@@ -894,7 +878,7 @@ public abstract class MessageIdMapperTest {
SimpleMailboxMessage copiedMessage = SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1);
copiedMessage.setUid(mapperProvider.generateMessageUid());
copiedMessage.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox));
- sut.copyInMailbox(copiedMessage);
+ sut.copyInMailbox(copiedMessage, benwaWorkMailbox);
sut.delete(
ImmutableMultimap.<MessageId, MailboxId>builder()
@@ -919,7 +903,7 @@ public abstract class MessageIdMapperTest {
SimpleMailboxMessage copiedMessage = SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1);
copiedMessage.setUid(mapperProvider.generateMessageUid());
copiedMessage.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox));
- sut.copyInMailbox(copiedMessage);
+ sut.copyInMailbox(copiedMessage, benwaWorkMailbox);
sut.delete(
ImmutableMultimap.<MessageId, MailboxId>builder()
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org