This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch 3.9.x in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 7d6b19f0fd22f4fb2644c89a3c207f347ebf8f56 Author: Quan Tran <[email protected]> AuthorDate: Tue Sep 30 09:58:55 2025 +0700 JAMES-4148 Filter serializer should support moveTo action --- .../src/test/resources/json/event-v4.json | 3 + .../src/test/resources/json/eventComplex-v4.json | 15 +++++ .../src/test/resources/json/increment-v4.json | 12 ++++ .../org/apache/james/jmap/api/filtering/Rule.java | 68 +++++++++++++++++++--- .../apache/james/jmap/api/filtering/RuleDTO.java | 49 +++++++++++++++- .../james/jmap/api/filtering/RuleFixture.java | 3 +- 6 files changed, 138 insertions(+), 12 deletions(-) diff --git a/server/data/data-jmap-cassandra/src/test/resources/json/event-v4.json b/server/data/data-jmap-cassandra/src/test/resources/json/event-v4.json index e354e06566..bb54fd57fa 100644 --- a/server/data/data-jmap-cassandra/src/test/resources/json/event-v4.json +++ b/server/data/data-jmap-cassandra/src/test/resources/json/event-v4.json @@ -25,6 +25,9 @@ "appendIn": { "mailboxIds":["id-01"] }, + "moveTo": { + "mailboxName": "Trash" + }, "important":true, "keyworkds":["abc"], "reject":true, diff --git a/server/data/data-jmap-cassandra/src/test/resources/json/eventComplex-v4.json b/server/data/data-jmap-cassandra/src/test/resources/json/eventComplex-v4.json index 437eaeff39..96ea617cad 100644 --- a/server/data/data-jmap-cassandra/src/test/resources/json/eventComplex-v4.json +++ b/server/data/data-jmap-cassandra/src/test/resources/json/eventComplex-v4.json @@ -40,6 +40,9 @@ "appendIn": { "mailboxIds":["id-01"] }, + "moveTo": { + "mailboxName": "Trash" + }, "important":true, "keyworkds":["abc"], "reject":true, @@ -67,6 +70,9 @@ "appendIn": { "mailboxIds":["id-01"] }, + "moveTo": { + "mailboxName": "Trash" + }, "important":true, "keyworkds":["abc"], "reject":true, @@ -94,6 +100,9 @@ "appendIn": { "mailboxIds":["id-01"] }, + "moveTo": { + "mailboxName": "Trash" + }, "important":true, "keyworkds":["abc"], "reject":true, @@ -121,6 +130,9 @@ "appendIn": { "mailboxIds":["id-01"] }, + "moveTo": { + "mailboxName": "Trash" + }, "important":true, "keyworkds":["abc"], "reject":true, @@ -148,6 +160,9 @@ "appendIn": { "mailboxIds":["id-01"] }, + "moveTo": { + "mailboxName": "Trash" + }, "important":true, "keyworkds":["abc"], "reject":true, diff --git a/server/data/data-jmap-cassandra/src/test/resources/json/increment-v4.json b/server/data/data-jmap-cassandra/src/test/resources/json/increment-v4.json index fb7b0b6174..1509fc10ef 100644 --- a/server/data/data-jmap-cassandra/src/test/resources/json/increment-v4.json +++ b/server/data/data-jmap-cassandra/src/test/resources/json/increment-v4.json @@ -20,6 +20,9 @@ "appendIn": { "mailboxIds":["id-01"] }, + "moveTo": { + "mailboxName": "Trash" + }, "important":true, "keyworkds":["abc"], "reject":true, @@ -47,6 +50,9 @@ "appendIn": { "mailboxIds":["id-01"] }, + "moveTo": { + "mailboxName": "Trash" + }, "important":true, "keyworkds":["abc"], "reject":true, @@ -76,6 +82,9 @@ "appendIn": { "mailboxIds":["id-01"] }, + "moveTo": { + "mailboxName": "Trash" + }, "important":true, "keyworkds":["abc"], "reject":true, @@ -105,6 +114,9 @@ "appendIn": { "mailboxIds":["id-01"] }, + "moveTo": { + "mailboxName": "Trash" + }, "important":true, "keyworkds":["abc"], "reject":true, diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java index c892df422a..123439a385 100644 --- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java +++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java @@ -376,6 +376,39 @@ public class Rule { } } + public static class MoveTo { + private final String mailboxName; + + public MoveTo(String mailboxName) { + this.mailboxName = mailboxName; + } + + public String getMailboxName() { + return mailboxName; + } + + @Override + public final boolean equals(Object o) { + if (o instanceof MoveTo) { + MoveTo moveTo = (MoveTo) o; + return Objects.equals(mailboxName, moveTo.mailboxName); + } + return false; + } + + @Override + public final int hashCode() { + return Objects.hash(mailboxName); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("mailboxName", mailboxName) + .toString(); + } + } + public static class Builder { private AppendInMailboxes appendInMailboxes; private boolean markAsSeen; @@ -383,6 +416,7 @@ public class Rule { private boolean reject; private List<String> withKeywords; private Optional<Forward> forward; + private Optional<MoveTo> moveTo; public Builder setAppendInMailboxes(AppendInMailboxes appendInMailboxes) { this.appendInMailboxes = appendInMailboxes; @@ -419,6 +453,11 @@ public class Rule { return this; } + public Builder setMoveTo(Optional<MoveTo> moveTo) { + this.moveTo = moveTo; + return this; + } + public Action build() { appendInMailboxes = Optional.ofNullable(appendInMailboxes) .orElse(Rule.Action.AppendInMailboxes.withMailboxIds(ImmutableList.of())); @@ -426,8 +465,10 @@ public class Rule { .orElse(ImmutableList.of()); forward = Optional.ofNullable(forward) .orElse(Optional.empty()); + moveTo = Optional.ofNullable(moveTo) + .orElse(Optional.empty()); - return new Action(appendInMailboxes, markAsSeen, markAsImportant, reject, withKeywords, forward); + return new Action(appendInMailboxes, markAsSeen, markAsImportant, reject, withKeywords, forward, moveTo); } } @@ -436,16 +477,18 @@ public class Rule { } public static Action of(AppendInMailboxes appendInMailboxes) { - return new Action(appendInMailboxes, false, false, false, ImmutableList.of(), Optional.empty()); + return new Action(appendInMailboxes, false, false, false, ImmutableList.of(), Optional.empty(), + Optional.empty()); } public static Action of(AppendInMailboxes appendInMailboxes, boolean markAsSeen, boolean markAsImportant, boolean reject, List<String> withKeywords) { - return new Action(appendInMailboxes, markAsSeen, markAsImportant, reject, withKeywords, Optional.empty()); + return new Action(appendInMailboxes, markAsSeen, markAsImportant, reject, withKeywords, Optional.empty(), Optional.empty()); } public static Action of(AppendInMailboxes appendInMailboxes, boolean markAsSeen, boolean markAsImportant, - boolean reject, List<String> withKeywords, Optional<Forward> forward) { - return new Action(appendInMailboxes, markAsSeen, markAsImportant, reject, withKeywords, forward); + boolean reject, List<String> withKeywords, Optional<Forward> forward, + Optional<MoveTo> moveTo) { + return new Action(appendInMailboxes, markAsSeen, markAsImportant, reject, withKeywords, forward, moveTo); } private final AppendInMailboxes appendInMailboxes; @@ -454,15 +497,18 @@ public class Rule { private final boolean reject; private final List<String> withKeywords; private final Optional<Forward> forward; + private final Optional<MoveTo> moveTo; private Action(AppendInMailboxes appendInMailboxes, boolean markAsSeen, boolean markAsImportant, - boolean reject, List<String> withKeywords, Optional<Forward> forward) { + boolean reject, List<String> withKeywords, Optional<Forward> forward, + Optional<MoveTo> moveTo) { this.appendInMailboxes = appendInMailboxes; this.markAsSeen = markAsSeen; this.markAsImportant = markAsImportant; this.reject = reject; this.withKeywords = withKeywords; this.forward = forward; + this.moveTo = moveTo; } public AppendInMailboxes getAppendInMailboxes() { @@ -489,6 +535,10 @@ public class Rule { return forward; } + public Optional<MoveTo> getMoveTo() { + return moveTo; + } + @Override public final boolean equals(Object o) { if (o instanceof Action) { @@ -498,14 +548,15 @@ public class Rule { && Objects.equals(markAsImportant, action.markAsImportant) && Objects.equals(reject, action.reject) && Objects.equals(withKeywords, action.withKeywords) - && Objects.equals(forward, action.forward); + && Objects.equals(forward, action.forward) + && Objects.equals(moveTo, action.moveTo); } return false; } @Override public final int hashCode() { - return Objects.hash(appendInMailboxes, markAsImportant, markAsSeen, reject, withKeywords, forward); + return Objects.hash(appendInMailboxes, markAsImportant, markAsSeen, reject, withKeywords, forward, moveTo); } @Override @@ -517,6 +568,7 @@ public class Rule { .add("reject", reject) .add("withKeywords", withKeywords) .add("forward", forward) + .add("moveTo", moveTo) .toString(); } } diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/RuleDTO.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/RuleDTO.java index 9f9794437b..cffdbbdd6a 100644 --- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/RuleDTO.java +++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/RuleDTO.java @@ -224,13 +224,48 @@ public class RuleDTO { } } + public static class MoveToDTO { + public static MoveToDTO from(Rule.Action.MoveTo moveTo) { + return new MoveToDTO(moveTo.getMailboxName()); + } + + private final String mailboxName; + + public MoveToDTO(@JsonProperty("mailboxName") String mailboxName) { + this.mailboxName = mailboxName; + } + + public String getMailboxName() { + return mailboxName; + } + + public Rule.Action.MoveTo toMoveTo() { + return new Rule.Action.MoveTo(mailboxName); + } + + @Override + public final boolean equals(Object o) { + if (o instanceof MoveToDTO) { + MoveToDTO that = (MoveToDTO) o; + return Objects.equals(this.mailboxName, that.mailboxName); + } + return false; + } + + @Override + public final int hashCode() { + return Objects.hash(mailboxName); + } + } + public static ActionDTO from(Rule.Action action) { return new ActionDTO(AppendInMailboxesDTO.from(action.getAppendInMailboxes()), action.isMarkAsSeen(), action.isMarkAsImportant(), action.isReject(), ImmutableList.copyOf(action.getWithKeywords()), - action.getForward().map(ForwardDTO::from)); + action.getForward().map(ForwardDTO::from), + action.getMoveTo().map(MoveToDTO::from)); } @JsonCreator @@ -239,13 +274,15 @@ public class RuleDTO { @JsonProperty("important") boolean important, @JsonProperty("reject") boolean reject, @JsonProperty("keywords") @JsonSetter(nulls = Nulls.AS_EMPTY) List<String> keyworkds, - @JsonProperty("forwardTo") Optional<ForwardDTO> forwardTo) { + @JsonProperty("forwardTo") Optional<ForwardDTO> forwardTo, + @JsonProperty("moveTo") Optional<MoveToDTO> moveTo) { this.appendIn = appendIn; this.keyworkds = keyworkds; this.seen = seen; this.important = important; this.reject = reject; this.forwardTo = forwardTo; + this.moveTo = moveTo; } private final AppendInMailboxesDTO appendIn; @@ -254,6 +291,7 @@ public class RuleDTO { private final boolean reject; private final List<String> keyworkds; private Optional<ForwardDTO> forwardTo; + private Optional<MoveToDTO> moveTo; public AppendInMailboxesDTO getAppendIn() { return appendIn; @@ -279,13 +317,18 @@ public class RuleDTO { return forwardTo; } + public Optional<MoveToDTO> getMoveTo() { + return moveTo; + } + public Rule.Action toAction() { return Rule.Action.of(appendIn.toAppendInMailboxes(), isSeen(), isImportant(), isReject(), getKeyworkds(), - forwardTo.map(ForwardDTO::toForward)); + forwardTo.map(ForwardDTO::toForward), + moveTo.map(MoveToDTO::toMoveTo)); } @Override diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleFixture.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleFixture.java index e027ca94f3..daac0973bf 100644 --- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleFixture.java +++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleFixture.java @@ -43,7 +43,8 @@ public interface RuleFixture { .stream() .map(Throwing.function(MailAddress::new)) .collect(ImmutableList.toImmutableList())) - .keepACopy())); + .keepACopy()), + Optional.of(new Rule.Action.MoveTo("Trash"))); Rule.Builder RULE_BUILDER = Rule.builder().name(NAME).conditionGroup(CONDITION).action(ACTION); Rule RULE_1 = RULE_BUILDER.id(Rule.Id.of("1")).build(); Rule RULE_1_MODIFIED = Rule.builder() --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
