You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2023/04/21 04:19:41 UTC

[james-project] 04/06: JAMES-3777 Serialization for IncrementalRuleChange

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

commit 7f445cd95ded31f6949bcbe761ccff21d7ef276f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Apr 19 11:38:56 2023 +0700

    JAMES-3777 Serialization for IncrementalRuleChange
---
 .../james/modules/data/CassandraJmapModule.java    |   1 +
 .../FilteringIncrementalRuleChangeDTO.java         | 141 +++++++++++++++++++++
 .../FilteringRuleSetDefineDTOModules.java          |  11 ++
 ...sandraEventSourcingFilteringManagementTest.java |   5 +-
 .../james/jmap/cassandra/filtering/DTOTest.java    |  22 ++++
 .../src/test/resources/json/increment.json         |  31 +++++
 6 files changed, 210 insertions(+), 1 deletion(-)

diff --git a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraJmapModule.java b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraJmapModule.java
index 77e64336b9..1dd7a16301 100644
--- a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraJmapModule.java
+++ b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraJmapModule.java
@@ -101,6 +101,7 @@ public class CassandraJmapModule extends AbstractModule {
 
         Multibinder<EventDTOModule<? extends Event, ? extends EventDTO>> eventDTOModuleBinder = Multibinder.newSetBinder(binder(), new TypeLiteral<>() {});
         eventDTOModuleBinder.addBinding().toInstance(FilteringRuleSetDefineDTOModules.FILTERING_RULE_SET_DEFINED);
+        eventDTOModuleBinder.addBinding().toInstance(FilteringRuleSetDefineDTOModules.FILTERING_INCREMENT);
 
 
         Multibinder.newSetBinder(binder(), UsernameChangeTaskStep.class)
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/FilteringIncrementalRuleChangeDTO.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/FilteringIncrementalRuleChangeDTO.java
new file mode 100644
index 0000000000..92cadb461d
--- /dev/null
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/FilteringIncrementalRuleChangeDTO.java
@@ -0,0 +1,141 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.jmap.cassandra.filtering;
+
+import java.util.Objects;
+
+import org.apache.james.eventsourcing.EventId;
+import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTO;
+import org.apache.james.jmap.api.filtering.Rule;
+import org.apache.james.jmap.api.filtering.impl.FilteringAggregateId;
+import org.apache.james.jmap.api.filtering.impl.IncrementalRuleChange;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
+public class FilteringIncrementalRuleChangeDTO implements EventDTO {
+
+    public static FilteringIncrementalRuleChangeDTO from(IncrementalRuleChange event, String type) {
+        return new FilteringIncrementalRuleChangeDTO(
+            type, event.eventId().serialize(),
+            event.getAggregateId().asAggregateKey(),
+            RuleDTO.from(event.getRulesPrepended()),
+            RuleDTO.from(event.getRulesPostPended()),
+            RuleDTO.from(event.getRulesUpdated()),
+            event.getRulesDeleted().stream()
+                .map(id -> id.asString())
+                .collect(ImmutableSet.toImmutableSet()));
+    }
+
+    public static FilteringIncrementalRuleChangeDTO from(IncrementalRuleChange event) {
+        return from(event, FilteringRuleSetDefineDTOModules.TYPE_INCREMENTAL);
+    }
+
+    private final String type;
+    private final int eventId;
+    private final String aggregateId;
+    private final ImmutableList<RuleDTO> prepended;
+    private final ImmutableList<RuleDTO> postpended;
+    private final ImmutableSet<String> deleted;
+    private final ImmutableList<RuleDTO> updated;
+
+
+    @JsonCreator
+    public FilteringIncrementalRuleChangeDTO(@JsonProperty("type") String type,
+                                             @JsonProperty("eventId") int eventId,
+                                             @JsonProperty("aggregateId") String aggregateId,
+                                             @JsonProperty("prepended") ImmutableList<RuleDTO> prepended,
+                                             @JsonProperty("postpended") ImmutableList<RuleDTO> postpended,
+                                             @JsonProperty("updated") ImmutableList<RuleDTO> updated,
+                                             @JsonProperty("deleted") ImmutableSet<String> deleted) {
+        this.type = type;
+        this.eventId = eventId;
+        this.aggregateId = aggregateId;
+        this.prepended = prepended;
+        this.postpended = postpended;
+        this.updated = updated;
+        this.deleted = deleted;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public int getEventId() {
+        return eventId;
+    }
+
+    public String getAggregateId() {
+        return aggregateId;
+    }
+
+    public ImmutableList<RuleDTO> getPrepended() {
+        return prepended;
+    }
+
+    public ImmutableList<RuleDTO> getPostpended() {
+        return postpended;
+    }
+
+    public ImmutableSet<String> getDeleted() {
+        return deleted;
+    }
+
+    public ImmutableList<RuleDTO> getUpdated() {
+        return updated;
+    }
+
+    @JsonIgnore
+    public IncrementalRuleChange toEvent() {
+        return new IncrementalRuleChange(
+            FilteringAggregateId.parse(aggregateId),
+            EventId.fromSerialized(eventId),
+            RuleDTO.toRules(prepended),
+            RuleDTO.toRules(postpended),
+            deleted.stream()
+                .map(Rule.Id::of)
+                .collect(ImmutableSet.toImmutableSet()),
+            RuleDTO.toRules(updated));
+    }
+
+    @Override
+    public final boolean equals(Object o) {
+        if (o instanceof FilteringIncrementalRuleChangeDTO) {
+            FilteringIncrementalRuleChangeDTO that = (FilteringIncrementalRuleChangeDTO) o;
+
+            return Objects.equals(this.eventId, that.eventId)
+                && Objects.equals(this.type, that.type)
+                && Objects.equals(this.aggregateId, that.aggregateId)
+                && Objects.equals(this.prepended, that.prepended)
+                && Objects.equals(this.postpended, that.postpended)
+                && Objects.equals(this.updated, that.updated)
+                && Objects.equals(this.deleted, that.deleted);
+        }
+        return false;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash(type, eventId, aggregateId, prepended, postpended, deleted, updated);
+    }
+}
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/FilteringRuleSetDefineDTOModules.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/FilteringRuleSetDefineDTOModules.java
index 3f8314a187..d845202235 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/FilteringRuleSetDefineDTOModules.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/FilteringRuleSetDefineDTOModules.java
@@ -20,11 +20,13 @@
 package org.apache.james.jmap.cassandra.filtering;
 
 import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTOModule;
+import org.apache.james.jmap.api.filtering.impl.IncrementalRuleChange;
 import org.apache.james.jmap.api.filtering.impl.RuleSetDefined;
 
 public interface FilteringRuleSetDefineDTOModules {
 
     String TYPE = "filtering-rule-set-defined";
+    String TYPE_INCREMENTAL = "filtering-increment";
 
     EventDTOModule<RuleSetDefined, FilteringRuleSetDefinedDTO> FILTERING_RULE_SET_DEFINED =
         EventDTOModule
@@ -35,4 +37,13 @@ public interface FilteringRuleSetDefineDTOModules {
             .typeName(TYPE)
             .withFactory(EventDTOModule::new);
 
+    EventDTOModule<IncrementalRuleChange, FilteringIncrementalRuleChangeDTO> FILTERING_INCREMENT =
+        EventDTOModule
+            .forEvent(IncrementalRuleChange.class)
+            .convertToDTO(FilteringIncrementalRuleChangeDTO.class)
+            .toDomainObjectConverter(FilteringIncrementalRuleChangeDTO::toEvent)
+            .toDTOConverter(FilteringIncrementalRuleChangeDTO::from)
+            .typeName(TYPE_INCREMENTAL)
+            .withFactory(EventDTOModule::new);
+
 }
diff --git a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/CassandraEventSourcingFilteringManagementTest.java b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/CassandraEventSourcingFilteringManagementTest.java
index 555581e42f..9972054f41 100644
--- a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/CassandraEventSourcingFilteringManagementTest.java
+++ b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/CassandraEventSourcingFilteringManagementTest.java
@@ -27,5 +27,8 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class CassandraEventSourcingFilteringManagementTest implements FilteringManagementContract {
     @RegisterExtension
     static CassandraEventStoreExtension eventStoreExtension =
-        new CassandraEventStoreExtension(JsonEventSerializer.forModules(FilteringRuleSetDefineDTOModules.FILTERING_RULE_SET_DEFINED).withoutNestedType());
+        new CassandraEventStoreExtension(JsonEventSerializer.forModules(
+                FilteringRuleSetDefineDTOModules.FILTERING_RULE_SET_DEFINED,
+                FilteringRuleSetDefineDTOModules.FILTERING_INCREMENT)
+            .withoutNestedType());
 }
diff --git a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/DTOTest.java b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/DTOTest.java
index 452f59dcea..3130a5bfd9 100644
--- a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/DTOTest.java
+++ b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/DTOTest.java
@@ -25,22 +25,30 @@ import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_FROM;
 import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_RECIPIENT;
 import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_SUBJECT;
 import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_TO;
+import static org.apache.james.jmap.cassandra.filtering.FilteringRuleSetDefineDTOModules.FILTERING_INCREMENT;
 import static org.apache.james.jmap.cassandra.filtering.FilteringRuleSetDefineDTOModules.FILTERING_RULE_SET_DEFINED;
 
+import java.util.Optional;
+
 import org.apache.james.JsonSerializationVerifier;
 import org.apache.james.core.Username;
 import org.apache.james.eventsourcing.EventId;
+import org.apache.james.jmap.api.filtering.Rule;
 import org.apache.james.jmap.api.filtering.impl.FilteringAggregateId;
+import org.apache.james.jmap.api.filtering.impl.IncrementalRuleChange;
 import org.apache.james.jmap.api.filtering.impl.RuleSetDefined;
+import org.apache.james.json.JsonGenericSerializer;
 import org.apache.james.util.ClassLoaderUtils;
 import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 
 class DTOTest {
     static final String EVENT_JSON = ClassLoaderUtils.getSystemResourceAsString("json/event.json");
     static final String EVENT_EMPTY_JSON = ClassLoaderUtils.getSystemResourceAsString("json/eventEmpty.json");
     static final String EVENT_COMPLEX_JSON = ClassLoaderUtils.getSystemResourceAsString("json/eventComplex.json");
+
     static final RuleSetDefined SIMPLE_RULE = new RuleSetDefined(
                     new FilteringAggregateId(Username.of("Bart")),
                     EventId.first(),
@@ -53,6 +61,13 @@ class DTOTest {
                     new FilteringAggregateId(Username.of("Bart")),
                     EventId.first(),
                     ImmutableList.of(RULE_FROM, RULE_RECIPIENT, RULE_SUBJECT, RULE_TO));
+    static final IncrementalRuleChange INCREMENT =  new IncrementalRuleChange(
+                    new FilteringAggregateId(Username.of("Bart")),
+                    EventId.first(),
+                    ImmutableList.of(RULE_FROM, RULE_TO),
+                    ImmutableList.of(RULE_RECIPIENT),
+                    ImmutableSet.of(Rule.Id.of("abdcd")),
+                    ImmutableList.of(RULE_SUBJECT));
 
     @Test
     void shouldSerializeRule() throws Exception {
@@ -62,4 +77,11 @@ class DTOTest {
             .testCase(COMPLEX_RULE, EVENT_COMPLEX_JSON)
             .verify();
     }
+
+    @Test
+    void shouldSerializeIncrements() throws Exception {
+        JsonSerializationVerifier.dtoModule(FILTERING_INCREMENT)
+            .testCase(INCREMENT, ClassLoaderUtils.getSystemResourceAsString("json/increment.json"))
+            .verify();
+    }
 }
diff --git a/server/data/data-jmap-cassandra/src/test/resources/json/increment.json b/server/data/data-jmap-cassandra/src/test/resources/json/increment.json
new file mode 100644
index 0000000000..00ea41137e
--- /dev/null
+++ b/server/data/data-jmap-cassandra/src/test/resources/json/increment.json
@@ -0,0 +1,31 @@
+{
+  "type":"filtering-increment",
+  "eventId":0,
+  "aggregateId":"FilteringRule/bart",
+  "prepended":[
+    {
+    "id":"id-from",
+    "name":"a name",
+    "condition":{"field":"from","comparator":"contains","value":"A value to match 4"},
+    "action":{"appendIn":{"mailboxIds":["mbx1"]}}
+    },
+    {
+      "id":"id-to",
+      "name":"a name",
+      "condition":{"field":"to","comparator":"exactly-equals","value":"A value to match 1"},
+      "action":{"appendIn":{"mailboxIds":["mbx1"]}}
+    }],
+  "postpended":[{
+    "id":"id-rcpt",
+    "name":"a name",
+    "condition":{"field":"recipient","comparator":"not-exactly-equals","value":"A value to match 3"},
+    "action":{"appendIn":{"mailboxIds":["mbx1"]}}
+  }],
+  "updated":[{
+    "id":"id-subject",
+    "name":"a name",
+    "condition":{"field":"subject","comparator":"not-contains","value":"A value to match 2"},
+    "action":{"appendIn":{"mailboxIds":["mbx1"]}}
+  }],
+  "deleted":["abdcd"]
+}
\ No newline at end of file


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