Skip to content

Commit 83caab0

Browse files
mbaechlerremk
authored andcommitted
JAMES-2813 handle nested AdditionInformation
1 parent edae4eb commit 83caab0

File tree

15 files changed

+136
-106
lines changed

15 files changed

+136
-106
lines changed

event-sourcing/event-store-cassandra/src/main/java/org/apache/james/eventsourcing/eventstore/cassandra/JsonEventSerializer.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import org.apache.james.eventsourcing.Event;
2828
import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTO;
2929
import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTOModule;
30+
import org.apache.james.json.DTOConverter;
31+
import org.apache.james.json.DTOModule;
3032
import org.apache.james.json.JsonGenericSerializer;
3133

3234
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -49,13 +51,12 @@ public UnknownEventException(JsonGenericSerializer.UnknownTypeException original
4951
private JsonGenericSerializer<Event, EventDTO> jsonGenericSerializer;
5052

5153
@Inject
52-
public JsonEventSerializer(Set<EventDTOModule<?, ?>> modules) {
53-
//FIXME
54-
jsonGenericSerializer = new JsonGenericSerializer(modules, null);
54+
public JsonEventSerializer(DTOConverter<Event, EventDTO> converter, Set<EventDTOModule<?, ?>> modules, Set<DTOModule<?, ?>> nestedTypesModules) {
55+
jsonGenericSerializer = new JsonGenericSerializer<>(modules, nestedTypesModules, converter);
5556
}
5657

5758
public JsonEventSerializer(EventDTOModule<?, ?>... modules) {
58-
this(ImmutableSet.copyOf(modules));
59+
this(new DTOConverter<>(ImmutableSet.copyOf(modules)), ImmutableSet.copyOf(modules), ImmutableSet.of());
5960
}
6061

6162
public String serialize(Event event) throws JsonProcessingException {

event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreExtension.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@
1919

2020
package org.apache.james.eventsourcing.eventstore.cassandra;
2121

22-
import java.util.Arrays;
2322
import java.util.Set;
2423

2524
import org.apache.james.backends.cassandra.CassandraClusterExtension;
2625
import org.apache.james.eventsourcing.eventstore.EventStore;
2726
import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTOModule;
27+
import org.apache.james.json.DTOConverter;
2828
import org.junit.jupiter.api.extension.AfterAllCallback;
2929
import org.junit.jupiter.api.extension.AfterEachCallback;
3030
import org.junit.jupiter.api.extension.BeforeAllCallback;
@@ -63,7 +63,7 @@ public void afterAll(ExtensionContext context) {
6363

6464
@Override
6565
public void beforeEach(ExtensionContext context) {
66-
JsonEventSerializer jsonEventSerializer = new JsonEventSerializer(modules);
66+
JsonEventSerializer jsonEventSerializer = new JsonEventSerializer(modules.toArray(new EventDTOModule[0]));
6767

6868
eventStoreDao = new EventStoreDao(cassandra.getCassandraCluster().getConf(), jsonEventSerializer);
6969
}

event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/JsonEventSerializerTest.java

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.apache.james.eventsourcing.TestEvent;
2929
import org.apache.james.eventsourcing.eventstore.cassandra.dto.OtherEvent;
3030
import org.apache.james.eventsourcing.eventstore.cassandra.dto.TestEventDTOModules;
31+
import org.apache.james.json.DTOModule;
3132
import org.junit.jupiter.api.Test;
3233

3334
class JsonEventSerializerTest {

json/src/main/java/org/apache/james/json/DTOConverter.java

+8-4
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,15 @@
2929

3030
public class DTOConverter<T, U extends DTO> {
3131

32-
private final Map<String, DTOModule<T, U>> typeToModule;
33-
private final Map<Class<? extends T>, DTOModule<T, U>> domainClassToModule;
32+
private final Map<String, DTOModule<? extends T, ? extends U>> typeToModule;
33+
private final Map<Class<? extends T>, DTOModule<? extends T, ? extends U>> domainClassToModule;
3434

3535
@SafeVarargs
36-
public static <T, U extends DTO> DTOConverter<T, U> of(DTOModule<T, U>... modules) {
36+
public static <T, U extends DTO> DTOConverter<T, U> of(DTOModule<? extends T, ? extends U>... modules) {
3737
return new DTOConverter<>(ImmutableSet.copyOf(modules));
3838
}
3939

40-
public DTOConverter(Set<DTOModule<T, U>> modules) {
40+
public DTOConverter(Set<? extends DTOModule<? extends T, ? extends U>> modules) {
4141
typeToModule = modules.stream()
4242
.collect(Guavate.toImmutableMap(
4343
DTOModule::getDomainObjectType,
@@ -49,16 +49,20 @@ public DTOConverter(Set<DTOModule<T, U>> modules) {
4949
Function.identity()));
5050
}
5151

52+
@SuppressWarnings("unchecked")
5253
public Optional<U> convert(T domainObject) {
5354
return Optional
5455
.ofNullable(domainClassToModule.get(domainObject.getClass()))
56+
.map(module -> (DTOModule<T, U>) module)
5557
.map(module -> module.toDTO(domainObject));
5658
}
5759

60+
@SuppressWarnings("unchecked")
5861
public Optional<T> convert(U dto) {
5962
String type = dto.getType();
6063
return Optional
6164
.ofNullable(typeToModule.get(type))
65+
.map(module -> (DTOModule<T, U>) module)
6266
.map(DTOModule::getToDomainObjectConverter)
6367
.map(convert -> convert.convert(dto));
6468
}

json/src/main/java/org/apache/james/json/JsonGenericSerializer.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
3636
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
3737
import com.google.common.collect.ImmutableSet;
38+
import com.google.common.collect.Sets;
3839

3940
public class JsonGenericSerializer<T, U extends DTO> {
4041

@@ -59,15 +60,15 @@ public UnknownTypeException(String message) {
5960

6061
@SafeVarargs
6162
public static <T, U extends DTO> JsonGenericSerializer<T, U> of(DTOModule<T, U>... modules) {
62-
return new JsonGenericSerializer<>(ImmutableSet.copyOf(modules), DTOConverter.of(modules));
63+
return new JsonGenericSerializer<>(ImmutableSet.copyOf(modules), ImmutableSet.of(), DTOConverter.of(modules));
6364
}
6465

65-
public JsonGenericSerializer(Set<DTOModule<T, U>> modules, DTOConverter<T, U> converter) {
66+
public JsonGenericSerializer(Set<? extends DTOModule<? extends T, ? extends U>> modules, Set<? extends DTOModule<?, ?>> nestedTypesModules, DTOConverter<T, U> converter) {
6667
this.dtoConverter = converter;
67-
this.objectMapper = buildObjectMapper(modules);
68+
this.objectMapper = buildObjectMapper(Sets.union(modules, nestedTypesModules));
6869
}
6970

70-
private ObjectMapper buildObjectMapper(Set<DTOModule<T, U>> modules) {
71+
private ObjectMapper buildObjectMapper(Set<? extends DTOModule<?, ?>> modules) {
7172
ObjectMapper objectMapper = new ObjectMapper()
7273
.registerModule(new Jdk8Module())
7374
.registerModule(new JavaTimeModule())

server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java

+15-13
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.apache.james.backends.cassandra.migration.MigrationTaskAdditionalInformationDTO;
2525
import org.apache.james.backends.cassandra.migration.MigrationTaskDTO;
2626
import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTOModule;
27+
import org.apache.james.json.DTOConverter;
2728
import org.apache.james.mailbox.cassandra.mail.task.MailboxMergingTaskAdditionalInformationDTO;
2829
import org.apache.james.mailbox.cassandra.mail.task.MailboxMergingTaskDTO;
2930
import org.apache.james.mailbox.cassandra.mail.task.MailboxMergingTaskRunner;
@@ -34,10 +35,11 @@
3435
import org.apache.james.rrt.cassandra.CassandraMappingsSourcesDAO;
3536
import org.apache.james.rrt.cassandra.migration.MappingsSourcesMigration;
3637
import org.apache.james.rrt.cassandra.migration.MappingsSourcesMigrationTaskAdditionalInformationDTO;
37-
import org.apache.james.server.task.json.JsonTaskAdditionalInformationSerializer;
3838
import org.apache.james.server.task.json.JsonTaskSerializer;
39+
import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
3940
import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
4041
import org.apache.james.server.task.json.dto.TaskDTOModule;
42+
import org.apache.james.task.TaskExecutionDetails;
4143
import org.apache.james.task.eventsourcing.distributed.TasksSerializationModule;
4244
import org.apache.james.vault.blob.BlobStoreVaultGarbageCollectionTask;
4345
import org.apache.james.vault.blob.BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO;
@@ -91,33 +93,33 @@
9193
public class TaskSerializationModule extends AbstractModule {
9294

9395
@ProvidesIntoSet
94-
public EventDTOModule<?, ?> taskCreatedSerialization(JsonTaskSerializer jsonTaskSerializer, JsonTaskAdditionalInformationSerializer jsonTaskAdditionalInformationSerializer) {
95-
return TasksSerializationModule.CREATED.create(jsonTaskSerializer, jsonTaskAdditionalInformationSerializer);
96+
public EventDTOModule<?, ?> taskCreatedSerialization(JsonTaskSerializer jsonTaskSerializer, DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter) {
97+
return TasksSerializationModule.CREATED.create(jsonTaskSerializer, additionalInformationConverter);
9698
}
9799

98100
@ProvidesIntoSet
99-
public EventDTOModule<?, ?> taskStartedSerialization(JsonTaskSerializer jsonTaskSerializer, JsonTaskAdditionalInformationSerializer jsonTaskAdditionalInformationSerializer) {
100-
return TasksSerializationModule.STARTED.create(jsonTaskSerializer, jsonTaskAdditionalInformationSerializer);
101+
public EventDTOModule<?, ?> taskStartedSerialization(JsonTaskSerializer jsonTaskSerializer, DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter) {
102+
return TasksSerializationModule.STARTED.create(jsonTaskSerializer, additionalInformationConverter);
101103
}
102104

103105
@ProvidesIntoSet
104-
public EventDTOModule<?, ?> taskCancelRequestedSerialization(JsonTaskSerializer jsonTaskSerializer, JsonTaskAdditionalInformationSerializer jsonTaskAdditionalInformationSerializer) {
105-
return TasksSerializationModule.CANCEL_REQUESTED.create(jsonTaskSerializer, jsonTaskAdditionalInformationSerializer);
106+
public EventDTOModule<?, ?> taskCancelRequestedSerialization(JsonTaskSerializer jsonTaskSerializer, DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter) {
107+
return TasksSerializationModule.CANCEL_REQUESTED.create(jsonTaskSerializer, additionalInformationConverter);
106108
}
107109

108110
@ProvidesIntoSet
109-
public EventDTOModule<?, ?> taskCancelledSerialization(JsonTaskSerializer jsonTaskSerializer, JsonTaskAdditionalInformationSerializer jsonTaskAdditionalInformationSerializer) {
110-
return TasksSerializationModule.CANCELLED.create(jsonTaskSerializer, jsonTaskAdditionalInformationSerializer);
111+
public EventDTOModule<?, ?> taskCancelledSerialization(JsonTaskSerializer jsonTaskSerializer, DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter) {
112+
return TasksSerializationModule.CANCELLED.create(jsonTaskSerializer, additionalInformationConverter);
111113
}
112114

113115
@ProvidesIntoSet
114-
public EventDTOModule<?, ?> taskCompletedSerialization(JsonTaskSerializer jsonTaskSerializer, JsonTaskAdditionalInformationSerializer jsonTaskAdditionalInformationSerializer) {
115-
return TasksSerializationModule.COMPLETED.create(jsonTaskSerializer, jsonTaskAdditionalInformationSerializer);
116+
public EventDTOModule<?, ?> taskCompletedSerialization(JsonTaskSerializer jsonTaskSerializer, DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter) {
117+
return TasksSerializationModule.COMPLETED.create(jsonTaskSerializer, additionalInformationConverter);
116118
}
117119

118120
@ProvidesIntoSet
119-
public EventDTOModule<?, ?> taskFailedSerialization(JsonTaskSerializer jsonTaskSerializer, JsonTaskAdditionalInformationSerializer jsonTaskAdditionalInformationSerializer) {
120-
return TasksSerializationModule.FAILED.create(jsonTaskSerializer, jsonTaskAdditionalInformationSerializer);
121+
public EventDTOModule<?, ?> taskFailedSerialization(JsonTaskSerializer jsonTaskSerializer, DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter) {
122+
return TasksSerializationModule.FAILED.create(jsonTaskSerializer, additionalInformationConverter);
121123
}
122124

123125
@ProvidesIntoSet

server/data/data-cassandra/src/test/java/org/apache/james/dlp/eventsourcing/cassandra/CassandraEventSourcingDLPConfigurationStoreExtension.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,8 @@ public boolean supportsParameter(ParameterContext parameterContext, ExtensionCon
7373
@Override
7474
public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
7575
JsonEventSerializer jsonEventSerializer = new JsonEventSerializer(
76-
ImmutableSet.of(
7776
DLPConfigurationModules.DLP_CONFIGURATION_STORE,
78-
DLPConfigurationModules.DLP_CONFIGURATION_CLEAR));
77+
DLPConfigurationModules.DLP_CONFIGURATION_CLEAR);
7978

8079
EventStoreDao eventStoreDao = new EventStoreDao(
8180
cassandra.getConf(),

server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/view/cassandra/CassandraMailQueueViewTestFactory.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public static CassandraMailQueueView.Factory factory(Clock clock, Session sessio
5454

5555

5656
EventsourcingConfigurationManagement eventsourcingConfigurationManagement = new EventsourcingConfigurationManagement(new CassandraEventStore(new EventStoreDao(session,
57-
new JsonEventSerializer(ImmutableSet.of(CassandraMailQueueViewConfigurationModule.MAIL_QUEUE_VIEW_CONFIGURATION)))));
57+
new JsonEventSerializer(CassandraMailQueueViewConfigurationModule.MAIL_QUEUE_VIEW_CONFIGURATION))));
5858

5959
return new CassandraMailQueueView.Factory(
6060
cassandraMailQueueMailStore,

server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/TasksSerializationModule.java

+21-19
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@
2323
import java.util.stream.Stream;
2424

2525
import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTOModule;
26-
import org.apache.james.server.task.json.JsonTaskAdditionalInformationSerializer;
26+
import org.apache.james.json.DTOConverter;
2727
import org.apache.james.server.task.json.JsonTaskSerializer;
28+
import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
29+
import org.apache.james.task.TaskExecutionDetails;
2830
import org.apache.james.task.eventsourcing.AdditionalInformationUpdated;
2931
import org.apache.james.task.eventsourcing.CancelRequested;
3032
import org.apache.james.task.eventsourcing.Cancelled;
@@ -38,69 +40,69 @@
3840
public interface TasksSerializationModule {
3941
@FunctionalInterface
4042
interface TaskSerializationModuleFactory {
41-
EventDTOModule<?, ?> create(JsonTaskSerializer taskSerializer, JsonTaskAdditionalInformationSerializer additionalInformationSerializer);
43+
EventDTOModule<?, ?> create(JsonTaskSerializer taskSerializer, DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter);
4244
}
4345

44-
TaskSerializationModuleFactory CREATED = (jsonTaskSerializer, additionalInformationSerializer) -> EventDTOModule
46+
TaskSerializationModuleFactory CREATED = (jsonTaskSerializer, additionalInformationConverter) -> EventDTOModule
4547
.forEvent(Created.class)
4648
.convertToDTO(CreatedDTO.class)
4749
.toDomainObjectConverter(dto -> dto.toDomainObject(jsonTaskSerializer))
4850
.toDTOConverter((event, typeName) -> CreatedDTO.fromDomainObject(event, typeName, jsonTaskSerializer))
4951
.typeName("task-manager-created")
5052
.withFactory(EventDTOModule::new);
5153

52-
TaskSerializationModuleFactory STARTED = (jsonTaskSerializer, additionalInformationSerializer) -> EventDTOModule
54+
TaskSerializationModuleFactory STARTED = (jsonTaskSerializer, additionalInformationConverter) -> EventDTOModule
5355
.forEvent(Started.class)
5456
.convertToDTO(StartedDTO.class)
5557
.toDomainObjectConverter(StartedDTO::toDomainObject)
5658
.toDTOConverter(StartedDTO::fromDomainObject)
5759
.typeName("task-manager-started")
5860
.withFactory(EventDTOModule::new);
5961

60-
TaskSerializationModuleFactory CANCEL_REQUESTED = (jsonTaskSerializer, additionalInformationSerializer) -> EventDTOModule
62+
TaskSerializationModuleFactory CANCEL_REQUESTED = (jsonTaskSerializer, additionalInformationConverter) -> EventDTOModule
6163
.forEvent(CancelRequested.class)
6264
.convertToDTO(CancelRequestedDTO.class)
6365
.toDomainObjectConverter(CancelRequestedDTO::toDomainObject)
6466
.toDTOConverter(CancelRequestedDTO::fromDomainObject)
6567
.typeName("task-manager-cancel-requested")
6668
.withFactory(EventDTOModule::new);
6769

68-
TaskSerializationModuleFactory COMPLETED = (jsonTaskSerializer, additionalInformationSerializer) -> EventDTOModule
70+
TaskSerializationModuleFactory COMPLETED = (jsonTaskSerializer, additionalInformationConverter) -> EventDTOModule
6971
.forEvent(Completed.class)
7072
.convertToDTO(CompletedDTO.class)
71-
.toDomainObjectConverter(dto -> dto.toDomainObject(additionalInformationSerializer))
72-
.toDTOConverter((event, typeName) -> CompletedDTO.fromDomainObject(additionalInformationSerializer, event, typeName))
73+
.toDomainObjectConverter(dto -> dto.toDomainObject(additionalInformationConverter))
74+
.toDTOConverter((event, typeName) -> CompletedDTO.fromDomainObject(additionalInformationConverter, event, typeName))
7375
.typeName("task-manager-completed")
7476
.withFactory(EventDTOModule::new);
7577

76-
TaskSerializationModuleFactory FAILED = (jsonTaskSerializer, additionalInformationSerializer) -> EventDTOModule
78+
TaskSerializationModuleFactory FAILED = (jsonTaskSerializer, additionalInformationConverter) -> EventDTOModule
7779
.forEvent(Failed.class)
7880
.convertToDTO(FailedDTO.class)
79-
.toDomainObjectConverter(dto -> dto.toDomainObject(additionalInformationSerializer))
80-
.toDTOConverter((event, typeName) -> FailedDTO.fromDomainObject(additionalInformationSerializer, event, typeName))
81+
.toDomainObjectConverter(dto -> dto.toDomainObject(additionalInformationConverter))
82+
.toDTOConverter((event, typeName) -> FailedDTO.fromDomainObject(additionalInformationConverter, event, typeName))
8183
.typeName("task-manager-failed")
8284
.withFactory(EventDTOModule::new);
8385

84-
TaskSerializationModuleFactory CANCELLED = (jsonTaskSerializer, additionalInformationSerializer) -> EventDTOModule
86+
TaskSerializationModuleFactory CANCELLED = (jsonTaskSerializer, additionalInformationConverter) -> EventDTOModule
8587
.forEvent(Cancelled.class)
8688
.convertToDTO(CancelledDTO.class)
87-
.toDomainObjectConverter(dto -> dto.toDomainObject(additionalInformationSerializer))
88-
.toDTOConverter((event, typeName) -> CancelledDTO.fromDomainObject(additionalInformationSerializer, event, typeName))
89+
.toDomainObjectConverter(dto -> dto.toDomainObject(additionalInformationConverter))
90+
.toDTOConverter((event, typeName) -> CancelledDTO.fromDomainObject(additionalInformationConverter, event, typeName))
8991
.typeName("task-manager-cancelled")
9092
.withFactory(EventDTOModule::new);
9193

92-
TaskSerializationModuleFactory UPDATED = (jsonTaskSerializer, additionalInformationSerializer) -> EventDTOModule
94+
TaskSerializationModuleFactory UPDATED = (jsonTaskSerializer, additionalInformationConverter) -> EventDTOModule
9395
.forEvent(AdditionalInformationUpdated.class)
9496
.convertToDTO(AdditionalInformationUpdatedDTO.class)
95-
.toDomainObjectConverter(dto -> dto.toDomainObject(additionalInformationSerializer))
96-
.toDTOConverter((event, typeName) -> AdditionalInformationUpdatedDTO.fromDomainObject(additionalInformationSerializer, event, typeName))
97+
.toDomainObjectConverter(dto -> dto.toDomainObject(additionalInformationConverter))
98+
.toDTOConverter((event, typeName) -> AdditionalInformationUpdatedDTO.fromDomainObject(additionalInformationConverter, event, typeName))
9799
.typeName("task-manager-updated")
98100
.withFactory(EventDTOModule::new);
99101

100-
static Set<EventDTOModule<?, ?>> list(JsonTaskSerializer jsonTaskSerializer, JsonTaskAdditionalInformationSerializer jsonTaskAdditionalInformationSerializer) {
102+
static Set<EventDTOModule<?, ?>> list(JsonTaskSerializer jsonTaskSerializer, DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter) {
101103
return Stream
102104
.of(CREATED, STARTED, CANCEL_REQUESTED, CANCELLED, COMPLETED, FAILED, UPDATED)
103-
.map(moduleFactory -> moduleFactory.create(jsonTaskSerializer, jsonTaskAdditionalInformationSerializer))
105+
.map(moduleFactory -> moduleFactory.create(jsonTaskSerializer, additionalInformationConverter))
104106
.collect(Guavate.toImmutableSet());
105107
}
106108
}

0 commit comments

Comments
 (0)