You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by ma...@apache.org on 2022/05/10 07:17:20 UTC
[james-project] branch master updated: JAMES-3762 Reworks MailRepository contract to use MailKeys instead of Mails
This is an automated email from the ASF dual-hosted git repository.
matthieu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
The following commit(s) were added to refs/heads/master by this push:
new 0d0a1786c7 JAMES-3762 Reworks MailRepository contract to use MailKeys instead of Mails
0d0a1786c7 is described below
commit 0d0a1786c7c938cd3cc60965f2538a0752a84074
Author: Jean Helou <jh...@codamens.fr>
AuthorDate: Wed Apr 20 22:23:23 2022 +0200
JAMES-3762 Reworks MailRepository contract to use MailKeys instead of Mails
Co-Authored-By: Matthieu Baechler <ma...@apache.org>
---
.../mailrepository/file/FileMailRepository.java | 9 ---
.../mailrepository/jdbc/JDBCMailRepository.java | 13 ----
.../james/mailrepository/api/MailRepository.java | 26 +++----
.../mailrepository/MailRepositoryContract.java | 88 +++++++++++-----------
.../cassandra/CassandraMailRepository.java | 16 ----
.../memory/MemoryMailRepository.java | 11 ---
.../webadmin/service/ReprocessingService.java | 14 ++--
7 files changed, 60 insertions(+), 117 deletions(-)
diff --git a/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/FileMailRepository.java b/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/FileMailRepository.java
index d898c29adf..a76ecb8ea0 100644
--- a/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/FileMailRepository.java
+++ b/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/FileMailRepository.java
@@ -291,15 +291,6 @@ public class FileMailRepository implements MailRepository, Configurable, Initial
}
}
- @Override
- public void remove(Mail mail) throws MessagingException {
- remove(MailKey.forMail(mail));
- }
-
- @Override
- public void remove(Collection<Mail> mails) throws MessagingException {
- mails.forEach(Throwing.<Mail>consumer(this::remove).sneakyThrow());
- }
@Override
public void remove(MailKey key) throws MessagingException {
diff --git a/server/data/data-jdbc/src/main/java/org/apache/james/mailrepository/jdbc/JDBCMailRepository.java b/server/data/data-jdbc/src/main/java/org/apache/james/mailrepository/jdbc/JDBCMailRepository.java
index 2acd881156..4dd12ff1f8 100644
--- a/server/data/data-jdbc/src/main/java/org/apache/james/mailrepository/jdbc/JDBCMailRepository.java
+++ b/server/data/data-jdbc/src/main/java/org/apache/james/mailrepository/jdbc/JDBCMailRepository.java
@@ -34,7 +34,6 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -662,18 +661,6 @@ public class JDBCMailRepository implements MailRepository, Configurable, Initial
.collect(ImmutableList.toImmutableList());
}
- @Override
- public void remove(Mail mail) throws MessagingException {
- remove(MailKey.forMail(mail));
- }
-
- @Override
- public void remove(Collection<Mail> mails) throws MessagingException {
- for (Mail mail : mails) {
- remove(mail);
- }
- }
-
@Override
public void remove(MailKey key) throws MessagingException {
internalRemove(key);
diff --git a/server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/MailRepository.java b/server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/MailRepository.java
index 9b0db61c1c..021403e5df 100644
--- a/server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/MailRepository.java
+++ b/server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/MailRepository.java
@@ -62,23 +62,6 @@ public interface MailRepository {
*/
Mail retrieve(MailKey key) throws MessagingException;
- /**
- * Removes a specified message
- *
- * @param mail
- * the message to be removed from the repository
- */
- void remove(Mail mail) throws MessagingException;
-
- /**
- * Remove an Collection of mails from the repository
- *
- * @param mails
- * The Collection of <code>MailImpl</code>'s to delete
- * @since 2.2.0
- */
- void remove(Collection<Mail> mails) throws MessagingException;
-
/**
* Removes a message identified by key.
*
@@ -87,6 +70,15 @@ public interface MailRepository {
*/
void remove(MailKey key) throws MessagingException;
+ /**
+ * Removes some messages identified by keys.
+ */
+ default void remove(Collection<MailKey> keys) throws MessagingException {
+ for (MailKey key: keys) {
+ remove(key);
+ }
+ }
+
/**
* Removes all mails from this repository
*
diff --git a/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java b/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java
index 3ac05ffa93..2e88746c82 100644
--- a/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java
+++ b/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java
@@ -132,8 +132,8 @@ public interface MailRepositoryContract {
default void sizeShouldBeDecrementedByRemove() throws Exception {
MailRepository testee = retrieveRepository();
- testee.store(createMail(MAIL_1));
- testee.remove(MAIL_1);
+ MailKey key = testee.store(createMail(MAIL_1));
+ testee.remove(key);
assertThat(testee.size()).isEqualTo(0L);
}
@@ -151,9 +151,9 @@ public interface MailRepositoryContract {
.build())
.build();
- testee.store(mail);
+ MailKey key = testee.store(mail);
- assertThat(testee.retrieve(MAIL_1).getMaybeSender()).isEqualTo(MaybeSender.nullSender());
+ assertThat(testee.retrieve(key).getMaybeSender()).isEqualTo(MaybeSender.nullSender());
}
@Test
@@ -178,9 +178,9 @@ public interface MailRepositoryContract {
MailRepository testee = retrieveRepository();
Mail mail = createMail(MAIL_1);
- testee.store(mail);
+ MailKey key = testee.store(mail);
- assertThat(testee.retrieve(MAIL_1)).satisfies(actual -> checkMailEquality(actual, mail));
+ assertThat(testee.retrieve(key)).satisfies(actual -> checkMailEquality(actual, mail));
}
@Test
@@ -206,19 +206,19 @@ public interface MailRepositoryContract {
Mail mail = createMail(MAIL_1);
mail.setDsnParameters(dsnParameters);
- testee.store(mail);
+ MailKey key = testee.store(mail);
- assertThat(testee.retrieve(MAIL_1).dsnParameters()).contains(dsnParameters);
+ assertThat(testee.retrieve(key).dsnParameters()).contains(dsnParameters);
}
@Test
default void retrieveShouldReturnNullAfterRemoveAll() throws Exception {
MailRepository testee = retrieveRepository();
- testee.store(createMail(MAIL_1));
+ MailKey key = testee.store(createMail(MAIL_1));
testee.removeAll();
- assertThat(testee.retrieve(MAIL_1)).isNull();
+ assertThat(testee.retrieve(key)).isNull();
}
@Test
@@ -244,9 +244,9 @@ public interface MailRepositoryContract {
MailRepository testee = retrieveRepository();
Mail mail = createMail(MAIL_1, "my content contains 🐋");
- testee.store(mail);
+ MailKey key = testee.store(mail);
- assertThat(testee.retrieve(MAIL_1).getMessage().getContent()).isEqualTo("my content contains 🐋");
+ assertThat(testee.retrieve(key).getMessage().getContent()).isEqualTo("my content contains 🐋");
}
@Test
@@ -254,9 +254,9 @@ public interface MailRepositoryContract {
MailRepository testee = retrieveRepository();
String bigString = Strings.repeat("my mail is big 🐋", 1_000_000);
Mail mail = createMail(MAIL_1, bigString);
- testee.store(mail);
+ MailKey key1 = testee.store(mail);
- Mail actual = testee.retrieve(MAIL_1);
+ Mail actual = testee.retrieve(key1);
assertThat(Hashing.sha256().hashString((String)actual.getMessage().getContent(), StandardCharsets.UTF_8))
.isEqualTo(Hashing.sha256().hashString(bigString, StandardCharsets.UTF_8));
@@ -277,9 +277,9 @@ public interface MailRepositoryContract {
.build(),
new MailAddress("bob@domain.com"));
- testee.store(mail);
+ MailKey key = testee.store(mail);
- assertThat(testee.retrieve(MAIL_1)).satisfies(actual -> checkMailEquality(actual, mail));
+ assertThat(testee.retrieve(key)).satisfies(actual -> checkMailEquality(actual, mail));
}
@Test
@@ -321,61 +321,59 @@ public interface MailRepositoryContract {
@Test
default void removeShouldnotAffectUnrelatedMails() throws Exception {
MailRepository testee = retrieveRepository();
- testee.store(createMail(MAIL_1));
- testee.store(createMail(MAIL_2));
+ MailKey key1 = testee.store(createMail(MAIL_1));
+ MailKey key2 = testee.store(createMail(MAIL_2));
- testee.remove(MAIL_1);
+ testee.remove(key1);
assertThat(retrieveRepository().list())
.toIterable()
- .contains(MAIL_2);
+ .contains(key2);
}
@Test
default void removedMailsShouldNotBeListed() throws Exception {
MailRepository testee = retrieveRepository();
- MailKey key3 = new MailKey("mail3");
Mail mail1 = createMail(MAIL_1);
Mail mail2 = createMail(MAIL_2);
- Mail mail3 = createMail(key3);
- retrieveRepository().store(mail1);
- retrieveRepository().store(mail2);
- retrieveRepository().store(mail3);
+ Mail mail3 = createMail(new MailKey("mail3"));
+ MailKey key1 = retrieveRepository().store(mail1);
+ MailKey key2 = retrieveRepository().store(mail2);
+ MailKey key3 = retrieveRepository().store(mail3);
- testee.remove(ImmutableList.of(mail1, mail3));
+ testee.remove(ImmutableList.of(key1, key3));
assertThat(retrieveRepository().list())
.toIterable()
- .contains(MAIL_2)
- .doesNotContain(MAIL_1, key3);
+ .contains(key2)
+ .doesNotContain(key1, key3);
}
@Test
default void removedMailShouldNotBeListed() throws Exception {
MailRepository testee = retrieveRepository();
- MailKey key3 = new MailKey("mail3");
Mail mail1 = createMail(MAIL_1);
Mail mail2 = createMail(MAIL_2);
- Mail mail3 = createMail(key3);
- retrieveRepository().store(mail1);
- retrieveRepository().store(mail2);
- retrieveRepository().store(mail3);
+ Mail mail3 = createMail(new MailKey("mail3"));
+ MailKey key1 = retrieveRepository().store(mail1);
+ MailKey key2 = retrieveRepository().store(mail2);
+ MailKey key3 = retrieveRepository().store(mail3);
- testee.remove(mail2);
+ testee.remove(key2);
assertThat(retrieveRepository().list())
.toIterable()
- .contains(MAIL_1, key3)
- .doesNotContain(MAIL_2);
+ .contains(key1, key3)
+ .doesNotContain(key2);
}
@Test
default void removeShouldHaveNoEffectForUnknownMails() throws Exception {
MailRepository testee = retrieveRepository();
- testee.remove(ImmutableList.of(createMail(UNKNOWN_KEY)));
+ testee.remove(ImmutableList.of(UNKNOWN_KEY));
assertThat(retrieveRepository().list())
.toIterable()
@@ -389,7 +387,7 @@ public interface MailRepositoryContract {
Mail mail1 = createMail(MAIL_1);
testee.store(mail1);
- testee.remove(ImmutableList.of(createMail(UNKNOWN_KEY)));
+ testee.remove(ImmutableList.of(UNKNOWN_KEY));
assertThat(testee.size()).isEqualTo(1);
}
@@ -409,7 +407,7 @@ public interface MailRepositoryContract {
default void removeShouldHaveNoEffectForUnknownMail() throws Exception {
MailRepository testee = retrieveRepository();
- testee.remove(createMail(UNKNOWN_KEY));
+ testee.remove(UNKNOWN_KEY);
assertThat(retrieveRepository().list())
.toIterable()
@@ -419,13 +417,13 @@ public interface MailRepositoryContract {
@Test
default void listShouldReturnStoredMailsKeys() throws Exception {
MailRepository testee = retrieveRepository();
- testee.store(createMail(MAIL_1));
+ MailKey key1 = testee.store(createMail(MAIL_1));
- testee.store(createMail(MAIL_2));
+ MailKey key2 = testee.store(createMail(MAIL_2));
assertThat(testee.list())
.toIterable()
- .containsOnly(MAIL_1, MAIL_2);
+ .containsOnly(key1, key2);
}
@Test
@@ -466,13 +464,13 @@ public interface MailRepositoryContract {
MailAddress recipient1 = new MailAddress("rec1@domain.com");
mail.addSpecificHeaderForRecipient(PerRecipientHeaders.Header.builder().name("foo").value("bar").build(), recipient1);
mail.addSpecificHeaderForRecipient(PerRecipientHeaders.Header.builder().name("fizz").value("buzz").build(), recipient1);
- testee.store(mail);
+ MailKey key = testee.store(mail);
assertThat(testee.list())
.toIterable()
.hasSize(1)
- .containsOnly(MAIL_1);
- assertThat(testee.retrieve(MAIL_1)).satisfies(actual -> checkMailEquality(actual, mail));
+ .containsOnly(key);
+ assertThat(testee.retrieve(key)).satisfies(actual -> checkMailEquality(actual, mail));
}
@RepeatedTest(10)
diff --git a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java
index 1c0abc611f..c85165ede8 100644
--- a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java
+++ b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java
@@ -22,7 +22,6 @@ package org.apache.james.mailrepository.cassandra;
import static org.apache.james.util.ReactorUtils.DEFAULT_CONCURRENCY;
import static org.apache.james.util.ReactorUtils.publishIfPresent;
-import java.util.Collection;
import java.util.Iterator;
import java.util.Optional;
@@ -43,7 +42,6 @@ import org.apache.mailet.Mail;
import com.github.fge.lambdas.Throwing;
-import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public class CassandraMailRepository implements MailRepository {
@@ -127,20 +125,6 @@ public class CassandraMailRepository implements MailRepository {
.build();
}
- @Override
- public void remove(Mail mail) {
- removeAsync(MailKey.forMail(mail)).block();
- }
-
- @Override
- public void remove(Collection<Mail> toRemove) {
- Flux.fromIterable(toRemove)
- .map(MailKey::forMail)
- .flatMap(this::removeAsync, DEFAULT_CONCURRENCY)
- .then()
- .block();
- }
-
@Override
public void remove(MailKey key) {
removeAsync(key).block();
diff --git a/server/mailrepository/mailrepository-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepository.java b/server/mailrepository/mailrepository-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepository.java
index d21adcbb74..d78f54868d 100644
--- a/server/mailrepository/mailrepository-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepository.java
+++ b/server/mailrepository/mailrepository-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepository.java
@@ -19,7 +19,6 @@
package org.apache.james.mailrepository.memory;
-import java.util.Collection;
import java.util.Iterator;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
@@ -57,16 +56,6 @@ public class MemoryMailRepository implements MailRepository {
.orElse(null);
}
- @Override
- public void remove(Mail mail) {
- remove(MailKey.forMail(mail));
- }
-
- @Override
- public void remove(Collection<Mail> toRemove) {
- toRemove.stream().map(MailKey::forMail).forEach(this::remove);
- }
-
@Override
public void remove(MailKey key) {
mails.remove(key);
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingService.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingService.java
index 9c443d2365..7b8f5cec8d 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingService.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingService.java
@@ -86,12 +86,12 @@ public class ReprocessingService {
this.configuration = configuration;
}
- private void reprocess(MailRepository repository, Mail mail) {
+ private void reprocess(MailRepository repository, Mail mail, MailKey key) {
try {
configuration.getTargetProcessor().ifPresent(mail::setState);
mailQueue.enQueue(mail);
if (configuration.isConsume()) {
- repository.remove(mail);
+ repository.remove(key);
}
} catch (Exception e) {
throw new RuntimeException("Error encountered while reprocessing mail " + mail.getName(), e);
@@ -127,9 +127,11 @@ public class ReprocessingService {
.forEach(Throwing.consumer((MailRepository repository) ->
Iterators.toStream(repository.list())
.peek(keyListener)
- .map(Throwing.function(key -> Optional.ofNullable(repository.retrieve(key))))
- .flatMap(Optional::stream)
- .forEach(mail -> reprocessor.reprocess(repository, mail))));
+ .forEach(Throwing.consumer(key ->
+ Optional.ofNullable(repository.retrieve(key))
+ .ifPresent(mail -> reprocessor.reprocess(repository, mail, key))
+ ))
+ ));
}
}
@@ -143,7 +145,7 @@ public class ReprocessingService {
.findFirst()
.orElseThrow(() -> new MissingKeyException(key));
- reprocessor.reprocess(mailPair.getKey(), mailPair.getValue());
+ reprocessor.reprocess(mailPair.getKey(), mailPair.getValue(), key);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org