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