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


The following commit(s) were added to refs/heads/master by this push:
     new b53c363150 JAMES-3899 WithStorageDirective should support extra 
mailboxes that do not yet exists (#1628)
b53c363150 is described below

commit b53c36315062c8e3483162f8945e66f46bcb2ff4
Author: Benoit TELLIER <btell...@linagora.com>
AuthorDate: Tue Jul 4 05:33:29 2023 +0200

    JAMES-3899 WithStorageDirective should support extra mailboxes that do not 
yet exists (#1628)
    
    Those are created if need be.
---
 .../WithStorageDirectiveIntegrationTest.java       | 29 ++++++++++++++++++++++
 .../mailets/delivery/MailboxAppenderImpl.java      | 15 ++++++++---
 2 files changed, 41 insertions(+), 3 deletions(-)

diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/WithStorageDirectiveIntegrationTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/WithStorageDirectiveIntegrationTest.java
index 066d000064..e7b28c82bd 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/WithStorageDirectiveIntegrationTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/WithStorageDirectiveIntegrationTest.java
@@ -38,7 +38,9 @@ import org.apache.james.probe.DataProbe;
 import org.apache.james.transport.mailets.WithStorageDirective;
 import org.apache.james.transport.matchers.SenderIsLocal;
 import org.apache.james.utils.DataProbeImpl;
+import org.apache.james.utils.MailRepositoryProbeImpl;
 import org.apache.james.utils.SMTPMessageSender;
+import org.apache.james.utils.SpoolerProbe;
 import org.apache.james.utils.TestIMAPClient;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Test;
@@ -99,6 +101,33 @@ class WithStorageDirectiveIntegrationTest {
             .awaitMessage(awaitAtMostOneMinute);
     }
 
+    @Test
+    void targetFolderNamesShouldWorkWhenTargetFolderDoNotExist(@TempDir File 
temporaryFolder) throws Exception {
+        setUp(temporaryFolder, MailetConfiguration.builder()
+            .matcher(SenderIsLocal.class)
+            .mailet(WithStorageDirective.class)
+            .addProperty("targetFolderNames", "target1, target2"));
+
+        testIMAPClient.connect(LOCALHOST_IP, 
jamesServer.getProbe(ImapGuiceProbe.class).getImapPort())
+            .login(RECIPIENT, PASSWORD);
+
+        messageSender.connect(LOCALHOST_IP, 
jamesServer.getProbe(SmtpGuiceProbe.class).getSmtpPort())
+            .authenticate(FROM, PASSWORD)
+            .sendMessage(FROM, RECIPIENT);
+
+        awaitAtMostOneMinute.until(() -> 
jamesServer.getProbe(SpoolerProbe.class).processingFinished());
+        testIMAPClient.connect(LOCALHOST_IP, 
jamesServer.getProbe(ImapGuiceProbe.class).getImapPort())
+            .login(RECIPIENT, PASSWORD)
+            .select("target1")
+            .awaitMessage(awaitAtMostOneMinute)
+            .close();
+        testIMAPClient.connect(LOCALHOST_IP, 
jamesServer.getProbe(ImapGuiceProbe.class).getImapPort())
+            .login(RECIPIENT, PASSWORD)
+            .select("target2")
+            .awaitMessage(awaitAtMostOneMinute)
+            .close();
+    }
+
     @Test
     void seenShouldWork(@TempDir File temporaryFolder) throws Exception {
         setUp(temporaryFolder, MailetConfiguration.builder()
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppenderImpl.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppenderImpl.java
index 5e793b8f4a..e1fd413b65 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppenderImpl.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppenderImpl.java
@@ -82,11 +82,10 @@ public class MailboxAppenderImpl implements MailboxAppender 
{
             return Flux.fromIterable(folders)
                 .skip(1)
                 .flatMap(Throwing.function(extraTargetFolder -> {
-                    MailboxPath targetMailboxPath = 
MailboxPath.forUser(session.getUser(), targetFolder);
+                    MailboxPath originMailboxPath = 
MailboxPath.forUser(session.getUser(), targetFolder);
                     MailboxPath destinationMailboxPath = 
MailboxPath.forUser(session.getUser(), useSlashAsSeparator(extraTargetFolder, 
session));
 
-                    return 
mailboxManager.copyMessagesReactive(MessageRange.one(id.getUid()),
-                        targetMailboxPath, destinationMailboxPath, session);
+                    return copyToExtraMailbox(id, originMailboxPath, 
destinationMailboxPath, session);
                 }))
                 .then(Mono.fromRunnable(() -> LOGGER.info("{} copied to {} 
extra mailboxes", id.getMessageId(), folders)))
                 .thenReturn(id);
@@ -94,6 +93,16 @@ public class MailboxAppenderImpl implements MailboxAppender {
         return Mono.just(id);
     }
 
+    private Mono<MessageRange> copyToExtraMailbox(ComposedMessageId id, 
MailboxPath originMailboxPath, MailboxPath destinationMailboxPath, 
MailboxSession session) {
+        return Mono.from(mailboxManager.mailboxExists(destinationMailboxPath, 
session))
+            .flatMap(exists -> {
+                if (exists) {
+                    return Mono.empty();
+                }
+                return 
Mono.from(mailboxManager.createMailboxReactive(destinationMailboxPath, 
session));
+            
}).then(Mono.from(mailboxManager.copyMessagesReactive(MessageRange.one(id.getUid()),
 originMailboxPath, destinationMailboxPath, session)));
+    }
+
     private String useSlashAsSeparator(String urlPath, MailboxSession session) 
throws MessagingException {
         String destination = urlPath.replace('/', session.getPathDelimiter());
         if (Strings.isNullOrEmpty(destination)) {


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org
For additional commands, e-mail: notifications-h...@james.apache.org

Reply via email to