You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by hq...@apache.org on 2025/10/29 07:11:36 UTC

(james-project) 02/07: JAMES-4148 RunRulesOnMailboxTask should rely on MailboxPath

This is an automated email from the ASF dual-hosted git repository.

hqtran pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit ab36cb926917262787c2b15ac7ace4aa7dacbd12
Author: Quan Tran <hq...@linagora.com>
AuthorDate: Tue Oct 28 11:33:26 2025 +0700

    JAMES-4148 RunRulesOnMailboxTask should rely on MailboxPath
    
    To allow running on shared mailbox if needed.
---
 .../data/jmap/RunRulesOnMailboxService.java        |  9 ++++-----
 .../webadmin/data/jmap/RunRulesOnMailboxTask.java  | 22 +++++++++++++++-------
 .../data/jmap/RunRulesOnMailboxTaskDTO.java        | 17 +++++++++--------
 .../resources/json/runRulesOnMailbox.task.json     |  2 +-
 4 files changed, 29 insertions(+), 21 deletions(-)

diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RunRulesOnMailboxService.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RunRulesOnMailboxService.java
index 881dc3fefb..1cfa6278a5 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RunRulesOnMailboxService.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RunRulesOnMailboxService.java
@@ -46,7 +46,6 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.task.Task;
-import org.apache.james.webadmin.validation.MailboxName;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -86,20 +85,20 @@ public class RunRulesOnMailboxService {
         this.maxActionsPerMailbox = maxActionsPerMailbox;
     }
 
-    public Mono<Task.Result> runRulesOnMailbox(Username username, MailboxName mailboxName, Rules rules, RunRulesOnMailboxTask.Context context) {
+    public Mono<Task.Result> runRulesOnMailbox(Username username, MailboxPath mailboxPath, Rules rules, RunRulesOnMailboxTask.Context context) {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(username);
         RuleMatcher ruleMatcher = new RuleMatcher(rules.getRules());
 
-        return Mono.from(mailboxManager.getMailboxReactive(MailboxPath.forUser(username, mailboxName.asString()), mailboxSession))
+        return Mono.from(mailboxManager.getMailboxReactive(mailboxPath, mailboxSession))
             .flatMapMany(messageManager -> Flux.from(messageManager.getMessagesReactive(MessageRange.all(), FetchGroup.HEADERS, mailboxSession))
                 .flatMap(Throwing.function(messageResult -> runRulesOnMessage(ruleMatcher, messageResult, mailboxSession, context)), DEFAULT_CONCURRENCY))
             .onErrorResume(TooManyAppliedActionsException.class, e -> {
-                LOGGER.info("Maximum number of actions exceeded for mailbox {} of user {}", mailboxName.asString(), username);
+                LOGGER.info("Maximum number of actions exceeded for mailbox {} of user {}", mailboxPath.asString(), username);
                 context.setMaximumAppliedActionExceeded();
                 return Mono.just(Task.Result.COMPLETED);
             })
             .onErrorResume(e -> {
-                LOGGER.error("Error when applying rules to mailbox. Mailbox {} for user {}", mailboxName.asString(), username, e);
+                LOGGER.error("Error when applying rules to mailbox. Mailbox {} for user {}", mailboxPath.asString(), username, e);
                 context.incrementFails();
                 return Mono.just(Task.Result.PARTIAL);
             })
diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RunRulesOnMailboxTask.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RunRulesOnMailboxTask.java
index e9c3f7f356..da99e07ceb 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RunRulesOnMailboxTask.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RunRulesOnMailboxTask.java
@@ -28,6 +28,7 @@ import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.james.core.Username;
 import org.apache.james.jmap.api.filtering.Rules;
+import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
 import org.apache.james.task.TaskType;
@@ -202,24 +203,31 @@ public class RunRulesOnMailboxTask implements Task {
 
     private final Context context;
     private final Username username;
-    private final MailboxName mailboxName;
+    private final MailboxPath mailboxPath;
     private final Rules rules;
     private final RunRulesOnMailboxService runRulesOnMailboxService;
 
     public RunRulesOnMailboxTask(Username username,
-                                 MailboxName mailboxName,
+                                 MailboxPath mailboxPath,
                                  Rules rules,
                                  RunRulesOnMailboxService runRulesOnMailboxService) {
         this.username = username;
-        this.mailboxName = mailboxName;
+        this.mailboxPath = mailboxPath;
         this.rules = rules;
         this.runRulesOnMailboxService = runRulesOnMailboxService;
         this.context = new Context();
     }
 
+    public RunRulesOnMailboxTask(Username username,
+                                 MailboxName mailboxName,
+                                 Rules rules,
+                                 RunRulesOnMailboxService runRulesOnMailboxService) {
+        this(username, MailboxPath.forUser(username, mailboxName.asString()), rules, runRulesOnMailboxService);
+    }
+
     @Override
     public Result run() {
-        return runRulesOnMailboxService.runRulesOnMailbox(username, mailboxName, rules, context)
+        return runRulesOnMailboxService.runRulesOnMailbox(username, mailboxPath, rules, context)
             .block();
     }
 
@@ -230,15 +238,15 @@ public class RunRulesOnMailboxTask implements Task {
 
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return Optional.of(AdditionalInformation.from(username, mailboxName, context));
+        return Optional.of(AdditionalInformation.from(username, new MailboxName(mailboxPath.getName()), context));
     }
 
     public Username getUsername() {
         return username;
     }
 
-    public MailboxName getMailboxName() {
-        return mailboxName;
+    public MailboxPath getMailboxPath() {
+        return mailboxPath;
     }
 
     public Rules getRules() {
diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RunRulesOnMailboxTaskDTO.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RunRulesOnMailboxTaskDTO.java
index 266401be7a..e4ff361c99 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RunRulesOnMailboxTaskDTO.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RunRulesOnMailboxTaskDTO.java
@@ -24,9 +24,9 @@ import org.apache.james.jmap.api.filtering.RuleDTO;
 import org.apache.james.jmap.api.filtering.Rules;
 import org.apache.james.jmap.api.filtering.Version;
 import org.apache.james.json.DTOModule;
+import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.server.task.json.dto.TaskDTO;
 import org.apache.james.server.task.json.dto.TaskDTOModule;
-import org.apache.james.webadmin.validation.MailboxName;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.collect.ImmutableList;
@@ -34,16 +34,16 @@ import com.google.common.collect.ImmutableList;
 public class RunRulesOnMailboxTaskDTO implements TaskDTO {
     private final String type;
     private final String username;
-    private final String mailboxName;
+    private final String mailboxPath;
     private final ImmutableList<RuleDTO> rules;
 
     public RunRulesOnMailboxTaskDTO(@JsonProperty("type") String type,
                                     @JsonProperty("username") String username,
-                                    @JsonProperty("mailboxName") String mailboxName,
+                                    @JsonProperty("mailboxPath") String mailboxPath,
                                     @JsonProperty("rules") ImmutableList<RuleDTO> rules) {
         this.type = type;
         this.username = username;
-        this.mailboxName = mailboxName;
+        this.mailboxPath = mailboxPath;
         this.rules = rules;
     }
 
@@ -56,8 +56,8 @@ public class RunRulesOnMailboxTaskDTO implements TaskDTO {
         return username;
     }
 
-    public String getMailboxName() {
-        return mailboxName;
+    public String getMailboxPath() {
+        return mailboxPath;
     }
 
     public ImmutableList<RuleDTO> getRules() {
@@ -75,10 +75,11 @@ public class RunRulesOnMailboxTaskDTO implements TaskDTO {
     }
 
     public RunRulesOnMailboxTask fromDTO(RunRulesOnMailboxService runRulesOnMailboxService) {
-        return new RunRulesOnMailboxTask(Username.of(username), new MailboxName(mailboxName), new Rules(RuleDTO.toRules(rules), Version.INITIAL), runRulesOnMailboxService);
+        return new RunRulesOnMailboxTask(Username.of(username), MailboxPath.parseEscaped(mailboxPath).orElseThrow(() -> new IllegalArgumentException("Can not parse mailboxPath: " + mailboxPath)),
+            new Rules(RuleDTO.toRules(rules), Version.INITIAL), runRulesOnMailboxService);
     }
 
     public static RunRulesOnMailboxTaskDTO toDTO(RunRulesOnMailboxTask domainObject, String typeName) {
-        return new RunRulesOnMailboxTaskDTO(typeName, domainObject.getUsername().asString(), domainObject.getMailboxName().asString(), RuleDTO.from(domainObject.getRules().getRules()));
+        return new RunRulesOnMailboxTaskDTO(typeName, domainObject.getUsername().asString(), domainObject.getMailboxPath().asString(), RuleDTO.from(domainObject.getRules().getRules()));
     }
 }
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/runRulesOnMailbox.task.json b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/runRulesOnMailbox.task.json
index 63445e07e9..5864a987a5 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/runRulesOnMailbox.task.json
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/runRulesOnMailbox.task.json
@@ -1,5 +1,5 @@
 {
-  "mailboxName": "mbx1",
+  "mailboxPath": "#private:bob@domain.tld:mbx1",
   "type": "RunRulesOnMailboxTask",
   "username": "bob@domain.tld",
   "rules": [


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