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