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