You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ro...@apache.org on 2020/06/11 15:25:37 UTC

[james-project] branch master updated (9b9a07f -> db80c6c)

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

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


    from 9b9a07f  JAMES-3201 Vavr Either adoption
     new 0769fee  JAMES-3150 Add ScalaCheck for the garbadge collector
     new 58a8c25  JAMES-3150 Add the first garbadge collection properties
     new d2d2e86  JAMES-3194 Rely on DTOConverter in TaskRoute
     new 7c1adec  JAMES-3194 Inject DTOConverter for every product
     new 4d529f7  JAMES-3194 Remove Jackson annotations from AdditionalInformation
     new 76ffc21  JAMES-3194 Leverage named injection to uncouple storage and presentation DTOs for additional tasks
     new 48baa23  JAMES-3194 Add missing licenses
     new e6ae7eb  JAMES-3194 Homogeneous naming for Additional Information serialization modules
     new c9b0a70  JAMES-3194 Rename SingleMailboxReindexingTask TYPE
     new 24e6833  JAMES-3201 Add missign tests for ReIndexing tasks mailboxFailures
     new 36fcc9f  JAMES-3201 Document mailboxFailures for ReIndexing tasks
     new a4625e1  JAMES-3204 additionalInformation.failures should be renamed to messageFailures
     new 8f86732  JAMES-3182 Detail filter visit algorithm in method name
     new c4b95da  JAMES-3204 Allow recording executed Cassandra statements
     new 3781196  JAMES-3204 Demonstrate CassandraMessageMapper partially applies limit
     new 4c093a4  JAMES-3204 Flatten reactive calls in CassandraMailboxMapper::findInMailboxReactive
     new db80c6c  JAMES-3204 Push limit to Cassandra backend when reading messages

The 17 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../MigrationTaskAdditionalInformationDTO.java     |   2 +-
 .../james/backends/cassandra/CassandraCluster.java |   4 +-
 .../cassandra/CassandraClusterExtension.java       |   2 +-
 .../backends/cassandra/StatementRecorder.java      |  30 +-
 .../james/backends/cassandra/TestingSession.java   |  23 +
 .../backends/cassandra/TestingSessionTest.java     |  42 ++
 .../migration/MigrationTaskSerializationTest.java  |   2 +-
 .../mailbox/cassandra/DeleteMessageListener.java   |   3 +-
 .../cassandra/mail/CassandraMessageIdDAO.java      |  95 +++--
 .../cassandra/mail/CassandraMessageMapper.java     |  13 +-
 ...MailboxMergingTaskAdditionalInformationDTO.java |   6 +-
 .../mail/task/MailboxMergingTaskRunner.java        |   3 +-
 .../mail/task/RecomputeMailboxCountersService.java |   3 +-
 .../mail/task/RecomputeMailboxCountersTask.java    |   3 -
 ...ailboxCountersTaskAdditionalInformationDTO.java |   6 +-
 .../mail/task/SolveMailboxInconsistenciesTask.java |   6 -
 ...nconsistenciesTaskAdditionalInformationDTO.java |   7 +-
 .../mail/task/SolveMessageInconsistenciesTask.java |   9 -
 ...nconsistenciesTaskAdditionalInformationDTO.java |   6 +-
 .../cassandra/CassandraMailboxManagerTest.java     |  15 +-
 .../cassandra/mail/CassandraMessageIdDAOTest.java  | 111 ++++-
 .../mail/CassandraMessageIdMapperTest.java         |   9 +-
 .../cassandra/mail/CassandraMessageMapperTest.java |  51 ++-
 .../mail/task/MailboxMergingTaskTest.java          |   2 +-
 ...omputeMailboxCountersTaskSerializationTest.java |   2 +-
 ...ailboxInconsistenciesTaskSerializationTest.java |   2 +-
 ...essageInconsistenciesTaskSerializationTest.java |   4 +-
 ...bageCollectionTaskAdditionalInformationDTO.java |   9 +
 ...aultGarbageCollectionTaskSerializationTest.java |   2 +-
 ...geIdReindexingTaskAdditionalInformationDTO.java |   2 +-
 .../indexer/ReprocessingContextInformation.java    |   9 -
 .../indexer/ReprocessingContextInformationDTO.java |  11 +-
 .../tools/indexer/SingleMailboxReindexingTask.java |   9 +-
 ...lboxReindexingTaskAdditionalInformationDTO.java |   4 +-
 .../indexer/SingleMailboxReindexingTaskDTO.java    |   2 +-
 ...sageReindexingTaskAdditionalInformationDTO.java |   2 +-
 .../mailbox/tools/indexer/UserReindexingTask.java  |   5 +-
 ...UserReindexingTaskAdditionalInformationDTO.java |   2 +-
 ...rorRecoveryIndexationTaskSerializationTest.java |   4 +-
 .../FullReindexingTaskSerializationTest.java       |   4 +-
 .../MessageIdReindexingTaskSerializationTest.java  |   2 +-
 ...ngleMailboxReindexingTaskSerializationTest.java |   4 +-
 ...ngleMessageReindexingTaskSerializationTest.java |   2 +-
 .../UserReindexingTaskSerializationTest.java       |   4 +-
 .../quota/task/RecomputeCurrentQuotasTask.java     |   3 -
 ...eCurrentQuotasTaskAdditionalInformationDTO.java |   6 +-
 ...ecomputeCurrentQuotasTaskSerializationTest.java |   4 +-
 pom.xml                                            |  10 +
 .../blob/blob-deduplicating/doc/gc-properties.adoc |  23 +
 .../blob-deduplicating}/pom.xml                    |  59 ++-
 .../james/server/blob/deduplication/GC.scala       | 187 ++++++++
 .../blob/deduplication/GCPropertiesTest.scala      | 228 ++++++++++
 .../james/server/blob/deduplication/State.scala}   |  39 +-
 server/blob/pom.xml                                |   1 +
 .../org/apache/james/CassandraJamesServerMain.java |   4 +
 ...assandraConsistencyTaskSerializationModule.java | 149 +++++++
 .../james/CassandraRabbitMQJamesServerMain.java    |   4 +-
 .../modules/DistributedTaskManagerModule.java      |   3 +
 .../DistributedTaskSerializationModule.java        | 107 +++++
 .../james/modules/TaskSerializationModule.java     | 475 ---------------------
 server/container/guice/guice-common/pom.xml        |   4 +
 .../james/modules/server/TaskManagerModule.java    |   2 +
 .../modules/server/TaskSerializationModule.java}   |  36 +-
 .../java/org/apache/james/JPAJamesServerMain.java  |   4 +-
 .../modules/mailbox/LuceneSearchMailboxModule.java |   2 +
 .../modules/vault/DeletedMessageVaultModule.java   |   1 +
 .../vault/VaultTaskSerializationModule.java        | 110 +++++
 server/container/guice/mailbox/pom.xml             |   4 +
 .../mailbox/ReIndexingTaskSerializationModule.java | 110 +++++
 .../server/JmapTaskSerializationModule.java        |  70 +++
 .../james/modules/server/JmapTasksModule.java      |   2 +
 .../james/modules/server/MailboxRoutesModule.java  |   2 +
 .../server/MailboxesExportRoutesModule.java        |   1 +
 .../WebAdminReIndexingTaskSerializationModule.java |  73 ++++
 ...badminMailboxExportTaskSerializationModule.java |  52 +++
 .../WebadminMailboxTaskSerializationModule.java    | 105 +++++
 .../modules/server/MailQueueRoutesModule.java      |   2 +
 .../server/MailQueueTaskSerializationModule.java   |  72 ++++
 .../server/MailRepositoriesRoutesModule.java       |   2 +
 .../MailRepositoryTaskSerializationModule.java     |  92 ++++
 .../james/modules/server/TaskRoutesModule.java     |  19 +
 .../java/org/apache/james/util/streams/Limit.java  |   4 +
 ...urcesMigrationTaskAdditionalInformationDTO.java |   2 +-
 ...pingsSourcesMigrationTaskSerializationTest.java |   2 +-
 .../jmap/draft/methods/GetMessageListMethod.java   |   2 +-
 .../org/apache/james/jmap/draft/model/Filter.java  |   8 +-
 .../apache/james/jmap/draft/model/FilterTest.java  |  44 +-
 ...dminServerTaskSerializationIntegrationTest.java |   8 +-
 .../routes/CassandraMappingsRoutesTest.java        |   5 +-
 .../protocols/webadmin/webadmin-cassandra/pom.xml  |  11 +
 ...AdminMigrationTaskAdditionalInformationDTO.java |  27 +-
 .../WebAdminMigrationTaskSerializationTest.java}   |  28 +-
 .../routes/CassandraMigrationRoutesTest.java       |   5 +-
 ...lveMessageInconsistenciesRequestToTaskTest.java |   4 +-
 server/protocols/webadmin/webadmin-core/pom.xml    |   4 +
 .../james/webadmin/dto/DTOModuleInjections.java}   |  17 +-
 .../james/webadmin/dto/ExecutionDetailsDto.java    |  24 +-
 .../apache/james/webadmin/routes/TasksRoutes.java  |  16 +-
 .../james/webadmin/routes/TasksRoutesTest.java     |   6 +-
 ...uteAllFastViewTaskAdditionalInformationDTO.java |   5 +-
 ...teUserFastViewTaskAdditionalInformationDTO.java |   5 +-
 ...llFastViewProjectionItemsRequestToTaskTest.java |   4 +-
 ...ctionItemsTaskAdditionalInformationDTOTest.java |   4 +-
 ...erFastViewProjectionItemsRequestToTaskTest.java |   4 +-
 ...ctionItemsTaskAdditionalInformationDTOTest.java |   4 +-
 ...gesVaultDeleteTaskAdditionalInformationDTO.java |   2 +-
 ...gesVaultExportTaskAdditionalInformationDTO.java |   6 +-
 ...esVaultRestoreTaskAdditionalInformationDTO.java |   6 +-
 ...esVaultDeleteTaskAdditionalInformationDTO.java} |  34 +-
 ...sVaultRestoreTaskAdditionalInformationDTO.java} |  38 +-
 ...edMessagesVaultDeleteTaskSerializationTest.java |   2 +-
 ...edMessagesVaultExportTaskSerializationTest.java |   4 +-
 ...dMessagesVaultRestoreTaskSerializationTest.java |   2 +-
 .../routes/DeletedMessagesVaultRoutesTest.java     |   9 +-
 ...dMessagesVaultDeleteTaskSerializationTest.java} |  28 +-
 ...MessagesVaultRestoreTaskSerializationTest.java} |  36 +-
 server/protocols/webadmin/webadmin-mailbox/pom.xml |   1 -
 .../SerializableReIndexingExecutionFailures.java   |   2 +-
 .../WebAdminReprocessingContextInformationDTO.java | 129 ++++++
 ...lboxReindexingTaskAdditionalInformationDTO.java |  96 +++++
 ...UserReindexingTaskAdditionalInformationDTO.java |  98 +++++
 ...LettersRedeliveryTaskAdditionalInformation.java |   4 -
 ...tersRedeliveryTaskAdditionalInformationDTO.java |  17 +-
 ...erializableReIndexingExecutionFailuresTest.java |   2 +-
 ...AdminReprocessingContextInformationDTOTest.java | 124 ++++++
 .../WebAdminSingleMailboxReprocessingDTOTest.java  |  90 ++++
 .../dto/WebAdminUserReprocessingDTOTest.java       |  90 ++++
 .../routes/EventDeadLettersRoutesTest.java         |   9 +-
 .../routes/MailboxesRoutesNoTasksTest.java         |   3 +-
 .../james/webadmin/routes/MailboxesRoutesTest.java | 105 ++++-
 .../james/webadmin/routes/MessageRoutesTest.java   |   6 +-
 .../UserMailboxesRoutesNoIndexationTest.java       |   3 +-
 .../webadmin/routes/UserMailboxesRoutesTest.java   |  44 +-
 .../routes/WebAdminQuotaSearchTestSystem.java      |   5 +-
 .../service/EventDeadLettersRedeliverTaskTest.java |   6 +-
 .../service/MailboxesExportRequestToTaskTest.java  |   4 +-
 ...ClearMailQueueTaskAdditionalInformationDTO.java |   8 +-
 ...sFromMailQueueTaskAdditionalInformationDTO.java |  26 +-
 .../service/DeleteMailsFromMailQueueTaskDTO.java   |  19 +
 ...sFromMailQueueTaskAdditionalInformationDTO.java | 128 ++++++
 .../james/webadmin/routes/MailQueueRoutesTest.java |   7 +-
 .../webadmin/service/ClearMailQueueTaskTest.java   |   2 +-
 .../service/DeleteMailsFromMailQueueTaskTest.java  |   5 +-
 ...mMailQueueTaskAdditionalInformationDTOTest.java |  51 +++
 ...MailRepositoryTaskAdditionalInformationDTO.java |   9 +-
 ...essingAllMailsTaskAdditionalInformationDTO.java |   9 +-
 ...cessingOneMailTaskAdditionalInformationDTO.java |   9 +-
 ...ailRepositoryTaskAdditionalInformationDTO.java} |  35 +-
 .../routes/MailRepositoriesRoutesTest.java         |   9 +-
 .../service/ClearMailRepositoryTaskTest.java       |   2 +-
 .../service/ReprocessingAllMailsTaskTest.java      |   2 +-
 .../service/ReprocessingOneMailTaskTest.java       |   2 +-
 ...=> WebAdminClearMailRepositoryTaskDTOTest.java} |  34 +-
 src/site/markdown/server/manage-webadmin.md        |  55 +--
 154 files changed, 3254 insertions(+), 1011 deletions(-)
 copy server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/TaskRoutesModule.java => backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/StatementRecorder.java (67%)
 create mode 100644 server/blob/blob-deduplicating/doc/gc-properties.adoc
 copy server/{protocols/webadmin/webadmin-cassandra => blob/blob-deduplicating}/pom.xml (59%)
 create mode 100644 server/blob/blob-deduplicating/src/main/scala/org/apache/james/server/blob/deduplication/GC.scala
 create mode 100644 server/blob/blob-deduplicating/src/test/scala/org/apache/james/server/blob/deduplication/GCPropertiesTest.scala
 copy server/{container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/DeletedMessageVaultModule.java => blob/blob-deduplicating/src/test/scala/org/apache/james/server/blob/deduplication/State.scala} (56%)
 create mode 100644 server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/CassandraConsistencyTaskSerializationModule.java
 create mode 100644 server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/DistributedTaskSerializationModule.java
 delete mode 100644 server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java
 copy server/container/guice/{protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTasksModule.java => guice-common/src/main/java/org/apache/james/modules/server/TaskSerializationModule.java} (53%)
 create mode 100644 server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/VaultTaskSerializationModule.java
 create mode 100644 server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/ReIndexingTaskSerializationModule.java
 create mode 100644 server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTaskSerializationModule.java
 create mode 100644 server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebAdminReIndexingTaskSerializationModule.java
 create mode 100644 server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxExportTaskSerializationModule.java
 create mode 100644 server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxTaskSerializationModule.java
 create mode 100644 server/container/guice/protocols/webadmin-mailqueue/src/main/java/org/apache/james/modules/server/MailQueueTaskSerializationModule.java
 create mode 100644 server/container/guice/protocols/webadmin-mailrepository/src/main/java/org/apache/james/modules/server/MailRepositoryTaskSerializationModule.java
 copy backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTaskAdditionalInformationDTO.java => server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/dto/WebAdminMigrationTaskAdditionalInformationDTO.java (68%)
 copy server/{container/guice/guice-common/src/main/java/org/apache/james/modules/server/TaskManagerModule.java => protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/dto/WebAdminMigrationTaskSerializationTest.java} (56%)
 copy server/{container/guice/guice-common/src/main/java/org/apache/james/modules/server/TaskManagerModule.java => protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/dto/DTOModuleInjections.java} (71%)
 copy server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/{DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java => WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java} (66%)
 copy server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/{DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java => WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java} (67%)
 copy server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/{DeletedMessagesVaultDeleteTaskSerializationTest.java => WebAdminDeletedMessagesVaultDeleteTaskSerializationTest.java} (61%)
 copy server/{data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskSerializationTest.java => protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultRestoreTaskSerializationTest.java} (51%)
 rename {mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer => server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto}/SerializableReIndexingExecutionFailures.java (98%)
 create mode 100644 server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTO.java
 create mode 100644 server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java
 create mode 100644 server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminUserReindexingTaskAdditionalInformationDTO.java
 rename {mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer => server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto}/SerializableReIndexingExecutionFailuresTest.java (98%)
 create mode 100644 server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTOTest.java
 create mode 100644 server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReprocessingDTOTest.java
 create mode 100644 server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminUserReprocessingDTOTest.java
 create mode 100644 server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
 create mode 100644 server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTOTest.java
 copy server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/{ClearMailRepositoryTaskAdditionalInformationDTO.java => WebAdminClearMailRepositoryTaskAdditionalInformationDTO.java} (65%)
 copy server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/{ClearMailRepositoryTaskTest.java => WebAdminClearMailRepositoryTaskDTOTest.java} (53%)


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


[james-project] 08/17: JAMES-3194 Homogeneous naming for Additional Information serialization modules

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit e6ae7ebf77fef4b10cb44bda3b81584728c53400
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Jun 10 09:28:33 2020 +0700

    JAMES-3194 Homogeneous naming for Additional Information serialization modules
---
 .../MigrationTaskAdditionalInformationDTO.java     |  2 +-
 .../migration/MigrationTaskSerializationTest.java  |  2 +-
 ...MailboxMergingTaskAdditionalInformationDTO.java |  6 ++++--
 ...ailboxCountersTaskAdditionalInformationDTO.java |  6 ++++--
 ...nconsistenciesTaskAdditionalInformationDTO.java |  7 ++++---
 ...nconsistenciesTaskAdditionalInformationDTO.java |  6 +++---
 .../mail/task/MailboxMergingTaskTest.java          |  2 +-
 ...omputeMailboxCountersTaskSerializationTest.java |  2 +-
 ...ailboxInconsistenciesTaskSerializationTest.java |  2 +-
 ...essageInconsistenciesTaskSerializationTest.java |  4 ++--
 ...bageCollectionTaskAdditionalInformationDTO.java |  9 ++++++++
 ...aultGarbageCollectionTaskSerializationTest.java |  2 +-
 ...geIdReindexingTaskAdditionalInformationDTO.java |  2 +-
 .../indexer/ReprocessingContextInformationDTO.java |  6 +++---
 ...lboxReindexingTaskAdditionalInformationDTO.java |  2 +-
 ...sageReindexingTaskAdditionalInformationDTO.java |  2 +-
 ...UserReindexingTaskAdditionalInformationDTO.java |  2 +-
 ...rorRecoveryIndexationTaskSerializationTest.java |  4 ++--
 .../FullReindexingTaskSerializationTest.java       |  4 ++--
 .../MessageIdReindexingTaskSerializationTest.java  |  2 +-
 ...ngleMailboxReindexingTaskSerializationTest.java |  4 ++--
 ...ngleMessageReindexingTaskSerializationTest.java |  2 +-
 .../UserReindexingTaskSerializationTest.java       |  4 ++--
 ...eCurrentQuotasTaskAdditionalInformationDTO.java |  6 +++---
 ...ecomputeCurrentQuotasTaskSerializationTest.java |  4 ++--
 ...assandraConsistencyTaskSerializationModule.java | 24 +++++++++++-----------
 .../vault/VaultTaskSerializationModule.java        | 16 +++++++--------
 .../mailbox/ReIndexingTaskSerializationModule.java | 12 +++++------
 .../server/JmapTaskSerializationModule.java        |  8 ++++----
 .../WebAdminReIndexingTaskSerializationModule.java |  4 ++--
 .../WebadminMailboxTaskSerializationModule.java    | 16 +++++++--------
 .../server/MailQueueTaskSerializationModule.java   |  8 ++++----
 .../MailRepositoryTaskSerializationModule.java     | 12 +++++------
 ...urcesMigrationTaskAdditionalInformationDTO.java |  2 +-
 ...pingsSourcesMigrationTaskSerializationTest.java |  2 +-
 .../routes/CassandraMappingsRoutesTest.java        |  2 +-
 ...AdminMigrationTaskAdditionalInformationDTO.java |  2 +-
 .../WebAdminMigrationTaskSerializationTest.java    |  3 +--
 .../routes/CassandraMigrationRoutesTest.java       |  3 +--
 ...lveMessageInconsistenciesRequestToTaskTest.java |  2 +-
 ...uteAllFastViewTaskAdditionalInformationDTO.java |  5 +++--
 ...teUserFastViewTaskAdditionalInformationDTO.java |  5 +++--
 ...llFastViewProjectionItemsRequestToTaskTest.java |  2 +-
 ...ctionItemsTaskAdditionalInformationDTOTest.java |  4 ++--
 ...erFastViewProjectionItemsRequestToTaskTest.java |  2 +-
 ...ctionItemsTaskAdditionalInformationDTOTest.java |  4 ++--
 ...gesVaultDeleteTaskAdditionalInformationDTO.java |  2 +-
 ...gesVaultExportTaskAdditionalInformationDTO.java |  6 +++---
 ...esVaultRestoreTaskAdditionalInformationDTO.java |  6 +++---
 ...gesVaultDeleteTaskAdditionalInformationDTO.java |  2 +-
 ...esVaultRestoreTaskAdditionalInformationDTO.java |  6 +++---
 ...edMessagesVaultDeleteTaskSerializationTest.java |  2 +-
 ...edMessagesVaultExportTaskSerializationTest.java |  4 ++--
 ...dMessagesVaultRestoreTaskSerializationTest.java |  2 +-
 .../routes/DeletedMessagesVaultRoutesTest.java     |  8 ++++----
 ...edMessagesVaultDeleteTaskSerializationTest.java |  2 +-
 ...dMessagesVaultRestoreTaskSerializationTest.java |  2 +-
 ...tersRedeliveryTaskAdditionalInformationDTO.java | 17 +++++++--------
 .../routes/EventDeadLettersRoutesTest.java         |  6 +++---
 .../james/webadmin/routes/MailboxesRoutesTest.java |  7 +------
 .../james/webadmin/routes/MessageRoutesTest.java   |  2 +-
 .../routes/WebAdminQuotaSearchTestSystem.java      |  2 +-
 .../service/EventDeadLettersRedeliverTaskTest.java |  6 +++---
 ...ClearMailQueueTaskAdditionalInformationDTO.java |  8 ++++----
 ...sFromMailQueueTaskAdditionalInformationDTO.java |  7 +++----
 ...sFromMailQueueTaskAdditionalInformationDTO.java |  7 +++----
 .../james/webadmin/routes/MailQueueRoutesTest.java |  5 ++---
 .../webadmin/service/ClearMailQueueTaskTest.java   |  2 +-
 .../service/DeleteMailsFromMailQueueTaskTest.java  |  5 ++---
 ...mMailQueueTaskAdditionalInformationDTOTest.java |  2 +-
 ...MailRepositoryTaskAdditionalInformationDTO.java |  9 ++++----
 ...essingAllMailsTaskAdditionalInformationDTO.java |  9 ++++----
 ...cessingOneMailTaskAdditionalInformationDTO.java |  9 ++++----
 ...MailRepositoryTaskAdditionalInformationDTO.java |  9 ++++----
 .../routes/MailRepositoriesRoutesTest.java         |  7 +++----
 .../service/ClearMailRepositoryTaskTest.java       |  2 +-
 .../service/ReprocessingAllMailsTaskTest.java      |  2 +-
 .../service/ReprocessingOneMailTaskTest.java       |  2 +-
 .../WebAdminClearMailRepositoryTaskDTOTest.java    |  2 +-
 79 files changed, 201 insertions(+), 200 deletions(-)

diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTaskAdditionalInformationDTO.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTaskAdditionalInformationDTO.java
index aef36f5..bb768cc 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTaskAdditionalInformationDTO.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTaskAdditionalInformationDTO.java
@@ -29,7 +29,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class MigrationTaskAdditionalInformationDTO implements AdditionalInformationDTO {
 
-    public static AdditionalInformationDTOModule<MigrationTask.AdditionalInformation, MigrationTaskAdditionalInformationDTO> serializationModule() {
+    public static AdditionalInformationDTOModule<MigrationTask.AdditionalInformation, MigrationTaskAdditionalInformationDTO> module() {
         return DTOModule.forDomainObject(MigrationTask.AdditionalInformation.class)
             .convertToDTO(MigrationTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new MigrationTask.AdditionalInformation(new SchemaVersion(dto.getTargetVersion()), dto.timestamp))
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/migration/MigrationTaskSerializationTest.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/migration/MigrationTaskSerializationTest.java
index 7dd5686..5a97860 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/migration/MigrationTaskSerializationTest.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/migration/MigrationTaskSerializationTest.java
@@ -44,7 +44,7 @@ class MigrationTaskSerializationTest {
     private final CassandraSchemaTransitions transitions = mock(CassandraSchemaTransitions.class);
     private final MigrationTask.Factory factory = target -> new MigrationTask(cassandraSchemaVersionDAO, transitions, target);
     private final JsonTaskSerializer taskSerializer = JsonTaskSerializer.of(MigrationTaskDTO.module(factory));
-    private JsonTaskAdditionalInformationSerializer jsonAdditionalInformationSerializer = JsonTaskAdditionalInformationSerializer.of(MigrationTaskAdditionalInformationDTO.serializationModule());
+    private JsonTaskAdditionalInformationSerializer jsonAdditionalInformationSerializer = JsonTaskAdditionalInformationSerializer.of(MigrationTaskAdditionalInformationDTO.module());
 
     @Test
     void taskShouldBeSerializable() throws JsonProcessingException {
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskAdditionalInformationDTO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskAdditionalInformationDTO.java
index df3dd79..dd569e0 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskAdditionalInformationDTO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskAdditionalInformationDTO.java
@@ -44,13 +44,15 @@ public class MailboxMergingTaskAdditionalInformationDTO implements AdditionalInf
         );
     }
 
-    public static final AdditionalInformationDTOModule<MailboxMergingTask.Details, MailboxMergingTaskAdditionalInformationDTO> SERIALIZATION_MODULE =
-        DTOModule.forDomainObject(MailboxMergingTask.Details.class)
+    public static AdditionalInformationDTOModule<MailboxMergingTask.Details, MailboxMergingTaskAdditionalInformationDTO> module() {
+        return DTOModule.forDomainObject(MailboxMergingTask.Details.class)
             .convertToDTO(MailboxMergingTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(MailboxMergingTaskAdditionalInformationDTO::toDomainObject)
             .toDTOConverter(MailboxMergingTaskAdditionalInformationDTO::fromDomainObject)
             .typeName(MailboxMergingTask.MAILBOX_MERGING.asString())
             .withFactory(AdditionalInformationDTOModule::new);
+    }
+
 
     private final String type;
     private final String oldMailboxId;
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersTaskAdditionalInformationDTO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersTaskAdditionalInformationDTO.java
index e7eef3d..ee88d87 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersTaskAdditionalInformationDTO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersTaskAdditionalInformationDTO.java
@@ -37,14 +37,16 @@ public class RecomputeMailboxCountersTaskAdditionalInformationDTO implements Add
             details.timestamp());
     }
 
-    public static final AdditionalInformationDTOModule<RecomputeMailboxCountersTask.Details, RecomputeMailboxCountersTaskAdditionalInformationDTO> MODULE =
-        DTOModule
+    public static final AdditionalInformationDTOModule<RecomputeMailboxCountersTask.Details, RecomputeMailboxCountersTaskAdditionalInformationDTO> module() {
+        return DTOModule
             .forDomainObject(RecomputeMailboxCountersTask.Details.class)
             .convertToDTO(RecomputeMailboxCountersTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(RecomputeMailboxCountersTaskAdditionalInformationDTO::toDomainObject)
             .toDTOConverter(RecomputeMailboxCountersTaskAdditionalInformationDTO::fromDomainObject)
             .typeName(RecomputeMailboxCountersTask.RECOMPUTE_MAILBOX_COUNTERS.asString())
             .withFactory(AdditionalInformationDTOModule::new);
+    }
+
 
     private final String type;
     private final long processedMailboxes;
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesTaskAdditionalInformationDTO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesTaskAdditionalInformationDTO.java
index d74e706..5811a68 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesTaskAdditionalInformationDTO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesTaskAdditionalInformationDTO.java
@@ -40,14 +40,15 @@ public class SolveMailboxInconsistenciesTaskAdditionalInformationDTO implements
             details.timestamp());
     }
 
-    public static final AdditionalInformationDTOModule<SolveMailboxInconsistenciesTask.Details, SolveMailboxInconsistenciesTaskAdditionalInformationDTO> MODULE =
-        DTOModule
-            .forDomainObject(SolveMailboxInconsistenciesTask.Details.class)
+    public static AdditionalInformationDTOModule<SolveMailboxInconsistenciesTask.Details, SolveMailboxInconsistenciesTaskAdditionalInformationDTO> module() {
+        return DTOModule.forDomainObject(SolveMailboxInconsistenciesTask.Details.class)
             .convertToDTO(SolveMailboxInconsistenciesTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(SolveMailboxInconsistenciesTaskAdditionalInformationDTO::toDomainObject)
             .toDTOConverter(SolveMailboxInconsistenciesTaskAdditionalInformationDTO::fromDomainObject)
             .typeName(SolveMailboxInconsistenciesTask.SOLVE_MAILBOX_INCONSISTENCIES.asString())
             .withFactory(AdditionalInformationDTOModule::new);
+    }
+
 
     private final String type;
     private final long processedMailboxEntries;
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskAdditionalInformationDTO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskAdditionalInformationDTO.java
index c8ae05d..ca1484c 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskAdditionalInformationDTO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskAdditionalInformationDTO.java
@@ -49,14 +49,14 @@ public class SolveMessageInconsistenciesTaskAdditionalInformationDTO implements
             details.getErrors());
     }
 
-    public static final AdditionalInformationDTOModule<Details, SolveMessageInconsistenciesTaskAdditionalInformationDTO> MODULE =
-        DTOModule
-            .forDomainObject(Details.class)
+    public static AdditionalInformationDTOModule<Details, SolveMessageInconsistenciesTaskAdditionalInformationDTO> module() {
+        return  DTOModule.forDomainObject(Details.class)
             .convertToDTO(SolveMessageInconsistenciesTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(SolveMessageInconsistenciesTaskAdditionalInformationDTO::toDomainObject)
             .toDTOConverter(SolveMessageInconsistenciesTaskAdditionalInformationDTO::fromDomainObject)
             .typeName(SOLVE_MESSAGE_INCONSISTENCIES.asString())
             .withFactory(AdditionalInformationDTOModule::new);
+    }
 
     private final Instant timestamp;
     private final String type;
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskTest.java
index 02e4b16..aacd4c2 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskTest.java
@@ -46,7 +46,7 @@ class MailboxMergingTaskTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws Exception {
-        JsonSerializationVerifier.dtoModule(MailboxMergingTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
+        JsonSerializationVerifier.dtoModule(MailboxMergingTaskAdditionalInformationDTO.module())
             .bean(DETAILS)
             .json(SERIALIZED_ADDITIONAL_INFORMATION)
             .verify();
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersTaskSerializationTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersTaskSerializationTest.java
index d5bd9d8..9484710 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersTaskSerializationTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersTaskSerializationTest.java
@@ -84,7 +84,7 @@ class RecomputeMailboxCountersTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws Exception {
-        JsonSerializationVerifier.dtoModule(RecomputeMailboxCountersTaskAdditionalInformationDTO.MODULE)
+        JsonSerializationVerifier.dtoModule(RecomputeMailboxCountersTaskAdditionalInformationDTO.module())
             .bean(DETAILS)
             .json(SERIALIZED_ADDITIONAL_INFORMATION)
             .verify();
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesTaskSerializationTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesTaskSerializationTest.java
index f490060..e44d347 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesTaskSerializationTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesTaskSerializationTest.java
@@ -78,7 +78,7 @@ class SolveMailboxInconsistenciesTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws Exception {
-        JsonSerializationVerifier.dtoModule(SolveMailboxInconsistenciesTaskAdditionalInformationDTO.MODULE)
+        JsonSerializationVerifier.dtoModule(SolveMailboxInconsistenciesTaskAdditionalInformationDTO.module())
             .bean(DETAILS)
             .json(SERIALIZED_ADDITIONAL_INFORMATION)
             .verify();
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskSerializationTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskSerializationTest.java
index 0d7717a..d450a52 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskSerializationTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskSerializationTest.java
@@ -86,7 +86,7 @@ public class SolveMessageInconsistenciesTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws Exception {
-        JsonSerializationVerifier.dtoModule(SolveMessageInconsistenciesTaskAdditionalInformationDTO.MODULE)
+        JsonSerializationVerifier.dtoModule(SolveMessageInconsistenciesTaskAdditionalInformationDTO.module())
             .bean(DETAILS)
             .json(ClassLoaderUtils.getSystemResourceAsString("json/solveMessageInconsistencies.additionalInformation.json"))
             .verify();
@@ -94,7 +94,7 @@ public class SolveMessageInconsistenciesTaskSerializationTest {
 
     @Test
     void legacyAdditionalInformationShouldBeDeserializable() throws Exception {
-        SolveMessageInconsistenciesTask.Details legacyDetails = JsonGenericSerializer.forModules(SolveMessageInconsistenciesTaskAdditionalInformationDTO.MODULE)
+        SolveMessageInconsistenciesTask.Details legacyDetails = JsonGenericSerializer.forModules(SolveMessageInconsistenciesTaskAdditionalInformationDTO.module())
             .withoutNestedType()
             .deserialize(ClassLoaderUtils.getSystemResourceAsString("json/solveMessageInconsistencies.additionalInformation.legacy.json"));
 
diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.java
index c757f38..5689e8e 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.java
@@ -51,6 +51,15 @@ public class BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO impleme
             .typeName(BlobStoreVaultGarbageCollectionTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
 
+    public static final AdditionalInformationDTOModule<BlobStoreVaultGarbageCollectionTask.AdditionalInformation, BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO> module() {
+        return DTOModule.forDomainObject(BlobStoreVaultGarbageCollectionTask.AdditionalInformation.class)
+            .convertToDTO(BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.class)
+            .toDomainObjectConverter(BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO::toDomainObject)
+            .toDTOConverter(BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO::fromDomainObject)
+            .typeName(BlobStoreVaultGarbageCollectionTask.TYPE.asString())
+            .withFactory(AdditionalInformationDTOModule::new);
+    }
+
     private final String beginningOfRetentionPeriod;
     private final Collection<String> deletedBuckets;
     private final String type;
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskSerializationTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskSerializationTest.java
index 2d2cd34..482668c 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskSerializationTest.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskSerializationTest.java
@@ -56,7 +56,7 @@ class BlobStoreVaultGarbageCollectionTaskSerializationTest {
     private static final String SERIALIZED_TASK = "{\"type\":\"deleted-messages-blob-store-based-garbage-collection\"}";
     private static final String SERIALIZED_ADDITIONAL_INFORMATION_TASK = "{\"type\":\"deleted-messages-blob-store-based-garbage-collection\", \"beginningOfRetentionPeriod\":\"2019-09-03T15:26:13.356+02:00[Europe/Paris]\",\"deletedBuckets\":[\"1\", \"2\", \"3\"], \"timestamp\": \"2018-11-13T12:00:55Z\"}";
 
-    private static final JsonTaskAdditionalInformationSerializer JSON_TASK_ADDITIONAL_INFORMATION_SERIALIZER = JsonTaskAdditionalInformationSerializer.of(BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.MODULE);
+    private static final JsonTaskAdditionalInformationSerializer JSON_TASK_ADDITIONAL_INFORMATION_SERIALIZER = JsonTaskAdditionalInformationSerializer.of(BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.module());
 
     @BeforeAll
     static void setUp() {
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskAdditionalInformationDTO.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskAdditionalInformationDTO.java
index b417db8..4716591 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskAdditionalInformationDTO.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskAdditionalInformationDTO.java
@@ -30,7 +30,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class MessageIdReindexingTaskAdditionalInformationDTO implements AdditionalInformationDTO {
 
-    public static AdditionalInformationDTOModule<MessageIdReIndexingTask.AdditionalInformation, MessageIdReindexingTaskAdditionalInformationDTO> serializationModule(MessageId.Factory factory) {
+    public static AdditionalInformationDTOModule<MessageIdReIndexingTask.AdditionalInformation, MessageIdReindexingTaskAdditionalInformationDTO> module(MessageId.Factory factory) {
         return DTOModule.forDomainObject(MessageIdReIndexingTask.AdditionalInformation.class)
             .convertToDTO(MessageIdReindexingTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new MessageIdReIndexingTask.AdditionalInformation(factory.fromString(dto.getMessageId()), dto.timestamp))
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformationDTO.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformationDTO.java
index 363cc42..eaab926 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformationDTO.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformationDTO.java
@@ -35,8 +35,8 @@ import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.github.steveash.guavate.Guavate;
-import com.google.common.base.Preconditions;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableListMultimap;
 
@@ -77,7 +77,7 @@ public class ReprocessingContextInformationDTO implements AdditionalInformationD
             }
         }
 
-        public static AdditionalInformationDTOModule<ReprocessingContextInformationForErrorRecoveryIndexationTask, DTO> serializationModule(MailboxId.Factory mailboxIdFactory) {
+        public static AdditionalInformationDTOModule<ReprocessingContextInformationForErrorRecoveryIndexationTask, DTO> module(MailboxId.Factory mailboxIdFactory) {
             return DTOModule.forDomainObject(ReprocessingContextInformationForErrorRecoveryIndexationTask.class)
                 .convertToDTO(DTO.class)
                 .toDomainObjectConverter(dto -> new ReprocessingContextInformationForErrorRecoveryIndexationTask(
@@ -128,7 +128,7 @@ public class ReprocessingContextInformationDTO implements AdditionalInformationD
             }
         }
 
-        public static AdditionalInformationDTOModule<ReprocessingContextInformationForFullReindexingTask, DTO> serializationModule(MailboxId.Factory mailboxIdFactory) {
+        public static AdditionalInformationDTOModule<ReprocessingContextInformationForFullReindexingTask, DTO> module(MailboxId.Factory mailboxIdFactory) {
             return DTOModule.forDomainObject(ReprocessingContextInformationForFullReindexingTask.class)
                 .convertToDTO(DTO.class)
                 .toDomainObjectConverter(dto -> new ReprocessingContextInformationForFullReindexingTask(
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskAdditionalInformationDTO.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskAdditionalInformationDTO.java
index 21950e7..37b1cb8 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskAdditionalInformationDTO.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskAdditionalInformationDTO.java
@@ -35,7 +35,7 @@ import com.google.common.collect.ImmutableList;
 
 public class SingleMailboxReindexingTaskAdditionalInformationDTO implements AdditionalInformationDTO {
 
-    public static AdditionalInformationDTOModule<SingleMailboxReindexingTask.AdditionalInformation, SingleMailboxReindexingTaskAdditionalInformationDTO> serializationModule(MailboxId.Factory factory) {
+    public static AdditionalInformationDTOModule<SingleMailboxReindexingTask.AdditionalInformation, SingleMailboxReindexingTaskAdditionalInformationDTO> module(MailboxId.Factory factory) {
         return DTOModule.forDomainObject(SingleMailboxReindexingTask.AdditionalInformation.class)
             .convertToDTO(SingleMailboxReindexingTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new SingleMailboxReindexingTask.AdditionalInformation(factory.fromString(dto.getMailboxId()),
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskAdditionalInformationDTO.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskAdditionalInformationDTO.java
index c783c63..1dab8a5 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskAdditionalInformationDTO.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskAdditionalInformationDTO.java
@@ -31,7 +31,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class SingleMessageReindexingTaskAdditionalInformationDTO implements AdditionalInformationDTO {
 
-    public static AdditionalInformationDTOModule<SingleMessageReindexingTask.AdditionalInformation, SingleMessageReindexingTaskAdditionalInformationDTO> serializationModule(MailboxId.Factory factory) {
+    public static AdditionalInformationDTOModule<SingleMessageReindexingTask.AdditionalInformation, SingleMessageReindexingTaskAdditionalInformationDTO> module(MailboxId.Factory factory) {
         return DTOModule.forDomainObject(SingleMessageReindexingTask.AdditionalInformation.class)
             .convertToDTO(SingleMessageReindexingTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new SingleMessageReindexingTask.AdditionalInformation(
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java
index 220a7f0..f242ef4 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java
@@ -37,7 +37,7 @@ import com.google.common.collect.ImmutableList;
 
 public class UserReindexingTaskAdditionalInformationDTO implements AdditionalInformationDTO {
 
-    public static AdditionalInformationDTOModule<UserReindexingTask.AdditionalInformation, UserReindexingTaskAdditionalInformationDTO> serializationModule(MailboxId.Factory factory) {
+    public static AdditionalInformationDTOModule<UserReindexingTask.AdditionalInformation, UserReindexingTaskAdditionalInformationDTO> module(MailboxId.Factory factory) {
         return DTOModule.forDomainObject(UserReindexingTask.AdditionalInformation.class)
             .convertToDTO(UserReindexingTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new UserReindexingTask.AdditionalInformation(Username.of(dto.getUser()),
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTaskSerializationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTaskSerializationTest.java
index 05ba84d..3ad7d4f 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTaskSerializationTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTaskSerializationTest.java
@@ -90,7 +90,7 @@ class ErrorRecoveryIndexationTaskSerializationTest {
     @Test
     void additionalInformationShouldBeSerializable() throws Exception {
         ReprocessingContextInformationForErrorRecoveryIndexationTask details = new ReprocessingContextInformationForErrorRecoveryIndexationTask(successfullyReprocessedMailCount, failedReprocessedMailCount, executionFailures, TIMESTAMP, RunningOptions.DEFAULT);
-        JsonSerializationVerifier.dtoModule(ReprocessingContextInformationForErrorRecoveryIndexationTask.serializationModule(mailboxIdFactory))
+        JsonSerializationVerifier.dtoModule(ReprocessingContextInformationForErrorRecoveryIndexationTask.module(mailboxIdFactory))
             .bean(details)
             .json(serializedAdditionalInformation)
             .verify();
@@ -98,7 +98,7 @@ class ErrorRecoveryIndexationTaskSerializationTest {
 
     @Test
     void legacyAdditionalInformationShouldBeDeserializable() throws Exception {
-        ReprocessingContextInformationForErrorRecoveryIndexationTask legacyAdditionalInformation = JsonGenericSerializer.forModules(ReprocessingContextInformationDTO.ReprocessingContextInformationForErrorRecoveryIndexationTask.serializationModule(new TestId.Factory()))
+        ReprocessingContextInformationForErrorRecoveryIndexationTask legacyAdditionalInformation = JsonGenericSerializer.forModules(ReprocessingContextInformationDTO.ReprocessingContextInformationForErrorRecoveryIndexationTask.module(new TestId.Factory()))
             .withoutNestedType()
             .deserialize(legacySerializedAdditionalInformation);
 
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/FullReindexingTaskSerializationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/FullReindexingTaskSerializationTest.java
index 49b3511..a19d8d1 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/FullReindexingTaskSerializationTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/FullReindexingTaskSerializationTest.java
@@ -90,7 +90,7 @@ class FullReindexingTaskSerializationTest {
     void additionalInformationShouldBeSerializable() throws Exception {
         ReprocessingContextInformationForFullReindexingTask details = new ReprocessingContextInformationForFullReindexingTask(successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures, TIMESTAMP, RunningOptions.DEFAULT);
 
-        JsonSerializationVerifier.dtoModule(ReprocessingContextInformationForFullReindexingTask.serializationModule(new TestId.Factory()))
+        JsonSerializationVerifier.dtoModule(ReprocessingContextInformationForFullReindexingTask.module(new TestId.Factory()))
             .bean(details)
             .json(serializedAdditionalInformation)
             .verify();
@@ -98,7 +98,7 @@ class FullReindexingTaskSerializationTest {
 
     @Test
     void legacyAdditionalInformationShouldBeDeserializable() throws Exception {
-        ReprocessingContextInformationForFullReindexingTask legacyAdditionalInformation = JsonGenericSerializer.forModules(ReprocessingContextInformationForFullReindexingTask.serializationModule(new TestId.Factory()))
+        ReprocessingContextInformationForFullReindexingTask legacyAdditionalInformation = JsonGenericSerializer.forModules(ReprocessingContextInformationForFullReindexingTask.module(new TestId.Factory()))
             .withoutNestedType()
             .deserialize(legacySerializedAdditionalInformation);
 
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskSerializationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskSerializationTest.java
index f309686..d1015d9 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskSerializationTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskSerializationTest.java
@@ -59,7 +59,7 @@ class MessageIdReindexingTaskSerializationTest {
         MessageId messageId = messageIdFactory.fromString("1");
         MessageIdReIndexingTask.AdditionalInformation details = new MessageIdReIndexingTask.AdditionalInformation(messageId, TIMESTAMP);
 
-        JsonSerializationVerifier.dtoModule(MessageIdReindexingTaskAdditionalInformationDTO.serializationModule(messageIdFactory))
+        JsonSerializationVerifier.dtoModule(MessageIdReindexingTaskAdditionalInformationDTO.module(messageIdFactory))
             .bean(details)
             .json(serializedAdditionalInformation)
             .verify();
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskSerializationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskSerializationTest.java
index 3e1028a..df5a50d 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskSerializationTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskSerializationTest.java
@@ -88,7 +88,7 @@ class SingleMailboxReindexingTaskSerializationTest {
     void additionalInformationShouldBeSerializable() throws Exception {
         SingleMailboxReindexingTask.AdditionalInformation details = new SingleMailboxReindexingTask.AdditionalInformation(mailboxId, successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures, TIMESTAMP, RunningOptions.DEFAULT);
 
-        JsonSerializationVerifier.dtoModule(SingleMailboxReindexingTaskAdditionalInformationDTO.serializationModule(new TestId.Factory()))
+        JsonSerializationVerifier.dtoModule(SingleMailboxReindexingTaskAdditionalInformationDTO.module(new TestId.Factory()))
             .bean(details)
             .json(serializedAdditionalInformation)
             .verify();
@@ -96,7 +96,7 @@ class SingleMailboxReindexingTaskSerializationTest {
 
     @Test
     void legacyAdditionalInformationShouldBeDeserializable() throws Exception {
-        SingleMailboxReindexingTask.AdditionalInformation legacyAdditionalInformation = JsonGenericSerializer.forModules(SingleMailboxReindexingTaskAdditionalInformationDTO.serializationModule(new TestId.Factory()))
+        SingleMailboxReindexingTask.AdditionalInformation legacyAdditionalInformation = JsonGenericSerializer.forModules(SingleMailboxReindexingTaskAdditionalInformationDTO.module(new TestId.Factory()))
             .withoutNestedType()
             .deserialize(legacySerializedAdditionalInformation);
 
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskSerializationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskSerializationTest.java
index 119098c..2aa0d26 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskSerializationTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskSerializationTest.java
@@ -57,7 +57,7 @@ class SingleMessageReindexingTaskSerializationTest {
     @Test
     void additionalInformationShouldBeSerializable() throws Exception {
         SingleMessageReindexingTask.AdditionalInformation details = new SingleMessageReindexingTask.AdditionalInformation(mailboxId, messageUid, TIMESTAMP);
-        JsonSerializationVerifier.dtoModule(SingleMessageReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory))
+        JsonSerializationVerifier.dtoModule(SingleMessageReindexingTaskAdditionalInformationDTO.module(mailboxIdFactory))
             .bean(details)
             .json(serializedAdditionalInformation)
             .verify();
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java
index 84c9efd..7dbb40d 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java
@@ -89,7 +89,7 @@ class UserReindexingTaskSerializationTest {
     @Test
     void additionalInformationShouldBeSerializable() throws Exception {
         UserReindexingTask.AdditionalInformation details = new UserReindexingTask.AdditionalInformation(USERNAME, successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures, TIMESTAMP, RunningOptions.DEFAULT);
-        JsonSerializationVerifier.dtoModule(UserReindexingTaskAdditionalInformationDTO.serializationModule(new TestId.Factory()))
+        JsonSerializationVerifier.dtoModule(UserReindexingTaskAdditionalInformationDTO.module(new TestId.Factory()))
             .bean(details)
             .json(serializedAdditionalInformation)
             .verify();
@@ -97,7 +97,7 @@ class UserReindexingTaskSerializationTest {
 
     @Test
     void legacyAdditionalInformationShouldBeDeserializable() throws Exception {
-        UserReindexingTask.AdditionalInformation legacyAdditionalInformation = JsonGenericSerializer.forModules(UserReindexingTaskAdditionalInformationDTO.serializationModule(new TestId.Factory()))
+        UserReindexingTask.AdditionalInformation legacyAdditionalInformation = JsonGenericSerializer.forModules(UserReindexingTaskAdditionalInformationDTO.module(new TestId.Factory()))
             .withoutNestedType()
             .deserialize(legacySerializedAdditionalInformation);
 
diff --git a/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskAdditionalInformationDTO.java b/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskAdditionalInformationDTO.java
index 5d8a56f..8d807e3 100644
--- a/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskAdditionalInformationDTO.java
+++ b/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskAdditionalInformationDTO.java
@@ -40,14 +40,14 @@ public class RecomputeCurrentQuotasTaskAdditionalInformationDTO implements Addit
             details.timestamp());
     }
 
-    public static final AdditionalInformationDTOModule<RecomputeCurrentQuotasTask.Details, RecomputeCurrentQuotasTaskAdditionalInformationDTO> MODULE =
-        DTOModule
-            .forDomainObject(RecomputeCurrentQuotasTask.Details.class)
+    public static AdditionalInformationDTOModule<RecomputeCurrentQuotasTask.Details, RecomputeCurrentQuotasTaskAdditionalInformationDTO> module() {
+        return DTOModule.forDomainObject(RecomputeCurrentQuotasTask.Details.class)
             .convertToDTO(RecomputeCurrentQuotasTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(RecomputeCurrentQuotasTaskAdditionalInformationDTO::toDomainObject)
             .toDTOConverter(RecomputeCurrentQuotasTaskAdditionalInformationDTO::fromDomainObject)
             .typeName(RecomputeCurrentQuotasTask.RECOMPUTE_CURRENT_QUOTAS.asString())
             .withFactory(AdditionalInformationDTOModule::new);
+    }
 
     private final String type;
     private final long processedQuotaRoots;
diff --git a/mailbox/tools/quota-recompute/src/test/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskSerializationTest.java b/mailbox/tools/quota-recompute/src/test/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskSerializationTest.java
index 73fbc5b..116ae10 100644
--- a/mailbox/tools/quota-recompute/src/test/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskSerializationTest.java
+++ b/mailbox/tools/quota-recompute/src/test/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskSerializationTest.java
@@ -66,7 +66,7 @@ class RecomputeCurrentQuotasTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws Exception {
-        JsonSerializationVerifier.dtoModule(RecomputeCurrentQuotasTaskAdditionalInformationDTO.MODULE)
+        JsonSerializationVerifier.dtoModule(RecomputeCurrentQuotasTaskAdditionalInformationDTO.module())
             .bean(DETAILS)
             .json(SERIALIZED_ADDITIONAL_INFORMATION)
             .verify();
@@ -84,7 +84,7 @@ class RecomputeCurrentQuotasTaskSerializationTest {
 
     @Test
     void shouldDeserializeLegacyDetails() throws Exception {
-        RecomputeCurrentQuotasTask.Details legacyDetails = JsonGenericSerializer.forModules(RecomputeCurrentQuotasTaskAdditionalInformationDTO.MODULE)
+        RecomputeCurrentQuotasTask.Details legacyDetails = JsonGenericSerializer.forModules(RecomputeCurrentQuotasTaskAdditionalInformationDTO.module())
             .withoutNestedType()
             .deserialize(SERIALIZED_ADDITIONAL_INFORMATION_LEGACY);
 
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/CassandraConsistencyTaskSerializationModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/CassandraConsistencyTaskSerializationModule.java
index 7c1546b..735b4ac 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/CassandraConsistencyTaskSerializationModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/CassandraConsistencyTaskSerializationModule.java
@@ -83,67 +83,67 @@ public class CassandraConsistencyTaskSerializationModule extends AbstractModule
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> cassandraMappingsSolveInconsistenciesAdditionalInformation() {
-        return MappingsSourcesMigrationTaskAdditionalInformationDTO.serializationModule(CassandraMappingsSolveInconsistenciesTask.TYPE);
+        return MappingsSourcesMigrationTaskAdditionalInformationDTO.module(CassandraMappingsSolveInconsistenciesTask.TYPE);
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminCassandraMappingsSolveInconsistenciesAdditionalInformation() {
-        return MappingsSourcesMigrationTaskAdditionalInformationDTO.serializationModule(CassandraMappingsSolveInconsistenciesTask.TYPE);
+        return MappingsSourcesMigrationTaskAdditionalInformationDTO.module(CassandraMappingsSolveInconsistenciesTask.TYPE);
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> mailboxMergingAdditionalInformation() {
-        return MailboxMergingTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+        return MailboxMergingTaskAdditionalInformationDTO.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminMailboxMergingAdditionalInformation() {
-        return MailboxMergingTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+        return MailboxMergingTaskAdditionalInformationDTO.module();
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> solveMailboxInconsistenciesAdditionalInformation() {
-        return SolveMailboxInconsistenciesTaskAdditionalInformationDTO.MODULE;
+        return SolveMailboxInconsistenciesTaskAdditionalInformationDTO.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminSolveMailboxInconsistenciesAdditionalInformation() {
-        return SolveMailboxInconsistenciesTaskAdditionalInformationDTO.MODULE;
+        return SolveMailboxInconsistenciesTaskAdditionalInformationDTO.module();
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> recomputeMailboxCountersAdditionalInformation() {
-        return RecomputeMailboxCountersTaskAdditionalInformationDTO.MODULE;
+        return RecomputeMailboxCountersTaskAdditionalInformationDTO.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminRecomputeMailboxCountersAdditionalInformation() {
-        return RecomputeMailboxCountersTaskAdditionalInformationDTO.MODULE;
+        return RecomputeMailboxCountersTaskAdditionalInformationDTO.module();
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> migrationTaskAdditionalInformation() {
-        return MigrationTaskAdditionalInformationDTO.serializationModule();
+        return MigrationTaskAdditionalInformationDTO.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminMigrationTaskAdditionalInformation() {
-        return WebAdminMigrationTaskAdditionalInformationDTO.serializationModule();
+        return WebAdminMigrationTaskAdditionalInformationDTO.module();
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> solveMessageInconsistenciesAdditionalInformation() {
-        return SolveMessageInconsistenciesTaskAdditionalInformationDTO.MODULE;
+        return SolveMessageInconsistenciesTaskAdditionalInformationDTO.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminSolveMessageInconsistenciesAdditionalInformation() {
-        return SolveMessageInconsistenciesTaskAdditionalInformationDTO.MODULE;
+        return SolveMessageInconsistenciesTaskAdditionalInformationDTO.module();
     }
 }
diff --git a/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/VaultTaskSerializationModule.java b/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/VaultTaskSerializationModule.java
index cc7340e..2121d52 100644
--- a/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/VaultTaskSerializationModule.java
+++ b/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/VaultTaskSerializationModule.java
@@ -66,45 +66,45 @@ public class VaultTaskSerializationModule extends AbstractModule {
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> blobStoreVaultGarbageCollectionAdditionalInformation() {
-        return BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.MODULE;
+        return BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminBlobStoreVaultGarbageCollectionAdditionalInformation() {
-        return BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.MODULE;
+        return BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.module();
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> deletedMessagesVaultDeleteAdditionalInformation(MessageId.Factory factory) {
-        return DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.serializationModule(factory);
+        return DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.module(factory);
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminDeletedMessagesVaultDeleteAdditionalInformation(MessageId.Factory factory) {
-        return WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.serializationModule(factory);
+        return WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.module(factory);
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> deletedMessagesVaultExportAdditionalInformation() {
-        return DeletedMessagesVaultExportTaskAdditionalInformationDTO.MODULE;
+        return DeletedMessagesVaultExportTaskAdditionalInformationDTO.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminDeletedMessagesVaultExportAdditionalInformation() {
-        return DeletedMessagesVaultExportTaskAdditionalInformationDTO.MODULE;
+        return DeletedMessagesVaultExportTaskAdditionalInformationDTO.module();
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> deletedMessagesVaultRestoreAdditionalInformation() {
-        return DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.MODULE;
+        return DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminDeletedMessagesVaultRestoreAdditionalInformation() {
-        return WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.MODULE;
+        return WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.module();
     }
 }
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/ReIndexingTaskSerializationModule.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/ReIndexingTaskSerializationModule.java
index fda0438..cc90eb6 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/ReIndexingTaskSerializationModule.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/ReIndexingTaskSerializationModule.java
@@ -80,31 +80,31 @@ public class ReIndexingTaskSerializationModule extends AbstractModule {
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> errorRecoveryAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
-        return ReprocessingContextInformationDTO.ReprocessingContextInformationForErrorRecoveryIndexationTask.serializationModule(mailboxIdFactory);
+        return ReprocessingContextInformationDTO.ReprocessingContextInformationForErrorRecoveryIndexationTask.module(mailboxIdFactory);
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> fullReindexAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
-        return ReprocessingContextInformationDTO.ReprocessingContextInformationForFullReindexingTask.serializationModule(mailboxIdFactory);
+        return ReprocessingContextInformationDTO.ReprocessingContextInformationForFullReindexingTask.module(mailboxIdFactory);
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> messageIdReindexingAdditionalInformation(MessageId.Factory messageIdFactory) {
-        return MessageIdReindexingTaskAdditionalInformationDTO.serializationModule(messageIdFactory);
+        return MessageIdReindexingTaskAdditionalInformationDTO.module(messageIdFactory);
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> singleMailboxReindexingAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
-        return SingleMailboxReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory);
+        return SingleMailboxReindexingTaskAdditionalInformationDTO.module(mailboxIdFactory);
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> singleMessageReindexingAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
-        return SingleMessageReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory);
+        return SingleMessageReindexingTaskAdditionalInformationDTO.module(mailboxIdFactory);
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> userReindexingAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
-        return UserReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory);
+        return UserReindexingTaskAdditionalInformationDTO.module(mailboxIdFactory);
     }
 }
diff --git a/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTaskSerializationModule.java b/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTaskSerializationModule.java
index 2c45797..4c09c55 100644
--- a/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTaskSerializationModule.java
+++ b/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTaskSerializationModule.java
@@ -48,23 +48,23 @@ public class JmapTaskSerializationModule extends AbstractModule {
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> recomputeAllJmapPreviewsAdditionalInformation() {
-        return RecomputeAllFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+        return RecomputeAllFastViewTaskAdditionalInformationDTO.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminRecomputeAllJmapPreviewsAdditionalInformation() {
-        return RecomputeAllFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+        return RecomputeAllFastViewTaskAdditionalInformationDTO.module();
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> recomputeUserJmapPreviewsAdditionalInformation() {
-        return RecomputeUserFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+        return RecomputeUserFastViewTaskAdditionalInformationDTO.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminRecomputeUserJmapPreviewsAdditionalInformation() {
-        return RecomputeUserFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+        return RecomputeUserFastViewTaskAdditionalInformationDTO.module();
     }
 }
diff --git a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebAdminReIndexingTaskSerializationModule.java b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebAdminReIndexingTaskSerializationModule.java
index 819ffd0..ffa3130 100644
--- a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebAdminReIndexingTaskSerializationModule.java
+++ b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebAdminReIndexingTaskSerializationModule.java
@@ -50,7 +50,7 @@ public class WebAdminReIndexingTaskSerializationModule extends AbstractModule {
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> messageIdReindexingAdditionalInformation(MessageId.Factory messageIdFactory) {
-        return MessageIdReindexingTaskAdditionalInformationDTO.serializationModule(messageIdFactory);
+        return MessageIdReindexingTaskAdditionalInformationDTO.module(messageIdFactory);
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
@@ -62,7 +62,7 @@ public class WebAdminReIndexingTaskSerializationModule extends AbstractModule {
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> singleMessageReindexingAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
-        return SingleMessageReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory);
+        return SingleMessageReindexingTaskAdditionalInformationDTO.module(mailboxIdFactory);
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
diff --git a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxTaskSerializationModule.java b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxTaskSerializationModule.java
index dd5ffbe..ab4767e 100644
--- a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxTaskSerializationModule.java
+++ b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxTaskSerializationModule.java
@@ -61,45 +61,45 @@ public class WebadminMailboxTaskSerializationModule extends AbstractModule {
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> eventDeadLettersRedeliveryAdditionalInformationForAll() {
-        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForAll.MODULE;
+        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForAll.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminEventDeadLettersRedeliveryAdditionalInformationForAll() {
-        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForAll.MODULE;
+        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForAll.module();
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> eventDeadLettersRedeliveryAdditionalInformationForGroup() {
-        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForGroup.MODULE;
+        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForGroup.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminEventDeadLettersRedeliveryAdditionalInformationForGroup() {
-        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForGroup.MODULE;
+        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForGroup.module();
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> eventDeadLettersRedeliveryAdditionalInformationForOne() {
-        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForOne.MODULE;
+        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForOne.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminEventDeadLettersRedeliveryAdditionalInformationForOne() {
-        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForOne.MODULE;
+        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForOne.module();
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> recomputeCurrentQuotasAdditionalInformation() {
-        return RecomputeCurrentQuotasTaskAdditionalInformationDTO.MODULE;
+        return RecomputeCurrentQuotasTaskAdditionalInformationDTO.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminRecomputeCurrentQuotasAdditionalInformation() {
-        return RecomputeCurrentQuotasTaskAdditionalInformationDTO.MODULE;
+        return RecomputeCurrentQuotasTaskAdditionalInformationDTO.module();
     }
 }
diff --git a/server/container/guice/protocols/webadmin-mailqueue/src/main/java/org/apache/james/modules/server/MailQueueTaskSerializationModule.java b/server/container/guice/protocols/webadmin-mailqueue/src/main/java/org/apache/james/modules/server/MailQueueTaskSerializationModule.java
index 75c220d..752ed99 100644
--- a/server/container/guice/protocols/webadmin-mailqueue/src/main/java/org/apache/james/modules/server/MailQueueTaskSerializationModule.java
+++ b/server/container/guice/protocols/webadmin-mailqueue/src/main/java/org/apache/james/modules/server/MailQueueTaskSerializationModule.java
@@ -50,23 +50,23 @@ public class MailQueueTaskSerializationModule extends AbstractModule {
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> clearMailQueueAdditionalInformation() {
-        return ClearMailQueueTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+        return ClearMailQueueTaskAdditionalInformationDTO.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminClearMailQueueAdditionalInformation() {
-        return ClearMailQueueTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+        return ClearMailQueueTaskAdditionalInformationDTO.module();
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> deleteMailsFromMailQueueAdditionalInformation() {
-        return DeleteMailsFromMailQueueTaskAdditionalInformationDTO.MODULE;
+        return DeleteMailsFromMailQueueTaskAdditionalInformationDTO.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminDeleteMailsFromMailQueueAdditionalInformation() {
-        return WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.MODULE;
+        return WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.module();
     }
 }
diff --git a/server/container/guice/protocols/webadmin-mailrepository/src/main/java/org/apache/james/modules/server/MailRepositoryTaskSerializationModule.java b/server/container/guice/protocols/webadmin-mailrepository/src/main/java/org/apache/james/modules/server/MailRepositoryTaskSerializationModule.java
index 1af8fe9..2d0356f 100644
--- a/server/container/guice/protocols/webadmin-mailrepository/src/main/java/org/apache/james/modules/server/MailRepositoryTaskSerializationModule.java
+++ b/server/container/guice/protocols/webadmin-mailrepository/src/main/java/org/apache/james/modules/server/MailRepositoryTaskSerializationModule.java
@@ -59,34 +59,34 @@ public class MailRepositoryTaskSerializationModule extends AbstractModule {
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> clearMailRepositoryAdditionalInformation() {
-        return ClearMailRepositoryTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+        return ClearMailRepositoryTaskAdditionalInformationDTO.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminClearMailRepositoryAdditionalInformation() {
-        return WebAdminClearMailRepositoryTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+        return WebAdminClearMailRepositoryTaskAdditionalInformationDTO.module();
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> reprocessingAllMailsAdditionalInformation() {
-        return ReprocessingAllMailsTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+        return ReprocessingAllMailsTaskAdditionalInformationDTO.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminReprocessingAllMailsAdditionalInformation() {
-        return ReprocessingAllMailsTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+        return ReprocessingAllMailsTaskAdditionalInformationDTO.module();
     }
 
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> reprocessingOneMailAdditionalInformation() {
-        return ReprocessingOneMailTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+        return ReprocessingOneMailTaskAdditionalInformationDTO.module();
     }
 
     @Named(DTOModuleInjections.WEBADMIN_DTO)
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminReprocessingOneMailAdditionalInformation() {
-        return ReprocessingOneMailTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+        return ReprocessingOneMailTaskAdditionalInformationDTO.module();
     }
 }
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskAdditionalInformationDTO.java b/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskAdditionalInformationDTO.java
index 3915342..8dce4cb 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskAdditionalInformationDTO.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskAdditionalInformationDTO.java
@@ -40,7 +40,7 @@ public class MappingsSourcesMigrationTaskAdditionalInformationDTO implements Add
         );
     }
 
-    public static AdditionalInformationDTOModule<MappingsSourcesMigration.AdditionalInformation, MappingsSourcesMigrationTaskAdditionalInformationDTO> serializationModule(TaskType type) {
+    public static AdditionalInformationDTOModule<MappingsSourcesMigration.AdditionalInformation, MappingsSourcesMigrationTaskAdditionalInformationDTO> module(TaskType type) {
         return DTOModule
             .forDomainObject(MappingsSourcesMigration.AdditionalInformation.class)
             .convertToDTO(MappingsSourcesMigrationTaskAdditionalInformationDTO.class)
diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskSerializationTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskSerializationTest.java
index b3c53a1..11a4a36 100644
--- a/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskSerializationTest.java
+++ b/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskSerializationTest.java
@@ -45,7 +45,7 @@ class MappingsSourcesMigrationTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws Exception {
-        JsonSerializationVerifier.dtoModule(MappingsSourcesMigrationTaskAdditionalInformationDTO.serializationModule(MappingsSourcesMigration.TYPE))
+        JsonSerializationVerifier.dtoModule(MappingsSourcesMigrationTaskAdditionalInformationDTO.module(MappingsSourcesMigration.TYPE))
             .bean(DETAILS)
             .json(SERIALIZED_ADDITIONAL_INFORMATION)
             .verify();
diff --git a/server/protocols/webadmin/webadmin-cassandra-data/src/test/java/org/apache/james/webadmin/routes/CassandraMappingsRoutesTest.java b/server/protocols/webadmin/webadmin-cassandra-data/src/test/java/org/apache/james/webadmin/routes/CassandraMappingsRoutesTest.java
index 6812278..1473173 100644
--- a/server/protocols/webadmin/webadmin-cassandra-data/src/test/java/org/apache/james/webadmin/routes/CassandraMappingsRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-cassandra-data/src/test/java/org/apache/james/webadmin/routes/CassandraMappingsRoutesTest.java
@@ -83,7 +83,7 @@ class CassandraMappingsRoutesTest {
         webAdminServer = WebAdminUtils.createWebAdminServer(
                 new CassandraMappingsRoutes(cassandraMappingsService, taskManager, jsonTransformer),
                 new TasksRoutes(taskManager, jsonTransformer,
-                    DTOConverter.of(MappingsSourcesMigrationTaskAdditionalInformationDTO.serializationModule(CassandraMappingsSolveInconsistenciesTask.TYPE))))
+                    DTOConverter.of(MappingsSourcesMigrationTaskAdditionalInformationDTO.module(CassandraMappingsSolveInconsistenciesTask.TYPE))))
             .start();
 
         RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer)
diff --git a/server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/dto/WebAdminMigrationTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/dto/WebAdminMigrationTaskAdditionalInformationDTO.java
index dc6be00..7871a68 100644
--- a/server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/dto/WebAdminMigrationTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/dto/WebAdminMigrationTaskAdditionalInformationDTO.java
@@ -30,7 +30,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class WebAdminMigrationTaskAdditionalInformationDTO implements AdditionalInformationDTO {
 
-    public static AdditionalInformationDTOModule<MigrationTask.AdditionalInformation, WebAdminMigrationTaskAdditionalInformationDTO> serializationModule() {
+    public static AdditionalInformationDTOModule<MigrationTask.AdditionalInformation, WebAdminMigrationTaskAdditionalInformationDTO> module() {
         return DTOModule.forDomainObject(MigrationTask.AdditionalInformation.class)
             .convertToDTO(WebAdminMigrationTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new MigrationTask.AdditionalInformation(new SchemaVersion(dto.getToVersion()), dto.timestamp))
diff --git a/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/dto/WebAdminMigrationTaskSerializationTest.java b/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/dto/WebAdminMigrationTaskSerializationTest.java
index 3d9abc6..09bc378 100644
--- a/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/dto/WebAdminMigrationTaskSerializationTest.java
+++ b/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/dto/WebAdminMigrationTaskSerializationTest.java
@@ -22,7 +22,6 @@ import java.time.Instant;
 
 import org.apache.james.JsonSerializationVerifier;
 import org.apache.james.backends.cassandra.migration.MigrationTask;
-import org.apache.james.backends.cassandra.migration.MigrationTaskAdditionalInformationDTO;
 import org.apache.james.backends.cassandra.versions.SchemaVersion;
 import org.junit.jupiter.api.Test;
 
@@ -32,7 +31,7 @@ class WebAdminMigrationTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws Exception {
-        JsonSerializationVerifier.dtoModule(WebAdminMigrationTaskAdditionalInformationDTO.serializationModule())
+        JsonSerializationVerifier.dtoModule(WebAdminMigrationTaskAdditionalInformationDTO.module())
             .bean(new MigrationTask.AdditionalInformation(new SchemaVersion(12), TIMESTAMP))
             .json(SERIALIZED_ADDITIONAL_INFORMATION)
             .verify();
diff --git a/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java b/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java
index ddf52e4..8ba58a6 100644
--- a/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java
@@ -41,7 +41,6 @@ import org.apache.james.backends.cassandra.migration.CassandraMigrationService;
 import org.apache.james.backends.cassandra.migration.CassandraSchemaTransitions;
 import org.apache.james.backends.cassandra.migration.Migration;
 import org.apache.james.backends.cassandra.migration.MigrationTask;
-import org.apache.james.backends.cassandra.migration.MigrationTaskAdditionalInformationDTO;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionDAO;
 import org.apache.james.backends.cassandra.versions.SchemaTransition;
 import org.apache.james.backends.cassandra.versions.SchemaVersion;
@@ -91,7 +90,7 @@ public class CassandraMigrationRoutesTest {
                 new CassandraMigrationRoutes(new CassandraMigrationService(schemaVersionDAO, transitions, version -> new MigrationTask(schemaVersionDAO, transitions, version), LATEST_VERSION),
                     taskManager, jsonTransformer),
                 new TasksRoutes(taskManager, jsonTransformer,
-                    DTOConverter.of(WebAdminMigrationTaskAdditionalInformationDTO.serializationModule())))
+                    DTOConverter.of(WebAdminMigrationTaskAdditionalInformationDTO.module())))
             .start();
 
         RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer)
diff --git a/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/SolveMessageInconsistenciesRequestToTaskTest.java b/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/SolveMessageInconsistenciesRequestToTaskTest.java
index 00ccadd..33fddd2 100644
--- a/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/SolveMessageInconsistenciesRequestToTaskTest.java
+++ b/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/SolveMessageInconsistenciesRequestToTaskTest.java
@@ -91,7 +91,7 @@ public class SolveMessageInconsistenciesRequestToTaskTest {
         Mockito.when(service.fixMessageInconsistencies(any(), any())).thenReturn(Mono.just(Task.Result.COMPLETED));
 
         webAdminServer = WebAdminUtils.createWebAdminServer(
-            new TasksRoutes(taskManager, jsonTransformer, DTOConverter.of(SolveMessageInconsistenciesTaskAdditionalInformationDTO.MODULE)),
+            new TasksRoutes(taskManager, jsonTransformer, DTOConverter.of(SolveMessageInconsistenciesTaskAdditionalInformationDTO.module())),
             new JMAPRoutes(
                 service,
                 taskManager))
diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewTaskAdditionalInformationDTO.java
index 8e1461e..5290fd1 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewTaskAdditionalInformationDTO.java
@@ -31,13 +31,14 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.annotations.VisibleForTesting;
 
 public class RecomputeAllFastViewTaskAdditionalInformationDTO implements AdditionalInformationDTO {
-    public static final AdditionalInformationDTOModule<RecomputeAllFastViewProjectionItemsTask.AdditionalInformation, RecomputeAllFastViewTaskAdditionalInformationDTO> SERIALIZATION_MODULE =
-        DTOModule.forDomainObject(RecomputeAllFastViewProjectionItemsTask.AdditionalInformation.class)
+    public static AdditionalInformationDTOModule<RecomputeAllFastViewProjectionItemsTask.AdditionalInformation, RecomputeAllFastViewTaskAdditionalInformationDTO> module() {
+        return DTOModule.forDomainObject(RecomputeAllFastViewProjectionItemsTask.AdditionalInformation.class)
             .convertToDTO(RecomputeAllFastViewTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(RecomputeAllFastViewTaskAdditionalInformationDTO::toDomainObject)
             .toDTOConverter(RecomputeAllFastViewTaskAdditionalInformationDTO::toDTO)
             .typeName(RecomputeAllFastViewProjectionItemsTask.TASK_TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
+    }
 
     private static RecomputeAllFastViewProjectionItemsTask.AdditionalInformation toDomainObject(RecomputeAllFastViewTaskAdditionalInformationDTO dto) {
         return new RecomputeAllFastViewProjectionItemsTask.AdditionalInformation(
diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewTaskAdditionalInformationDTO.java
index 5a5c133..8ae9692 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewTaskAdditionalInformationDTO.java
@@ -31,13 +31,14 @@ import org.apache.james.webadmin.data.jmap.MessageFastViewProjectionCorrector.Ru
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class RecomputeUserFastViewTaskAdditionalInformationDTO implements AdditionalInformationDTO {
-    public static final AdditionalInformationDTOModule<RecomputeUserFastViewProjectionItemsTask.AdditionalInformation, RecomputeUserFastViewTaskAdditionalInformationDTO> SERIALIZATION_MODULE =
-        DTOModule.forDomainObject(RecomputeUserFastViewProjectionItemsTask.AdditionalInformation.class)
+    public static AdditionalInformationDTOModule<RecomputeUserFastViewProjectionItemsTask.AdditionalInformation, RecomputeUserFastViewTaskAdditionalInformationDTO> module() {
+        return DTOModule.forDomainObject(RecomputeUserFastViewProjectionItemsTask.AdditionalInformation.class)
             .convertToDTO(RecomputeUserFastViewTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(RecomputeUserFastViewTaskAdditionalInformationDTO::toDomainObject)
             .toDTOConverter(RecomputeUserFastViewTaskAdditionalInformationDTO::toDTO)
             .typeName(RecomputeUserFastViewProjectionItemsTask.TASK_TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
+    }
 
     private static RecomputeUserFastViewTaskAdditionalInformationDTO toDTO(RecomputeUserFastViewProjectionItemsTask.AdditionalInformation details, String type) {
         return new RecomputeUserFastViewTaskAdditionalInformationDTO(
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java
index 35e402e..9ac2f1e 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java
@@ -121,7 +121,7 @@ class RecomputeAllFastViewProjectionItemsRequestToTaskTest {
         MessageFastViewPrecomputedProperties.Factory projectionItemFactory = new MessageFastViewPrecomputedProperties.Factory(previewFactory);
         webAdminServer = WebAdminUtils.createWebAdminServer(
             new TasksRoutes(taskManager, jsonTransformer,
-                DTOConverter.of(RecomputeAllFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE)),
+                DTOConverter.of(RecomputeAllFastViewTaskAdditionalInformationDTO.module())),
             new JMAPRoutes(
                 new MessageFastViewProjectionCorrector(usersRepository, mailboxManager, messageFastViewProjection, projectionItemFactory),
                 taskManager))
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
index 15108e7..5f301af 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
@@ -41,7 +41,7 @@ class RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest {
 
     @Test
     void shouldMatchJsonSerializationContract() throws Exception {
-        JsonSerializationVerifier.dtoModule(RecomputeAllFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
+        JsonSerializationVerifier.dtoModule(RecomputeAllFastViewTaskAdditionalInformationDTO.module())
             .bean(DOMAIN_OBJECT)
             .json(ClassLoaderUtils.getSystemResourceAsString("json/recomputeAll.additionalInformation.json"))
             .verify();
@@ -49,7 +49,7 @@ class RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest {
 
     @Test
     void shouldDeserializeLegacy() throws Exception {
-        RecomputeAllFastViewProjectionItemsTask.AdditionalInformation legacyDetails = JsonGenericSerializer.forModules(RecomputeAllFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
+        RecomputeAllFastViewProjectionItemsTask.AdditionalInformation legacyDetails = JsonGenericSerializer.forModules(RecomputeAllFastViewTaskAdditionalInformationDTO.module())
             .withoutNestedType()
             .deserialize(ClassLoaderUtils.getSystemResourceAsString("json/recomputeAll.additionalInformation.legacy.json"));
 
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTaskTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTaskTest.java
index 91eabc8..3e4ad41 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTaskTest.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTaskTest.java
@@ -135,7 +135,7 @@ class RecomputeUserFastViewProjectionItemsRequestToTaskTest {
         MessageFastViewPrecomputedProperties.Factory projectionItemFactory = new MessageFastViewPrecomputedProperties.Factory(previewFactory);
         webAdminServer = WebAdminUtils.createWebAdminServer(
             new TasksRoutes(taskManager, jsonTransformer,
-                DTOConverter.of(RecomputeUserFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE)),
+                DTOConverter.of(RecomputeUserFastViewTaskAdditionalInformationDTO.module())),
             new JMAPRoutes(
                 new MessageFastViewProjectionCorrector(usersRepository, mailboxManager, messageFastViewProjection, projectionItemFactory),
                 taskManager, usersRepository))
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
index 22355a9..baeb7c1 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
@@ -37,7 +37,7 @@ class RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest {
 
     @Test
     void shouldMatchJsonSerializationContract() throws Exception {
-        JsonSerializationVerifier.dtoModule(RecomputeUserFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
+        JsonSerializationVerifier.dtoModule(RecomputeUserFastViewTaskAdditionalInformationDTO.module())
             .bean(DOMAIN_OBJECT)
             .json(ClassLoaderUtils.getSystemResourceAsString("json/recomputeUser.additionalInformation.json"))
             .verify();
@@ -46,7 +46,7 @@ class RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest {
 
     @Test
     void shouldDeserializeLegacy() throws Exception {
-        RecomputeUserFastViewProjectionItemsTask.AdditionalInformation legacyDetails = JsonGenericSerializer.forModules(RecomputeUserFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
+        RecomputeUserFastViewProjectionItemsTask.AdditionalInformation legacyDetails = JsonGenericSerializer.forModules(RecomputeUserFastViewTaskAdditionalInformationDTO.module())
             .withoutNestedType()
             .deserialize(ClassLoaderUtils.getSystemResourceAsString("json/recomputeUser.additionalInformation.legacy.json"));
 
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java
index 33c8bdf..a9d1713 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java
@@ -30,7 +30,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class DeletedMessagesVaultDeleteTaskAdditionalInformationDTO implements AdditionalInformationDTO {
 
-    public static AdditionalInformationDTOModule<DeletedMessagesVaultDeleteTask.AdditionalInformation, DeletedMessagesVaultDeleteTaskAdditionalInformationDTO> serializationModule(MessageId.Factory factory) {
+    public static AdditionalInformationDTOModule<DeletedMessagesVaultDeleteTask.AdditionalInformation, DeletedMessagesVaultDeleteTaskAdditionalInformationDTO> module(MessageId.Factory factory) {
         return DTOModule.forDomainObject(DeletedMessagesVaultDeleteTask.AdditionalInformation.class)
             .convertToDTO(DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new DeletedMessagesVaultDeleteTask.AdditionalInformation(Username.of(dto.userName), factory.fromString(dto.getMessageId()), dto.getTimestamp()))
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskAdditionalInformationDTO.java
index f8a66ad..5470f32 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskAdditionalInformationDTO.java
@@ -44,14 +44,14 @@ public class DeletedMessagesVaultExportTaskAdditionalInformationDTO implements A
         );
     }
 
-    public static final AdditionalInformationDTOModule<DeletedMessagesVaultExportTask.AdditionalInformation, DeletedMessagesVaultExportTaskAdditionalInformationDTO> MODULE =
-        DTOModule
-            .forDomainObject(DeletedMessagesVaultExportTask.AdditionalInformation.class)
+    public static final AdditionalInformationDTOModule<DeletedMessagesVaultExportTask.AdditionalInformation, DeletedMessagesVaultExportTaskAdditionalInformationDTO> module() {
+        return DTOModule.forDomainObject(DeletedMessagesVaultExportTask.AdditionalInformation.class)
             .convertToDTO(DeletedMessagesVaultExportTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(DeletedMessagesVaultExportTaskAdditionalInformationDTO::toDomainObject)
             .toDTOConverter(DeletedMessagesVaultExportTaskAdditionalInformationDTO::fromDomainObject)
             .typeName(DeletedMessagesVaultExportTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
+    }
 
     private final String type;
     private final String userExportFrom;
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java
index e93839b..7d93afe 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java
@@ -41,14 +41,14 @@ public class DeletedMessagesVaultRestoreTaskAdditionalInformationDTO implements
         );
     }
 
-    public static final AdditionalInformationDTOModule<DeletedMessagesVaultRestoreTask.AdditionalInformation, DeletedMessagesVaultRestoreTaskAdditionalInformationDTO> MODULE =
-        DTOModule
-            .forDomainObject(DeletedMessagesVaultRestoreTask.AdditionalInformation.class)
+    public static AdditionalInformationDTOModule<DeletedMessagesVaultRestoreTask.AdditionalInformation, DeletedMessagesVaultRestoreTaskAdditionalInformationDTO> module() {
+        return DTOModule.forDomainObject(DeletedMessagesVaultRestoreTask.AdditionalInformation.class)
             .convertToDTO(DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(DeletedMessagesVaultRestoreTaskAdditionalInformationDTO::toDomainObject)
             .toDTOConverter(DeletedMessagesVaultRestoreTaskAdditionalInformationDTO::fromDomainObject)
             .typeName(DeletedMessagesVaultRestoreTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
+    }
 
     private final String type;
     private final String user;
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java
index f387ecc..14a7dcf 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java
@@ -30,7 +30,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO implements AdditionalInformationDTO {
 
-    public static AdditionalInformationDTOModule<DeletedMessagesVaultDeleteTask.AdditionalInformation, WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO> serializationModule(MessageId.Factory factory) {
+    public static AdditionalInformationDTOModule<DeletedMessagesVaultDeleteTask.AdditionalInformation, WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO> module(MessageId.Factory factory) {
         return DTOModule.forDomainObject(DeletedMessagesVaultDeleteTask.AdditionalInformation.class)
             .convertToDTO(WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new DeletedMessagesVaultDeleteTask.AdditionalInformation(Username.of(dto.username), factory.fromString(dto.getDeleteMessageId()), dto.getTimestamp()))
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java
index 7e498ae..1d532b0 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java
@@ -41,14 +41,14 @@ public class WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO imp
         );
     }
 
-    public static final AdditionalInformationDTOModule<DeletedMessagesVaultRestoreTask.AdditionalInformation, WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO> MODULE =
-        DTOModule
-            .forDomainObject(DeletedMessagesVaultRestoreTask.AdditionalInformation.class)
+    public static AdditionalInformationDTOModule<DeletedMessagesVaultRestoreTask.AdditionalInformation, WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO> module() {
+        return DTOModule.forDomainObject(DeletedMessagesVaultRestoreTask.AdditionalInformation.class)
             .convertToDTO(WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO::toDomainObject)
             .toDTOConverter(WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO::fromDomainObject)
             .typeName(DeletedMessagesVaultRestoreTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
+    }
 
     private final String type;
     private final String username;
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskSerializationTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskSerializationTest.java
index 0b85ce6..291da2b 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskSerializationTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskSerializationTest.java
@@ -58,7 +58,7 @@ class DeletedMessagesVaultDeleteTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws Exception {
-        JsonSerializationVerifier.dtoModule(DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.serializationModule(messageIdFactory))
+        JsonSerializationVerifier.dtoModule(DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.module(messageIdFactory))
             .bean(new DeletedMessagesVaultDeleteTask.AdditionalInformation(username, messageId, TIMESTAMP))
             .json(serializedAdditionalInformation)
             .verify();
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskSerializationTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskSerializationTest.java
index 0699822..9f20209 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskSerializationTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskSerializationTest.java
@@ -84,7 +84,7 @@ class DeletedMessagesVaultExportTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws Exception {
-        JsonSerializationVerifier.dtoModule(DeletedMessagesVaultExportTaskAdditionalInformationDTO.MODULE)
+        JsonSerializationVerifier.dtoModule(DeletedMessagesVaultExportTaskAdditionalInformationDTO.module())
             .bean(details)
             .json(SERIALIZED_ADDITIONAL_INFORMATION_TASK)
             .verify();
@@ -93,7 +93,7 @@ class DeletedMessagesVaultExportTaskSerializationTest {
     @Test
     void additionalInformationWithInvalidMailAddressShouldThrow() {
         String invalidSerializedAdditionalInformationTask = "{\"type\":\"deleted-messages-export\",\"exportTo\":\"invalid\",\"userExportFrom\":\"james\",\"totalExportedMessages\":42}";;
-        assertThatCode(() -> JsonTaskAdditionalInformationSerializer.of(DeletedMessagesVaultExportTaskAdditionalInformationDTO.MODULE)
+        assertThatCode(() -> JsonTaskAdditionalInformationSerializer.of(DeletedMessagesVaultExportTaskAdditionalInformationDTO.module())
                 .deserialize(invalidSerializedAdditionalInformationTask))
             .hasCauseInstanceOf(AddressException.class);
     }
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskSerializationTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskSerializationTest.java
index e243190..e50f99e 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskSerializationTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskSerializationTest.java
@@ -72,7 +72,7 @@ class DeletedMessagesVaultRestoreTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws Exception {
-        JsonSerializationVerifier.dtoModule(DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.MODULE)
+        JsonSerializationVerifier.dtoModule(DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.module())
             .bean(DETAILS)
             .json(SERIALIZED_ADDITIONAL_INFORMATION_TASK)
             .verify();
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
index c66f372..0c12862 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
@@ -197,10 +197,10 @@ class DeletedMessagesVaultRoutesTest {
         webAdminServer = WebAdminUtils.createWebAdminServer(
                 new TasksRoutes(taskManager, jsonTransformer,
                     DTOConverter.of(
-                        WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.serializationModule(messageIdFactory),
-                        DeletedMessagesVaultExportTaskAdditionalInformationDTO.MODULE,
-                        WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.MODULE,
-                        BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.MODULE)),
+                        WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.module(messageIdFactory),
+                        DeletedMessagesVaultExportTaskAdditionalInformationDTO.module(),
+                        WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.module(),
+                        BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.module())),
                 new DeletedMessagesVaultRoutes(vault, vaultRestore, exportService, jsonTransformer, taskManager, queryTranslator, usersRepository, messageIdFactory))
             .start();
         RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer)
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultDeleteTaskSerializationTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultDeleteTaskSerializationTest.java
index d02c2ce..ac88a10 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultDeleteTaskSerializationTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultDeleteTaskSerializationTest.java
@@ -36,7 +36,7 @@ class WebAdminDeletedMessagesVaultDeleteTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws Exception {
-        JsonSerializationVerifier.dtoModule(WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.serializationModule(messageIdFactory))
+        JsonSerializationVerifier.dtoModule(WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.module(messageIdFactory))
             .bean(new DeletedMessagesVaultDeleteTask.AdditionalInformation(username, messageId, TIMESTAMP))
             .json(serializedAdditionalInformation)
             .verify();
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultRestoreTaskSerializationTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultRestoreTaskSerializationTest.java
index 71e73d1..010b459 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultRestoreTaskSerializationTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultRestoreTaskSerializationTest.java
@@ -33,7 +33,7 @@ class WebAdminDeletedMessagesVaultRestoreTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws Exception {
-        JsonSerializationVerifier.dtoModule(WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.MODULE)
+        JsonSerializationVerifier.dtoModule(WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.module())
             .bean(DETAILS)
             .json(SERIALIZED_ADDITIONAL_INFORMATION_TASK)
             .verify();
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliveryTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliveryTaskAdditionalInformationDTO.java
index 552aa8b..479c729 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliveryTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliveryTaskAdditionalInformationDTO.java
@@ -26,8 +26,8 @@ public class EventDeadLettersRedeliveryTaskAdditionalInformationDTO implements A
             }
         }
 
-        public static final AdditionalInformationDTOModule<EventDeadLettersRedeliveryTaskAdditionalInformationForAll, DTO> MODULE =
-            DTOModule
+        public static AdditionalInformationDTOModule<EventDeadLettersRedeliveryTaskAdditionalInformationForAll, DTO> module() {
+            return DTOModule
                 .forDomainObject(EventDeadLettersRedeliveryTaskAdditionalInformationForAll.class)
                 .convertToDTO(DTO.class)
                 .toDomainObjectConverter(EventDeadLettersRedeliveryTaskAdditionalInformationDTO::fromAll)
@@ -39,6 +39,7 @@ public class EventDeadLettersRedeliveryTaskAdditionalInformationDTO implements A
                     domainObject.timestamp()))
                 .typeName(EventDeadLettersRedeliverAllTask.TYPE.asString())
                 .withFactory(AdditionalInformationDTOModule::new);
+        }
 
 
         EventDeadLettersRedeliveryTaskAdditionalInformationForAll(long successfulRedeliveriesCount, long failedRedeliveriesCount, Instant timestamp) {
@@ -59,9 +60,8 @@ public class EventDeadLettersRedeliveryTaskAdditionalInformationDTO implements A
             }
         }
 
-        public static final AdditionalInformationDTOModule<EventDeadLettersRedeliveryTaskAdditionalInformationForGroup, DTO> MODULE =
-            DTOModule
-                .forDomainObject(EventDeadLettersRedeliveryTaskAdditionalInformationForGroup.class)
+        public static AdditionalInformationDTOModule<EventDeadLettersRedeliveryTaskAdditionalInformationForGroup, DTO> module() {
+            return DTOModule.forDomainObject(EventDeadLettersRedeliveryTaskAdditionalInformationForGroup.class)
                 .convertToDTO(DTO.class)
                 .toDomainObjectConverter(EventDeadLettersRedeliveryTaskAdditionalInformationDTO::fromGroup)
                 .toDTOConverter((domainObject, typeName) -> new DTO(typeName,
@@ -72,6 +72,7 @@ public class EventDeadLettersRedeliveryTaskAdditionalInformationDTO implements A
                     domainObject.timestamp()))
                 .typeName(EventDeadLettersRedeliverGroupTask.TYPE.asString())
                 .withFactory(AdditionalInformationDTOModule::new);
+        }
 
 
         EventDeadLettersRedeliveryTaskAdditionalInformationForGroup(long successfulRedeliveriesCount, long failedRedeliveriesCount, Optional<Group> group, Instant timestamp) {
@@ -91,9 +92,8 @@ public class EventDeadLettersRedeliveryTaskAdditionalInformationDTO implements A
             }
         }
 
-        public static final AdditionalInformationDTOModule<EventDeadLettersRedeliveryTaskAdditionalInformationForOne, DTO> MODULE =
-            DTOModule
-                .forDomainObject(EventDeadLettersRedeliveryTaskAdditionalInformationForOne.class)
+        public static AdditionalInformationDTOModule<EventDeadLettersRedeliveryTaskAdditionalInformationForOne, DTO> module() {
+            return DTOModule.forDomainObject(EventDeadLettersRedeliveryTaskAdditionalInformationForOne.class)
                 .convertToDTO(DTO.class)
                 .toDomainObjectConverter(EventDeadLettersRedeliveryTaskAdditionalInformationDTO::fromOne)
                 .toDTOConverter((domainObject, typeName) -> new DTO(typeName,
@@ -104,6 +104,7 @@ public class EventDeadLettersRedeliveryTaskAdditionalInformationDTO implements A
                     domainObject.timestamp()))
                 .typeName(EventDeadLettersRedeliverOneTask.TYPE.asString())
                 .withFactory(AdditionalInformationDTOModule::new);
+        }
 
 
         EventDeadLettersRedeliveryTaskAdditionalInformationForOne(
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/EventDeadLettersRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/EventDeadLettersRoutesTest.java
index eb08117..21bc893 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/EventDeadLettersRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/EventDeadLettersRoutesTest.java
@@ -128,9 +128,9 @@ class EventDeadLettersRoutesTest {
         webAdminServer = WebAdminUtils.createWebAdminServer(
                 new EventDeadLettersRoutes(service, eventSerializer, taskManager, jsonTransformer),
                 new TasksRoutes(taskManager, jsonTransformer,
-                    DTOConverter.of(EventDeadLettersRedeliveryTaskAdditionalInformationForOne.MODULE,
-                        EventDeadLettersRedeliveryTaskAdditionalInformationForGroup.MODULE,
-                        EventDeadLettersRedeliveryTaskAdditionalInformationForAll.MODULE)))
+                    DTOConverter.of(EventDeadLettersRedeliveryTaskAdditionalInformationForOne.module(),
+                        EventDeadLettersRedeliveryTaskAdditionalInformationForGroup.module(),
+                        EventDeadLettersRedeliveryTaskAdditionalInformationForAll.module())))
             .start();
 
         RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer).build();
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
index 56a2290..280399e 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
@@ -50,7 +50,6 @@ import org.apache.james.task.Hostname;
 import org.apache.james.task.MemoryTaskManager;
 import org.apache.james.webadmin.WebAdminServer;
 import org.apache.james.webadmin.WebAdminUtils;
-import org.apache.james.webadmin.dto.WebAdminReprocessingContextInformationDTO;
 import org.apache.james.webadmin.dto.WebAdminReprocessingContextInformationDTO.WebAdminErrorRecoveryIndexationDTO;
 import org.apache.james.webadmin.dto.WebAdminReprocessingContextInformationDTO.WebAdminFullIndexationDTO;
 import org.apache.james.webadmin.dto.WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO;
@@ -60,14 +59,10 @@ import org.apache.james.webadmin.utils.JsonTransformer;
 import org.apache.mailbox.tools.indexer.FullReindexingTask;
 import org.apache.mailbox.tools.indexer.ReIndexerImpl;
 import org.apache.mailbox.tools.indexer.ReIndexerPerformer;
-import org.apache.mailbox.tools.indexer.ReprocessingContextInformationDTO.ReprocessingContextInformationForErrorRecoveryIndexationTask;
-import org.apache.mailbox.tools.indexer.ReprocessingContextInformationDTO.ReprocessingContextInformationForFullReindexingTask;
 import org.apache.mailbox.tools.indexer.SingleMailboxReindexingTask;
-import org.apache.mailbox.tools.indexer.SingleMailboxReindexingTaskAdditionalInformationDTO;
 import org.apache.mailbox.tools.indexer.SingleMessageReindexingTask;
 import org.apache.mailbox.tools.indexer.SingleMessageReindexingTaskAdditionalInformationDTO;
 import org.eclipse.jetty.http.HttpStatus;
-import org.hamcrest.Matchers;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
@@ -112,7 +107,7 @@ class MailboxesRoutesTest {
                         WebAdminErrorRecoveryIndexationDTO.serializationModule(mailboxIdFactory),
                         WebAdminFullIndexationDTO.serializationModule(mailboxIdFactory),
                         WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory),
-                        SingleMessageReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory))),
+                        SingleMessageReindexingTaskAdditionalInformationDTO.module(mailboxIdFactory))),
                 new MailboxesRoutes(taskManager,
                     jsonTransformer,
                     ImmutableSet.of(
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MessageRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MessageRoutesTest.java
index bd24736..27058fa 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MessageRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MessageRoutesTest.java
@@ -89,7 +89,7 @@ class MessageRoutesTest {
         webAdminServer = WebAdminUtils.createWebAdminServer(
                 new TasksRoutes(taskManager, jsonTransformer,
                     DTOConverter.of(
-                        MessageIdReindexingTaskAdditionalInformationDTO.serializationModule(mailboxManager.getMessageIdFactory()))),
+                        MessageIdReindexingTaskAdditionalInformationDTO.module(mailboxManager.getMessageIdFactory()))),
                 new MessagesRoutes(taskManager,
                     new InMemoryMessageId.Factory(),
                     new MessageIdReIndexerImpl(reIndexerPerformer),
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/WebAdminQuotaSearchTestSystem.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/WebAdminQuotaSearchTestSystem.java
index a84d9f7..4c56ac8 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/WebAdminQuotaSearchTestSystem.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/WebAdminQuotaSearchTestSystem.java
@@ -63,7 +63,7 @@ public class WebAdminQuotaSearchTestSystem {
         RecomputeCurrentQuotasService mock = mock(RecomputeCurrentQuotasService.class);
         when(mock.recomputeCurrentQuotas(any(), any())).thenReturn(Mono.just(Task.Result.COMPLETED));
         TasksRoutes tasksRoutes = new TasksRoutes(taskManager, new JsonTransformer(),
-            DTOConverter.of(RecomputeCurrentQuotasTaskAdditionalInformationDTO.MODULE));
+            DTOConverter.of(RecomputeCurrentQuotasTaskAdditionalInformationDTO.module()));
         UserQuotaRoutes userQuotaRoutes = new UserQuotaRoutes(quotaSearchTestSystem.getUsersRepository(),
             userQuotaService,
             jsonTransformer,
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverTaskTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverTaskTest.java
index 7e9217e..88dfb05 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverTaskTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverTaskTest.java
@@ -84,7 +84,7 @@ class EventDeadLettersRedeliverTaskTest {
 
     @Test
     void redeliverAllAdditionalInformationShouldMatchJsonSerializationContract() throws Exception {
-        JsonSerializationVerifier.dtoModule(EventDeadLettersRedeliveryTaskAdditionalInformationForAll.MODULE)
+        JsonSerializationVerifier.dtoModule(EventDeadLettersRedeliveryTaskAdditionalInformationForAll.module())
             .bean(new EventDeadLettersRedeliveryTaskAdditionalInformationForAll(SUCCESSFUL_REDELIVERY_COUNT, FAILED_REDELIVERY_COUNT, TIMESTAMP))
             .json(SERIALIZED_TASK_ADDITIONAL_INFORMATION_ALL)
             .verify();
@@ -92,7 +92,7 @@ class EventDeadLettersRedeliverTaskTest {
 
     @Test
     void redeliverGroupAdditionalInformationShouldMatchJsonSerializationContract() throws Exception {
-        JsonSerializationVerifier.dtoModule(EventDeadLettersRedeliveryTaskAdditionalInformationForGroup.MODULE)
+        JsonSerializationVerifier.dtoModule(EventDeadLettersRedeliveryTaskAdditionalInformationForGroup.module())
             .bean(new EventDeadLettersRedeliveryTaskAdditionalInformationForGroup(SUCCESSFUL_REDELIVERY_COUNT, FAILED_REDELIVERY_COUNT, SOME_GROUP, TIMESTAMP))
             .json(SERIALIZED_TASK_ADDITIONAL_INFORMATION_GROUP)
             .verify();
@@ -100,7 +100,7 @@ class EventDeadLettersRedeliverTaskTest {
 
     @Test
     void redeliverOneAdditionalInformationShouldMatchJsonSerializationContract() throws Exception {
-        JsonSerializationVerifier.dtoModule(EventDeadLettersRedeliveryTaskAdditionalInformationForOne.MODULE)
+        JsonSerializationVerifier.dtoModule(EventDeadLettersRedeliveryTaskAdditionalInformationForOne.module())
             .bean(new EventDeadLettersRedeliveryTaskAdditionalInformationForOne(SUCCESSFUL_REDELIVERY_COUNT, FAILED_REDELIVERY_COUNT, SOME_GROUP, SOME_INSERTION_ID, TIMESTAMP))
             .json(SERIALIZED_TASK_ADDITIONAL_INFORMATION_ONE)
             .verify();
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTaskAdditionalInformationDTO.java
index 9cbc1e9..9e9b2d8 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTaskAdditionalInformationDTO.java
@@ -29,15 +29,14 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class ClearMailQueueTaskAdditionalInformationDTO implements AdditionalInformationDTO {
 
-    public static final AdditionalInformationDTOModule<ClearMailQueueTask.AdditionalInformation, ClearMailQueueTaskAdditionalInformationDTO> SERIALIZATION_MODULE =
-        DTOModule.forDomainObject(ClearMailQueueTask.AdditionalInformation.class)
+    public static AdditionalInformationDTOModule<ClearMailQueueTask.AdditionalInformation, ClearMailQueueTaskAdditionalInformationDTO> module() {
+        return DTOModule.forDomainObject(ClearMailQueueTask.AdditionalInformation.class)
             .convertToDTO(ClearMailQueueTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new ClearMailQueueTask.AdditionalInformation(
                 MailQueueName.of(dto.mailQueueName),
                 dto.initialCount,
                 dto.remainingCount,
-                dto.timestamp
-            ))
+                dto.timestamp))
             .toDTOConverter((details, type) -> new ClearMailQueueTaskAdditionalInformationDTO(
                 type,
                 details.getMailQueueName(),
@@ -46,6 +45,7 @@ public class ClearMailQueueTaskAdditionalInformationDTO implements AdditionalInf
                 details.timestamp()))
             .typeName(ClearMailQueueTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
+    }
 
     private final String mailQueueName;
     private final String type;
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
index 077c1df..3f3a98c 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
@@ -32,15 +32,14 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.github.fge.lambdas.Throwing;
 
 public class DeleteMailsFromMailQueueTaskAdditionalInformationDTO implements AdditionalInformationDTO {
-
-    public static final AdditionalInformationDTOModule<DeleteMailsFromMailQueueTask.AdditionalInformation, DeleteMailsFromMailQueueTaskAdditionalInformationDTO> MODULE =
-        DTOModule
-            .forDomainObject(DeleteMailsFromMailQueueTask.AdditionalInformation.class)
+    public static AdditionalInformationDTOModule<DeleteMailsFromMailQueueTask.AdditionalInformation, DeleteMailsFromMailQueueTaskAdditionalInformationDTO> module() {
+        return DTOModule.forDomainObject(DeleteMailsFromMailQueueTask.AdditionalInformation.class)
             .convertToDTO(DeleteMailsFromMailQueueTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(DeleteMailsFromMailQueueTaskAdditionalInformationDTO::fromDTO)
             .toDTOConverter(DeleteMailsFromMailQueueTaskAdditionalInformationDTO::toDTO)
             .typeName(DeleteMailsFromMailQueueTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
+    }
 
     private static DeleteMailsFromMailQueueTaskAdditionalInformationDTO toDTO(DeleteMailsFromMailQueueTask.AdditionalInformation domainObject, String typeName) {
         return new DeleteMailsFromMailQueueTaskAdditionalInformationDTO(
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
index fbd858e..5ac1d63 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
@@ -32,15 +32,14 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.github.fge.lambdas.Throwing;
 
 public class WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO implements AdditionalInformationDTO {
-
-    public static final AdditionalInformationDTOModule<DeleteMailsFromMailQueueTask.AdditionalInformation, WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO> MODULE =
-        DTOModule
-            .forDomainObject(DeleteMailsFromMailQueueTask.AdditionalInformation.class)
+    public static AdditionalInformationDTOModule<DeleteMailsFromMailQueueTask.AdditionalInformation, WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO> module() {
+        return DTOModule.forDomainObject(DeleteMailsFromMailQueueTask.AdditionalInformation.class)
             .convertToDTO(WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO::fromDTO)
             .toDTOConverter(WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO::toDTO)
             .typeName(DeleteMailsFromMailQueueTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
+    }
 
     private static WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO toDTO(DeleteMailsFromMailQueueTask.AdditionalInformation domainObject, String typeName) {
         return new WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO(
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java
index d16dd01..6212c7d 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java
@@ -52,7 +52,6 @@ import org.apache.james.webadmin.WebAdminUtils;
 import org.apache.james.webadmin.service.ClearMailQueueTask;
 import org.apache.james.webadmin.service.ClearMailQueueTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.service.DeleteMailsFromMailQueueTask;
-import org.apache.james.webadmin.service.DeleteMailsFromMailQueueTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.service.WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.utils.JsonTransformer;
 import org.apache.mailet.Mail;
@@ -96,8 +95,8 @@ class MailQueueRoutesTest {
         return WebAdminUtils.createWebAdminServer(
                 new MailQueueRoutes(mailQueueFactory, jsonTransformer, taskManager),
                 new TasksRoutes(taskManager, jsonTransformer,
-                    DTOConverter.of(WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.MODULE,
-                        ClearMailQueueTaskAdditionalInformationDTO.SERIALIZATION_MODULE)))
+                    DTOConverter.of(WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.module(),
+                        ClearMailQueueTaskAdditionalInformationDTO.module())))
             .start();
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/ClearMailQueueTaskTest.java b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/ClearMailQueueTaskTest.java
index c78a4c4..ff74eeb 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/ClearMailQueueTaskTest.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/ClearMailQueueTaskTest.java
@@ -72,7 +72,7 @@ class ClearMailQueueTaskTest {
     @Test
     void additionalInformationShouldBeSerializable() throws Exception {
         ClearMailQueueTask.AdditionalInformation details = new ClearMailQueueTask.AdditionalInformation(QUEUE_NAME, INITIAL_COUNT, REMAINING_COUNT, TIMESTAMP);
-        JsonSerializationVerifier.dtoModule(ClearMailQueueTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
+        JsonSerializationVerifier.dtoModule(ClearMailQueueTaskAdditionalInformationDTO.module())
             .bean(details)
             .json(SERIALIZED_TASK_ADDITIONAL_INFORMATION)
             .verify();
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskTest.java b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskTest.java
index eb2b79c..ca68379 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskTest.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskTest.java
@@ -20,7 +20,6 @@ package org.apache.james.webadmin.service;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -104,7 +103,7 @@ class DeleteMailsFromMailQueueTaskTest {
         DeleteMailsFromMailQueueTask.AdditionalInformation detailsRecipient = new DeleteMailsFromMailQueueTask.AdditionalInformation(queue.getName(), 6L, 6L,
             Optional.empty(), Optional.empty(), Optional.of(new MailAddress("d@e.f")), TIMESTAMP);
 
-        JsonSerializationVerifier.dtoModule(DeleteMailsFromMailQueueTaskAdditionalInformationDTO.MODULE)
+        JsonSerializationVerifier.dtoModule(DeleteMailsFromMailQueueTaskAdditionalInformationDTO.module())
             .testCase(detailsSender,
                 "{\"type\": \"delete-mails-from-mail-queue\", \"queue\": \"anyQueue\", \"sender\": \"a@b.c\", \"initialCount\" : 10, \"remainingCount\":5, \"timestamp\": \"2018-11-13T12:00:55Z\"}")
             .testCase(detailsName,
@@ -117,7 +116,7 @@ class DeleteMailsFromMailQueueTaskTest {
     @Test
     void additionalInformationShouldThrowWhenDeserializeAMalformedMailAddress() {
         String serializedJson = "{\"type\": \"delete-mails-from-mail-queue\", \"queue\": \"anyQueue\", \"sender\": \"a.b.c\", \"initialCount\" : 10, \"remainingCount\":5}";
-        assertThatThrownBy(() -> JsonTaskAdditionalInformationSerializer.of(DeleteMailsFromMailQueueTaskAdditionalInformationDTO.MODULE)
+        assertThatThrownBy(() -> JsonTaskAdditionalInformationSerializer.of(DeleteMailsFromMailQueueTaskAdditionalInformationDTO.module())
                 .deserialize(serializedJson))
             .isInstanceOf(AddressException.class);
     }
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTOTest.java b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTOTest.java
index 9d6986a..09ea48c 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTOTest.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTOTest.java
@@ -39,7 +39,7 @@ class WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTOTest {
         DeleteMailsFromMailQueueTask.AdditionalInformation detailsRecipient = new DeleteMailsFromMailQueueTask.AdditionalInformation(queueName, 6L, 6L,
             Optional.empty(), Optional.empty(), Optional.of(new MailAddress("d@e.f")), TIMESTAMP);
 
-        JsonSerializationVerifier.dtoModule(WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.MODULE)
+        JsonSerializationVerifier.dtoModule(WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.module())
             .testCase(detailsSender,
                 "{\"type\": \"delete-mails-from-mail-queue\", \"mailQueueName\": \"anyQueue\", \"sender\": \"a@b.c\", \"initialCount\" : 10, \"remainingCount\":5, \"timestamp\": \"2018-11-13T12:00:55Z\"}")
             .testCase(detailsName,
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskAdditionalInformationDTO.java
index 2b9d9f7..46827dd 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskAdditionalInformationDTO.java
@@ -28,16 +28,14 @@ import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class ClearMailRepositoryTaskAdditionalInformationDTO implements AdditionalInformationDTO {
-
-    public static final AdditionalInformationDTOModule<ClearMailRepositoryTask.AdditionalInformation, ClearMailRepositoryTaskAdditionalInformationDTO> SERIALIZATION_MODULE =
-        DTOModule.forDomainObject(ClearMailRepositoryTask.AdditionalInformation.class)
+    public static AdditionalInformationDTOModule<ClearMailRepositoryTask.AdditionalInformation, ClearMailRepositoryTaskAdditionalInformationDTO> module() {
+        return DTOModule.forDomainObject(ClearMailRepositoryTask.AdditionalInformation.class)
             .convertToDTO(ClearMailRepositoryTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new ClearMailRepositoryTask.AdditionalInformation(
                 MailRepositoryPath.from(dto.mailRepositoryPath),
                 dto.initialCount,
                 dto.remainingCount,
-                dto.timestamp
-            ))
+                dto.timestamp))
             .toDTOConverter((details, type) -> new ClearMailRepositoryTaskAdditionalInformationDTO(
                 type,
                 details.getRepositoryPath(),
@@ -46,6 +44,7 @@ public class ClearMailRepositoryTaskAdditionalInformationDTO implements Addition
                 details.timestamp()))
             .typeName(ClearMailRepositoryTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
+    }
 
     private final String mailRepositoryPath;
     private final String type;
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskAdditionalInformationDTO.java
index ee821a5..adacac9 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskAdditionalInformationDTO.java
@@ -30,9 +30,8 @@ import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class ReprocessingAllMailsTaskAdditionalInformationDTO implements AdditionalInformationDTO {
-
-    public static final AdditionalInformationDTOModule<ReprocessingAllMailsTask.AdditionalInformation, ReprocessingAllMailsTaskAdditionalInformationDTO> SERIALIZATION_MODULE =
-        DTOModule.forDomainObject(ReprocessingAllMailsTask.AdditionalInformation.class)
+    public static AdditionalInformationDTOModule<ReprocessingAllMailsTask.AdditionalInformation, ReprocessingAllMailsTaskAdditionalInformationDTO> module() {
+        return DTOModule.forDomainObject(ReprocessingAllMailsTask.AdditionalInformation.class)
             .convertToDTO(ReprocessingAllMailsTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new ReprocessingAllMailsTask.AdditionalInformation(
                 MailRepositoryPath.from(dto.repositoryPath),
@@ -40,8 +39,7 @@ public class ReprocessingAllMailsTaskAdditionalInformationDTO implements Additio
                 dto.targetProcessor,
                 dto.initialCount,
                 dto.remainingCount,
-                dto.timestamp
-            ))
+                dto.timestamp))
             .toDTOConverter((details, type) -> new ReprocessingAllMailsTaskAdditionalInformationDTO(
                 type,
                 details.getRepositoryPath(),
@@ -52,6 +50,7 @@ public class ReprocessingAllMailsTaskAdditionalInformationDTO implements Additio
                 details.timestamp()))
             .typeName(ReprocessingAllMailsTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
+    }
 
     private final String type;
     private final String repositoryPath;
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskAdditionalInformationDTO.java
index 89dd1d8..f84ae9d 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskAdditionalInformationDTO.java
@@ -31,17 +31,15 @@ import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class ReprocessingOneMailTaskAdditionalInformationDTO implements AdditionalInformationDTO {
-
-    public static final AdditionalInformationDTOModule<ReprocessingOneMailTask.AdditionalInformation, ReprocessingOneMailTaskAdditionalInformationDTO> SERIALIZATION_MODULE =
-        DTOModule.forDomainObject(ReprocessingOneMailTask.AdditionalInformation.class)
+    public static AdditionalInformationDTOModule<ReprocessingOneMailTask.AdditionalInformation, ReprocessingOneMailTaskAdditionalInformationDTO> module() {
+        return DTOModule.forDomainObject(ReprocessingOneMailTask.AdditionalInformation.class)
             .convertToDTO(ReprocessingOneMailTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new ReprocessingOneMailTask.AdditionalInformation(
                 MailRepositoryPath.from(dto.repositoryPath),
                 MailQueueName.of(dto.targetQueue),
                 new MailKey(dto.mailKey),
                 dto.targetProcessor,
-                dto.timestamp
-            ))
+                dto.timestamp))
             .toDTOConverter((details, type) -> new ReprocessingOneMailTaskAdditionalInformationDTO(
                 type,
                 details.getRepositoryPath(),
@@ -51,6 +49,7 @@ public class ReprocessingOneMailTaskAdditionalInformationDTO implements Addition
                 details.timestamp()))
             .typeName(ReprocessingOneMailTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
+    }
 
     private final String type;
     private final String repositoryPath;
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/WebAdminClearMailRepositoryTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/WebAdminClearMailRepositoryTaskAdditionalInformationDTO.java
index 25acd2e..31359fb 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/WebAdminClearMailRepositoryTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/WebAdminClearMailRepositoryTaskAdditionalInformationDTO.java
@@ -28,16 +28,14 @@ import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class WebAdminClearMailRepositoryTaskAdditionalInformationDTO implements AdditionalInformationDTO {
-
-    public static final AdditionalInformationDTOModule<ClearMailRepositoryTask.AdditionalInformation, WebAdminClearMailRepositoryTaskAdditionalInformationDTO> SERIALIZATION_MODULE =
-        DTOModule.forDomainObject(ClearMailRepositoryTask.AdditionalInformation.class)
+    public static AdditionalInformationDTOModule<ClearMailRepositoryTask.AdditionalInformation, WebAdminClearMailRepositoryTaskAdditionalInformationDTO> module() {
+        return DTOModule.forDomainObject(ClearMailRepositoryTask.AdditionalInformation.class)
             .convertToDTO(WebAdminClearMailRepositoryTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new ClearMailRepositoryTask.AdditionalInformation(
                 MailRepositoryPath.from(dto.repositoryPath),
                 dto.initialCount,
                 dto.remainingCount,
-                dto.timestamp
-            ))
+                dto.timestamp))
             .toDTOConverter((details, type) -> new WebAdminClearMailRepositoryTaskAdditionalInformationDTO(
                 type,
                 details.getRepositoryPath(),
@@ -46,6 +44,7 @@ public class WebAdminClearMailRepositoryTaskAdditionalInformationDTO implements
                 details.timestamp()))
             .typeName(ClearMailRepositoryTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
+    }
 
     private final String repositoryPath;
     private final String type;
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java
index 6444bee..d1806a2 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java
@@ -72,7 +72,6 @@ import org.apache.james.webadmin.Constants;
 import org.apache.james.webadmin.WebAdminServer;
 import org.apache.james.webadmin.WebAdminUtils;
 import org.apache.james.webadmin.service.ClearMailRepositoryTask;
-import org.apache.james.webadmin.service.ClearMailRepositoryTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.service.MailRepositoryStoreService;
 import org.apache.james.webadmin.service.ReprocessingAllMailsTask;
 import org.apache.james.webadmin.service.ReprocessingAllMailsTaskAdditionalInformationDTO;
@@ -131,9 +130,9 @@ public class MailRepositoriesRoutesTest {
                 new MailRepositoriesRoutes(repositoryStoreService,
                     jsonTransformer, reprocessingService, taskManager),
             new TasksRoutes(taskManager, jsonTransformer,
-                DTOConverter.of(ReprocessingOneMailTaskAdditionalInformationDTO.SERIALIZATION_MODULE,
-                    ReprocessingAllMailsTaskAdditionalInformationDTO.SERIALIZATION_MODULE,
-                    WebAdminClearMailRepositoryTaskAdditionalInformationDTO.SERIALIZATION_MODULE)))
+                DTOConverter.of(ReprocessingOneMailTaskAdditionalInformationDTO.module(),
+                    ReprocessingAllMailsTaskAdditionalInformationDTO.module(),
+                    WebAdminClearMailRepositoryTaskAdditionalInformationDTO.module())))
             .start();
 
         RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer)
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskTest.java
index 06aa208..df0cf35 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskTest.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskTest.java
@@ -64,7 +64,7 @@ class ClearMailRepositoryTaskTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws Exception {
-        JsonSerializationVerifier.dtoModule(ClearMailRepositoryTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
+        JsonSerializationVerifier.dtoModule(ClearMailRepositoryTaskAdditionalInformationDTO.module())
             .bean(new ClearMailRepositoryTask.AdditionalInformation(MAIL_REPOSITORY_PATH, INITIAL_COUNT, REMAINING_COUNT, TIMESTAMP))
             .json(SERIALIZED_TASK_ADDITIONAL_INFORMATION)
             .verify();
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskTest.java
index 7ad6a8b..d9eb9ca 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskTest.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskTest.java
@@ -73,7 +73,7 @@ class ReprocessingAllMailsTaskTest {
         ReprocessingAllMailsTask.AdditionalInformation detailsWithoutProcessor = new ReprocessingAllMailsTask.AdditionalInformation(REPOSITORY_PATH, TARGET_QUEUE, Optional.empty(),
             REPOSITORY_SIZE, REMAINING_COUNT, TIMESTAMP);
 
-        JsonSerializationVerifier.dtoModule(ReprocessingAllMailsTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
+        JsonSerializationVerifier.dtoModule(ReprocessingAllMailsTaskAdditionalInformationDTO.module())
             .testCase(details, SERIALIZED_TASK_ADDITIONAL_INFORMATION_WITH_TARGET_PROCESSOR)
             .testCase(detailsWithoutProcessor, SERIALIZED_TASK_ADDITIONAL_INFORMATION_WITHOUT_TARGET_PROCESSOR)
             .verify();
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskTest.java
index b61ed7e..1d89553 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskTest.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskTest.java
@@ -72,7 +72,7 @@ class ReprocessingOneMailTaskTest {
     @Test
     void additionalInformationShouldBeSerializable() throws IOException {
         ReprocessingOneMailTask.AdditionalInformation details = new ReprocessingOneMailTask.AdditionalInformation(REPOSITORY_PATH, TARGET_QUEUE, MAIL_KEY, TARGET_PROCESSOR, TIMESTAMP);
-        JsonSerializationVerifier.dtoModule(ReprocessingOneMailTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
+        JsonSerializationVerifier.dtoModule(ReprocessingOneMailTaskAdditionalInformationDTO.module())
             .bean(details)
             .json(SERIALIZED_TASK_1_ADDITIONAL_INFORMATION)
             .verify();
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/WebAdminClearMailRepositoryTaskDTOTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/WebAdminClearMailRepositoryTaskDTOTest.java
index 4496652..9aaaf88 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/WebAdminClearMailRepositoryTaskDTOTest.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/WebAdminClearMailRepositoryTaskDTOTest.java
@@ -36,7 +36,7 @@ class WebAdminClearMailRepositoryTaskDTOTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws Exception {
-        JsonSerializationVerifier.dtoModule(WebAdminClearMailRepositoryTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
+        JsonSerializationVerifier.dtoModule(WebAdminClearMailRepositoryTaskAdditionalInformationDTO.module())
             .bean(new ClearMailRepositoryTask.AdditionalInformation(MAIL_REPOSITORY_PATH, INITIAL_COUNT, REMAINING_COUNT, TIMESTAMP))
             .json(SERIALIZED_TASK_ADDITIONAL_INFORMATION)
             .verify();


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


[james-project] 14/17: JAMES-3204 Allow recording executed Cassandra statements

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit c4b95da664bc591ef6a01139e6d78553d32dc632
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Jun 8 17:36:52 2020 +0700

    JAMES-3204 Allow recording executed Cassandra statements
    
    This enables to test executed statements and allows enabling assertions
    on query count reduction, for performance purpose.
---
 .../james/backends/cassandra/CassandraCluster.java |  4 +-
 .../cassandra/CassandraClusterExtension.java       |  2 +-
 .../backends/cassandra/StatementRecorder.java      | 43 ++++++++++++++++++++++
 .../james/backends/cassandra/TestingSession.java   | 23 ++++++++++++
 .../backends/cassandra/TestingSessionTest.java     | 42 +++++++++++++++++++++
 5 files changed, 110 insertions(+), 4 deletions(-)

diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraCluster.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraCluster.java
index f4b576c..2090236 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraCluster.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraCluster.java
@@ -18,8 +18,6 @@
  ****************************************************************/
 package org.apache.james.backends.cassandra;
 
-import static org.apache.james.backends.cassandra.Scenario.NOTHING;
-
 import java.util.Optional;
 
 import org.apache.james.backends.cassandra.components.CassandraModule;
@@ -85,7 +83,7 @@ public final class CassandraCluster implements AutoCloseable {
 
     @Override
     public void close() {
-        nonPrivilegedSession.registerScenario(NOTHING);
+        nonPrivilegedSession.resetInstrumentation();
         if (!nonPrivilegedCluster.isClosed()) {
             clearTables();
             closeCluster();
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraClusterExtension.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraClusterExtension.java
index 603fcf3..68b5478 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraClusterExtension.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraClusterExtension.java
@@ -76,7 +76,7 @@ public class CassandraClusterExtension implements BeforeAllCallback, BeforeEachC
     @Override
     public void afterEach(ExtensionContext extensionContext) {
         cassandraCluster.clearTables();
-        cassandraCluster.getConf().registerScenario(Scenario.NOTHING);
+        cassandraCluster.getConf().resetInstrumentation();
     }
 
     @Override
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/StatementRecorder.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/StatementRecorder.java
new file mode 100644
index 0000000..e8773f5
--- /dev/null
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/StatementRecorder.java
@@ -0,0 +1,43 @@
+/****************************************************************
+ * 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.backends.cassandra;
+
+
+import java.util.List;
+import java.util.concurrent.ConcurrentLinkedDeque;
+
+import com.datastax.driver.core.Statement;
+import com.google.common.collect.ImmutableList;
+
+public class StatementRecorder {
+    private final ConcurrentLinkedDeque statements;
+
+    public StatementRecorder() {
+        statements = new ConcurrentLinkedDeque();
+    }
+
+    void recordStatement(Statement statement) {
+        statements.add(statement);
+    }
+
+    public List<Statement> listExecutedStatements() {
+        return ImmutableList.copyOf(statements);
+    }
+}
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/TestingSession.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/TestingSession.java
index f591286..4b9e235 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/TestingSession.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/TestingSession.java
@@ -20,6 +20,7 @@
 package org.apache.james.backends.cassandra;
 
 import java.util.Map;
+import java.util.Optional;
 
 import com.datastax.driver.core.BoundStatement;
 import com.datastax.driver.core.CloseFuture;
@@ -37,17 +38,29 @@ public class TestingSession implements Session {
     private final Session delegate;
     private volatile Scenario scenario;
     private volatile boolean printStatements;
+    private volatile Optional<StatementRecorder> statementRecorder;
 
     public TestingSession(Session delegate) {
         this.delegate = delegate;
         this.scenario = Scenario.NOTHING;
         this.printStatements = false;
+        this.statementRecorder = Optional.empty();
     }
 
     public void printStatements() {
         printStatements = true;
     }
 
+    public void resetInstrumentation() {
+        stopRecordingStatements();
+        stopPrintingStatements();
+        registerScenario(Scenario.NOTHING);
+    }
+
+    public void stopPrintingStatements() {
+        printStatements = false;
+    }
+
     public void registerScenario(Scenario scenario) {
         this.scenario = scenario;
     }
@@ -56,6 +69,14 @@ public class TestingSession implements Session {
         this.scenario = Scenario.combine(hooks);
     }
 
+    public void recordStatements(StatementRecorder statementRecorder) {
+        this.statementRecorder = Optional.of(statementRecorder);
+    }
+
+    public void stopRecordingStatements() {
+        this.statementRecorder = Optional.empty();
+    }
+
     @Override
     public String getLoggedKeyspace() {
         return delegate.getLoggedKeyspace();
@@ -92,6 +113,7 @@ public class TestingSession implements Session {
     @Override
     public ResultSet execute(Statement statement) {
         printStatement(statement);
+        statementRecorder.ifPresent(recorder -> recorder.recordStatement(statement));
         return delegate.execute(statement);
     }
 
@@ -116,6 +138,7 @@ public class TestingSession implements Session {
     @Override
     public ResultSetFuture executeAsync(Statement statement) {
         printStatement(statement);
+        statementRecorder.ifPresent(recorder -> recorder.recordStatement(statement));
         return scenario
             .getCorrespondingBehavior(statement)
             .execute(delegate, statement);
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/TestingSessionTest.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/TestingSessionTest.java
index 27a191a..e496e34 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/TestingSessionTest.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/TestingSessionTest.java
@@ -42,6 +42,8 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
+import com.datastax.driver.core.BoundStatement;
+
 import reactor.core.scheduler.Schedulers;
 
 class TestingSessionTest {
@@ -73,6 +75,46 @@ class TestingSessionTest {
     }
 
     @Test
+    void recordStatementsShouldKeepTraceOfExecutedStatement(CassandraCluster cassandra) {
+        StatementRecorder statementRecorder = new StatementRecorder();
+        cassandra.getConf().recordStatements(statementRecorder);
+
+        dao.getCurrentSchemaVersion().block();
+
+        assertThat(statementRecorder.listExecutedStatements())
+            .filteredOn(statement -> statement instanceof BoundStatement)
+            .extracting(BoundStatement.class::cast)
+            .extracting(statement -> statement.preparedStatement().getQueryString())
+            .containsExactly("SELECT value FROM schemaVersion;");
+    }
+
+    @Test
+    void recordStatementsShouldKeepTraceOfExecutedStatements(CassandraCluster cassandra) {
+        StatementRecorder statementRecorder = new StatementRecorder();
+        cassandra.getConf().recordStatements(statementRecorder);
+
+        dao.updateVersion(new SchemaVersion(36)).block();
+        dao.getCurrentSchemaVersion().block();
+
+        assertThat(statementRecorder.listExecutedStatements())
+            .filteredOn(statement -> statement instanceof BoundStatement)
+            .extracting(BoundStatement.class::cast)
+            .extracting(statement -> statement.preparedStatement().getQueryString())
+            .containsExactly("INSERT INTO schemaVersion (key,value) VALUES (:key,:value);", "SELECT value FROM schemaVersion;");
+    }
+
+    @Test
+    void recordStatementsShouldNotKeepTraceOfExecutedStatementsBeforeRecording(CassandraCluster cassandra) {
+        dao.getCurrentSchemaVersion().block();
+
+        StatementRecorder statementRecorder = new StatementRecorder();
+        cassandra.getConf().recordStatements(statementRecorder);
+
+        assertThat(statementRecorder.listExecutedStatements())
+            .isEmpty();
+    }
+
+    @Test
     void daoOperationShouldNotBeInstrumentedWhenNotMatching(CassandraCluster cassandra) {
         cassandra.getConf()
             .registerScenario(fail()


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


[james-project] 11/17: JAMES-3201 Document mailboxFailures for ReIndexing tasks

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 36fcc9fea5872a164fbcb5f0b8b3373d4ee1a9c0
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Jun 10 13:39:56 2020 +0700

    JAMES-3201 Document mailboxFailures for ReIndexing tasks
---
 src/site/markdown/server/manage-webadmin.md | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md
index 806c67f..d3b0e93 100644
--- a/src/site/markdown/server/manage-webadmin.md
+++ b/src/site/markdown/server/manage-webadmin.md
@@ -601,6 +601,7 @@ The scheduled task will have the following type `full-reindexing` and the follow
   },
   "successfullyReprocessedMailCount":18,
   "failedReprocessedMailCount": 3,
+  "mailboxFailures": ["12", "23" ],
   "failures": [
    {
      "mailboxId": "1",
@@ -643,6 +644,7 @@ The scheduled task will have the following type `error-recovery-indexation` and
   },
   "successfullyReprocessedMailCount":18,
   "failedReprocessedMailCount": 3,
+  "mailboxFailures": ["12", "23" ],
   "failures": [{
      "mailboxId": "1",
       "uids": [1, 36]
@@ -695,6 +697,7 @@ The scheduled task will have the following type `mailbox-reindexing` and the fol
   "mailboxId":"{mailboxId}",
   "successfullyReprocessedMailCount":18,
   "failedReprocessedMailCount": 3,
+  "mailboxFailures": ["12"],
   "failures": [
    {
      "mailboxId": "1",
@@ -1021,6 +1024,7 @@ The scheduled task will have the following type `user-reindexing` and the follow
   "user":"user@domain.com",
   "successfullyReprocessedMailCount":18,
   "failedReprocessedMailCount": 3,
+  "mailboxFailures": ["12", "23" ],
   "failures": [
    {
      "mailboxId": "1",


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


[james-project] 02/17: JAMES-3150 Add the first garbadge collection properties

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 58a8c255feb90b7ead395108583e9f70ffde3c92
Author: Gautier DI FOLCO <gd...@linagora.com>
AuthorDate: Fri Mar 20 16:25:12 2020 +0100

    JAMES-3150 Add the first garbadge collection properties
---
 pom.xml                                            |  10 +
 .../blob/blob-deduplicating/doc/gc-properties.adoc |   8 +-
 server/blob/blob-deduplicating/pom.xml             |  18 +-
 .../james/server/blob/deduplication/GC.scala       | 187 +++++++++++++++++
 .../src/test/scala/GCPropertiesTest.scala          | 107 ----------
 .../blob/deduplication/GCPropertiesTest.scala      | 228 +++++++++++++++++++++
 .../james/server/blob/deduplication/State.scala    |  46 +++++
 7 files changed, 483 insertions(+), 121 deletions(-)

diff --git a/pom.xml b/pom.xml
index bea0a41..4c64989 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2581,6 +2581,16 @@
                 <version>0.9.0</version>
             </dependency>
             <dependency>
+                <groupId>org.scalacheck</groupId>
+                <artifactId>scalacheck_${scala.base}</artifactId>
+                <version>1.14.3</version>
+            </dependency>
+            <dependency>
+                <groupId>org.scalatest</groupId>
+                <artifactId>scalatest_${scala.base}</artifactId>
+                <version>3.1.1</version>
+            </dependency>
+            <dependency>
                 <groupId>org.slf4j</groupId>
                 <artifactId>jcl-over-slf4j</artifactId>
                 <version>${slf4j.version}</version>
diff --git a/gc-properties.adoc b/server/blob/blob-deduplicating/doc/gc-properties.adoc
similarity index 74%
rename from gc-properties.adoc
rename to server/blob/blob-deduplicating/doc/gc-properties.adoc
index 7c69c01..6ffed72 100644
--- a/gc-properties.adoc
+++ b/server/blob/blob-deduplicating/doc/gc-properties.adoc
@@ -1,10 +1,10 @@
 = GC properties
 
 1. the execution time of the GC should be linked to
-active dataset but not to global dataset
-(for scalability purpose)
+active dataset (ie. where the number of references have changed)
+but not to global dataset (for scalability purpose)
 
-2. GC should run on live dataset
+2. GC should run on active dataset
 
  2.1. GC should not delete data being referenced by a pending process or
 still referenced
@@ -17,7 +17,7 @@ not have a different outcome than a single one
  3.1. an unreferenced piece of data should be removed after 1 day
 
  3.2. less than 10% of unreferenced data of a significant dataset
-should persist after three GC executions
+should persist
 
 4. GC should report what it does
 
diff --git a/server/blob/blob-deduplicating/pom.xml b/server/blob/blob-deduplicating/pom.xml
index e849535..ada4371 100644
--- a/server/blob/blob-deduplicating/pom.xml
+++ b/server/blob/blob-deduplicating/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>james-server-blob</artifactId>
         <groupId>org.apache.james</groupId>
-        <version>3.5.0-SNAPSHOT</version>
+        <version>3.6.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
@@ -32,7 +32,7 @@
 
     <name>Apache James :: Server :: Blob :: Deduplicating Blob Storage</name>
     <description>
-        An implementation of BlobStore which deduplicate the stored blobs and use a garbage collector
+        An implementation of BlobStore which deduplicates the stored blobs and uses a garbage collector
         to ensure their effective deletion.
     </description>
 
@@ -75,21 +75,19 @@
             <artifactId>scala-java8-compat_${scala.base}</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.scalactic</groupId>
-            <artifactId>scalactic_2.13</artifactId>
-            <version>3.1.1</version>
+            <groupId>org.scalacheck</groupId>
+            <artifactId>scalacheck_${scala.base}</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.scalatest</groupId>
-            <artifactId>scalatest_2.13</artifactId>
+            <groupId>org.scalactic</groupId>
+            <artifactId>scalactic_${scala.base}</artifactId>
             <version>3.1.1</version>
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.scalacheck</groupId>
-            <artifactId>scalacheck_2.13</artifactId>
-            <version>1.14.3</version>
+            <groupId>org.scalatest</groupId>
+            <artifactId>scalatest_${scala.base}</artifactId>
             <scope>test</scope>
         </dependency>
     </dependencies>
diff --git a/server/blob/blob-deduplicating/src/main/scala/org/apache/james/server/blob/deduplication/GC.scala b/server/blob/blob-deduplicating/src/main/scala/org/apache/james/server/blob/deduplication/GC.scala
new file mode 100644
index 0000000..0fa4ea8
--- /dev/null
+++ b/server/blob/blob-deduplicating/src/main/scala/org/apache/james/server/blob/deduplication/GC.scala
@@ -0,0 +1,187 @@
+/****************************************************************
+ * 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.server.blob.deduplication
+
+import org.apache.james.blob.api.BlobId
+
+/**
+ * Isolating and grouping Events
+ */
+sealed abstract class Generation extends Comparable[Generation] {
+  def previous: Generation
+  def previous(times: Long): Generation =
+    (0L until times).foldLeft(this)((generation, _) => generation.previous)
+
+  def next: Generation
+  def next(times: Long): Generation =
+    (0L until times).foldLeft(this)((generation, _) => generation.next)
+
+  /**
+   * List all generations the GC is able to collect
+   */
+  def collectibles(targetedGeneration: Generation): Set[Generation] =
+    Generation.range(this, targetedGeneration.previous(GC.temporization)).toSet
+
+  def <(that: Generation): Boolean = compareTo(that) < 0
+  def <=(that: Generation): Boolean = compareTo(that) <= 0
+  def >(that: Generation): Boolean = compareTo(that) > 0
+  def >=(that: Generation): Boolean = compareTo(that) >= 0
+}
+
+object Generation {
+  val first: Generation = apply(0)
+
+  def apply(id: Long): Generation = {
+    if (id < 0) {
+      NonExistingGeneration
+    } else {
+      ValidGeneration(id)
+    }
+  }
+
+  def range(start: Generation, end: Generation): Seq[Generation] = (start, end) match {
+    case (NonExistingGeneration, NonExistingGeneration) => Seq(NonExistingGeneration)
+    case (ValidGeneration(_), NonExistingGeneration) => Nil
+    case (NonExistingGeneration, ValidGeneration(id)) =>  NonExistingGeneration +: (0L to id).map(Generation.apply)
+    case (ValidGeneration(id1), ValidGeneration(id2)) => (id1 to id2).map(Generation.apply)
+  }
+}
+
+/**
+ * Generation which has existed
+ */
+case class ValidGeneration(id: Long) extends Generation {
+  override def previous: Generation = Generation(id - 1)
+
+  override def next: Generation = copy(id + 1)
+
+  override def compareTo(t: Generation): Int = t match {
+    case NonExistingGeneration => 1
+    case that: ValidGeneration => id.compareTo(that.id)
+  }
+
+}
+
+/**
+ * NullObject for the initialisation of the GC
+ */
+case object NonExistingGeneration extends Generation {
+  override def previous: Generation = NonExistingGeneration
+
+  override def next: Generation = Generation.first
+
+  override def compareTo(t: Generation): Int = t match {
+    case NonExistingGeneration => 0
+    case _: ValidGeneration => -1
+  }
+}
+
+/**
+ * A run of the GC regarding a Set of Generations
+ */
+case class Iteration(id: Long, processedGenerations: Set[Generation], lastGeneration: Generation) {
+  def next(generations: Set[Generation], lastGeneration: Generation): Iteration = Iteration(id + 1, generations, lastGeneration)
+}
+
+object Iteration {
+  def initial: Iteration = Iteration(0, Set(), NonExistingGeneration)
+}
+
+case class ExternalID(id: String)
+
+/**
+ * Modelized users' interactions related to blobs
+ */
+sealed trait Event {
+  def blob: BlobId
+  def externalId: ExternalID
+  def generation: Generation
+}
+
+case class Reference(externalId: ExternalID, blobId: BlobId, generation: Generation) extends Event {
+  override def blob: BlobId = blobId
+}
+
+case class Dereference(generation: Generation, reference: Reference) extends Event {
+  override def blob: BlobId = reference.blob
+  override def externalId: ExternalID = reference.externalId
+}
+
+object Events {
+  def getLastGeneration(events: Seq[Event]): Generation = events.map(_.generation).maxOption
+    .getOrElse(Generation.first)
+
+}
+
+case class Report(iteration: Iteration, blobsToDelete: Set[(Generation, BlobId)])
+
+/**
+ * Accessors to the References/Dereferences made by generations
+ */
+case class StabilizedState(references: Map[Generation, Seq[Reference]], dereferences: Map[Generation, Seq[Dereference]]) {
+  private val referencedBlobsAcrossGenerations: Map[Generation, ReferencedBlobs] = {
+    val blobIds = references.keys ++ dereferences.keys
+    val maxGeneration = blobIds.maxOption.getOrElse(Generation.first)
+    val minGeneration = blobIds.minOption.getOrElse(Generation.first)
+
+    val initialRefs = Generation.range(NonExistingGeneration, minGeneration.previous).map((_, ReferencedBlobs(Map()))).toMap
+    Generation.range(minGeneration, maxGeneration)
+      .foldLeft(initialRefs)(buildGeneration)
+  }
+
+  private def buildGeneration(refs: Map[Generation, ReferencedBlobs], generation: Generation): Map[Generation, ReferencedBlobs] = {
+    val populatedRefs = references.getOrElse(generation, Set())
+      .foldLeft(refs(generation.previous))((currentReferences, ref) => currentReferences.addReferences(ref.blobId))
+
+    val expungedRefs = dereferences.getOrElse(generation, Set())
+      .foldLeft(populatedRefs)((currentReferences, ref) => currentReferences.removeReferences(ref.reference.blobId))
+
+    refs + (generation -> expungedRefs)
+  }
+
+  def referencesAt(generation: Generation): ReferencedBlobs = referencedBlobsAcrossGenerations(generation)
+
+  type ReferenceCount = Int
+
+  case class ReferencedBlobs(blobs: Map[BlobId, ReferenceCount]) {
+    def isNotReferenced(blobId: BlobId): Boolean =
+      !blobs.contains(blobId)
+
+    def addReferences(blobId: BlobId): ReferencedBlobs =
+      ReferencedBlobs(blobs.updatedWith(blobId)(oldCount => oldCount.map(count => Some(count + 1)).getOrElse(Some(1))))
+    def removeReferences(blobId: BlobId): ReferencedBlobs =
+      ReferencedBlobs(blobs.updatedWith(blobId)(oldCount => oldCount.map(_ - 1).filter(_ > 0)))
+  }
+
+}
+
+object GC {
+  val temporization: Long = 2
+  def plan(state: StabilizedState, lastIteration: Iteration, targetedGeneration: Generation): Report = {
+    val processedGenerations = lastIteration.lastGeneration.collectibles(targetedGeneration)
+    val blobsToDelete = state.dereferences
+      .filter { case (generation, _) => processedGenerations.contains(generation) }
+      .flatMap { case (_, dereferences) => dereferences }
+      .toSet
+      .filter(dereference => state.referencesAt(processedGenerations.max).isNotReferenced(dereference.reference.blobId))
+      .map(dereference => (dereference.reference.generation, dereference.reference.blobId))
+
+    Report(lastIteration.next(processedGenerations, targetedGeneration.previous(temporization)), blobsToDelete)
+  }
+}
diff --git a/server/blob/blob-deduplicating/src/test/scala/GCPropertiesTest.scala b/server/blob/blob-deduplicating/src/test/scala/GCPropertiesTest.scala
deleted file mode 100644
index 5de3f44..0000000
--- a/server/blob/blob-deduplicating/src/test/scala/GCPropertiesTest.scala
+++ /dev/null
@@ -1,107 +0,0 @@
-import org.apache.james.blob.api.{BlobId, TestBlobId}
-import org.scalacheck.Gen
-import org.scalatest.funsuite.AnyFunSuite
-
-case class Generation(id: Long)
-case class Iteration(id: Long)
-case class ExternalID(id: String) // TODO
-
-sealed trait Event
-case class Reference(externalId: ExternalID, blobId: BlobId, generation: Generation) extends Event
-case class Deletion(generation: Generation, reference: Reference) extends Event
-
-case class Report(iteration: Iteration,
-                  blobsToDelete: Set[(Generation, BlobId)]
-                 )
-
-object Generators {
-
-  val smallInteger = Gen.choose(0L,100L)
-  var current = 0;
-  val generationsGen: Gen[LazyList[Generation]] = Gen.infiniteLazyList(Gen.frequency((90, Gen.const(0)), (9, Gen.const(1)), (1, Gen.const(2))))
-    .map(list => list.scanLeft(0)(_ + _))
-    .map(list => list.map(_.toLong).map(Generation.apply))
-
-  val iterationGen = smallInteger.map(Iteration.apply)
-
-  val blobIdFactory = new TestBlobId.Factory
-
-  def blobIdGen(generation: Generation) : Gen[BlobId] = Gen.uuid.map(uuid =>
-    blobIdFactory.from(s"${generation}_$uuid"))
-
-  val externalIDGen = Gen.uuid.map(uuid => ExternalID(uuid.toString))
-
-  def referenceGen(generation: Generation): Gen[Reference] = for {
-    blobId <- blobIdGen(generation)
-    externalId <- externalIDGen
-  } yield Reference(externalId, blobId, generation)
-
-  def existingReferences : Seq[Event] => Set[Reference] = _
-    .foldLeft((Set[Reference](), Set[Reference]()))((acc, event) => event match {
-      case deletion: Deletion => (acc._1 ++ Set(deletion.reference), acc._2)
-      case reference: Reference => if (acc._1.contains(reference)) {
-        acc
-      } else {
-        (acc._1, acc._2 ++ Set(reference))
-      }
-    })._2
-
-  def deletionGen(previousEvents : Seq[Event], generation: Generation): Gen[Option[Deletion]] = {
-    val persistingReferences = existingReferences(previousEvents)
-    if (persistingReferences.isEmpty) {
-      Gen.const(None)
-    } else {
-      Gen.oneOf(persistingReferences)
-        .map(reference => Deletion(generation, reference))
-        .map(Some(_))
-    }
-  }
-
-  def duplicateReferenceGen(generation: Generation, reference: Reference): Gen[Reference] = {
-    if (reference.generation == generation) {
-      externalIDGen.map(id => reference.copy(externalId = id))
-    } else {
-      referenceGen(generation)
-    }
-  }
-
-  def eventGen(previousEvents: Seq[Event], generation: Generation): Gen[Event] = for {
-    greenAddEvent <- referenceGen(generation)
-    addEvents = previousEvents.flatMap {
-      case x: Reference => Some(x)
-      case _ => None
-    }
-    randomAddEvent <- Gen.oneOf(addEvents)
-    duplicateAddEvent <- duplicateReferenceGen(generation, randomAddEvent)
-    deleteEvent <- deletionGen(previousEvents, generation)
-    event <- Gen.oneOf(Seq(greenAddEvent, duplicateAddEvent) ++ deleteEvent)
-  } yield event
-
-  def eventsGen() : Gen[Seq[Event]] = for {
-    nbEvents <- Gen.choose(0, 100)
-    generations <- generationsGen.map(_.take(nbEvents))
-    startEvent <- referenceGen(Generation.apply(0))
-    events <- foldM(generations, (Seq(startEvent): Seq[Event]))((previousEvents, generation) => eventGen(previousEvents, generation).map(_ +: previousEvents))
-  } yield events.reverse
-
-  def foldM[A, B](fa: LazyList[A], z: B)(f: (B, A) => Gen[B]): Gen[B] = {
-    def step(in: (LazyList[A], B)): Gen[Either[(LazyList[A], B), B]] = {
-      val (s, b) = in
-      if (s.isEmpty)
-        Gen.const(Right(b))
-      else {
-        f (b, s.head).map { bnext =>
-          Left((s.tail, bnext))
-        }
-      }
-    }
-
-    Gen.tailRecM((fa, z))(step)
-  }
-}
-
-class GCPropertiesTest extends AnyFunSuite {
-  test("print sample") {
-    Generators.eventsGen().sample.foreach(_.foreach(println))
-  }
-}
diff --git a/server/blob/blob-deduplicating/src/test/scala/org/apache/james/server/blob/deduplication/GCPropertiesTest.scala b/server/blob/blob-deduplicating/src/test/scala/org/apache/james/server/blob/deduplication/GCPropertiesTest.scala
new file mode 100644
index 0000000..ad90f1c
--- /dev/null
+++ b/server/blob/blob-deduplicating/src/test/scala/org/apache/james/server/blob/deduplication/GCPropertiesTest.scala
@@ -0,0 +1,228 @@
+/***************************************************************
+ * 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.server.blob.deduplication
+
+import java.nio.charset.StandardCharsets
+
+import com.google.common.hash
+import org.apache.james.blob.api.BlobId
+import org.apache.james.server.blob.deduplication.Generators.{OnePassGCTestParameters, TestParameters}
+import org.scalacheck.Prop.forAll
+import org.scalacheck.Test.Parameters
+import org.scalacheck.{Arbitrary, Gen, Properties, Shrink}
+
+case class GenerationAwareBlobId(generation: Generation, hash: String) extends BlobId {
+  override def asString(): String = s"${generation}_$hash"
+}
+
+object Generators {
+
+  // generate a sequence of Generations with monotonic numeric ids
+  // 80% of the time, the generation id is not incremented
+  // 19% of the time, the generation id is incremented by 1
+  // 1% of the time, the generation id is incremented by 2
+  // i.e. (0, 0, 0, 2, 3, 3, 4, 5, 5, 5, 5)
+  def nextGenerationsGen(previousGeneration: Generation): Gen[Generation] =
+    Gen.frequency((80, Gen.const(0l)), (19, Gen.const(1l)), (1, Gen.const(2l))).map(previousGeneration.next)
+
+  val externalIDGen: Gen[ExternalID] = Gen.uuid.map(uuid => ExternalID(uuid.toString))
+
+  def referenceGen(generation: Generation, hash: String): Gen[Reference] = for {
+    externalId <- externalIDGen
+  } yield Reference(externalId, GenerationAwareBlobId(generation, hash), generation)
+
+  case class ReferenceAccumulator(dereferenced: Set[Reference], existing: Set[Reference]) {
+    def addDeletion(dereference: Reference) = this.copy(dereferenced = dereferenced ++ Set(dereference))
+    def addExisting(reference: Reference) = if (dereferenced.contains(reference)) {
+      this
+    } else {
+      this.copy(existing = existing ++ Set(reference))
+    }
+  }
+
+  object ReferenceAccumulator {
+    val empty: ReferenceAccumulator = ReferenceAccumulator(Set.empty, Set.empty)
+  }
+
+  def existingReferences: Seq[Event] => Set[Reference] =
+    _.foldLeft(ReferenceAccumulator.empty)((acc, event) => event match {
+      case dereference: Dereference => acc.addDeletion(dereference.reference)
+      case reference: Reference => acc.addExisting(reference)
+    }).existing
+
+  def dereferenceGen(previousEvents: Seq[Event], generation: Generation): Gen[Option[Dereference]] = {
+    val remainingReferences: Set[Reference] = existingReferences(previousEvents)
+    if (remainingReferences.isEmpty) {
+      Gen.const(None)
+    } else {
+      Gen.oneOf(remainingReferences)
+        .map(reference => Dereference(generation, reference))
+        .map(Some(_))
+    }
+  }
+
+  val hashGenerator: Gen[String] = Gen.alphaLowerStr.map(content => hash.Hashing.sha256().hashString(content, StandardCharsets.UTF_8).toString)
+
+  // Generate an Event, either a Reference or a Dereference (10% of the time if there are previous Events)
+  def eventGen(previousEvents: Seq[Event], contentHashes: Seq[String]): Gen[Event] =
+    if (previousEvents.isEmpty) {
+      for {
+        hashForEvent <- Gen.oneOf(contentHashes)
+        firstEvent <- referenceGen(Generation.first, hashForEvent)
+      } yield firstEvent
+    } else {
+      def pickEvent(newReferenceEvent: Reference, dereferenceEventOption: Option[Dereference]): Gen[Event] = dereferenceEventOption match {
+        case Some(dereferenceEvent) => Gen.frequency((90, newReferenceEvent), (10, dereferenceEvent))
+        case None => Gen.const(newReferenceEvent)
+      }
+
+      for {
+        generation <- nextGenerationsGen(previousEvents.head.generation)
+        contentHashForEvent <- Gen.oneOf(contentHashes)
+
+        newReferenceEvent <- referenceGen(generation, contentHashForEvent)
+        dereferenceEvent <- dereferenceGen(previousEvents, generation)
+
+        event <- pickEvent(newReferenceEvent, dereferenceEvent)
+    } yield event
+  }
+
+  // Generates a list of Events with a ratio of hashes per event to enforce referencing the same hashes multiple times.
+  def eventsGen(maxNbEvents: Int, hashesPerEventsRatio: Float): Gen[Seq[Event]] =  for {
+    hashes <- generateHashes(maxNbEvents, hashesPerEventsRatio)
+    // Generate iteratively events until the number of events is reached
+    events <- Gen.tailRecM(Seq[Event]())(previousEvents => {
+      previousEvents.size match {
+        case nbEvents if nbEvents >= maxNbEvents => Gen.const(Right(previousEvents))
+        case _ => eventGen(previousEvents, hashes).map(event => Left(event +: previousEvents))
+      }
+    })
+  } yield events.reverse
+
+  def generateHashes(maxNbEvents: Int, hashesPerEventsRatio: Float): Gen[Seq[String]] = {
+    val nbHashes = Math.ceil(maxNbEvents * hashesPerEventsRatio).intValue
+    for {
+      contentHashes <- Gen.listOfN(nbHashes, hashGenerator)
+    } yield contentHashes
+  }
+
+  case class TestParameters(events: Seq[Event], generationsToCollect: Seq[Generation])
+  case class OnePassGCTestParameters(events: Seq[Event], generationToCollect: Generation)
+
+  def testParametersGen(eventsGen: Gen[Seq[Event]]): Gen[TestParameters] = for {
+    events <- eventsGen
+    allGenerations = Generation.range(Generation.first, Events.getLastGeneration(events))
+    generationsToCollect <- Gen.someOf(allGenerations)
+  } yield TestParameters(events, generationsToCollect.sorted.toSeq)
+
+  def onePassTestParametersGen(eventsGen: Gen[Seq[Event]]): Gen[OnePassGCTestParameters] = for {
+    events <- eventsGen
+    generation <- Gen.oneOf(if(events.isEmpty) Seq(Generation.first) else events.map(_.generation).toSet)
+  } yield OnePassGCTestParameters(events, generation)
+}
+
+object GCPropertiesTest extends Properties("GC") {
+  val maxNbEvents = 100
+  val hashesPerEventsRatio = 0.2f
+
+  // Arbitrary machinery to effective shrinking
+  val arbEvents: Arbitrary[Seq[Event]] = Arbitrary(Gen.choose(0, maxNbEvents).flatMap(Generators.eventsGen(_, hashesPerEventsRatio)))
+  implicit val arbTestParameters: Arbitrary[Generators.TestParameters] = Arbitrary(Generators.testParametersGen(arbEvents.arbitrary))
+  implicit val arbTestParameter: Arbitrary[Generators.OnePassGCTestParameters] = Arbitrary(Generators.onePassTestParametersGen(arbEvents.arbitrary))
+  import org.scalacheck.Shrink._
+
+  override def overrideParameters(p: Parameters) =
+    p.withMinSuccessfulTests(1000)
+
+  def createSaneTestParameters(events: Seq[Event], generations: Seq[Generation]): TestParameters = {
+    val allGenerations = Generation.range(Generation.first, Events.getLastGeneration(events))
+    TestParameters(events, generations.filter(allGenerations.contains(_)))
+  }
+  def createSaneOnePassGCTestParameters(events: Seq[Event], generation: Generation): OnePassGCTestParameters = {
+    OnePassGCTestParameters(events, generation)
+  }
+
+  implicit val shrinkTestParameters: Shrink[Generators.TestParameters] = Shrink {
+    params: Generators.TestParameters =>
+      shrink(params.events).flatMap(events => shrink(params.generationsToCollect).map(generations => createSaneTestParameters(events, generations)))
+  }
+
+  implicit val shrinkOnePassGCTestParameters: Shrink[Generators.OnePassGCTestParameters] = Shrink {
+    params: Generators.OnePassGCTestParameters =>
+      shrink(params.events).map(events => createSaneOnePassGCTestParameters(events, params.generationToCollect))
+  }
+
+  property("2.1. GC should not delete data being referenced by a pending process or still referenced") = forAll {
+    testParameters: Generators.TestParameters => {
+
+      val partitionedBlobsId = partitionBlobs(testParameters.events)
+      testParameters.generationsToCollect.foldLeft(true)((acc, e) => {
+        val plannedDeletions = GC.plan(Interpreter(testParameters.events).stabilize(), Iteration.initial, e).blobsToDelete.map(_._2)
+        acc && partitionedBlobsId.stillReferencedBlobIds.intersect(plannedDeletions).isEmpty
+      })
+    }
+  }
+
+  property("3.2. less than 10% of unreferenced data of a significant dataset should persist") = forAll {
+    testParameters: Generators.OnePassGCTestParameters => {
+      if (testParameters.generationToCollect >= Events.getLastGeneration(testParameters.events).previous(GC.temporization))
+        true
+      else {
+        val plan = GC.plan(Interpreter(testParameters.events).stabilize(), Iteration.initial, testParameters.generationToCollect)
+        // An Event belongs to a collected Generation
+        val relevantEvents: Event => Boolean = event => event.generation <= testParameters.generationToCollect.previous(GC.temporization)
+        val plannedDeletions = plan.blobsToDelete.map(_._2)
+
+        val partitionedBlobsId = partitionBlobs(testParameters.events.filter(relevantEvents))
+        plannedDeletions.size >= partitionedBlobsId.notReferencedBlobIds.size * 0.9
+      }
+    }
+  }
+
+  /*
+  Implement an oracle that implements BlobStore with a Ref Count reference tracking
+   */
+  def partitionBlobs(events: Seq[Event]): PartitionedEvents = {
+    val (referencingEvents, dereferencingEvents) = events.partition {
+      case _: Reference => true
+      case _: Dereference => false
+    }
+
+    val referencedBlobsCount = referencingEvents.groupBy(_.blob).view.mapValues(_.size).toMap
+    val dereferencedBlobsCount = dereferencingEvents.groupBy(_.blob).view.mapValues(_.size).toMap
+
+    val stillReferencedBlobIds = referencedBlobsCount.foldLeft(Set[BlobId]())((acc, kv) => {
+      val (blobId, referencesCount) = kv
+      val dereferencesCount  = dereferencedBlobsCount.getOrElse(blobId, 0)
+
+      if(referencesCount > dereferencesCount)
+        acc + blobId
+      else
+        acc
+    })
+
+    lazy val notReferencedBlobIds = dereferencedBlobsCount.keySet -- stillReferencedBlobIds
+    PartitionedEvents(stillReferencedBlobIds, notReferencedBlobIds)
+  }
+
+  case class PartitionedEvents(stillReferencedBlobIds: Set[BlobId], notReferencedBlobIds: Set[BlobId])
+
+}
+
+
diff --git a/server/blob/blob-deduplicating/src/test/scala/org/apache/james/server/blob/deduplication/State.scala b/server/blob/blob-deduplicating/src/test/scala/org/apache/james/server/blob/deduplication/State.scala
new file mode 100644
index 0000000..119d0cf
--- /dev/null
+++ b/server/blob/blob-deduplicating/src/test/scala/org/apache/james/server/blob/deduplication/State.scala
@@ -0,0 +1,46 @@
+/***************************************************************
+ * 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.server.blob.deduplication
+
+/**
+ * Used to iteratively build a StabilizedState
+ */
+case class State(references: Map[Generation, Seq[Reference]], deletions: Map[Generation, Seq[Dereference]]) {
+
+  def stabilize(): StabilizedState = StabilizedState(references, deletions)
+
+  def apply(event: Event): State = event match {
+    case e: Reference => copy(references = addElement(references, e))
+    case e: Dereference => copy(deletions = addElement(deletions, e))
+  }
+
+  private def addElement[T <: Event](collection: Map[Generation, Seq[T]], e: T): Map[Generation, Seq[T]] = {
+    collection.updatedWith(e.generation)(previous => Some(e +: previous.getOrElse(Seq())))
+  }
+}
+
+object State {
+  val initial: State = State(references = Map.empty, deletions = Map.empty)
+}
+
+object Interpreter {
+  def apply(events: Seq[Event]): State =
+    events.foldLeft(State.initial)((state, event) => state(event))
+}


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


[james-project] 09/17: JAMES-3194 Rename SingleMailboxReindexingTask TYPE

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit c9b0a70176eb5d83e48cd476d3fdc702c77d9536
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Jun 10 09:29:36 2020 +0700

    JAMES-3194 Rename SingleMailboxReindexingTask TYPE
---
 .../apache/mailbox/tools/indexer/SingleMailboxReindexingTask.java   | 4 ++--
 .../SingleMailboxReindexingTaskAdditionalInformationDTO.java        | 2 +-
 .../mailbox/tools/indexer/SingleMailboxReindexingTaskDTO.java       | 2 +-
 ...WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java | 2 +-
 .../java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java  | 6 +++---
 5 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTask.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTask.java
index 167889d..668b934 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTask.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTask.java
@@ -36,7 +36,7 @@ import com.google.common.annotations.VisibleForTesting;
 
 public class SingleMailboxReindexingTask implements Task {
 
-    public static final TaskType MAILBOX_RE_INDEXING = TaskType.of("mailbox-reindexing");
+    public static final TaskType TYPE = TaskType.of("mailbox-reindexing");
 
     public static class AdditionalInformation extends ReprocessingContextInformation {
         private final MailboxId mailboxId;
@@ -103,7 +103,7 @@ public class SingleMailboxReindexingTask implements Task {
 
     @Override
     public TaskType type() {
-        return MAILBOX_RE_INDEXING;
+        return TYPE;
     }
 
     public RunningOptions getRunningOptions() {
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskAdditionalInformationDTO.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskAdditionalInformationDTO.java
index 37b1cb8..9ab460a 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskAdditionalInformationDTO.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskAdditionalInformationDTO.java
@@ -58,7 +58,7 @@ public class SingleMailboxReindexingTaskAdditionalInformationDTO implements Addi
                 details.timestamp(),
                 Optional.of(RunningOptionsDTO.toDTO(details.getRunningOptions()))
                 ))
-            .typeName(SingleMailboxReindexingTask.MAILBOX_RE_INDEXING.asString())
+            .typeName(SingleMailboxReindexingTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
     }
 
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskDTO.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskDTO.java
index 067c07a..e03b1ee 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskDTO.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskDTO.java
@@ -38,7 +38,7 @@ public class SingleMailboxReindexingTaskDTO implements TaskDTO {
             .convertToDTO(SingleMailboxReindexingTaskDTO.class)
             .toDomainObjectConverter(factory::create)
             .toDTOConverter(SingleMailboxReindexingTaskDTO::of)
-            .typeName(SingleMailboxReindexingTask.MAILBOX_RE_INDEXING.asString())
+            .typeName(SingleMailboxReindexingTask.TYPE.asString())
             .withFactory(TaskDTOModule::new);
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java
index 199177c..7b84cde 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java
@@ -46,7 +46,7 @@ public class WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO impleme
                 details.getFailedReprocessedMailCount(),
                 details.failures(),
                 details.timestamp()))
-            .typeName(SingleMailboxReindexingTask.MAILBOX_RE_INDEXING.asString())
+            .typeName(SingleMailboxReindexingTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
index 280399e..dfb5867 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
@@ -363,7 +363,7 @@ class MailboxesRoutesTest {
                 .then()
                     .body("status", is("completed"))
                     .body("taskId", is(notNullValue()))
-                    .body("type", is(SingleMailboxReindexingTask.MAILBOX_RE_INDEXING.asString()))
+                    .body("type", is(SingleMailboxReindexingTask.TYPE.asString()))
                     .body("additionalInformation.mailboxId", is(mailboxId.serialize()))
                     .body("additionalInformation.successfullyReprocessedMailCount", is(0))
                     .body("additionalInformation.failedReprocessedMailCount", is(0))
@@ -393,7 +393,7 @@ class MailboxesRoutesTest {
                 .then()
                     .body("status", is("completed"))
                     .body("taskId", is(notNullValue()))
-                    .body("type", is(SingleMailboxReindexingTask.MAILBOX_RE_INDEXING.asString()))
+                    .body("type", is(SingleMailboxReindexingTask.TYPE.asString()))
                     .body("additionalInformation.mailboxId", is(mailboxId.serialize()))
                     .body("additionalInformation.successfullyReprocessedMailCount", is(1))
                     .body("additionalInformation.failedReprocessedMailCount", is(0))
@@ -428,7 +428,7 @@ class MailboxesRoutesTest {
                 .then()
                     .body("status", is("failed"))
                     .body("taskId", is(notNullValue()))
-                    .body("type", is(SingleMailboxReindexingTask.MAILBOX_RE_INDEXING.asString()))
+                    .body("type", is(SingleMailboxReindexingTask.TYPE.asString()))
                     .body("additionalInformation.successfullyReprocessedMailCount", is(0))
                     .body("additionalInformation.failedReprocessedMailCount", is(1))
                     .body("additionalInformation.failures.\"" + mailboxId.serialize() + "\"[0].uid", is(Long.valueOf(uidAsLong).intValue()))


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


[james-project] 17/17: JAMES-3204 Push limit to Cassandra backend when reading messages

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit db80c6c29de11e37f79493844e665b190bb375db
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Jun 8 14:52:24 2020 +0700

    JAMES-3204 Push limit to Cassandra backend when reading messages
---
 .../mailbox/cassandra/DeleteMessageListener.java   |   3 +-
 .../cassandra/mail/CassandraMessageIdDAO.java      |  95 +++++++++++++-----
 .../cassandra/mail/CassandraMessageMapper.java     |   9 +-
 .../mail/task/MailboxMergingTaskRunner.java        |   3 +-
 .../mail/task/RecomputeMailboxCountersService.java |   3 +-
 .../cassandra/CassandraMailboxManagerTest.java     |  15 +--
 .../cassandra/mail/CassandraMessageIdDAOTest.java  | 111 ++++++++++++++++++++-
 .../mail/CassandraMessageIdMapperTest.java         |   9 +-
 .../cassandra/mail/CassandraMessageMapperTest.java |  11 +-
 .../java/org/apache/james/util/streams/Limit.java  |   4 +
 10 files changed, 211 insertions(+), 52 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java
index 53b1d2e..e3d2eab 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java
@@ -51,6 +51,7 @@ import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.store.mail.MessageMapper;
+import org.apache.james.util.streams.Limit;
 
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
@@ -137,7 +138,7 @@ public class DeleteMessageListener implements MailboxListener.GroupMailboxListen
     }
 
     private Mono<Void> handleMailboxDeletion(CassandraId mailboxId) {
-        return messageIdDAO.retrieveMessages(mailboxId, MessageRange.all())
+        return messageIdDAO.retrieveMessages(mailboxId, MessageRange.all(), Limit.unlimited())
             .map(ComposedMessageIdWithMetaData::getComposedMessageId)
             .concatMap(metadata -> handleMessageDeletionAsPartOfMailboxDeletion((CassandraMessageId) metadata.getMessageId(), mailboxId)
                 .then(imapUidDAO.delete((CassandraMessageId) metadata.getMessageId(), mailboxId))
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java
index d15e121..82beedf 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java
@@ -57,6 +57,7 @@ import org.apache.james.mailbox.cassandra.ids.CassandraMessageId.Factory;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
 import org.apache.james.mailbox.model.MessageRange;
+import org.apache.james.util.streams.Limit;
 
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Row;
@@ -71,6 +72,7 @@ public class CassandraMessageIdDAO {
 
     private static final String IMAP_UID_GTE = IMAP_UID + "_GTE";
     private static final String IMAP_UID_LTE = IMAP_UID + "_LTE";
+    public static final String LIMIT = "LIMIT_BIND_MARKER";
 
     private final CassandraAsyncExecutor cassandraAsyncExecutor;
     private final Factory messageIdFactory;
@@ -78,8 +80,11 @@ public class CassandraMessageIdDAO {
     private final PreparedStatement insert;
     private final PreparedStatement select;
     private final PreparedStatement selectAllUids;
+    private final PreparedStatement selectAllUidsLimited;
     private final PreparedStatement selectUidGte;
+    private final PreparedStatement selectUidGteLimited;
     private final PreparedStatement selectUidRange;
+    private final PreparedStatement selectUidRangeLimited;
     private final PreparedStatement update;
     private final PreparedStatement listStatement;
 
@@ -92,8 +97,11 @@ public class CassandraMessageIdDAO {
         this.update = prepareUpdate(session);
         this.select = prepareSelect(session);
         this.selectAllUids = prepareSelectAllUids(session);
+        this.selectAllUidsLimited = prepareSelectAllUidsLimited(session);
         this.selectUidGte = prepareSelectUidGte(session);
+        this.selectUidGteLimited = prepareSelectUidGteLimited(session);
         this.selectUidRange = prepareSelectUidRange(session);
+        this.selectUidRangeLimited = prepareSelectUidRangeLimited(session);
         this.listStatement = prepareList(session);
     }
 
@@ -144,8 +152,15 @@ public class CassandraMessageIdDAO {
 
     private PreparedStatement prepareSelectAllUids(Session session) {
         return session.prepare(select(FIELDS)
-                .from(TABLE_NAME)
-                .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID))));
+            .from(TABLE_NAME)
+            .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID))));
+    }
+
+    private PreparedStatement prepareSelectAllUidsLimited(Session session) {
+        return session.prepare(select(FIELDS)
+            .from(TABLE_NAME)
+            .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID)))
+            .limit(bindMarker(LIMIT)));
     }
 
     private PreparedStatement prepareList(Session session) {
@@ -155,17 +170,34 @@ public class CassandraMessageIdDAO {
 
     private PreparedStatement prepareSelectUidGte(Session session) {
         return session.prepare(select(FIELDS)
-                .from(TABLE_NAME)
-                .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID)))
-                .and(gte(IMAP_UID, bindMarker(IMAP_UID))));
+            .from(TABLE_NAME)
+            .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID)))
+            .and(gte(IMAP_UID, bindMarker(IMAP_UID))));
+    }
+
+    private PreparedStatement prepareSelectUidGteLimited(Session session) {
+        return session.prepare(select(FIELDS)
+            .from(TABLE_NAME)
+            .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID)))
+            .and(gte(IMAP_UID, bindMarker(IMAP_UID)))
+            .limit(bindMarker(LIMIT)));
     }
 
     private PreparedStatement prepareSelectUidRange(Session session) {
         return session.prepare(select(FIELDS)
-                .from(TABLE_NAME)
-                .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID)))
-                .and(gte(IMAP_UID, bindMarker(IMAP_UID_GTE)))
-                .and(lte(IMAP_UID, bindMarker(IMAP_UID_LTE))));
+            .from(TABLE_NAME)
+            .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID)))
+            .and(gte(IMAP_UID, bindMarker(IMAP_UID_GTE)))
+            .and(lte(IMAP_UID, bindMarker(IMAP_UID_LTE))));
+    }
+
+    private PreparedStatement prepareSelectUidRangeLimited(Session session) {
+        return session.prepare(select(FIELDS)
+            .from(TABLE_NAME)
+            .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID)))
+            .and(gte(IMAP_UID, bindMarker(IMAP_UID_GTE)))
+            .and(lte(IMAP_UID, bindMarker(IMAP_UID_LTE)))
+            .limit(bindMarker(LIMIT)));
     }
 
     public Mono<Void> delete(CassandraId mailboxId, MessageUid uid) {
@@ -226,8 +258,8 @@ public class CassandraMessageIdDAO {
                 .setLong(IMAP_UID, uid.asLong()));
     }
 
-    public Flux<ComposedMessageIdWithMetaData> retrieveMessages(CassandraId mailboxId, MessageRange set) {
-        return retrieveRows(mailboxId, set)
+    public Flux<ComposedMessageIdWithMetaData> retrieveMessages(CassandraId mailboxId, MessageRange set, Limit limit) {
+        return retrieveRows(mailboxId, set, limit)
             .map(this::fromRowToComposedMessageIdWithFlags);
     }
 
@@ -236,36 +268,51 @@ public class CassandraMessageIdDAO {
             .map(this::fromRowToComposedMessageIdWithFlags);
     }
 
-    private Flux<Row> retrieveRows(CassandraId mailboxId, MessageRange set) {
+    private Flux<Row> retrieveRows(CassandraId mailboxId, MessageRange set, Limit limit) {
         switch (set.getType()) {
         case ALL:
-            return selectAll(mailboxId);
+            return selectAll(mailboxId, limit);
         case FROM:
-            return selectFrom(mailboxId, set.getUidFrom());
+            return selectFrom(mailboxId, set.getUidFrom(), limit);
         case RANGE:
-            return selectRange(mailboxId, set.getUidFrom(), set.getUidTo());
+            return selectRange(mailboxId, set.getUidFrom(), set.getUidTo(), limit);
         case ONE:
             return Flux.concat(selectOneRow(mailboxId, set.getUidFrom()));
         }
         throw new UnsupportedOperationException();
     }
 
-    private Flux<Row> selectAll(CassandraId mailboxId) {
-        return cassandraAsyncExecutor.executeRows(selectAllUids.bind()
-                .setUUID(MAILBOX_ID, mailboxId.asUuid()));
+    private Flux<Row> selectAll(CassandraId mailboxId, Limit limit) {
+        return cassandraAsyncExecutor.executeRows(limit.getLimit()
+            .map(limitAsInt -> selectAllUidsLimited.bind()
+                .setUUID(MAILBOX_ID, mailboxId.asUuid())
+                .setInt(LIMIT, limitAsInt))
+            .orElse(selectAllUids.bind()
+                .setUUID(MAILBOX_ID, mailboxId.asUuid())));
     }
 
-    private Flux<Row> selectFrom(CassandraId mailboxId, MessageUid uid) {
-        return cassandraAsyncExecutor.executeRows(selectUidGte.bind()
+    private Flux<Row> selectFrom(CassandraId mailboxId, MessageUid uid, Limit limit) {
+        return cassandraAsyncExecutor.executeRows(limit.getLimit()
+            .map(limitAsInt -> selectUidGteLimited.bind()
                 .setUUID(MAILBOX_ID, mailboxId.asUuid())
-                .setLong(IMAP_UID, uid.asLong()));
+                .setLong(IMAP_UID, uid.asLong())
+                .setInt(LIMIT, limitAsInt))
+            .orElse(selectUidGte.bind()
+                .setUUID(MAILBOX_ID, mailboxId.asUuid())
+                .setLong(IMAP_UID, uid.asLong())));
     }
 
-    private Flux<Row> selectRange(CassandraId mailboxId, MessageUid from, MessageUid to) {
-        return cassandraAsyncExecutor.executeRows(selectUidRange.bind()
+    private Flux<Row> selectRange(CassandraId mailboxId, MessageUid from, MessageUid to, Limit limit) {
+        return cassandraAsyncExecutor.executeRows(limit.getLimit()
+            .map(limitAsInt -> selectUidRangeLimited.bind()
+                .setUUID(MAILBOX_ID, mailboxId.asUuid())
+                .setLong(IMAP_UID_GTE, from.asLong())
+                .setLong(IMAP_UID_LTE, to.asLong())
+                .setInt(LIMIT, limitAsInt))
+            .orElse(selectUidRange.bind()
                 .setUUID(MAILBOX_ID, mailboxId.asUuid())
                 .setLong(IMAP_UID_GTE, from.asLong())
-                .setLong(IMAP_UID_LTE, to.asLong()));
+                .setLong(IMAP_UID_LTE, to.asLong())));
     }
 
     private ComposedMessageIdWithMetaData fromRowToComposedMessageIdWithFlags(Row row) {
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
index 9b8c18e..39a7757 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
@@ -111,7 +111,7 @@ public class CassandraMessageMapper implements MessageMapper {
     @Override
     public Flux<MessageUid> listAllMessageUids(Mailbox mailbox) {
         CassandraId cassandraId = (CassandraId) mailbox.getMailboxId();
-        return messageIdDAO.retrieveMessages(cassandraId, MessageRange.all())
+        return messageIdDAO.retrieveMessages(cassandraId, MessageRange.all(), Limit.unlimited())
             .map(metaData -> metaData.getComposedMessageId().getUid());
     }
 
@@ -167,10 +167,11 @@ public class CassandraMessageMapper implements MessageMapper {
     }
 
     @Override
-    public Flux<MailboxMessage> findInMailboxReactive(Mailbox mailbox, MessageRange messageRange, FetchType ftype, int limit) {
+    public Flux<MailboxMessage> findInMailboxReactive(Mailbox mailbox, MessageRange messageRange, FetchType ftype, int limitAsInt) {
         CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
 
-        return Limit.from(limit).applyOnFlux(messageIdDAO.retrieveMessages(mailboxId, messageRange))
+        Limit limit = Limit.from(limitAsInt);
+        return limit.applyOnFlux(messageIdDAO.retrieveMessages(mailboxId, messageRange, limit))
             .flatMap(id -> retrieveMessage(id, ftype), cassandraConfiguration.getMessageReadChunkSize())
             .sort(Comparator.comparing(MailboxMessage::getUid));
     }
@@ -291,7 +292,7 @@ public class CassandraMessageMapper implements MessageMapper {
     public Iterator<UpdatedFlags> updateFlags(Mailbox mailbox, FlagsUpdateCalculator flagUpdateCalculator, MessageRange range) {
         CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
 
-        Flux<ComposedMessageIdWithMetaData> toBeUpdated = messageIdDAO.retrieveMessages(mailboxId, range);
+        Flux<ComposedMessageIdWithMetaData> toBeUpdated = messageIdDAO.retrieveMessages(mailboxId, range, Limit.unlimited());
 
         FlagsUpdateStageResult firstResult = runUpdateStage(mailboxId, toBeUpdated, flagUpdateCalculator).block();
         FlagsUpdateStageResult finalResult = handleUpdatesStagedRetry(mailboxId, flagUpdateCalculator, firstResult);
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskRunner.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskRunner.java
index 8e7c6e0..2de3caf 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskRunner.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskRunner.java
@@ -37,6 +37,7 @@ import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.store.StoreMessageIdManager;
 import org.apache.james.task.Task;
+import org.apache.james.util.streams.Limit;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -68,7 +69,7 @@ public class MailboxMergingTaskRunner {
     }
 
     private Task.Result moveMessages(CassandraId oldMailboxId, CassandraId newMailboxId, MailboxSession session, MailboxMergingTask.Context context) {
-        return cassandraMessageIdDAO.retrieveMessages(oldMailboxId, MessageRange.all())
+        return cassandraMessageIdDAO.retrieveMessages(oldMailboxId, MessageRange.all(), Limit.unlimited())
             .map(ComposedMessageIdWithMetaData::getComposedMessageId)
             .map(messageId -> moveMessage(newMailboxId, messageId, session, context))
             .reduce(Task.Result.COMPLETED, Task::combine)
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersService.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersService.java
index 7bb4093..be1fbec 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersService.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersService.java
@@ -39,6 +39,7 @@ import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.task.Task;
 import org.apache.james.task.Task.Result;
+import org.apache.james.util.streams.Limit;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -216,7 +217,7 @@ public class RecomputeMailboxCountersService {
         CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
         Counter counter = new Counter(mailboxId);
 
-        return imapUidToMessageIdDAO.retrieveMessages(mailboxId, MessageRange.all())
+        return imapUidToMessageIdDAO.retrieveMessages(mailboxId, MessageRange.all(), Limit.unlimited())
             .flatMap(message -> latestMetadata(mailboxId, message, options), MESSAGE_CONCURRENCY)
             .doOnNext(counter::process)
             .then(Mono.defer(() -> counterDAO.resetCounters(counter.snapshot())))
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
index 6e35beb..cc1a026 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
@@ -69,6 +69,7 @@ import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.metrics.tests.RecordingMetricFactory;
 import org.apache.james.util.ClassLoaderUtils;
 import org.apache.james.util.streams.Iterators;
+import org.apache.james.util.streams.Limit;
 import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
@@ -140,7 +141,7 @@ public class CassandraMailboxManagerTest extends MailboxManagerTest<CassandraMai
                 softly.assertThat(imapUidDAO(cassandraCluster).retrieve(cassandraMessageId, Optional.of(mailboxId)).collectList().block())
                     .isEmpty();
 
-                softly.assertThat(messageIdDAO(cassandraCluster).retrieveMessages(mailboxId, MessageRange.all()).collectList().block())
+                softly.assertThat(messageIdDAO(cassandraCluster).retrieveMessages(mailboxId, MessageRange.all(), Limit.unlimited()).collectList().block())
                     .isEmpty();
 
                 softly.assertThat(attachmentDAO(cassandraCluster).getAttachment(attachmentId).blockOptional())
@@ -179,7 +180,7 @@ public class CassandraMailboxManagerTest extends MailboxManagerTest<CassandraMai
                 softly.assertThat(imapUidDAO(cassandraCluster).retrieve(cassandraMessageId, Optional.of(mailboxId)).collectList().block())
                     .isEmpty();
 
-                softly.assertThat(messageIdDAO(cassandraCluster).retrieveMessages(mailboxId, MessageRange.all()).collectList().block())
+                softly.assertThat(messageIdDAO(cassandraCluster).retrieveMessages(mailboxId, MessageRange.all(), Limit.unlimited()).collectList().block())
                     .isEmpty();
 
                 softly.assertThat(attachmentDAO(cassandraCluster).getAttachment(attachmentId).blockOptional())
@@ -218,7 +219,7 @@ public class CassandraMailboxManagerTest extends MailboxManagerTest<CassandraMai
                 softly.assertThat(imapUidDAO(cassandraCluster).retrieve(cassandraMessageId, Optional.of(mailboxId)).collectList().block())
                     .isEmpty();
 
-                softly.assertThat(messageIdDAO(cassandraCluster).retrieveMessages(mailboxId, MessageRange.all()).collectList().block())
+                softly.assertThat(messageIdDAO(cassandraCluster).retrieveMessages(mailboxId, MessageRange.all(), Limit.unlimited()).collectList().block())
                     .isEmpty();
 
                 softly.assertThat(attachmentDAO(cassandraCluster).getAttachment(attachmentId).blockOptional())
@@ -257,7 +258,7 @@ public class CassandraMailboxManagerTest extends MailboxManagerTest<CassandraMai
                 softly.assertThat(imapUidDAO(cassandraCluster).retrieve(cassandraMessageId, Optional.of(mailboxId)).collectList().block())
                     .isEmpty();
 
-                softly.assertThat(messageIdDAO(cassandraCluster).retrieveMessages(mailboxId, MessageRange.all()).collectList().block())
+                softly.assertThat(messageIdDAO(cassandraCluster).retrieveMessages(mailboxId, MessageRange.all(), Limit.unlimited()).collectList().block())
                     .isEmpty();
 
                 softly.assertThat(attachmentDAO(cassandraCluster).getAttachment(attachmentId).blockOptional())
@@ -296,7 +297,7 @@ public class CassandraMailboxManagerTest extends MailboxManagerTest<CassandraMai
                 softly.assertThat(imapUidDAO(cassandraCluster).retrieve(cassandraMessageId, Optional.of(mailboxId)).collectList().block())
                     .isEmpty();
 
-                softly.assertThat(messageIdDAO(cassandraCluster).retrieveMessages(mailboxId, MessageRange.all()).collectList().block())
+                softly.assertThat(messageIdDAO(cassandraCluster).retrieveMessages(mailboxId, MessageRange.all(), Limit.unlimited()).collectList().block())
                     .isEmpty();
 
                 softly.assertThat(attachmentDAO(cassandraCluster).getAttachment(attachmentId).blockOptional())
@@ -425,7 +426,7 @@ public class CassandraMailboxManagerTest extends MailboxManagerTest<CassandraMai
                 softly.assertThat(imapUidDAO(cassandraCluster).retrieve(cassandraMessageId, Optional.of(mailboxId)).collectList().block())
                     .isEmpty();
 
-                softly.assertThat(messageIdDAO(cassandraCluster).retrieveMessages(mailboxId, MessageRange.all()).collectList().block())
+                softly.assertThat(messageIdDAO(cassandraCluster).retrieveMessages(mailboxId, MessageRange.all(), Limit.unlimited()).collectList().block())
                     .isEmpty();
 
                 softly.assertThat(attachmentDAO(cassandraCluster).getAttachment(attachmentId).blockOptional())
@@ -492,7 +493,7 @@ public class CassandraMailboxManagerTest extends MailboxManagerTest<CassandraMai
                 softly.assertThat(imapUidDAO(cassandraCluster).retrieve(cassandraMessageId, Optional.of(mailboxId)).collectList().block())
                     .isEmpty();
 
-                softly.assertThat(messageIdDAO(cassandraCluster).retrieveMessages(mailboxId, MessageRange.all()).collectList().block())
+                softly.assertThat(messageIdDAO(cassandraCluster).retrieveMessages(mailboxId, MessageRange.all(), Limit.unlimited()).collectList().block())
                     .isEmpty();
 
                 softly.assertThat(attachmentDAO(cassandraCluster).getAttachment(attachmentId).blockOptional())
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java
index 8188a29..8f53020 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java
@@ -37,6 +37,7 @@ import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
 import org.apache.james.mailbox.model.MessageRange;
+import org.apache.james.util.streams.Limit;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
@@ -395,11 +396,37 @@ class CassandraMessageIdDAOTest {
                 testee.insert(composedMessageIdWithMetaData2))
         .blockLast();
 
-        assertThat(testee.retrieveMessages(mailboxId, MessageRange.all()).toIterable())
+        assertThat(testee.retrieveMessages(mailboxId, MessageRange.all(), Limit.unlimited()).toIterable())
             .containsOnly(composedMessageIdWithMetaData, composedMessageIdWithMetaData2);
     }
 
     @Test
+    void retrieveMessagesShouldApplyLimitWhenRangeAll() {
+        CassandraMessageId messageId = messageIdFactory.generate();
+        CassandraMessageId messageId2 = messageIdFactory.generate();
+        CassandraId mailboxId = CassandraId.timeBased();
+        MessageUid messageUid = MessageUid.of(1);
+        MessageUid messageUid2 = MessageUid.of(2);
+
+        ComposedMessageIdWithMetaData composedMessageIdWithMetaData = ComposedMessageIdWithMetaData.builder()
+                .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
+                .flags(new Flags())
+                .modSeq(ModSeq.of(1))
+                .build();
+        ComposedMessageIdWithMetaData composedMessageIdWithMetaData2 = ComposedMessageIdWithMetaData.builder()
+                .composedMessageId(new ComposedMessageId(mailboxId, messageId2, messageUid2))
+                .flags(new Flags())
+                .modSeq(ModSeq.of(1))
+                .build();
+        Flux.merge(testee.insert(composedMessageIdWithMetaData),
+                testee.insert(composedMessageIdWithMetaData2))
+            .blockLast();
+
+        assertThat(testee.retrieveMessages(mailboxId, MessageRange.all(), Limit.limit(1)).toIterable())
+            .containsOnly(composedMessageIdWithMetaData);
+    }
+
+    @Test
     void retrieveMessagesShouldRetrieveSomeWhenRangeFrom() {
         CassandraMessageId messageId = messageIdFactory.generate();
         CassandraMessageId messageId2 = messageIdFactory.generate();
@@ -429,9 +456,42 @@ class CassandraMessageIdDAOTest {
                 testee.insert(composedMessageIdWithMetaData2))
         .blockLast();
 
-        assertThat(testee.retrieveMessages(mailboxId, MessageRange.from(messageUid2)).toIterable())
+        assertThat(testee.retrieveMessages(mailboxId, MessageRange.from(messageUid2), Limit.unlimited()).toIterable())
             .containsOnly(composedMessageIdWithMetaData, composedMessageIdWithMetaData2);
     }
+    @Test
+    void retrieveMessagesShouldAppluLimitWhenRangeFrom() {
+        CassandraMessageId messageId = messageIdFactory.generate();
+        CassandraMessageId messageId2 = messageIdFactory.generate();
+        CassandraMessageId messageId3 = messageIdFactory.generate();
+        CassandraId mailboxId = CassandraId.timeBased();
+        MessageUid messageUid = MessageUid.of(1);
+        MessageUid messageUid2 = MessageUid.of(2);
+        MessageUid messageUid3 = MessageUid.of(3);
+
+        ComposedMessageIdWithMetaData composedMessageIdWithMetaData = ComposedMessageIdWithMetaData.builder()
+            .composedMessageId(new ComposedMessageId(mailboxId, messageId2, messageUid2))
+            .flags(new Flags())
+            .modSeq(ModSeq.of(1))
+            .build();
+        ComposedMessageIdWithMetaData composedMessageIdWithMetaData2 = ComposedMessageIdWithMetaData.builder()
+            .composedMessageId(new ComposedMessageId(mailboxId, messageId3, messageUid3))
+            .flags(new Flags())
+            .modSeq(ModSeq.of(1))
+            .build();
+        Flux.merge(testee.insert(
+            ComposedMessageIdWithMetaData.builder()
+                .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
+                .flags(new Flags())
+                .modSeq(ModSeq.of(1))
+                .build()),
+            testee.insert(composedMessageIdWithMetaData),
+            testee.insert(composedMessageIdWithMetaData2))
+            .blockLast();
+
+        assertThat(testee.retrieveMessages(mailboxId, MessageRange.from(messageUid2), Limit.limit(1)).toIterable())
+            .containsOnly(composedMessageIdWithMetaData);
+    }
 
     @Test
     void retrieveMessagesShouldRetrieveSomeWhenRange() {
@@ -472,11 +532,54 @@ class CassandraMessageIdDAOTest {
                     .build()))
         .blockLast();
 
-        assertThat(testee.retrieveMessages(mailboxId, MessageRange.range(messageUid2, messageUid3)).toIterable())
+        assertThat(testee.retrieveMessages(mailboxId, MessageRange.range(messageUid2, messageUid3), Limit.unlimited()).toIterable())
             .containsOnly(composedMessageIdWithMetaData, composedMessageIdWithMetaData2);
     }
 
     @Test
+    void retrieveMessagesShouldApplyLimitWhenRange() {
+        CassandraMessageId messageId = messageIdFactory.generate();
+        CassandraMessageId messageId2 = messageIdFactory.generate();
+        CassandraMessageId messageId3 = messageIdFactory.generate();
+        CassandraMessageId messageId4 = messageIdFactory.generate();
+        CassandraId mailboxId = CassandraId.timeBased();
+        MessageUid messageUid = MessageUid.of(1);
+        MessageUid messageUid2 = MessageUid.of(2);
+        MessageUid messageUid3 = MessageUid.of(3);
+        MessageUid messageUid4 = MessageUid.of(4);
+
+        testee.insert(ComposedMessageIdWithMetaData.builder()
+                .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
+                .flags(new Flags())
+                .modSeq(ModSeq.of(1))
+            .build())
+            .block();
+
+        ComposedMessageIdWithMetaData composedMessageIdWithMetaData = ComposedMessageIdWithMetaData.builder()
+            .composedMessageId(new ComposedMessageId(mailboxId, messageId2, messageUid2))
+            .flags(new Flags())
+            .modSeq(ModSeq.of(1))
+            .build();
+
+        ComposedMessageIdWithMetaData composedMessageIdWithMetaData2 = ComposedMessageIdWithMetaData.builder()
+            .composedMessageId(new ComposedMessageId(mailboxId, messageId3, messageUid3))
+            .flags(new Flags())
+            .modSeq(ModSeq.of(1))
+            .build();
+        Flux.merge(testee.insert(composedMessageIdWithMetaData),
+            testee.insert(composedMessageIdWithMetaData2),
+            testee.insert(ComposedMessageIdWithMetaData.builder()
+                .composedMessageId(new ComposedMessageId(mailboxId, messageId4, messageUid4))
+                .flags(new Flags())
+                .modSeq(ModSeq.of(1))
+                .build()))
+            .blockLast();
+
+        assertThat(testee.retrieveMessages(mailboxId, MessageRange.range(messageUid2, messageUid3), Limit.limit(1)).toIterable())
+            .containsOnly(composedMessageIdWithMetaData);
+    }
+
+    @Test
     void retrieveMessagesShouldRetrieveOneWhenRangeOne() {
         CassandraMessageId messageId = messageIdFactory.generate();
         CassandraMessageId messageId2 = messageIdFactory.generate();
@@ -505,7 +608,7 @@ class CassandraMessageIdDAOTest {
                     .build()))
         .blockLast();
 
-        assertThat(testee.retrieveMessages(mailboxId, MessageRange.one(messageUid2)).toIterable())
+        assertThat(testee.retrieveMessages(mailboxId, MessageRange.one(messageUid2), Limit.unlimited()).toIterable())
             .containsOnly(composedMessageIdWithMetaData);
     }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
index 891529a..104a72a 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
@@ -39,6 +39,7 @@ import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.MessageIdMapperTest;
+import org.apache.james.util.streams.Limit;
 import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
@@ -103,7 +104,7 @@ class CassandraMessageIdMapperTest extends MessageIdMapperTest {
             SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
                 softly.assertThat(sut.find(ImmutableList.of(message1.getMessageId()), MessageMapper.FetchType.Metadata))
                     .isEmpty();
-                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
+                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all(), Limit.unlimited()).collectList().block())
                     .isEmpty();
             }));
         }
@@ -127,7 +128,7 @@ class CassandraMessageIdMapperTest extends MessageIdMapperTest {
             SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
                 softly.assertThat(sut.find(ImmutableList.of(message1.getMessageId()), MessageMapper.FetchType.Metadata))
                     .isEmpty();
-                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
+                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all(), Limit.unlimited()).collectList().block())
                     .isEmpty();
             }));
         }
@@ -151,7 +152,7 @@ class CassandraMessageIdMapperTest extends MessageIdMapperTest {
             SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
                 softly.assertThat(sut.find(ImmutableList.of(message1.getMessageId()), MessageMapper.FetchType.Metadata))
                     .isEmpty();
-                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
+                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all(), Limit.unlimited()).collectList().block())
                     .isEmpty();
             }));
         }
@@ -175,7 +176,7 @@ class CassandraMessageIdMapperTest extends MessageIdMapperTest {
             SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
                 softly.assertThat(sut.find(ImmutableList.of(message1.getMessageId()), MessageMapper.FetchType.Metadata))
                     .isEmpty();
-                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
+                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all(), Limit.unlimited()).collectList().block())
                     .isEmpty();
             }));
         }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
index 97f86ef..b97cf66 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
@@ -36,8 +36,8 @@ import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.MapperProvider;
 import org.apache.james.mailbox.store.mail.model.MessageMapperTest;
+import org.apache.james.util.streams.Limit;
 import org.assertj.core.api.SoftAssertions;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
@@ -55,7 +55,6 @@ class CassandraMessageMapperTest extends MessageMapperTest {
         return new CassandraMapperProvider(cassandraCluster.getCassandraCluster());
     }
 
-    @Disabled("Currently generates a read to messageV2 per stored message despite the limit")
     @Test
     void findInMailboxLimitShouldLimitProjectionReadCassandraQueries(CassandraCluster cassandra) throws MailboxException {
         saveMessages();
@@ -98,7 +97,7 @@ class CassandraMessageMapperTest extends MessageMapperTest {
                 softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Metadata, 1))
                     .toIterable()
                     .isEmpty();
-                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
+                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all(), Limit.unlimited()).collectList().block())
                     .isEmpty();
             }));
         }
@@ -121,7 +120,7 @@ class CassandraMessageMapperTest extends MessageMapperTest {
                 softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Metadata, 1))
                     .toIterable()
                     .isEmpty();
-                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
+                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all(), Limit.unlimited()).collectList().block())
                     .isEmpty();
             }));
         }
@@ -144,7 +143,7 @@ class CassandraMessageMapperTest extends MessageMapperTest {
                 softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Metadata, 1))
                     .toIterable()
                     .isEmpty();
-                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
+                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all(), Limit.unlimited()).collectList().block())
                     .isEmpty();
             }));
         }
@@ -167,7 +166,7 @@ class CassandraMessageMapperTest extends MessageMapperTest {
                 softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Metadata, 1))
                     .toIterable()
                     .isEmpty();
-                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
+                softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all(), Limit.unlimited()).collectList().block())
                     .isEmpty();
             }));
         }
diff --git a/server/container/util/src/main/java/org/apache/james/util/streams/Limit.java b/server/container/util/src/main/java/org/apache/james/util/streams/Limit.java
index 466f1fb..70ffbbd 100644
--- a/server/container/util/src/main/java/org/apache/james/util/streams/Limit.java
+++ b/server/container/util/src/main/java/org/apache/james/util/streams/Limit.java
@@ -61,6 +61,10 @@ public class Limit {
         return limit;
     }
 
+    public boolean isUnlimited() {
+        return !limit.isPresent();
+    }
+
     public <T> Stream<T> applyOnStream(Stream<T> stream) {
         return limit
             .map(stream::limit)


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


[james-project] 06/17: JAMES-3194 Leverage named injection to uncouple storage and presentation DTOs for additional tasks

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 76ffc2106c1f4ed4c5275d91e04bcfbb8464d048
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Jun 1 16:09:49 2020 +0700

    JAMES-3194 Leverage named injection to uncouple storage and presentation DTOs for additional tasks
---
 .../org/apache/james/CassandraJamesServerMain.java |  2 +
 ...assandraConsistencyTaskSerializationModule.java | 39 ++++++++++++
 .../java/org/apache/james/JPAJamesServerMain.java  |  4 +-
 .../vault/VaultTaskSerializationModule.java        | 28 +++++++++
 .../server/JmapTaskSerializationModule.java        | 14 +++++
 .../WebAdminReIndexingTaskSerializationModule.java | 73 ++++++++++++++++++++++
 ...badminMailboxExportTaskSerializationModule.java |  8 +++
 .../WebadminMailboxTaskSerializationModule.java    | 26 ++++++++
 .../server/MailQueueTaskSerializationModule.java   | 15 +++++
 .../MailRepositoryTaskSerializationModule.java     | 21 +++++++
 .../james/modules/server/TaskRoutesModule.java     | 19 ++++++
 .../james/webadmin/dto/DTOModuleInjections.java}   | 19 +-----
 .../apache/james/webadmin/routes/TasksRoutes.java  |  5 +-
 .../WebAdminReprocessingContextInformationDTO.java | 29 ++++++---
 ...lboxReindexingTaskAdditionalInformationDTO.java | 26 ++++----
 ...UserReindexingTaskAdditionalInformationDTO.java | 21 ++++---
 ...AdminReprocessingContextInformationDTOTest.java | 23 +++++--
 .../WebAdminSingleMailboxReprocessingDTOTest.java  | 15 ++++-
 .../dto/WebAdminUserReprocessingDTOTest.java       | 17 +++--
 19 files changed, 346 insertions(+), 58 deletions(-)

diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
index 167bb2e..2c2e189 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
@@ -69,6 +69,7 @@ import org.apache.james.modules.server.ReIndexingModule;
 import org.apache.james.modules.server.SieveRoutesModule;
 import org.apache.james.modules.server.SwaggerRoutesModule;
 import org.apache.james.modules.server.TaskManagerModule;
+import org.apache.james.modules.server.WebAdminReIndexingTaskSerializationModule;
 import org.apache.james.modules.server.WebAdminServerModule;
 import org.apache.james.modules.spamassassin.SpamAssassinListenerModule;
 import org.apache.james.modules.vault.DeletedMessageVaultRoutesModule;
@@ -100,6 +101,7 @@ public class CassandraJamesServerMain implements JamesServerMain {
         new SieveRoutesModule(),
         new SwaggerRoutesModule(),
         new WebAdminServerModule(),
+        new WebAdminReIndexingTaskSerializationModule(),
         new MessagesRoutesModule());
 
     public static final Module PROTOCOLS = Modules.combine(
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/CassandraConsistencyTaskSerializationModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/CassandraConsistencyTaskSerializationModule.java
index 2b565c2..7c1546b 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/CassandraConsistencyTaskSerializationModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/CassandraConsistencyTaskSerializationModule.java
@@ -42,10 +42,13 @@ import org.apache.james.server.task.json.dto.TaskDTO;
 import org.apache.james.server.task.json.dto.TaskDTOModule;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.webadmin.dto.DTOModuleInjections;
+import org.apache.james.webadmin.dto.WebAdminMigrationTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.service.CassandraMappingsSolveInconsistenciesTask;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.multibindings.ProvidesIntoSet;
+import com.google.inject.name.Named;
 
 public class CassandraConsistencyTaskSerializationModule extends AbstractModule {
     @ProvidesIntoSet
@@ -83,28 +86,64 @@ public class CassandraConsistencyTaskSerializationModule extends AbstractModule
         return MappingsSourcesMigrationTaskAdditionalInformationDTO.serializationModule(CassandraMappingsSolveInconsistenciesTask.TYPE);
     }
 
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminCassandraMappingsSolveInconsistenciesAdditionalInformation() {
+        return MappingsSourcesMigrationTaskAdditionalInformationDTO.serializationModule(CassandraMappingsSolveInconsistenciesTask.TYPE);
+    }
+
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> mailboxMergingAdditionalInformation() {
         return MailboxMergingTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
     }
 
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminMailboxMergingAdditionalInformation() {
+        return MailboxMergingTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+    }
+
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> solveMailboxInconsistenciesAdditionalInformation() {
         return SolveMailboxInconsistenciesTaskAdditionalInformationDTO.MODULE;
     }
 
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminSolveMailboxInconsistenciesAdditionalInformation() {
+        return SolveMailboxInconsistenciesTaskAdditionalInformationDTO.MODULE;
+    }
+
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> recomputeMailboxCountersAdditionalInformation() {
         return RecomputeMailboxCountersTaskAdditionalInformationDTO.MODULE;
     }
 
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminRecomputeMailboxCountersAdditionalInformation() {
+        return RecomputeMailboxCountersTaskAdditionalInformationDTO.MODULE;
+    }
+
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> migrationTaskAdditionalInformation() {
         return MigrationTaskAdditionalInformationDTO.serializationModule();
     }
 
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminMigrationTaskAdditionalInformation() {
+        return WebAdminMigrationTaskAdditionalInformationDTO.serializationModule();
+    }
+
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> solveMessageInconsistenciesAdditionalInformation() {
         return SolveMessageInconsistenciesTaskAdditionalInformationDTO.MODULE;
     }
+
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminSolveMessageInconsistenciesAdditionalInformation() {
+        return SolveMessageInconsistenciesTaskAdditionalInformationDTO.MODULE;
+    }
 }
diff --git a/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java b/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java
index 6e742c5..5895e24 100644
--- a/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java
+++ b/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java
@@ -47,6 +47,7 @@ import org.apache.james.modules.server.ReIndexingModule;
 import org.apache.james.modules.server.SieveRoutesModule;
 import org.apache.james.modules.server.SwaggerRoutesModule;
 import org.apache.james.modules.server.TaskManagerModule;
+import org.apache.james.modules.server.WebAdminReIndexingTaskSerializationModule;
 import org.apache.james.modules.server.WebAdminServerModule;
 import org.apache.james.modules.spamassassin.SpamAssassinListenerModule;
 import org.apache.james.server.core.configuration.Configuration;
@@ -65,7 +66,8 @@ public class JPAJamesServerMain implements JamesServerMain {
         new MailRepositoriesRoutesModule(),
         new ReIndexingModule(),
         new SwaggerRoutesModule(),
-        new SieveRoutesModule());
+        new SieveRoutesModule(),
+        new WebAdminReIndexingTaskSerializationModule());
 
     private static final Module PROTOCOLS = Modules.combine(
         new IMAPServerModule(),
diff --git a/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/VaultTaskSerializationModule.java b/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/VaultTaskSerializationModule.java
index b59c3ce..cc7340e 100644
--- a/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/VaultTaskSerializationModule.java
+++ b/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/VaultTaskSerializationModule.java
@@ -28,6 +28,7 @@ import org.apache.james.task.TaskExecutionDetails;
 import org.apache.james.vault.blob.BlobStoreVaultGarbageCollectionTask;
 import org.apache.james.vault.blob.BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO;
 import org.apache.james.vault.blob.BlobStoreVaultGarbageCollectionTaskDTO;
+import org.apache.james.webadmin.dto.DTOModuleInjections;
 import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultDeleteTask;
 import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultDeleteTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultDeleteTaskDTO;
@@ -35,9 +36,12 @@ import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultExportTaskAddi
 import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultExportTaskDTO;
 import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultRestoreTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultRestoreTaskDTO;
+import org.apache.james.webadmin.vault.routes.WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO;
+import org.apache.james.webadmin.vault.routes.WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.multibindings.ProvidesIntoSet;
+import com.google.inject.name.Named;
 
 public class VaultTaskSerializationModule extends AbstractModule {
     @ProvidesIntoSet
@@ -65,18 +69,42 @@ public class VaultTaskSerializationModule extends AbstractModule {
         return BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.MODULE;
     }
 
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminBlobStoreVaultGarbageCollectionAdditionalInformation() {
+        return BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.MODULE;
+    }
+
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> deletedMessagesVaultDeleteAdditionalInformation(MessageId.Factory factory) {
         return DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.serializationModule(factory);
     }
 
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminDeletedMessagesVaultDeleteAdditionalInformation(MessageId.Factory factory) {
+        return WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.serializationModule(factory);
+    }
+
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> deletedMessagesVaultExportAdditionalInformation() {
         return DeletedMessagesVaultExportTaskAdditionalInformationDTO.MODULE;
     }
 
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminDeletedMessagesVaultExportAdditionalInformation() {
+        return DeletedMessagesVaultExportTaskAdditionalInformationDTO.MODULE;
+    }
+
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> deletedMessagesVaultRestoreAdditionalInformation() {
         return DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.MODULE;
     }
+
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminDeletedMessagesVaultRestoreAdditionalInformation() {
+        return WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.MODULE;
+    }
 }
diff --git a/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTaskSerializationModule.java b/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTaskSerializationModule.java
index de4fe7b..2c45797 100644
--- a/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTaskSerializationModule.java
+++ b/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTaskSerializationModule.java
@@ -29,9 +29,11 @@ import org.apache.james.webadmin.data.jmap.RecomputeAllFastViewProjectionItemsTa
 import org.apache.james.webadmin.data.jmap.RecomputeAllFastViewTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.data.jmap.RecomputeUserFastViewProjectionItemsTask;
 import org.apache.james.webadmin.data.jmap.RecomputeUserFastViewTaskAdditionalInformationDTO;
+import org.apache.james.webadmin.dto.DTOModuleInjections;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.multibindings.ProvidesIntoSet;
+import com.google.inject.name.Named;
 
 public class JmapTaskSerializationModule extends AbstractModule {
     @ProvidesIntoSet
@@ -49,8 +51,20 @@ public class JmapTaskSerializationModule extends AbstractModule {
         return RecomputeAllFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
     }
 
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminRecomputeAllJmapPreviewsAdditionalInformation() {
+        return RecomputeAllFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+    }
+
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> recomputeUserJmapPreviewsAdditionalInformation() {
         return RecomputeUserFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
     }
+
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminRecomputeUserJmapPreviewsAdditionalInformation() {
+        return RecomputeUserFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+    }
 }
diff --git a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebAdminReIndexingTaskSerializationModule.java b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebAdminReIndexingTaskSerializationModule.java
new file mode 100644
index 0000000..819ffd0
--- /dev/null
+++ b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebAdminReIndexingTaskSerializationModule.java
@@ -0,0 +1,73 @@
+/****************************************************************
+ * 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.modules.server;
+
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.webadmin.dto.DTOModuleInjections;
+import org.apache.james.webadmin.dto.WebAdminReprocessingContextInformationDTO;
+import org.apache.james.webadmin.dto.WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO;
+import org.apache.james.webadmin.dto.WebAdminUserReindexingTaskAdditionalInformationDTO;
+import org.apache.mailbox.tools.indexer.MessageIdReindexingTaskAdditionalInformationDTO;
+import org.apache.mailbox.tools.indexer.SingleMessageReindexingTaskAdditionalInformationDTO;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.ProvidesIntoSet;
+import com.google.inject.name.Named;
+
+public class WebAdminReIndexingTaskSerializationModule extends AbstractModule {
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> errorRecoveryAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
+        return WebAdminReprocessingContextInformationDTO.WebAdminErrorRecoveryIndexationDTO.serializationModule(mailboxIdFactory);
+    }
+
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> fullReindexAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
+        return WebAdminReprocessingContextInformationDTO.WebAdminFullIndexationDTO.serializationModule(mailboxIdFactory);
+    }
+
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> messageIdReindexingAdditionalInformation(MessageId.Factory messageIdFactory) {
+        return MessageIdReindexingTaskAdditionalInformationDTO.serializationModule(messageIdFactory);
+    }
+
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> singleMailboxReindexingAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
+        return WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory);
+    }
+
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> singleMessageReindexingAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
+        return SingleMessageReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory);
+    }
+
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> userReindexingAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
+        return WebAdminUserReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory);
+    }
+}
diff --git a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxExportTaskSerializationModule.java b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxExportTaskSerializationModule.java
index 90f69af..7afff0b 100644
--- a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxExportTaskSerializationModule.java
+++ b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxExportTaskSerializationModule.java
@@ -24,12 +24,14 @@ import org.apache.james.server.task.json.dto.TaskDTO;
 import org.apache.james.server.task.json.dto.TaskDTOModule;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.webadmin.dto.DTOModuleInjections;
 import org.apache.james.webadmin.service.ExportService;
 import org.apache.james.webadmin.service.MailboxesExportTask;
 import org.apache.james.webadmin.service.MailboxesExportTaskAdditionalInformationDTO;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.multibindings.ProvidesIntoSet;
+import com.google.inject.name.Named;
 
 public class WebadminMailboxExportTaskSerializationModule extends AbstractModule {
     @ProvidesIntoSet
@@ -41,4 +43,10 @@ public class WebadminMailboxExportTaskSerializationModule extends AbstractModule
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> mailboxesExportAdditionalInformation() {
         return MailboxesExportTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
     }
+
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminMailboxesExportAdditionalInformation() {
+        return MailboxesExportTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+    }
 }
diff --git a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxTaskSerializationModule.java b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxTaskSerializationModule.java
index b7dbb5b..dd5ffbe 100644
--- a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxTaskSerializationModule.java
+++ b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxTaskSerializationModule.java
@@ -27,6 +27,7 @@ import org.apache.james.server.task.json.dto.TaskDTO;
 import org.apache.james.server.task.json.dto.TaskDTOModule;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.webadmin.dto.DTOModuleInjections;
 import org.apache.james.webadmin.service.EventDeadLettersRedeliverAllTaskDTO;
 import org.apache.james.webadmin.service.EventDeadLettersRedeliverGroupTaskDTO;
 import org.apache.james.webadmin.service.EventDeadLettersRedeliverOneTaskDTO;
@@ -35,6 +36,7 @@ import org.apache.james.webadmin.service.EventDeadLettersRedeliveryTaskAdditiona
 
 import com.google.inject.AbstractModule;
 import com.google.inject.multibindings.ProvidesIntoSet;
+import com.google.inject.name.Named;
 
 public class WebadminMailboxTaskSerializationModule extends AbstractModule {
     @ProvidesIntoSet
@@ -62,18 +64,42 @@ public class WebadminMailboxTaskSerializationModule extends AbstractModule {
         return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForAll.MODULE;
     }
 
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminEventDeadLettersRedeliveryAdditionalInformationForAll() {
+        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForAll.MODULE;
+    }
+
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> eventDeadLettersRedeliveryAdditionalInformationForGroup() {
         return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForGroup.MODULE;
     }
 
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminEventDeadLettersRedeliveryAdditionalInformationForGroup() {
+        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForGroup.MODULE;
+    }
+
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> eventDeadLettersRedeliveryAdditionalInformationForOne() {
         return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForOne.MODULE;
     }
 
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminEventDeadLettersRedeliveryAdditionalInformationForOne() {
+        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForOne.MODULE;
+    }
+
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> recomputeCurrentQuotasAdditionalInformation() {
         return RecomputeCurrentQuotasTaskAdditionalInformationDTO.MODULE;
     }
+
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminRecomputeCurrentQuotasAdditionalInformation() {
+        return RecomputeCurrentQuotasTaskAdditionalInformationDTO.MODULE;
+    }
 }
diff --git a/server/container/guice/protocols/webadmin-mailqueue/src/main/java/org/apache/james/modules/server/MailQueueTaskSerializationModule.java b/server/container/guice/protocols/webadmin-mailqueue/src/main/java/org/apache/james/modules/server/MailQueueTaskSerializationModule.java
index 14495ea..75c220d 100644
--- a/server/container/guice/protocols/webadmin-mailqueue/src/main/java/org/apache/james/modules/server/MailQueueTaskSerializationModule.java
+++ b/server/container/guice/protocols/webadmin-mailqueue/src/main/java/org/apache/james/modules/server/MailQueueTaskSerializationModule.java
@@ -26,13 +26,16 @@ import org.apache.james.server.task.json.dto.TaskDTO;
 import org.apache.james.server.task.json.dto.TaskDTOModule;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.webadmin.dto.DTOModuleInjections;
 import org.apache.james.webadmin.service.ClearMailQueueTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.service.ClearMailQueueTaskDTO;
 import org.apache.james.webadmin.service.DeleteMailsFromMailQueueTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.service.DeleteMailsFromMailQueueTaskDTO;
+import org.apache.james.webadmin.service.WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.multibindings.ProvidesIntoSet;
+import com.google.inject.name.Named;
 
 public class MailQueueTaskSerializationModule extends AbstractModule {
     @ProvidesIntoSet
@@ -50,8 +53,20 @@ public class MailQueueTaskSerializationModule extends AbstractModule {
         return ClearMailQueueTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
     }
 
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminClearMailQueueAdditionalInformation() {
+        return ClearMailQueueTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+    }
+
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> deleteMailsFromMailQueueAdditionalInformation() {
         return DeleteMailsFromMailQueueTaskAdditionalInformationDTO.MODULE;
     }
+
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminDeleteMailsFromMailQueueAdditionalInformation() {
+        return WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.MODULE;
+    }
 }
diff --git a/server/container/guice/protocols/webadmin-mailrepository/src/main/java/org/apache/james/modules/server/MailRepositoryTaskSerializationModule.java b/server/container/guice/protocols/webadmin-mailrepository/src/main/java/org/apache/james/modules/server/MailRepositoryTaskSerializationModule.java
index 5f8d4c7..1af8fe9 100644
--- a/server/container/guice/protocols/webadmin-mailrepository/src/main/java/org/apache/james/modules/server/MailRepositoryTaskSerializationModule.java
+++ b/server/container/guice/protocols/webadmin-mailrepository/src/main/java/org/apache/james/modules/server/MailRepositoryTaskSerializationModule.java
@@ -26,6 +26,7 @@ import org.apache.james.server.task.json.dto.TaskDTO;
 import org.apache.james.server.task.json.dto.TaskDTOModule;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.webadmin.dto.DTOModuleInjections;
 import org.apache.james.webadmin.service.ClearMailRepositoryTask;
 import org.apache.james.webadmin.service.ClearMailRepositoryTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.service.ClearMailRepositoryTaskDTO;
@@ -34,9 +35,11 @@ import org.apache.james.webadmin.service.ReprocessingAllMailsTaskDTO;
 import org.apache.james.webadmin.service.ReprocessingOneMailTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.service.ReprocessingOneMailTaskDTO;
 import org.apache.james.webadmin.service.ReprocessingService;
+import org.apache.james.webadmin.service.WebAdminClearMailRepositoryTaskAdditionalInformationDTO;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.multibindings.ProvidesIntoSet;
+import com.google.inject.name.Named;
 
 public class MailRepositoryTaskSerializationModule extends AbstractModule {
     @ProvidesIntoSet
@@ -59,13 +62,31 @@ public class MailRepositoryTaskSerializationModule extends AbstractModule {
         return ClearMailRepositoryTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
     }
 
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminClearMailRepositoryAdditionalInformation() {
+        return WebAdminClearMailRepositoryTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+    }
+
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> reprocessingAllMailsAdditionalInformation() {
         return ReprocessingAllMailsTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
     }
 
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminReprocessingAllMailsAdditionalInformation() {
+        return ReprocessingAllMailsTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+    }
+
     @ProvidesIntoSet
     public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> reprocessingOneMailAdditionalInformation() {
         return ReprocessingOneMailTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
     }
+
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> webAdminReprocessingOneMailAdditionalInformation() {
+        return ReprocessingOneMailTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+    }
 }
diff --git a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/TaskRoutesModule.java b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/TaskRoutesModule.java
index 390bb17..cd5a10f 100644
--- a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/TaskRoutesModule.java
+++ b/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/TaskRoutesModule.java
@@ -19,12 +19,22 @@
 
 package org.apache.james.modules.server;
 
+import java.util.Set;
+
+import org.apache.james.json.DTOConverter;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+import org.apache.james.task.TaskExecutionDetails;
 import org.apache.james.webadmin.Routes;
+import org.apache.james.webadmin.dto.DTOModuleInjections;
 import org.apache.james.webadmin.routes.TasksRoutes;
 
 import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
 import com.google.inject.Scopes;
+import com.google.inject.Singleton;
 import com.google.inject.multibindings.Multibinder;
+import com.google.inject.name.Named;
 
 public class TaskRoutesModule extends AbstractModule {
     @Override
@@ -34,4 +44,13 @@ public class TaskRoutesModule extends AbstractModule {
         Multibinder<Routes> routesMultibinder = Multibinder.newSetBinder(binder(), Routes.class);
         routesMultibinder.addBinding().to(TasksRoutes.class);
     }
+
+    @Named(DTOModuleInjections.WEBADMIN_DTO)
+    @Provides
+    @Singleton
+    public DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationDTOConverter(
+            @Named(DTOModuleInjections.WEBADMIN_DTO) Set<AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends AdditionalInformationDTO>> modules) {
+
+        return new DTOConverter<>(modules);
+    }
 }
diff --git a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/TaskRoutesModule.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/dto/DTOModuleInjections.java
similarity index 67%
copy from server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/TaskRoutesModule.java
copy to server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/dto/DTOModuleInjections.java
index 390bb17..2f4055c 100644
--- a/server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/TaskRoutesModule.java
+++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/dto/DTOModuleInjections.java
@@ -17,21 +17,8 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.modules.server;
+package org.apache.james.webadmin.dto;
 
-import org.apache.james.webadmin.Routes;
-import org.apache.james.webadmin.routes.TasksRoutes;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.Scopes;
-import com.google.inject.multibindings.Multibinder;
-
-public class TaskRoutesModule extends AbstractModule {
-    @Override
-    protected void configure() {
-        bind(TasksRoutes.class).in(Scopes.SINGLETON);
-
-        Multibinder<Routes> routesMultibinder = Multibinder.newSetBinder(binder(), Routes.class);
-        routesMultibinder.addBinding().to(TasksRoutes.class);
-    }
+public interface DTOModuleInjections {
+    String WEBADMIN_DTO = "webadmin-dto";
 }
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/TasksRoutes.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/TasksRoutes.java
index 9316ad7..35ad151 100644
--- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/TasksRoutes.java
+++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/TasksRoutes.java
@@ -26,6 +26,7 @@ import java.util.Optional;
 import java.util.function.Supplier;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -39,6 +40,7 @@ import org.apache.james.task.TaskManager;
 import org.apache.james.task.TaskNotFoundException;
 import org.apache.james.util.DurationParser;
 import org.apache.james.webadmin.Routes;
+import org.apache.james.webadmin.dto.DTOModuleInjections;
 import org.apache.james.webadmin.dto.ExecutionDetailsDto;
 import org.apache.james.webadmin.utils.ErrorResponder;
 import org.apache.james.webadmin.utils.JsonTransformer;
@@ -69,7 +71,8 @@ public class TasksRoutes implements Routes {
     private final DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationDTOConverter;
 
     @Inject
-    public TasksRoutes(TaskManager taskManager, JsonTransformer jsonTransformer, DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationDTOConverter) {
+    public TasksRoutes(TaskManager taskManager, JsonTransformer jsonTransformer,
+                       @Named(DTOModuleInjections.WEBADMIN_DTO) DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationDTOConverter) {
         this.taskManager = taskManager;
         this.jsonTransformer = jsonTransformer;
         this.additionalInformationDTOConverter = additionalInformationDTOConverter;
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTO.java
index 0c67a50..1b43b3e 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTO.java
@@ -19,9 +19,11 @@
 package org.apache.james.webadmin.dto;
 
 import java.time.Instant;
+import java.util.List;
 
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.json.DTOModule;
+import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
@@ -29,6 +31,8 @@ import org.apache.mailbox.tools.indexer.ErrorRecoveryIndexationTask;
 import org.apache.mailbox.tools.indexer.FullReindexingTask;
 import org.apache.mailbox.tools.indexer.ReprocessingContextInformationDTO;
 
+import com.github.steveash.guavate.Guavate;
+
 public class WebAdminReprocessingContextInformationDTO implements AdditionalInformationDTO {
     public static class WebAdminErrorRecoveryIndexationDTO extends WebAdminReprocessingContextInformationDTO {
         public static AdditionalInformationDTOModule<ReprocessingContextInformationDTO.ReprocessingContextInformationForErrorRecoveryIndexationTask, WebAdminErrorRecoveryIndexationDTO> serializationModule(MailboxId.Factory mailboxIdFactory) {
@@ -41,14 +45,14 @@ public class WebAdminReprocessingContextInformationDTO implements AdditionalInfo
                     type,
                     details.getSuccessfullyReprocessedMailCount(),
                     details.getFailedReprocessedMailCount(),
-                    SerializableReIndexingExecutionFailures.from(details.failures()),
+                    details.failures(),
                     details.timestamp()))
                 .typeName(ErrorRecoveryIndexationTask.PREVIOUS_FAILURES_INDEXING.asString())
                 .withFactory(AdditionalInformationDTOModule::new);
         }
 
         WebAdminErrorRecoveryIndexationDTO(String type, int successfullyReprocessedMailCount, int failedReprocessedMailCount,
-                                           SerializableReIndexingExecutionFailures failures, Instant timestamp) {
+                                           ReIndexingExecutionFailures failures, Instant timestamp) {
             super(type, successfullyReprocessedMailCount, failedReprocessedMailCount, failures, timestamp);
         }
     }
@@ -64,14 +68,14 @@ public class WebAdminReprocessingContextInformationDTO implements AdditionalInfo
                     type,
                     details.getSuccessfullyReprocessedMailCount(),
                     details.getFailedReprocessedMailCount(),
-                    SerializableReIndexingExecutionFailures.from(details.failures()),
+                    details.failures(),
                     details.timestamp()))
                 .typeName(FullReindexingTask.FULL_RE_INDEXING.asString())
                 .withFactory(AdditionalInformationDTOModule::new);
         }
 
         WebAdminFullIndexationDTO(String type, int successfullyReprocessedMailCount, int failedReprocessedMailCount,
-                                  SerializableReIndexingExecutionFailures failures, Instant timestamp) {
+                                  ReIndexingExecutionFailures failures, Instant timestamp) {
             super(type, successfullyReprocessedMailCount, failedReprocessedMailCount, failures, timestamp);
         }
 
@@ -80,16 +84,21 @@ public class WebAdminReprocessingContextInformationDTO implements AdditionalInfo
     protected final String type;
     protected final int successfullyReprocessedMailCount;
     protected final int failedReprocessedMailCount;
-    protected final SerializableReIndexingExecutionFailures failures;
+    protected final SerializableReIndexingExecutionFailures messageFailures;
+    private final List<String> mailboxFailures;
     protected final Instant timestamp;
 
 
     WebAdminReprocessingContextInformationDTO(String type, int successfullyReprocessedMailCount, int failedReprocessedMailCount,
-                                              SerializableReIndexingExecutionFailures failures, Instant timestamp) {
+                                              ReIndexingExecutionFailures failures,
+                                              Instant timestamp) {
         this.type = type;
         this.successfullyReprocessedMailCount = successfullyReprocessedMailCount;
         this.failedReprocessedMailCount = failedReprocessedMailCount;
-        this.failures = failures;
+        this.messageFailures = SerializableReIndexingExecutionFailures.from(failures);
+        this.mailboxFailures = failures.mailboxFailures().stream()
+            .map(MailboxId::serialize)
+            .collect(Guavate.toImmutableList());
         this.timestamp = timestamp;
     }
 
@@ -102,7 +111,11 @@ public class WebAdminReprocessingContextInformationDTO implements AdditionalInfo
     }
 
     public SerializableReIndexingExecutionFailures getFailures() {
-        return failures;
+        return messageFailures;
+    }
+
+    public List<String> getMailboxFailures() {
+        return mailboxFailures;
     }
 
     public Instant getTimestamp() {
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java
index 6574e7a..199177c 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java
@@ -19,16 +19,17 @@
 package org.apache.james.webadmin.dto;
 
 import java.time.Instant;
+import java.util.List;
 
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.json.DTOModule;
+import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
 import org.apache.mailbox.tools.indexer.SingleMailboxReindexingTask;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO implements AdditionalInformationDTO {
 
@@ -43,7 +44,7 @@ public class WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO impleme
                 details.getMailboxId(),
                 details.getSuccessfullyReprocessedMailCount(),
                 details.getFailedReprocessedMailCount(),
-                SerializableReIndexingExecutionFailures.from(details.failures()),
+                details.failures(),
                 details.timestamp()))
             .typeName(SingleMailboxReindexingTask.MAILBOX_RE_INDEXING.asString())
             .withFactory(AdditionalInformationDTOModule::new);
@@ -53,18 +54,15 @@ public class WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO impleme
     private final String mailboxId;
 
     @JsonCreator
-    private WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO(@JsonProperty("type") String type,
-                                                                        @JsonProperty("mailboxId") String mailboxId,
-                                                                        @JsonProperty("successfullyReprocessedMailCount") int successfullyReprocessedMailCount,
-                                                                        @JsonProperty("failedReprocessedMailCount") int failedReprocessedMailCount,
-                                                                        @JsonProperty("failures") SerializableReIndexingExecutionFailures failures,
-                                                                        @JsonProperty("timestamp") Instant timestamp) {
+    private WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO(String type,
+                                                                        String mailboxId,
+                                                                        int successfullyReprocessedMailCount,
+                                                                        int failedReprocessedMailCount,
+                                                                        ReIndexingExecutionFailures failures,
+                                                                        Instant timestamp) {
         this.mailboxId = mailboxId;
         this.reprocessingContextInformationDTO = new WebAdminReprocessingContextInformationDTO(
-            type,
-            successfullyReprocessedMailCount,
-            failedReprocessedMailCount, failures,
-            timestamp);
+            type, successfullyReprocessedMailCount, failedReprocessedMailCount, failures, timestamp);
     }
 
     @Override
@@ -91,4 +89,8 @@ public class WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO impleme
     public SerializableReIndexingExecutionFailures getFailures() {
         return reprocessingContextInformationDTO.getFailures();
     }
+
+    public List<String> getMailboxFailures() {
+        return reprocessingContextInformationDTO.getMailboxFailures();
+    }
 }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminUserReindexingTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminUserReindexingTaskAdditionalInformationDTO.java
index 9d5c17a..7991a04 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminUserReindexingTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminUserReindexingTaskAdditionalInformationDTO.java
@@ -19,16 +19,17 @@
 package org.apache.james.webadmin.dto;
 
 import java.time.Instant;
+import java.util.List;
 
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.json.DTOModule;
+import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
 import org.apache.mailbox.tools.indexer.UserReindexingTask;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class WebAdminUserReindexingTaskAdditionalInformationDTO implements AdditionalInformationDTO {
 
@@ -43,7 +44,7 @@ public class WebAdminUserReindexingTaskAdditionalInformationDTO implements Addit
                 details.getUsername(),
                 details.getSuccessfullyReprocessedMailCount(),
                 details.getFailedReprocessedMailCount(),
-                SerializableReIndexingExecutionFailures.from(details.failures()),
+                details.failures(),
                 details.timestamp()))
             .typeName(UserReindexingTask.USER_RE_INDEXING.asString())
             .withFactory(AdditionalInformationDTOModule::new);
@@ -53,12 +54,12 @@ public class WebAdminUserReindexingTaskAdditionalInformationDTO implements Addit
     private final String username;
 
     @JsonCreator
-    private WebAdminUserReindexingTaskAdditionalInformationDTO(@JsonProperty("type") String type,
-                                                               @JsonProperty("username") String username,
-                                                               @JsonProperty("successfullyReprocessedMailCount") int successfullyReprocessedMailCount,
-                                                               @JsonProperty("failedReprocessedMailCount") int failedReprocessedMailCount,
-                                                               @JsonProperty("failures") SerializableReIndexingExecutionFailures failures,
-                                                               @JsonProperty("timestamp") Instant timestamp) {
+    private WebAdminUserReindexingTaskAdditionalInformationDTO(String type,
+                                                               String username,
+                                                               int successfullyReprocessedMailCount,
+                                                               int failedReprocessedMailCount,
+                                                               ReIndexingExecutionFailures failures,
+                                                               Instant timestamp) {
         this.username = username;
         this.reprocessingContextInformationDTO = new WebAdminReprocessingContextInformationDTO(
             type,
@@ -90,4 +91,8 @@ public class WebAdminUserReindexingTaskAdditionalInformationDTO implements Addit
     public SerializableReIndexingExecutionFailures getFailures() {
         return reprocessingContextInformationDTO.getFailures();
     }
+
+    public List<String> getMailboxFailures() {
+        return reprocessingContextInformationDTO.getMailboxFailures();
+    }
 }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTOTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTOTest.java
index c8d25af..cf0e6da 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTOTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTOTest.java
@@ -19,7 +19,6 @@
 package org.apache.james.webadmin.dto;
 
 import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
-import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.time.Instant;
@@ -29,6 +28,7 @@ import org.apache.james.json.JsonGenericSerializer;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.indexer.ReIndexer;
 import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
+import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.mailbox.tools.indexer.ReprocessingContextInformationDTO;
 import org.junit.jupiter.api.Test;
@@ -39,8 +39,20 @@ import com.google.common.collect.ImmutableList;
 class WebAdminReprocessingContextInformationDTOTest {
     private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
 
-    private final String serializedErrorRecoveryAdditionalInformation = "{\"type\":\"error-recovery-indexation\",\"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]},\"timestamp\":\"2018-11-13T12:00:55Z\"}";
-    private final String serializedFullAdditionalInformation = "{\"type\":\"full-reindexing\",\"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]},\"timestamp\":\"2018-11-13T12:00:55Z\"}";
+    private final String serializedErrorRecoveryAdditionalInformation = "{" +
+        "  \"type\":\"error-recovery-indexation\"," +
+        "  \"successfullyReprocessedMailCount\":42," +
+        "  \"failedReprocessedMailCount\":2," +
+        "  \"failures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]}," +
+        "  \"mailboxFailures\":[\"3\", \"4\"]," +
+        "  \"timestamp\":\"2018-11-13T12:00:55Z\"}";
+    private final String serializedFullAdditionalInformation = "{" +
+        "  \"type\":\"full-reindexing\"," +
+        "  \"successfullyReprocessedMailCount\":42," +
+        "  \"failedReprocessedMailCount\":2," +
+        "  \"failures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]}," +
+        "  \"mailboxFailures\":[\"3\", \"4\"]," +
+        "  \"timestamp\":\"2018-11-13T12:00:55Z\"}";
 
     private final TestId mailboxId = TestId.of(1L);
     private final MessageUid messageUid = MessageUid.of(10L);
@@ -48,8 +60,9 @@ class WebAdminReprocessingContextInformationDTOTest {
     private final TestId mailboxId2 = TestId.of(2L);
     private final MessageUid messageUid2 = MessageUid.of(20L);
     private final ReIndexingExecutionFailures.ReIndexingFailure indexingFailure2 = new ReIndexingExecutionFailures.ReIndexingFailure(mailboxId2, messageUid2);
-    private final List<ReIndexingExecutionFailures.ReIndexingFailure> failures = ImmutableList.of(indexingFailure, indexingFailure2);
-    private final ReIndexingExecutionFailures executionFailures = new ReIndexingExecutionFailures(failures);
+    private final List<ReIndexingExecutionFailures.ReIndexingFailure> messageFailures = ImmutableList.of(indexingFailure, indexingFailure2);
+    private final ImmutableList<MailboxId> mailboxFailures = ImmutableList.of(TestId.of(3), TestId.of(4));
+    private final ReIndexingExecutionFailures executionFailures = new ReIndexingExecutionFailures(messageFailures, mailboxFailures);
 
     @Test
     void shouldSerializeErrorRecoveryAdditionalInformation() throws Exception {
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReprocessingDTOTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReprocessingDTOTest.java
index 30bd411..02f4795 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReprocessingDTOTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReprocessingDTOTest.java
@@ -28,6 +28,7 @@ import org.apache.james.json.JsonGenericSerializer;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.indexer.ReIndexer;
 import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
+import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.mailbox.tools.indexer.ReprocessingContextInformationDTO;
 import org.apache.mailbox.tools.indexer.SingleMailboxReindexingTask;
@@ -39,7 +40,14 @@ import com.google.common.collect.ImmutableList;
 class WebAdminSingleMailboxReprocessingDTOTest {
     private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
 
-    private final String serializedAdditionalInformation = "{\"type\":\"mailbox-reindexing\",\"mailboxId\":\"1\",\"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]},\"timestamp\":\"2018-11-13T12:00:55Z\"}";
+    private final String serializedAdditionalInformation = "{" +
+        "  \"type\":\"mailbox-reindexing\"," +
+        "  \"mailboxId\":\"1\"," +
+        "  \"successfullyReprocessedMailCount\":42," +
+        "  \"failedReprocessedMailCount\":2," +
+        "  \"failures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]}," +
+        "  \"mailboxFailures\":[\"3\", \"4\"]," +
+        "  \"timestamp\":\"2018-11-13T12:00:55Z\"}";
 
     private final TestId mailboxId = TestId.of(1L);
     private final MessageUid messageUid = MessageUid.of(10L);
@@ -47,8 +55,9 @@ class WebAdminSingleMailboxReprocessingDTOTest {
     private final TestId mailboxId2 = TestId.of(2L);
     private final MessageUid messageUid2 = MessageUid.of(20L);
     private final ReIndexingExecutionFailures.ReIndexingFailure indexingFailure2 = new ReIndexingExecutionFailures.ReIndexingFailure(mailboxId2, messageUid2);
-    private final List<ReIndexingExecutionFailures.ReIndexingFailure> failures = ImmutableList.of(indexingFailure, indexingFailure2);
-    private final ReIndexingExecutionFailures executionFailures = new ReIndexingExecutionFailures(failures);
+    private final List<ReIndexingExecutionFailures.ReIndexingFailure> messageFailures = ImmutableList.of(indexingFailure, indexingFailure2);
+    private final ImmutableList<MailboxId> mailboxFailures = ImmutableList.of(TestId.of(3), TestId.of(4));
+    private final ReIndexingExecutionFailures executionFailures = new ReIndexingExecutionFailures(messageFailures, mailboxFailures);
 
     @Test
     void shouldSerializeAdditionalInformation() throws Exception {
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminUserReprocessingDTOTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminUserReprocessingDTOTest.java
index 9ea55a7..48acc11 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminUserReprocessingDTOTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminUserReprocessingDTOTest.java
@@ -29,18 +29,26 @@ import org.apache.james.json.JsonGenericSerializer;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.indexer.ReIndexer;
 import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
+import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.TestId;
-import org.apache.mailbox.tools.indexer.SingleMailboxReindexingTask;
 import org.apache.mailbox.tools.indexer.UserReindexingTask;
 import org.junit.jupiter.api.Test;
 
 import com.fasterxml.jackson.databind.exc.InvalidDefinitionException;
 import com.google.common.collect.ImmutableList;
 
+import net.javacrumbs.jsonunit.core.Option;
+
 class WebAdminUserReprocessingDTOTest {
     private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
 
-    private final String serializedAdditionalInformation = "{\"type\":\"user-reindexing\",\"username\":\"bob\",\"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]},\"timestamp\":\"2018-11-13T12:00:55Z\"}";
+    private final String serializedAdditionalInformation = "{" +
+        "  \"type\":\"user-reindexing\",\"username\":\"bob\"," +
+        "  \"successfullyReprocessedMailCount\":42," +
+        "  \"failedReprocessedMailCount\":2," +
+        "  \"failures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]}," +
+        "  \"mailboxFailures\":[\"3\", \"4\"]," +
+        "  \"timestamp\":\"2018-11-13T12:00:55Z\"}";
 
     private final TestId mailboxId = TestId.of(1L);
     private final MessageUid messageUid = MessageUid.of(10L);
@@ -48,8 +56,9 @@ class WebAdminUserReprocessingDTOTest {
     private final TestId mailboxId2 = TestId.of(2L);
     private final MessageUid messageUid2 = MessageUid.of(20L);
     private final ReIndexingExecutionFailures.ReIndexingFailure indexingFailure2 = new ReIndexingExecutionFailures.ReIndexingFailure(mailboxId2, messageUid2);
-    private final List<ReIndexingExecutionFailures.ReIndexingFailure> failures = ImmutableList.of(indexingFailure, indexingFailure2);
-    private final ReIndexingExecutionFailures executionFailures = new ReIndexingExecutionFailures(failures);
+    private final List<ReIndexingExecutionFailures.ReIndexingFailure> messageFailures = ImmutableList.of(indexingFailure, indexingFailure2);
+    private final ImmutableList<MailboxId> mailboxFailures = ImmutableList.of(TestId.of(3), TestId.of(4));
+    private final ReIndexingExecutionFailures executionFailures = new ReIndexingExecutionFailures(messageFailures, mailboxFailures);
 
     @Test
     void shouldSerializeAdditionalInformation() throws Exception {


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


[james-project] 04/17: JAMES-3194 Inject DTOConverter for every product

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 7c1adec91f44c237d60d989a63326ff7faaab327
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri May 15 15:51:03 2020 +0700

    JAMES-3194 Inject DTOConverter for every product
    
    Note that is requires splitting guice injections for it
---
 .../org/apache/james/CassandraJamesServerMain.java |   2 +
 ...assandraConsistencyTaskSerializationModule.java | 110 +++++
 .../james/CassandraRabbitMQJamesServerMain.java    |   4 +-
 .../modules/DistributedTaskManagerModule.java      |   3 +
 .../DistributedTaskSerializationModule.java        | 107 +++++
 .../james/modules/TaskSerializationModule.java     | 475 ---------------------
 server/container/guice/guice-common/pom.xml        |   4 +
 .../james/modules/server/TaskManagerModule.java    |   2 +
 .../modules/server/TaskSerializationModule.java}   |  36 +-
 .../modules/mailbox/LuceneSearchMailboxModule.java |   2 +
 .../modules/vault/DeletedMessageVaultModule.java   |   1 +
 .../vault/VaultTaskSerializationModule.java        |  82 ++++
 server/container/guice/mailbox/pom.xml             |   4 +
 .../mailbox/ReIndexingTaskSerializationModule.java | 110 +++++
 .../server/JmapTaskSerializationModule.java        |  56 +++
 .../james/modules/server/JmapTasksModule.java      |   2 +
 .../james/modules/server/MailboxRoutesModule.java  |   2 +
 .../server/MailboxesExportRoutesModule.java        |   1 +
 ...adminMailboxExportTaskSerializationModule.java} |  32 +-
 .../WebadminMailboxTaskSerializationModule.java    |  79 ++++
 .../modules/server/MailQueueRoutesModule.java      |   2 +
 .../server/MailQueueTaskSerializationModule.java   |  57 +++
 .../server/MailRepositoriesRoutesModule.java       |   2 +
 .../MailRepositoryTaskSerializationModule.java     |  71 +++
 24 files changed, 739 insertions(+), 507 deletions(-)

diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
index 8ecdf1a..167bb2e 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
@@ -24,6 +24,7 @@ import java.util.Set;
 import org.apache.james.eventsourcing.eventstore.cassandra.EventNestedTypes;
 import org.apache.james.json.DTOModule;
 import org.apache.james.modules.BlobExportMechanismModule;
+import org.apache.james.modules.CassandraConsistencyTaskSerializationModule;
 import org.apache.james.modules.MailboxModule;
 import org.apache.james.modules.activemq.ActiveMQQueueModule;
 import org.apache.james.modules.data.CassandraDLPConfigurationStoreModule;
@@ -139,6 +140,7 @@ public class CassandraJamesServerMain implements JamesServerMain {
         CASSANDRA_EVENT_STORE_JSON_SERIALIZATION_DEFAULT_MODULE);
 
     public static final Module CASSANDRA_MAILBOX_MODULE = Modules.combine(
+        new CassandraConsistencyTaskSerializationModule(),
         new CassandraMailboxModule(),
         new CassandraDeletedMessageVaultModule(),
         new ElasticSearchClientModule(),
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/CassandraConsistencyTaskSerializationModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/CassandraConsistencyTaskSerializationModule.java
new file mode 100644
index 0000000..2b565c2
--- /dev/null
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/CassandraConsistencyTaskSerializationModule.java
@@ -0,0 +1,110 @@
+/****************************************************************
+ * 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.modules;
+
+import org.apache.james.backends.cassandra.migration.MigrationTask;
+import org.apache.james.backends.cassandra.migration.MigrationTaskAdditionalInformationDTO;
+import org.apache.james.backends.cassandra.migration.MigrationTaskDTO;
+import org.apache.james.mailbox.cassandra.mail.task.MailboxMergingTaskAdditionalInformationDTO;
+import org.apache.james.mailbox.cassandra.mail.task.MailboxMergingTaskDTO;
+import org.apache.james.mailbox.cassandra.mail.task.MailboxMergingTaskRunner;
+import org.apache.james.mailbox.cassandra.mail.task.RecomputeMailboxCountersService;
+import org.apache.james.mailbox.cassandra.mail.task.RecomputeMailboxCountersTaskAdditionalInformationDTO;
+import org.apache.james.mailbox.cassandra.mail.task.RecomputeMailboxCountersTaskDTO;
+import org.apache.james.mailbox.cassandra.mail.task.SolveMailboxInconsistenciesService;
+import org.apache.james.mailbox.cassandra.mail.task.SolveMailboxInconsistenciesTaskAdditionalInformationDTO;
+import org.apache.james.mailbox.cassandra.mail.task.SolveMailboxInconsistenciesTaskDTO;
+import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesService;
+import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesTaskAdditionalInformationDTO;
+import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesTaskDTO;
+import org.apache.james.rrt.cassandra.CassandraMappingsSourcesDAO;
+import org.apache.james.rrt.cassandra.migration.MappingsSourcesMigration;
+import org.apache.james.rrt.cassandra.migration.MappingsSourcesMigrationTaskAdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+import org.apache.james.server.task.json.dto.TaskDTO;
+import org.apache.james.server.task.json.dto.TaskDTOModule;
+import org.apache.james.task.Task;
+import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.webadmin.service.CassandraMappingsSolveInconsistenciesTask;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.ProvidesIntoSet;
+
+public class CassandraConsistencyTaskSerializationModule extends AbstractModule {
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> cassandraMappingsSolveInconsistenciesTask(MappingsSourcesMigration migration, CassandraMappingsSourcesDAO dao) {
+        return CassandraMappingsSolveInconsistenciesTask.module(migration, dao);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> mailboxMergingTask(MailboxMergingTaskRunner taskRunner) {
+        return MailboxMergingTaskDTO.module(taskRunner);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> solveMailboxInconsistenciesTask(SolveMailboxInconsistenciesService service) {
+        return SolveMailboxInconsistenciesTaskDTO.module(service);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> recomputeMailboxCountersTask(RecomputeMailboxCountersService service) {
+        return RecomputeMailboxCountersTaskDTO.module(service);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> migrationTask(MigrationTask.Factory factory) {
+        return MigrationTaskDTO.module(factory);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> solveMessageInconsistenciesTask(SolveMessageInconsistenciesService solveMessageInconsistenciesService) {
+        return SolveMessageInconsistenciesTaskDTO.module(solveMessageInconsistenciesService);
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> cassandraMappingsSolveInconsistenciesAdditionalInformation() {
+        return MappingsSourcesMigrationTaskAdditionalInformationDTO.serializationModule(CassandraMappingsSolveInconsistenciesTask.TYPE);
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> mailboxMergingAdditionalInformation() {
+        return MailboxMergingTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> solveMailboxInconsistenciesAdditionalInformation() {
+        return SolveMailboxInconsistenciesTaskAdditionalInformationDTO.MODULE;
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> recomputeMailboxCountersAdditionalInformation() {
+        return RecomputeMailboxCountersTaskAdditionalInformationDTO.MODULE;
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> migrationTaskAdditionalInformation() {
+        return MigrationTaskAdditionalInformationDTO.serializationModule();
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> solveMessageInconsistenciesAdditionalInformation() {
+        return SolveMessageInconsistenciesTaskAdditionalInformationDTO.MODULE;
+    }
+}
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
index e9730fa..588ee9b 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
@@ -22,7 +22,7 @@ package org.apache.james;
 import static org.apache.james.CassandraJamesServerMain.REQUIRE_TASK_MANAGER_MODULE;
 
 import org.apache.james.modules.DistributedTaskManagerModule;
-import org.apache.james.modules.TaskSerializationModule;
+import org.apache.james.modules.DistributedTaskSerializationModule;
 import org.apache.james.modules.blobstore.BlobStoreCacheModulesChooser;
 import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.blobstore.BlobStoreModulesChooser;
@@ -37,7 +37,7 @@ public class CassandraRabbitMQJamesServerMain implements JamesServerMain {
     protected static final Module MODULES =
         Modules
             .override(Modules.combine(REQUIRE_TASK_MANAGER_MODULE, new DistributedTaskManagerModule()))
-            .with(new RabbitMQModule(), new RabbitMQEventBusModule(), new TaskSerializationModule());
+            .with(new RabbitMQModule(), new RabbitMQEventBusModule(), new DistributedTaskSerializationModule());
 
     public static void main(String[] args) throws Exception {
         CassandraRabbitMQJamesConfiguration configuration = CassandraRabbitMQJamesConfiguration.builder()
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/DistributedTaskManagerModule.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/DistributedTaskManagerModule.java
index ce0333f..d970f5a 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/DistributedTaskManagerModule.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/DistributedTaskManagerModule.java
@@ -22,6 +22,7 @@ package org.apache.james.modules;
 
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.modules.server.HostnameModule;
+import org.apache.james.modules.server.TaskSerializationModule;
 import org.apache.james.task.TaskManager;
 import org.apache.james.task.eventsourcing.EventSourcingTaskManager;
 import org.apache.james.task.eventsourcing.TaskExecutionDetailsProjection;
@@ -45,6 +46,8 @@ public class DistributedTaskManagerModule extends AbstractModule {
     @Override
     protected void configure() {
         install(new HostnameModule());
+        install(new TaskSerializationModule());
+
         bind(CassandraTaskExecutionDetailsProjection.class).in(Scopes.SINGLETON);
         bind(EventSourcingTaskManager.class).in(Scopes.SINGLETON);
         bind(RabbitMQWorkQueueSupplier.class).in(Scopes.SINGLETON);
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/DistributedTaskSerializationModule.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/DistributedTaskSerializationModule.java
new file mode 100644
index 0000000..2cbed70
--- /dev/null
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/DistributedTaskSerializationModule.java
@@ -0,0 +1,107 @@
+/****************************************************************
+ * 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.modules;
+
+import java.util.Set;
+
+import javax.inject.Named;
+
+import org.apache.james.eventsourcing.Event;
+import org.apache.james.eventsourcing.eventstore.cassandra.EventNestedTypes;
+import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTO;
+import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTOModule;
+import org.apache.james.json.DTOConverter;
+import org.apache.james.json.DTOModule;
+import org.apache.james.modules.mailbox.ReIndexingTaskSerializationModule;
+import org.apache.james.server.task.json.JsonTaskSerializer;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+import org.apache.james.server.task.json.dto.TaskDTO;
+import org.apache.james.server.task.json.dto.TaskDTOModule;
+import org.apache.james.task.Task;
+import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.task.eventsourcing.distributed.TasksSerializationModule;
+
+import com.google.common.collect.Sets;
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+import com.google.inject.multibindings.ProvidesIntoSet;
+
+public class DistributedTaskSerializationModule extends AbstractModule {
+    @Override
+    protected void configure() {
+        install(new ReIndexingTaskSerializationModule());
+    }
+
+    @ProvidesIntoSet
+    public EventDTOModule<? extends Event, ? extends EventDTO> taskCreatedSerialization(JsonTaskSerializer jsonTaskSerializer,
+                                                                                        DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter,
+                                                                                        DTOConverter<Task, TaskDTO> taskConverter) {
+        return TasksSerializationModule.CREATED.create(jsonTaskSerializer, additionalInformationConverter, taskConverter);
+    }
+
+    @ProvidesIntoSet
+    public EventDTOModule<? extends Event, ? extends EventDTO> taskStartedSerialization(JsonTaskSerializer jsonTaskSerializer,
+                                                         DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter,
+                                                         DTOConverter<Task, TaskDTO> taskConverter) {
+        return TasksSerializationModule.STARTED.create(jsonTaskSerializer, additionalInformationConverter, taskConverter);
+    }
+
+    @ProvidesIntoSet
+    public EventDTOModule<? extends Event, ? extends EventDTO> taskCancelRequestedSerialization(JsonTaskSerializer jsonTaskSerializer,
+                                                                 DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter,
+                                                                 DTOConverter<Task, TaskDTO> taskConverter) {
+        return TasksSerializationModule.CANCEL_REQUESTED.create(jsonTaskSerializer, additionalInformationConverter, taskConverter);
+    }
+
+    @ProvidesIntoSet
+    public EventDTOModule<? extends Event, ? extends EventDTO> taskCancelledSerialization(JsonTaskSerializer jsonTaskSerializer,
+                                                           DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter,
+                                                           DTOConverter<Task, TaskDTO> taskConverter) {
+        return TasksSerializationModule.CANCELLED.create(jsonTaskSerializer, additionalInformationConverter, taskConverter);
+    }
+
+    @ProvidesIntoSet
+    public EventDTOModule<? extends Event, ? extends EventDTO> taskCompletedSerialization(JsonTaskSerializer jsonTaskSerializer,
+                                                           DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter,
+                                                           DTOConverter<Task, TaskDTO> taskConverter) {
+        return TasksSerializationModule.COMPLETED.create(jsonTaskSerializer, additionalInformationConverter, taskConverter);
+    }
+
+    @ProvidesIntoSet
+    public EventDTOModule<? extends Event, ? extends EventDTO> taskFailedSerialization(JsonTaskSerializer jsonTaskSerializer,
+                                                        DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter,
+                                                        DTOConverter<Task, TaskDTO> taskConverter) {
+        return TasksSerializationModule.FAILED.create(jsonTaskSerializer, additionalInformationConverter, taskConverter);
+    }
+
+    @ProvidesIntoSet
+    public EventDTOModule<? extends Event, ? extends EventDTO> taskUpdatedSerialization(JsonTaskSerializer jsonTaskSerializer,
+                                                        DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter,
+                                                        DTOConverter<Task, TaskDTO> taskConverter) {
+        return TasksSerializationModule.UPDATED.create(jsonTaskSerializer, additionalInformationConverter, taskConverter);
+    }
+
+    @Named(EventNestedTypes.EVENT_NESTED_TYPES_INJECTION_NAME)
+    @Provides
+    public Set<DTOModule<?, ? extends org.apache.james.json.DTO>> eventNestedTypes(Set<AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO>> additionalInformationDTOModules,
+                                                                                   Set<TaskDTOModule<? extends Task, ? extends TaskDTO>> taskDTOModules) {
+        return Sets.union(additionalInformationDTOModules, taskDTOModules);
+    }
+}
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java
deleted file mode 100644
index 5c63753..0000000
--- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java
+++ /dev/null
@@ -1,475 +0,0 @@
-/****************************************************************
- * 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.modules;
-
-import java.time.Clock;
-import java.util.Set;
-
-import javax.inject.Named;
-
-import org.apache.james.backends.cassandra.migration.MigrationTask;
-import org.apache.james.backends.cassandra.migration.MigrationTaskAdditionalInformationDTO;
-import org.apache.james.backends.cassandra.migration.MigrationTaskDTO;
-import org.apache.james.eventsourcing.Event;
-import org.apache.james.eventsourcing.eventstore.cassandra.EventNestedTypes;
-import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTO;
-import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTOModule;
-import org.apache.james.json.DTOConverter;
-import org.apache.james.json.DTOModule;
-import org.apache.james.mailbox.cassandra.mail.task.MailboxMergingTaskAdditionalInformationDTO;
-import org.apache.james.mailbox.cassandra.mail.task.MailboxMergingTaskDTO;
-import org.apache.james.mailbox.cassandra.mail.task.MailboxMergingTaskRunner;
-import org.apache.james.mailbox.cassandra.mail.task.RecomputeMailboxCountersService;
-import org.apache.james.mailbox.cassandra.mail.task.RecomputeMailboxCountersTaskAdditionalInformationDTO;
-import org.apache.james.mailbox.cassandra.mail.task.RecomputeMailboxCountersTaskDTO;
-import org.apache.james.mailbox.cassandra.mail.task.SolveMailboxInconsistenciesService;
-import org.apache.james.mailbox.cassandra.mail.task.SolveMailboxInconsistenciesTaskAdditionalInformationDTO;
-import org.apache.james.mailbox.cassandra.mail.task.SolveMailboxInconsistenciesTaskDTO;
-import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesService;
-import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesTaskAdditionalInformationDTO;
-import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesTaskDTO;
-import org.apache.james.mailbox.model.MailboxId;
-import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasService;
-import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasTaskAdditionalInformationDTO;
-import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasTaskDTO;
-import org.apache.james.queue.api.MailQueueFactory;
-import org.apache.james.queue.api.ManageableMailQueue;
-import org.apache.james.rrt.cassandra.CassandraMappingsSourcesDAO;
-import org.apache.james.rrt.cassandra.migration.MappingsSourcesMigration;
-import org.apache.james.rrt.cassandra.migration.MappingsSourcesMigrationTaskAdditionalInformationDTO;
-import org.apache.james.server.task.json.JsonTaskSerializer;
-import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
-import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
-import org.apache.james.server.task.json.dto.TaskDTO;
-import org.apache.james.server.task.json.dto.TaskDTOModule;
-import org.apache.james.task.Task;
-import org.apache.james.task.TaskExecutionDetails;
-import org.apache.james.task.eventsourcing.distributed.TasksSerializationModule;
-import org.apache.james.vault.blob.BlobStoreVaultGarbageCollectionTask;
-import org.apache.james.vault.blob.BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO;
-import org.apache.james.vault.blob.BlobStoreVaultGarbageCollectionTaskDTO;
-import org.apache.james.webadmin.data.jmap.MessageFastViewProjectionCorrector;
-import org.apache.james.webadmin.data.jmap.RecomputeAllFastViewProjectionItemsTask;
-import org.apache.james.webadmin.data.jmap.RecomputeAllFastViewTaskAdditionalInformationDTO;
-import org.apache.james.webadmin.data.jmap.RecomputeUserFastViewProjectionItemsTask;
-import org.apache.james.webadmin.data.jmap.RecomputeUserFastViewTaskAdditionalInformationDTO;
-import org.apache.james.webadmin.service.CassandraMappingsSolveInconsistenciesTask;
-import org.apache.james.webadmin.service.ClearMailQueueTaskAdditionalInformationDTO;
-import org.apache.james.webadmin.service.ClearMailQueueTaskDTO;
-import org.apache.james.webadmin.service.ClearMailRepositoryTask;
-import org.apache.james.webadmin.service.ClearMailRepositoryTaskAdditionalInformationDTO;
-import org.apache.james.webadmin.service.ClearMailRepositoryTaskDTO;
-import org.apache.james.webadmin.service.DeleteMailsFromMailQueueTaskAdditionalInformationDTO;
-import org.apache.james.webadmin.service.DeleteMailsFromMailQueueTaskDTO;
-import org.apache.james.webadmin.service.EventDeadLettersRedeliverAllTaskDTO;
-import org.apache.james.webadmin.service.EventDeadLettersRedeliverGroupTaskDTO;
-import org.apache.james.webadmin.service.EventDeadLettersRedeliverOneTaskDTO;
-import org.apache.james.webadmin.service.EventDeadLettersRedeliverService;
-import org.apache.james.webadmin.service.EventDeadLettersRedeliveryTaskAdditionalInformationDTO;
-import org.apache.james.webadmin.service.ExportService;
-import org.apache.james.webadmin.service.MailboxesExportTask;
-import org.apache.james.webadmin.service.MailboxesExportTaskAdditionalInformationDTO;
-import org.apache.james.webadmin.service.ReprocessingAllMailsTaskAdditionalInformationDTO;
-import org.apache.james.webadmin.service.ReprocessingAllMailsTaskDTO;
-import org.apache.james.webadmin.service.ReprocessingOneMailTaskAdditionalInformationDTO;
-import org.apache.james.webadmin.service.ReprocessingOneMailTaskDTO;
-import org.apache.james.webadmin.service.ReprocessingService;
-import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultDeleteTask;
-import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultDeleteTaskAdditionalInformationDTO;
-import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultDeleteTaskDTO;
-import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultExportTaskAdditionalInformationDTO;
-import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultExportTaskDTO;
-import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultRestoreTaskAdditionalInformationDTO;
-import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultRestoreTaskDTO;
-import org.apache.mailbox.tools.indexer.ErrorRecoveryIndexationTask;
-import org.apache.mailbox.tools.indexer.ErrorRecoveryIndexationTaskDTO;
-import org.apache.mailbox.tools.indexer.FullReindexingTaskDTO;
-import org.apache.mailbox.tools.indexer.MessageIdReIndexingTask;
-import org.apache.mailbox.tools.indexer.MessageIdReindexingTaskAdditionalInformationDTO;
-import org.apache.mailbox.tools.indexer.MessageIdReindexingTaskDTO;
-import org.apache.mailbox.tools.indexer.ReIndexerPerformer;
-import org.apache.mailbox.tools.indexer.ReprocessingContextInformationDTO;
-import org.apache.mailbox.tools.indexer.SingleMailboxReindexingTask;
-import org.apache.mailbox.tools.indexer.SingleMailboxReindexingTaskAdditionalInformationDTO;
-import org.apache.mailbox.tools.indexer.SingleMailboxReindexingTaskDTO;
-import org.apache.mailbox.tools.indexer.SingleMessageReindexingTask;
-import org.apache.mailbox.tools.indexer.SingleMessageReindexingTaskAdditionalInformationDTO;
-import org.apache.mailbox.tools.indexer.SingleMessageReindexingTaskDTO;
-import org.apache.mailbox.tools.indexer.UserReindexingTask;
-import org.apache.mailbox.tools.indexer.UserReindexingTaskAdditionalInformationDTO;
-import org.apache.mailbox.tools.indexer.UserReindexingTaskDTO;
-
-import com.google.common.collect.Sets;
-import com.google.inject.AbstractModule;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
-import com.google.inject.multibindings.ProvidesIntoSet;
-
-public class TaskSerializationModule extends AbstractModule {
-
-    @Provides
-    @Singleton
-    public DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationDTOConverter(Set<AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends AdditionalInformationDTO>> modules) {
-        return new DTOConverter<>(modules);
-    }
-
-    @Provides
-    @Singleton
-    public DTOConverter<Task, TaskDTO> taskDTOConverter(Set<TaskDTOModule<? extends Task, ? extends TaskDTO>> taskDTOModules) {
-        return new DTOConverter<>(taskDTOModules);
-
-    }
-
-    @ProvidesIntoSet
-    public EventDTOModule<? extends Event, ? extends EventDTO> taskCreatedSerialization(JsonTaskSerializer jsonTaskSerializer,
-                                                                                        DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter,
-                                                                                        DTOConverter<Task, TaskDTO> taskConverter) {
-        return TasksSerializationModule.CREATED.create(jsonTaskSerializer, additionalInformationConverter, taskConverter);
-    }
-
-    @ProvidesIntoSet
-    public EventDTOModule<? extends Event, ? extends EventDTO> taskStartedSerialization(JsonTaskSerializer jsonTaskSerializer,
-                                                         DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter,
-                                                         DTOConverter<Task, TaskDTO> taskConverter) {
-        return TasksSerializationModule.STARTED.create(jsonTaskSerializer, additionalInformationConverter, taskConverter);
-    }
-
-    @ProvidesIntoSet
-    public EventDTOModule<? extends Event, ? extends EventDTO> taskCancelRequestedSerialization(JsonTaskSerializer jsonTaskSerializer,
-                                                                 DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter,
-                                                                 DTOConverter<Task, TaskDTO> taskConverter) {
-        return TasksSerializationModule.CANCEL_REQUESTED.create(jsonTaskSerializer, additionalInformationConverter, taskConverter);
-    }
-
-    @ProvidesIntoSet
-    public EventDTOModule<? extends Event, ? extends EventDTO> taskCancelledSerialization(JsonTaskSerializer jsonTaskSerializer,
-                                                           DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter,
-                                                           DTOConverter<Task, TaskDTO> taskConverter) {
-        return TasksSerializationModule.CANCELLED.create(jsonTaskSerializer, additionalInformationConverter, taskConverter);
-    }
-
-    @ProvidesIntoSet
-    public EventDTOModule<? extends Event, ? extends EventDTO> taskCompletedSerialization(JsonTaskSerializer jsonTaskSerializer,
-                                                           DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter,
-                                                           DTOConverter<Task, TaskDTO> taskConverter) {
-        return TasksSerializationModule.COMPLETED.create(jsonTaskSerializer, additionalInformationConverter, taskConverter);
-    }
-
-    @ProvidesIntoSet
-    public EventDTOModule<? extends Event, ? extends EventDTO> taskFailedSerialization(JsonTaskSerializer jsonTaskSerializer,
-                                                        DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter,
-                                                        DTOConverter<Task, TaskDTO> taskConverter) {
-        return TasksSerializationModule.FAILED.create(jsonTaskSerializer, additionalInformationConverter, taskConverter);
-    }
-
-    @ProvidesIntoSet
-    public EventDTOModule<? extends Event, ? extends EventDTO> taskUpdatedSerialization(JsonTaskSerializer jsonTaskSerializer,
-                                                        DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter,
-                                                        DTOConverter<Task, TaskDTO> taskConverter) {
-        return TasksSerializationModule.UPDATED.create(jsonTaskSerializer, additionalInformationConverter, taskConverter);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> blobStoreVaultGarbageCollectionTask(BlobStoreVaultGarbageCollectionTask.Factory factory) {
-        return BlobStoreVaultGarbageCollectionTaskDTO.module(factory);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> cassandraMappingsSolveInconsistenciesTask(MappingsSourcesMigration migration, CassandraMappingsSourcesDAO dao) {
-        return CassandraMappingsSolveInconsistenciesTask.module(migration, dao);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> clearMailQueueTask(MailQueueFactory<? extends ManageableMailQueue> mailQueueFactory) {
-        return ClearMailQueueTaskDTO.module(mailQueueFactory);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> recomputeAllJmapPreviewsTask(MessageFastViewProjectionCorrector corrector) {
-        return RecomputeAllFastViewProjectionItemsTask.module(corrector);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> recomputeUserJmapPreviewsTask(MessageFastViewProjectionCorrector corrector) {
-        return RecomputeUserFastViewProjectionItemsTask.module(corrector);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> mailboxesExportTask(ExportService exportService) {
-        return MailboxesExportTask.module(exportService);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> clearMailRepositoryTask(ClearMailRepositoryTask.Factory factory) {
-        return ClearMailRepositoryTaskDTO.module(factory);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> deleteMailsFromMailQueueTask(MailQueueFactory<? extends ManageableMailQueue> mailQueueFactory) {
-        return DeleteMailsFromMailQueueTaskDTO.module(mailQueueFactory);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> deletedMessagesVaultDeleteTask(DeletedMessagesVaultDeleteTask.Factory factory) {
-        return DeletedMessagesVaultDeleteTaskDTO.module(factory);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> deletedMessagesVaultExportTask(DeletedMessagesVaultExportTaskDTO.Factory factory) {
-        return DeletedMessagesVaultExportTaskDTO.module(factory);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> deletedMessagesVaultRestoreTask(DeletedMessagesVaultRestoreTaskDTO.Factory factory) {
-        return DeletedMessagesVaultRestoreTaskDTO.module(factory);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> eventDeadLettersRedeliverAllTask(EventDeadLettersRedeliverService service) {
-        return EventDeadLettersRedeliverAllTaskDTO.module(service);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> eventDeadLettersRedeliverGroupTask(EventDeadLettersRedeliverService service) {
-        return EventDeadLettersRedeliverGroupTaskDTO.module(service);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> eventDeadLettersRedeliverOneTask(EventDeadLettersRedeliverService service) {
-        return EventDeadLettersRedeliverOneTaskDTO.module(service);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> fullReindexTask(ReIndexerPerformer performer) {
-        return FullReindexingTaskDTO.module(performer);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> errorRecoveryIndexationTask(ErrorRecoveryIndexationTask.Factory factory) {
-        return ErrorRecoveryIndexationTaskDTO.module(factory);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> mailboxMergingTask(MailboxMergingTaskRunner taskRunner) {
-        return MailboxMergingTaskDTO.module(taskRunner);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> solveMailboxInconsistenciesTask(SolveMailboxInconsistenciesService service) {
-        return SolveMailboxInconsistenciesTaskDTO.module(service);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> recomputeMailboxCountersTask(RecomputeMailboxCountersService service) {
-        return RecomputeMailboxCountersTaskDTO.module(service);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> recomputeCurrentQuotasTask(RecomputeCurrentQuotasService service) {
-        return RecomputeCurrentQuotasTaskDTO.module(service);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> messageIdReindexingTask(MessageIdReIndexingTask.Factory factory) {
-        return MessageIdReindexingTaskDTO.module(factory);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> migrationTask(MigrationTask.Factory factory) {
-        return MigrationTaskDTO.module(factory);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> reprocessingAllMailsTask(ReprocessingService reprocessingService) {
-        return ReprocessingAllMailsTaskDTO.module(reprocessingService);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> reprocessingOneMailsTask(ReprocessingService reprocessingService) {
-        return ReprocessingOneMailTaskDTO.module(Clock.systemUTC(), reprocessingService);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> solveMessageInconsistenciesTask(SolveMessageInconsistenciesService solveMessageInconsistenciesService) {
-        return SolveMessageInconsistenciesTaskDTO.module(solveMessageInconsistenciesService);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> singleMailboxReindexingTask(SingleMailboxReindexingTask.Factory factory) {
-        return SingleMailboxReindexingTaskDTO.module(factory);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> singleMessageReindexingTask(SingleMessageReindexingTask.Factory factory) {
-        return SingleMessageReindexingTaskDTO.module(factory);
-    }
-
-    @ProvidesIntoSet
-    public TaskDTOModule<? extends Task, ? extends TaskDTO> userReindexingTask(UserReindexingTask.Factory factory) {
-        return UserReindexingTaskDTO.module(factory);
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> blobStoreVaultGarbageCollectionAdditionalInformation() {
-        return BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.MODULE;
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> cassandraMappingsSolveInconsistenciesAdditionalInformation() {
-        return MappingsSourcesMigrationTaskAdditionalInformationDTO.serializationModule(CassandraMappingsSolveInconsistenciesTask.TYPE);
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> clearMailQueueAdditionalInformation() {
-        return ClearMailQueueTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> clearMailRepositoryAdditionalInformation() {
-        return ClearMailRepositoryTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> deleteMailsFromMailQueueAdditionalInformation() {
-        return DeleteMailsFromMailQueueTaskAdditionalInformationDTO.MODULE;
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> deletedMessagesVaultDeleteAdditionalInformation(MessageId.Factory factory) {
-        return DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.serializationModule(factory);
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> deletedMessagesVaultExportAdditionalInformation() {
-        return DeletedMessagesVaultExportTaskAdditionalInformationDTO.MODULE;
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> deletedMessagesVaultRestoreAdditionalInformation() {
-        return DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.MODULE;
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> errorRecoveryAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
-        return ReprocessingContextInformationDTO.ReprocessingContextInformationForErrorRecoveryIndexationTask.serializationModule(mailboxIdFactory);
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> eventDeadLettersRedeliveryAdditionalInformationForAll() {
-        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForAll.MODULE;
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> eventDeadLettersRedeliveryAdditionalInformationForGroup() {
-        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForGroup.MODULE;
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> eventDeadLettersRedeliveryAdditionalInformationForOne() {
-        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForOne.MODULE;
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> fullReindexAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
-        return ReprocessingContextInformationDTO.ReprocessingContextInformationForFullReindexingTask.serializationModule(mailboxIdFactory);
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> mailboxMergingAdditionalInformation() {
-        return MailboxMergingTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> solveMailboxInconsistenciesAdditionalInformation() {
-        return SolveMailboxInconsistenciesTaskAdditionalInformationDTO.MODULE;
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> recomputeMailboxCountersAdditionalInformation() {
-        return RecomputeMailboxCountersTaskAdditionalInformationDTO.MODULE;
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> recomputeCurrentQuotasAdditionalInformation() {
-        return RecomputeCurrentQuotasTaskAdditionalInformationDTO.MODULE;
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> messageIdReindexingAdditionalInformation(MessageId.Factory messageIdFactory) {
-        return MessageIdReindexingTaskAdditionalInformationDTO.serializationModule(messageIdFactory);
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> migrationTaskAdditionalInformation() {
-        return MigrationTaskAdditionalInformationDTO.serializationModule();
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> reprocessingAllMailsAdditionalInformation() {
-        return ReprocessingAllMailsTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> reprocessingOneMailAdditionalInformation() {
-        return ReprocessingOneMailTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> singleMailboxReindexingAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
-        return SingleMailboxReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory);
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> singleMessageReindexingAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
-        return SingleMessageReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory);
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> userReindexingAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
-        return UserReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory);
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> recomputeAllJmapPreviewsAdditionalInformation() {
-        return RecomputeAllFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> recomputeUserJmapPreviewsAdditionalInformation() {
-        return RecomputeUserFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> mailboxesExportAdditionalInformation() {
-        return MailboxesExportTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
-    }
-
-    @ProvidesIntoSet
-    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> solveMessageInconsistenciesAdditionalInformation() {
-        return SolveMessageInconsistenciesTaskAdditionalInformationDTO.MODULE;
-    }
-
-    @Named(EventNestedTypes.EVENT_NESTED_TYPES_INJECTION_NAME)
-    @Provides
-    public Set<DTOModule<?, ? extends org.apache.james.json.DTO>> eventNestedTypes(Set<AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO>> additionalInformationDTOModules,
-                                                                                   Set<TaskDTOModule<? extends Task, ? extends TaskDTO>> taskDTOModules) {
-        return Sets.union(additionalInformationDTOModules, taskDTOModules);
-    }
-}
diff --git a/server/container/guice/guice-common/pom.xml b/server/container/guice/guice-common/pom.xml
index e24d450..4d6c6625 100644
--- a/server/container/guice/guice-common/pom.xml
+++ b/server/container/guice/guice-common/pom.xml
@@ -111,6 +111,10 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-task-json</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-task-memory</artifactId>
         </dependency>
         <dependency>
diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/TaskManagerModule.java b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/TaskManagerModule.java
index 484ad4c..d07ed8f 100644
--- a/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/TaskManagerModule.java
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/TaskManagerModule.java
@@ -29,6 +29,8 @@ public class TaskManagerModule extends AbstractModule {
     @Override
     protected void configure() {
         install(new HostnameModule());
+        install(new TaskSerializationModule());
+
         bind(MemoryTaskManager.class).in(Scopes.SINGLETON);
         bind(TaskManager.class).to(MemoryTaskManager.class);
     }
diff --git a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxesExportRoutesModule.java b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/TaskSerializationModule.java
similarity index 53%
copy from server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxesExportRoutesModule.java
copy to server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/TaskSerializationModule.java
index 4e09cdb..884b947 100644
--- a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxesExportRoutesModule.java
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/TaskSerializationModule.java
@@ -19,24 +19,30 @@
 
 package org.apache.james.modules.server;
 
-import org.apache.james.webadmin.routes.UserMailboxesRoutes;
-import org.apache.james.webadmin.service.ExportService;
-import org.apache.james.webadmin.service.MailboxesExportRequestToTask;
-import org.apache.james.webadmin.tasks.TaskFromRequestRegistry;
+import java.util.Set;
 
-import com.google.inject.AbstractModule;
-import com.google.inject.Scopes;
-import com.google.inject.multibindings.Multibinder;
-import com.google.inject.name.Names;
+import org.apache.james.json.DTOConverter;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+import org.apache.james.server.task.json.dto.TaskDTO;
+import org.apache.james.server.task.json.dto.TaskDTOModule;
+import org.apache.james.task.Task;
+import org.apache.james.task.TaskExecutionDetails;
 
-public class MailboxesExportRoutesModule extends AbstractModule {
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
 
-    @Override
-    protected void configure() {
-        install(new MailboxesBackupModule());
+public class TaskSerializationModule extends AbstractModule {
+    @Provides
+    @Singleton
+    public DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationDTOConverter(Set<AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends AdditionalInformationDTO>> modules) {
+        return new DTOConverter<>(modules);
+    }
 
-        bind(ExportService.class).in(Scopes.SINGLETON);
-        Multibinder.newSetBinder(binder(), TaskFromRequestRegistry.TaskRegistration.class, Names.named(UserMailboxesRoutes.USER_MAILBOXES_OPERATIONS_INJECTION_KEY))
-            .addBinding().to(MailboxesExportRequestToTask.class);
+    @Provides
+    @Singleton
+    public DTOConverter<Task, TaskDTO> taskDTOConverter(Set<TaskDTOModule<? extends Task, ? extends TaskDTO>> taskDTOModules) {
+        return new DTOConverter<>(taskDTOModules);
     }
 }
diff --git a/server/container/guice/jpa-guice/src/main/java/org/apache/james/modules/mailbox/LuceneSearchMailboxModule.java b/server/container/guice/jpa-guice/src/main/java/org/apache/james/modules/mailbox/LuceneSearchMailboxModule.java
index 7b5c6de..78c5bba 100644
--- a/server/container/guice/jpa-guice/src/main/java/org/apache/james/modules/mailbox/LuceneSearchMailboxModule.java
+++ b/server/container/guice/jpa-guice/src/main/java/org/apache/james/modules/mailbox/LuceneSearchMailboxModule.java
@@ -39,6 +39,8 @@ public class LuceneSearchMailboxModule extends AbstractModule {
 
     @Override
     protected void configure() {
+        install(new ReIndexingTaskSerializationModule());
+
         bind(LuceneMessageSearchIndex.class).in(Scopes.SINGLETON);
         bind(MessageSearchIndex.class).to(LuceneMessageSearchIndex.class);
         bind(ListeningMessageSearchIndex.class).to(LuceneMessageSearchIndex.class);
diff --git a/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/DeletedMessageVaultModule.java b/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/DeletedMessageVaultModule.java
index 9d26a1d..c6ac334 100644
--- a/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/DeletedMessageVaultModule.java
+++ b/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/DeletedMessageVaultModule.java
@@ -30,6 +30,7 @@ public class DeletedMessageVaultModule extends AbstractModule {
     @Override
     protected void configure() {
         install(new DeletedMessageVaultRetentionModule());
+        install(new VaultTaskSerializationModule());
 
         bind(BucketNameGenerator.class).in(Scopes.SINGLETON);
         bind(BlobStoreDeletedMessageVault.class).in(Scopes.SINGLETON);
diff --git a/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/VaultTaskSerializationModule.java b/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/VaultTaskSerializationModule.java
new file mode 100644
index 0000000..b59c3ce
--- /dev/null
+++ b/server/container/guice/mailbox-plugin-deleted-messages-vault-guice/src/main/java/org/apache/james/modules/vault/VaultTaskSerializationModule.java
@@ -0,0 +1,82 @@
+/****************************************************************
+ * 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.modules.vault;
+
+import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+import org.apache.james.server.task.json.dto.TaskDTO;
+import org.apache.james.server.task.json.dto.TaskDTOModule;
+import org.apache.james.task.Task;
+import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.vault.blob.BlobStoreVaultGarbageCollectionTask;
+import org.apache.james.vault.blob.BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO;
+import org.apache.james.vault.blob.BlobStoreVaultGarbageCollectionTaskDTO;
+import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultDeleteTask;
+import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultDeleteTaskAdditionalInformationDTO;
+import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultDeleteTaskDTO;
+import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultExportTaskAdditionalInformationDTO;
+import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultExportTaskDTO;
+import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultRestoreTaskAdditionalInformationDTO;
+import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultRestoreTaskDTO;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.ProvidesIntoSet;
+
+public class VaultTaskSerializationModule extends AbstractModule {
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> blobStoreVaultGarbageCollectionTask(BlobStoreVaultGarbageCollectionTask.Factory factory) {
+        return BlobStoreVaultGarbageCollectionTaskDTO.module(factory);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> deletedMessagesVaultDeleteTask(DeletedMessagesVaultDeleteTask.Factory factory) {
+        return DeletedMessagesVaultDeleteTaskDTO.module(factory);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> deletedMessagesVaultExportTask(DeletedMessagesVaultExportTaskDTO.Factory factory) {
+        return DeletedMessagesVaultExportTaskDTO.module(factory);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> deletedMessagesVaultRestoreTask(DeletedMessagesVaultRestoreTaskDTO.Factory factory) {
+        return DeletedMessagesVaultRestoreTaskDTO.module(factory);
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> blobStoreVaultGarbageCollectionAdditionalInformation() {
+        return BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.MODULE;
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> deletedMessagesVaultDeleteAdditionalInformation(MessageId.Factory factory) {
+        return DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.serializationModule(factory);
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> deletedMessagesVaultExportAdditionalInformation() {
+        return DeletedMessagesVaultExportTaskAdditionalInformationDTO.MODULE;
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> deletedMessagesVaultRestoreAdditionalInformation() {
+        return DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.MODULE;
+    }
+}
diff --git a/server/container/guice/mailbox/pom.xml b/server/container/guice/mailbox/pom.xml
index ecc3efa..53b833f 100644
--- a/server/container/guice/mailbox/pom.xml
+++ b/server/container/guice/mailbox/pom.xml
@@ -52,6 +52,10 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>apache-james-mailbox-tools-indexer</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-guice-configuration</artifactId>
         </dependency>
         <dependency>
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/ReIndexingTaskSerializationModule.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/ReIndexingTaskSerializationModule.java
new file mode 100644
index 0000000..fda0438
--- /dev/null
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/ReIndexingTaskSerializationModule.java
@@ -0,0 +1,110 @@
+/****************************************************************
+ * 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.modules.mailbox;
+
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+import org.apache.james.server.task.json.dto.TaskDTO;
+import org.apache.james.server.task.json.dto.TaskDTOModule;
+import org.apache.james.task.Task;
+import org.apache.james.task.TaskExecutionDetails;
+import org.apache.mailbox.tools.indexer.ErrorRecoveryIndexationTask;
+import org.apache.mailbox.tools.indexer.ErrorRecoveryIndexationTaskDTO;
+import org.apache.mailbox.tools.indexer.FullReindexingTaskDTO;
+import org.apache.mailbox.tools.indexer.MessageIdReIndexingTask;
+import org.apache.mailbox.tools.indexer.MessageIdReindexingTaskAdditionalInformationDTO;
+import org.apache.mailbox.tools.indexer.MessageIdReindexingTaskDTO;
+import org.apache.mailbox.tools.indexer.ReIndexerPerformer;
+import org.apache.mailbox.tools.indexer.ReprocessingContextInformationDTO;
+import org.apache.mailbox.tools.indexer.SingleMailboxReindexingTask;
+import org.apache.mailbox.tools.indexer.SingleMailboxReindexingTaskAdditionalInformationDTO;
+import org.apache.mailbox.tools.indexer.SingleMailboxReindexingTaskDTO;
+import org.apache.mailbox.tools.indexer.SingleMessageReindexingTask;
+import org.apache.mailbox.tools.indexer.SingleMessageReindexingTaskAdditionalInformationDTO;
+import org.apache.mailbox.tools.indexer.SingleMessageReindexingTaskDTO;
+import org.apache.mailbox.tools.indexer.UserReindexingTask;
+import org.apache.mailbox.tools.indexer.UserReindexingTaskAdditionalInformationDTO;
+import org.apache.mailbox.tools.indexer.UserReindexingTaskDTO;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.ProvidesIntoSet;
+
+public class ReIndexingTaskSerializationModule extends AbstractModule {
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> fullReindexTask(ReIndexerPerformer performer) {
+        return FullReindexingTaskDTO.module(performer);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> errorRecoveryIndexationTask(ErrorRecoveryIndexationTask.Factory factory) {
+        return ErrorRecoveryIndexationTaskDTO.module(factory);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> messageIdReindexingTask(MessageIdReIndexingTask.Factory factory) {
+        return MessageIdReindexingTaskDTO.module(factory);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> singleMailboxReindexingTask(SingleMailboxReindexingTask.Factory factory) {
+        return SingleMailboxReindexingTaskDTO.module(factory);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> singleMessageReindexingTask(SingleMessageReindexingTask.Factory factory) {
+        return SingleMessageReindexingTaskDTO.module(factory);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> userReindexingTask(UserReindexingTask.Factory factory) {
+        return UserReindexingTaskDTO.module(factory);
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> errorRecoveryAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
+        return ReprocessingContextInformationDTO.ReprocessingContextInformationForErrorRecoveryIndexationTask.serializationModule(mailboxIdFactory);
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> fullReindexAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
+        return ReprocessingContextInformationDTO.ReprocessingContextInformationForFullReindexingTask.serializationModule(mailboxIdFactory);
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> messageIdReindexingAdditionalInformation(MessageId.Factory messageIdFactory) {
+        return MessageIdReindexingTaskAdditionalInformationDTO.serializationModule(messageIdFactory);
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> singleMailboxReindexingAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
+        return SingleMailboxReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory);
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> singleMessageReindexingAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
+        return SingleMessageReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory);
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> userReindexingAdditionalInformation(MailboxId.Factory mailboxIdFactory) {
+        return UserReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory);
+    }
+}
diff --git a/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTaskSerializationModule.java b/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTaskSerializationModule.java
new file mode 100644
index 0000000..de4fe7b
--- /dev/null
+++ b/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTaskSerializationModule.java
@@ -0,0 +1,56 @@
+/****************************************************************
+ * 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.modules.server;
+
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+import org.apache.james.server.task.json.dto.TaskDTO;
+import org.apache.james.server.task.json.dto.TaskDTOModule;
+import org.apache.james.task.Task;
+import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.webadmin.data.jmap.MessageFastViewProjectionCorrector;
+import org.apache.james.webadmin.data.jmap.RecomputeAllFastViewProjectionItemsTask;
+import org.apache.james.webadmin.data.jmap.RecomputeAllFastViewTaskAdditionalInformationDTO;
+import org.apache.james.webadmin.data.jmap.RecomputeUserFastViewProjectionItemsTask;
+import org.apache.james.webadmin.data.jmap.RecomputeUserFastViewTaskAdditionalInformationDTO;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.ProvidesIntoSet;
+
+public class JmapTaskSerializationModule extends AbstractModule {
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> recomputeAllJmapPreviewsTask(MessageFastViewProjectionCorrector corrector) {
+        return RecomputeAllFastViewProjectionItemsTask.module(corrector);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> recomputeUserJmapPreviewsTask(MessageFastViewProjectionCorrector corrector) {
+        return RecomputeUserFastViewProjectionItemsTask.module(corrector);
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> recomputeAllJmapPreviewsAdditionalInformation() {
+        return RecomputeAllFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> recomputeUserJmapPreviewsAdditionalInformation() {
+        return RecomputeUserFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+    }
+}
diff --git a/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTasksModule.java b/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTasksModule.java
index 5b6931e..73b1030 100644
--- a/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTasksModule.java
+++ b/server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTasksModule.java
@@ -32,6 +32,8 @@ import com.google.inject.name.Names;
 public class JmapTasksModule extends AbstractModule {
     @Override
     protected void configure() {
+        install(new JmapTaskSerializationModule());
+
         Multibinder.newSetBinder(binder(), TaskFromRequestRegistry.TaskRegistration.class, Names.named(MailboxesRoutes.ALL_MAILBOXES_TASKS))
             .addBinding().to(RecomputeAllFastViewProjectionItemsRequestToTask.class);
 
diff --git a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxRoutesModule.java b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxRoutesModule.java
index 6da9e2c..cc16843 100644
--- a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxRoutesModule.java
+++ b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxRoutesModule.java
@@ -44,6 +44,8 @@ public class MailboxRoutesModule extends AbstractModule {
 
     @Override
     protected void configure() {
+        install(new WebadminMailboxTaskSerializationModule());
+
         Multibinder<Routes> routesMultibinder = Multibinder.newSetBinder(binder(), Routes.class);
         routesMultibinder.addBinding().to(DomainQuotaRoutes.class);
         routesMultibinder.addBinding().to(EventDeadLettersRoutes.class);
diff --git a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxesExportRoutesModule.java b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxesExportRoutesModule.java
index 4e09cdb..2a7021f 100644
--- a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxesExportRoutesModule.java
+++ b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxesExportRoutesModule.java
@@ -34,6 +34,7 @@ public class MailboxesExportRoutesModule extends AbstractModule {
     @Override
     protected void configure() {
         install(new MailboxesBackupModule());
+        install(new WebadminMailboxExportTaskSerializationModule());
 
         bind(ExportService.class).in(Scopes.SINGLETON);
         Multibinder.newSetBinder(binder(), TaskFromRequestRegistry.TaskRegistration.class, Names.named(UserMailboxesRoutes.USER_MAILBOXES_OPERATIONS_INJECTION_KEY))
diff --git a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxesExportRoutesModule.java b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxExportTaskSerializationModule.java
similarity index 54%
copy from server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxesExportRoutesModule.java
copy to server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxExportTaskSerializationModule.java
index 4e09cdb..90f69af 100644
--- a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxesExportRoutesModule.java
+++ b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxExportTaskSerializationModule.java
@@ -16,27 +16,29 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-
 package org.apache.james.modules.server;
 
-import org.apache.james.webadmin.routes.UserMailboxesRoutes;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+import org.apache.james.server.task.json.dto.TaskDTO;
+import org.apache.james.server.task.json.dto.TaskDTOModule;
+import org.apache.james.task.Task;
+import org.apache.james.task.TaskExecutionDetails;
 import org.apache.james.webadmin.service.ExportService;
-import org.apache.james.webadmin.service.MailboxesExportRequestToTask;
-import org.apache.james.webadmin.tasks.TaskFromRequestRegistry;
+import org.apache.james.webadmin.service.MailboxesExportTask;
+import org.apache.james.webadmin.service.MailboxesExportTaskAdditionalInformationDTO;
 
 import com.google.inject.AbstractModule;
-import com.google.inject.Scopes;
-import com.google.inject.multibindings.Multibinder;
-import com.google.inject.name.Names;
-
-public class MailboxesExportRoutesModule extends AbstractModule {
+import com.google.inject.multibindings.ProvidesIntoSet;
 
-    @Override
-    protected void configure() {
-        install(new MailboxesBackupModule());
+public class WebadminMailboxExportTaskSerializationModule extends AbstractModule {
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> mailboxesExportTask(ExportService exportService) {
+        return MailboxesExportTask.module(exportService);
+    }
 
-        bind(ExportService.class).in(Scopes.SINGLETON);
-        Multibinder.newSetBinder(binder(), TaskFromRequestRegistry.TaskRegistration.class, Names.named(UserMailboxesRoutes.USER_MAILBOXES_OPERATIONS_INJECTION_KEY))
-            .addBinding().to(MailboxesExportRequestToTask.class);
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> mailboxesExportAdditionalInformation() {
+        return MailboxesExportTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
     }
 }
diff --git a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxTaskSerializationModule.java b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxTaskSerializationModule.java
new file mode 100644
index 0000000..b7dbb5b
--- /dev/null
+++ b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxTaskSerializationModule.java
@@ -0,0 +1,79 @@
+/****************************************************************
+ * 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.modules.server;
+
+import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasService;
+import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasTaskAdditionalInformationDTO;
+import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasTaskDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+import org.apache.james.server.task.json.dto.TaskDTO;
+import org.apache.james.server.task.json.dto.TaskDTOModule;
+import org.apache.james.task.Task;
+import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.webadmin.service.EventDeadLettersRedeliverAllTaskDTO;
+import org.apache.james.webadmin.service.EventDeadLettersRedeliverGroupTaskDTO;
+import org.apache.james.webadmin.service.EventDeadLettersRedeliverOneTaskDTO;
+import org.apache.james.webadmin.service.EventDeadLettersRedeliverService;
+import org.apache.james.webadmin.service.EventDeadLettersRedeliveryTaskAdditionalInformationDTO;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.ProvidesIntoSet;
+
+public class WebadminMailboxTaskSerializationModule extends AbstractModule {
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> eventDeadLettersRedeliverAllTask(EventDeadLettersRedeliverService service) {
+        return EventDeadLettersRedeliverAllTaskDTO.module(service);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> eventDeadLettersRedeliverGroupTask(EventDeadLettersRedeliverService service) {
+        return EventDeadLettersRedeliverGroupTaskDTO.module(service);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> eventDeadLettersRedeliverOneTask(EventDeadLettersRedeliverService service) {
+        return EventDeadLettersRedeliverOneTaskDTO.module(service);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> recomputeCurrentQuotasTask(RecomputeCurrentQuotasService service) {
+        return RecomputeCurrentQuotasTaskDTO.module(service);
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> eventDeadLettersRedeliveryAdditionalInformationForAll() {
+        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForAll.MODULE;
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> eventDeadLettersRedeliveryAdditionalInformationForGroup() {
+        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForGroup.MODULE;
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> eventDeadLettersRedeliveryAdditionalInformationForOne() {
+        return EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForOne.MODULE;
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> recomputeCurrentQuotasAdditionalInformation() {
+        return RecomputeCurrentQuotasTaskAdditionalInformationDTO.MODULE;
+    }
+}
diff --git a/server/container/guice/protocols/webadmin-mailqueue/src/main/java/org/apache/james/modules/server/MailQueueRoutesModule.java b/server/container/guice/protocols/webadmin-mailqueue/src/main/java/org/apache/james/modules/server/MailQueueRoutesModule.java
index 127c53a..d8dd186 100644
--- a/server/container/guice/protocols/webadmin-mailqueue/src/main/java/org/apache/james/modules/server/MailQueueRoutesModule.java
+++ b/server/container/guice/protocols/webadmin-mailqueue/src/main/java/org/apache/james/modules/server/MailQueueRoutesModule.java
@@ -28,6 +28,8 @@ import com.google.inject.multibindings.Multibinder;
 public class MailQueueRoutesModule extends AbstractModule {
     @Override
     protected void configure() {
+        install(new MailQueueTaskSerializationModule());
+
         Multibinder<Routes> routesMultibinder = Multibinder.newSetBinder(binder(), Routes.class);
         routesMultibinder.addBinding().to(MailQueueRoutes.class);
     }
diff --git a/server/container/guice/protocols/webadmin-mailqueue/src/main/java/org/apache/james/modules/server/MailQueueTaskSerializationModule.java b/server/container/guice/protocols/webadmin-mailqueue/src/main/java/org/apache/james/modules/server/MailQueueTaskSerializationModule.java
new file mode 100644
index 0000000..14495ea
--- /dev/null
+++ b/server/container/guice/protocols/webadmin-mailqueue/src/main/java/org/apache/james/modules/server/MailQueueTaskSerializationModule.java
@@ -0,0 +1,57 @@
+/****************************************************************
+ * 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.modules.server;
+
+import org.apache.james.queue.api.MailQueueFactory;
+import org.apache.james.queue.api.ManageableMailQueue;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+import org.apache.james.server.task.json.dto.TaskDTO;
+import org.apache.james.server.task.json.dto.TaskDTOModule;
+import org.apache.james.task.Task;
+import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.webadmin.service.ClearMailQueueTaskAdditionalInformationDTO;
+import org.apache.james.webadmin.service.ClearMailQueueTaskDTO;
+import org.apache.james.webadmin.service.DeleteMailsFromMailQueueTaskAdditionalInformationDTO;
+import org.apache.james.webadmin.service.DeleteMailsFromMailQueueTaskDTO;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.ProvidesIntoSet;
+
+public class MailQueueTaskSerializationModule extends AbstractModule {
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> clearMailQueueTask(MailQueueFactory<? extends ManageableMailQueue> mailQueueFactory) {
+        return ClearMailQueueTaskDTO.module(mailQueueFactory);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> deleteMailsFromMailQueueTask(MailQueueFactory<? extends ManageableMailQueue> mailQueueFactory) {
+        return DeleteMailsFromMailQueueTaskDTO.module(mailQueueFactory);
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> clearMailQueueAdditionalInformation() {
+        return ClearMailQueueTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> deleteMailsFromMailQueueAdditionalInformation() {
+        return DeleteMailsFromMailQueueTaskAdditionalInformationDTO.MODULE;
+    }
+}
diff --git a/server/container/guice/protocols/webadmin-mailrepository/src/main/java/org/apache/james/modules/server/MailRepositoriesRoutesModule.java b/server/container/guice/protocols/webadmin-mailrepository/src/main/java/org/apache/james/modules/server/MailRepositoriesRoutesModule.java
index a4a4706..eb24141 100644
--- a/server/container/guice/protocols/webadmin-mailrepository/src/main/java/org/apache/james/modules/server/MailRepositoriesRoutesModule.java
+++ b/server/container/guice/protocols/webadmin-mailrepository/src/main/java/org/apache/james/modules/server/MailRepositoriesRoutesModule.java
@@ -28,6 +28,8 @@ import com.google.inject.multibindings.Multibinder;
 public class MailRepositoriesRoutesModule extends AbstractModule {
     @Override
     protected void configure() {
+        install(new MailRepositoryTaskSerializationModule());
+
         Multibinder<Routes> routesMultibinder = Multibinder.newSetBinder(binder(), Routes.class);
         routesMultibinder.addBinding().to(MailRepositoriesRoutes.class);
     }
diff --git a/server/container/guice/protocols/webadmin-mailrepository/src/main/java/org/apache/james/modules/server/MailRepositoryTaskSerializationModule.java b/server/container/guice/protocols/webadmin-mailrepository/src/main/java/org/apache/james/modules/server/MailRepositoryTaskSerializationModule.java
new file mode 100644
index 0000000..5f8d4c7
--- /dev/null
+++ b/server/container/guice/protocols/webadmin-mailrepository/src/main/java/org/apache/james/modules/server/MailRepositoryTaskSerializationModule.java
@@ -0,0 +1,71 @@
+/****************************************************************
+ * 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.modules.server;
+
+import java.time.Clock;
+
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+import org.apache.james.server.task.json.dto.TaskDTO;
+import org.apache.james.server.task.json.dto.TaskDTOModule;
+import org.apache.james.task.Task;
+import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.webadmin.service.ClearMailRepositoryTask;
+import org.apache.james.webadmin.service.ClearMailRepositoryTaskAdditionalInformationDTO;
+import org.apache.james.webadmin.service.ClearMailRepositoryTaskDTO;
+import org.apache.james.webadmin.service.ReprocessingAllMailsTaskAdditionalInformationDTO;
+import org.apache.james.webadmin.service.ReprocessingAllMailsTaskDTO;
+import org.apache.james.webadmin.service.ReprocessingOneMailTaskAdditionalInformationDTO;
+import org.apache.james.webadmin.service.ReprocessingOneMailTaskDTO;
+import org.apache.james.webadmin.service.ReprocessingService;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.multibindings.ProvidesIntoSet;
+
+public class MailRepositoryTaskSerializationModule extends AbstractModule {
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> clearMailRepositoryTask(ClearMailRepositoryTask.Factory factory) {
+        return ClearMailRepositoryTaskDTO.module(factory);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> reprocessingAllMailsTask(ReprocessingService reprocessingService) {
+        return ReprocessingAllMailsTaskDTO.module(reprocessingService);
+    }
+
+    @ProvidesIntoSet
+    public TaskDTOModule<? extends Task, ? extends TaskDTO> reprocessingOneMailsTask(ReprocessingService reprocessingService) {
+        return ReprocessingOneMailTaskDTO.module(Clock.systemUTC(), reprocessingService);
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> clearMailRepositoryAdditionalInformation() {
+        return ClearMailRepositoryTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> reprocessingAllMailsAdditionalInformation() {
+        return ReprocessingAllMailsTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+    }
+
+    @ProvidesIntoSet
+    public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends  AdditionalInformationDTO> reprocessingOneMailAdditionalInformation() {
+        return ReprocessingOneMailTaskAdditionalInformationDTO.SERIALIZATION_MODULE;
+    }
+}


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


[james-project] 16/17: JAMES-3204 Flatten reactive calls in CassandraMailboxMapper::findInMailboxReactive

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 4c093a4e99d8060d547488725411a8cc3965c2b2
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Jun 8 14:12:01 2020 +0700

    JAMES-3204 Flatten reactive calls in CassandraMailboxMapper::findInMailboxReactive
---
 .../apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
index 2e41530..9b8c18e 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
@@ -170,10 +170,8 @@ public class CassandraMessageMapper implements MessageMapper {
     public Flux<MailboxMessage> findInMailboxReactive(Mailbox mailbox, MessageRange messageRange, FetchType ftype, int limit) {
         CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
 
-        return Limit.from(limit).applyOnFlux(
-            messageIdDAO.retrieveMessages(mailboxId, messageRange)
-                .flatMap(id -> retrieveMessage(id, ftype), cassandraConfiguration.getMessageReadChunkSize()))
-            .map(MailboxMessage.class::cast)
+        return Limit.from(limit).applyOnFlux(messageIdDAO.retrieveMessages(mailboxId, messageRange))
+            .flatMap(id -> retrieveMessage(id, ftype), cassandraConfiguration.getMessageReadChunkSize())
             .sort(Comparator.comparing(MailboxMessage::getUid));
     }
 


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


[james-project] 03/17: JAMES-3194 Rely on DTOConverter in TaskRoute

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit d2d2e869fc53273a0f37853033cd7df57f2ca55d
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Jun 1 15:48:08 2020 +0700

    JAMES-3194 Rely on DTOConverter in TaskRoute
---
 .../indexer/ReprocessingContextInformation.java    |   6 --
 .../indexer/ReprocessingContextInformationDTO.java |   7 +-
 .../tools/indexer/SingleMailboxReindexingTask.java |   5 +-
 .../mailbox/tools/indexer/UserReindexingTask.java  |   5 +-
 .../routes/CassandraMappingsRoutesTest.java        |   5 +-
 .../protocols/webadmin/webadmin-cassandra/pom.xml  |  11 ++
 ...AdminMigrationTaskAdditionalInformationDTO.java |  66 ++++++++++++
 .../WebAdminMigrationTaskSerializationTest.java    |  40 +++++++
 .../routes/CassandraMigrationRoutesTest.java       |   6 +-
 ...lveMessageInconsistenciesRequestToTaskTest.java |   4 +-
 server/protocols/webadmin/webadmin-core/pom.xml    |   4 +
 .../james/webadmin/dto/ExecutionDetailsDto.java    |  24 +++--
 .../apache/james/webadmin/routes/TasksRoutes.java  |  13 ++-
 .../james/webadmin/routes/TasksRoutesTest.java     |   6 +-
 ...llFastViewProjectionItemsRequestToTaskTest.java |   4 +-
 ...erFastViewProjectionItemsRequestToTaskTest.java |   4 +-
 ...gesVaultDeleteTaskAdditionalInformationDTO.java |  74 +++++++++++++
 ...esVaultRestoreTaskAdditionalInformationDTO.java | 101 ++++++++++++++++++
 .../routes/DeletedMessagesVaultRoutesTest.java     |   9 +-
 ...edMessagesVaultDeleteTaskSerializationTest.java |  44 ++++++++
 ...dMessagesVaultRestoreTaskSerializationTest.java |  41 ++++++++
 server/protocols/webadmin/webadmin-mailbox/pom.xml |   1 -
 .../SerializableReIndexingExecutionFailures.java   |   2 +-
 .../WebAdminReprocessingContextInformationDTO.java | 116 +++++++++++++++++++++
 ...lboxReindexingTaskAdditionalInformationDTO.java |  94 +++++++++++++++++
 ...UserReindexingTaskAdditionalInformationDTO.java |  93 +++++++++++++++++
 ...erializableReIndexingExecutionFailuresTest.java |   2 +-
 ...AdminReprocessingContextInformationDTOTest.java | 111 ++++++++++++++++++++
 .../WebAdminSingleMailboxReprocessingDTOTest.java  |  82 +++++++++++++++
 .../dto/WebAdminUserReprocessingDTOTest.java       |  83 +++++++++++++++
 .../routes/EventDeadLettersRoutesTest.java         |   9 +-
 .../routes/MailboxesRoutesNoTasksTest.java         |   3 +-
 .../james/webadmin/routes/MailboxesRoutesTest.java |  17 ++-
 .../james/webadmin/routes/MessageRoutesTest.java   |   6 +-
 .../UserMailboxesRoutesNoIndexationTest.java       |   3 +-
 .../webadmin/routes/UserMailboxesRoutesTest.java   |  17 +--
 .../routes/WebAdminQuotaSearchTestSystem.java      |   5 +-
 .../service/MailboxesExportRequestToTaskTest.java  |   4 +-
 ...sFromMailQueueTaskAdditionalInformationDTO.java | 110 +++++++++++++++++++
 .../james/webadmin/routes/MailQueueRoutesTest.java |   8 +-
 ...mMailQueueTaskAdditionalInformationDTOTest.java |  51 +++++++++
 ...MailRepositoryTaskAdditionalInformationDTO.java |  88 ++++++++++++++++
 .../routes/MailRepositoriesRoutesTest.java         |  10 +-
 .../WebAdminClearMailRepositoryTaskDTOTest.java    |  44 ++++++++
 src/site/markdown/server/manage-webadmin.md        |  51 ++++-----
 45 files changed, 1417 insertions(+), 72 deletions(-)

diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformation.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformation.java
index c2927c9..2517c07 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformation.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformation.java
@@ -27,7 +27,6 @@ import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
 import org.apache.james.task.TaskExecutionDetails;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class ReprocessingContextInformation implements TaskExecutionDetails.AdditionalInformation, IndexingDetailInformation {
 
@@ -62,11 +61,6 @@ public class ReprocessingContextInformation implements TaskExecutionDetails.Addi
         return failures;
     }
 
-    @JsonProperty("failures")
-    public SerializableReIndexingExecutionFailures failuresAsJson() {
-        return SerializableReIndexingExecutionFailures.from(failures());
-    }
-
     @Override
     public Instant timestamp() {
         return timestamp;
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformationDTO.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformationDTO.java
index 714599d..363cc42 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformationDTO.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformationDTO.java
@@ -36,6 +36,7 @@ import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.github.steveash.guavate.Guavate;
 import com.google.common.base.Preconditions;
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableListMultimap;
 
@@ -101,7 +102,8 @@ public class ReprocessingContextInformationDTO implements AdditionalInformationD
                 .withFactory(AdditionalInformationDTOModule::new);
         }
 
-        ReprocessingContextInformationForErrorRecoveryIndexationTask(int successfullyReprocessedMailCount,
+        @VisibleForTesting
+        public ReprocessingContextInformationForErrorRecoveryIndexationTask(int successfullyReprocessedMailCount,
                                                                      int failedReprocessedMailCount,
                                                                      ReIndexingExecutionFailures failures,
                                                                      Instant timestamp,
@@ -150,7 +152,8 @@ public class ReprocessingContextInformationDTO implements AdditionalInformationD
                 .withFactory(AdditionalInformationDTOModule::new);
         }
 
-        ReprocessingContextInformationForFullReindexingTask(int successfullyReprocessedMailCount,
+        @VisibleForTesting
+        public ReprocessingContextInformationForFullReindexingTask(int successfullyReprocessedMailCount,
                                                             int failedReprocessedMailCount,
                                                             ReIndexingExecutionFailures failures,
                                                             Instant timestamp,
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTask.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTask.java
index bc474a3..167889d 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTask.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTask.java
@@ -32,6 +32,8 @@ import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
 import org.apache.james.task.TaskType;
 
+import com.google.common.annotations.VisibleForTesting;
+
 public class SingleMailboxReindexingTask implements Task {
 
     public static final TaskType MAILBOX_RE_INDEXING = TaskType.of("mailbox-reindexing");
@@ -39,7 +41,8 @@ public class SingleMailboxReindexingTask implements Task {
     public static class AdditionalInformation extends ReprocessingContextInformation {
         private final MailboxId mailboxId;
 
-        AdditionalInformation(MailboxId mailboxId, int successfullyReprocessedMailCount,
+        @VisibleForTesting
+        public AdditionalInformation(MailboxId mailboxId, int successfullyReprocessedMailCount,
                               int failedReprocessedMailCount, ReIndexingExecutionFailures failures,
                               Instant timestamp, RunningOptions runningOptions) {
             super(successfullyReprocessedMailCount, failedReprocessedMailCount, failures, timestamp, runningOptions);
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java
index 19cde9b..5fe450b 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java
@@ -32,6 +32,8 @@ import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
 import org.apache.james.task.TaskType;
 
+import com.google.common.annotations.VisibleForTesting;
+
 import reactor.core.publisher.Mono;
 
 public class UserReindexingTask implements Task {
@@ -41,7 +43,8 @@ public class UserReindexingTask implements Task {
     public static class AdditionalInformation extends ReprocessingContextInformation {
         private final Username username;
 
-        AdditionalInformation(Username username, int successfullyReprocessedMailCount,
+        @VisibleForTesting
+        public AdditionalInformation(Username username, int successfullyReprocessedMailCount,
                               int failedReprocessedMailCount, ReIndexingExecutionFailures failures,
                               Instant timestamp, RunningOptions runningOptions) {
             super(successfullyReprocessedMailCount, failedReprocessedMailCount, failures, timestamp, runningOptions);
diff --git a/server/protocols/webadmin/webadmin-cassandra-data/src/test/java/org/apache/james/webadmin/routes/CassandraMappingsRoutesTest.java b/server/protocols/webadmin/webadmin-cassandra-data/src/test/java/org/apache/james/webadmin/routes/CassandraMappingsRoutesTest.java
index 5c42462..6812278 100644
--- a/server/protocols/webadmin/webadmin-cassandra-data/src/test/java/org/apache/james/webadmin/routes/CassandraMappingsRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-cassandra-data/src/test/java/org/apache/james/webadmin/routes/CassandraMappingsRoutesTest.java
@@ -30,10 +30,12 @@ import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.core.Domain;
+import org.apache.james.json.DTOConverter;
 import org.apache.james.rrt.cassandra.CassandraMappingsSourcesDAO;
 import org.apache.james.rrt.cassandra.CassandraRRTModule;
 import org.apache.james.rrt.cassandra.CassandraRecipientRewriteTableDAO;
 import org.apache.james.rrt.cassandra.migration.MappingsSourcesMigration;
+import org.apache.james.rrt.cassandra.migration.MappingsSourcesMigrationTaskAdditionalInformationDTO;
 import org.apache.james.rrt.lib.Mapping;
 import org.apache.james.rrt.lib.MappingSource;
 import org.apache.james.task.Hostname;
@@ -80,7 +82,8 @@ class CassandraMappingsRoutesTest {
         taskManager = new MemoryTaskManager(new Hostname("foo"));
         webAdminServer = WebAdminUtils.createWebAdminServer(
                 new CassandraMappingsRoutes(cassandraMappingsService, taskManager, jsonTransformer),
-                new TasksRoutes(taskManager, jsonTransformer))
+                new TasksRoutes(taskManager, jsonTransformer,
+                    DTOConverter.of(MappingsSourcesMigrationTaskAdditionalInformationDTO.serializationModule(CassandraMappingsSolveInconsistenciesTask.TYPE))))
             .start();
 
         RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer)
diff --git a/server/protocols/webadmin/webadmin-cassandra/pom.xml b/server/protocols/webadmin/webadmin-cassandra/pom.xml
index 002dc6f..0505fab 100644
--- a/server/protocols/webadmin/webadmin-cassandra/pom.xml
+++ b/server/protocols/webadmin/webadmin-cassandra/pom.xml
@@ -39,6 +39,12 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>james-json</artifactId>
+            <scope>test</scope>
+            <type>test-jar</type>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-task-memory</artifactId>
             <scope>test</scope>
         </dependency>
@@ -72,6 +78,11 @@
             <artifactId>javax.inject</artifactId>
         </dependency>
         <dependency>
+            <groupId>net.javacrumbs.json-unit</groupId>
+            <artifactId>json-unit-assertj</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
             <scope>test</scope>
diff --git a/server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/dto/WebAdminMigrationTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/dto/WebAdminMigrationTaskAdditionalInformationDTO.java
new file mode 100644
index 0000000..dc6be00
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/dto/WebAdminMigrationTaskAdditionalInformationDTO.java
@@ -0,0 +1,66 @@
+/****************************************************************
+ * 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.webadmin.dto;
+
+import java.time.Instant;
+
+import org.apache.james.backends.cassandra.migration.MigrationTask;
+import org.apache.james.backends.cassandra.versions.SchemaVersion;
+import org.apache.james.json.DTOModule;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class WebAdminMigrationTaskAdditionalInformationDTO implements AdditionalInformationDTO {
+
+    public static AdditionalInformationDTOModule<MigrationTask.AdditionalInformation, WebAdminMigrationTaskAdditionalInformationDTO> serializationModule() {
+        return DTOModule.forDomainObject(MigrationTask.AdditionalInformation.class)
+            .convertToDTO(WebAdminMigrationTaskAdditionalInformationDTO.class)
+            .toDomainObjectConverter(dto -> new MigrationTask.AdditionalInformation(new SchemaVersion(dto.getToVersion()), dto.timestamp))
+            .toDTOConverter((details, type) -> new WebAdminMigrationTaskAdditionalInformationDTO(type, details.getToVersion(), details.timestamp()))
+            .typeName(MigrationTask.CASSANDRA_MIGRATION.asString())
+            .withFactory(AdditionalInformationDTOModule::new);
+    }
+
+    private final String type;
+    private final int toVersion;
+    private final Instant timestamp;
+
+    public WebAdminMigrationTaskAdditionalInformationDTO(@JsonProperty("type") String type,
+                                                         @JsonProperty("toVersion") int toVersion,
+                                                         @JsonProperty("timestamp") Instant timestamp) {
+        this.type = type;
+        this.toVersion = toVersion;
+        this.timestamp = timestamp;
+    }
+
+    @Override
+    public String getType() {
+        return type;
+    }
+
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
+    public int getToVersion() {
+        return toVersion;
+    }
+}
diff --git a/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/dto/WebAdminMigrationTaskSerializationTest.java b/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/dto/WebAdminMigrationTaskSerializationTest.java
new file mode 100644
index 0000000..3d9abc6
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/dto/WebAdminMigrationTaskSerializationTest.java
@@ -0,0 +1,40 @@
+/****************************************************************
+ * 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.webadmin.dto;
+
+import java.time.Instant;
+
+import org.apache.james.JsonSerializationVerifier;
+import org.apache.james.backends.cassandra.migration.MigrationTask;
+import org.apache.james.backends.cassandra.migration.MigrationTaskAdditionalInformationDTO;
+import org.apache.james.backends.cassandra.versions.SchemaVersion;
+import org.junit.jupiter.api.Test;
+
+class WebAdminMigrationTaskSerializationTest {
+    private static final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"cassandra-migration\", \"toVersion\": 12, \"timestamp\": \"2018-11-13T12:00:55Z\"}";
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+
+    @Test
+    void additionalInformationShouldBeSerializable() throws Exception {
+        JsonSerializationVerifier.dtoModule(WebAdminMigrationTaskAdditionalInformationDTO.serializationModule())
+            .bean(new MigrationTask.AdditionalInformation(new SchemaVersion(12), TIMESTAMP))
+            .json(SERIALIZED_ADDITIONAL_INFORMATION)
+            .verify();
+    }
+}
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java b/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java
index 5d5d4e5..ddf52e4 100644
--- a/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java
@@ -41,13 +41,16 @@ import org.apache.james.backends.cassandra.migration.CassandraMigrationService;
 import org.apache.james.backends.cassandra.migration.CassandraSchemaTransitions;
 import org.apache.james.backends.cassandra.migration.Migration;
 import org.apache.james.backends.cassandra.migration.MigrationTask;
+import org.apache.james.backends.cassandra.migration.MigrationTaskAdditionalInformationDTO;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionDAO;
 import org.apache.james.backends.cassandra.versions.SchemaTransition;
 import org.apache.james.backends.cassandra.versions.SchemaVersion;
+import org.apache.james.json.DTOConverter;
 import org.apache.james.task.Hostname;
 import org.apache.james.task.MemoryTaskManager;
 import org.apache.james.webadmin.WebAdminServer;
 import org.apache.james.webadmin.WebAdminUtils;
+import org.apache.james.webadmin.dto.WebAdminMigrationTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.utils.JsonTransformer;
 import org.eclipse.jetty.http.HttpStatus;
 import org.junit.After;
@@ -87,7 +90,8 @@ public class CassandraMigrationRoutesTest {
         webAdminServer = WebAdminUtils.createWebAdminServer(
                 new CassandraMigrationRoutes(new CassandraMigrationService(schemaVersionDAO, transitions, version -> new MigrationTask(schemaVersionDAO, transitions, version), LATEST_VERSION),
                     taskManager, jsonTransformer),
-                new TasksRoutes(taskManager, jsonTransformer))
+                new TasksRoutes(taskManager, jsonTransformer,
+                    DTOConverter.of(WebAdminMigrationTaskAdditionalInformationDTO.serializationModule())))
             .start();
 
         RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer)
diff --git a/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/SolveMessageInconsistenciesRequestToTaskTest.java b/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/SolveMessageInconsistenciesRequestToTaskTest.java
index 01cb39d..00ccadd 100644
--- a/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/SolveMessageInconsistenciesRequestToTaskTest.java
+++ b/server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/SolveMessageInconsistenciesRequestToTaskTest.java
@@ -27,7 +27,9 @@ import static org.hamcrest.Matchers.notNullValue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 
+import org.apache.james.json.DTOConverter;
 import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesService;
+import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesTaskAdditionalInformationDTO;
 import org.apache.james.task.Hostname;
 import org.apache.james.task.MemoryTaskManager;
 import org.apache.james.task.Task;
@@ -89,7 +91,7 @@ public class SolveMessageInconsistenciesRequestToTaskTest {
         Mockito.when(service.fixMessageInconsistencies(any(), any())).thenReturn(Mono.just(Task.Result.COMPLETED));
 
         webAdminServer = WebAdminUtils.createWebAdminServer(
-            new TasksRoutes(taskManager, jsonTransformer),
+            new TasksRoutes(taskManager, jsonTransformer, DTOConverter.of(SolveMessageInconsistenciesTaskAdditionalInformationDTO.MODULE)),
             new JMAPRoutes(
                 service,
                 taskManager))
diff --git a/server/protocols/webadmin/webadmin-core/pom.xml b/server/protocols/webadmin/webadmin-core/pom.xml
index 2d80ae4..1f28dee 100644
--- a/server/protocols/webadmin/webadmin-core/pom.xml
+++ b/server/protocols/webadmin/webadmin-core/pom.xml
@@ -70,6 +70,10 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-task-json</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-task-memory</artifactId>
             <scope>test</scope>
         </dependency>
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/dto/ExecutionDetailsDto.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/dto/ExecutionDetailsDto.java
index 413a525..8e25de7 100644
--- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/dto/ExecutionDetailsDto.java
+++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/dto/ExecutionDetailsDto.java
@@ -24,6 +24,8 @@ import java.util.List;
 import java.util.Optional;
 import java.util.UUID;
 
+import org.apache.james.json.DTOConverter;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
 import org.apache.james.task.Hostname;
 import org.apache.james.task.TaskExecutionDetails;
 
@@ -32,20 +34,28 @@ import com.fasterxml.jackson.annotation.JsonInclude;
 import com.github.steveash.guavate.Guavate;
 
 public class ExecutionDetailsDto {
-    public static List<ExecutionDetailsDto> from(List<TaskExecutionDetails> tasksDetails) {
+    public static List<ExecutionDetailsDto> from(DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter,
+                                                 List<TaskExecutionDetails> tasksDetails) {
         return tasksDetails.stream()
-            .map(ExecutionDetailsDto::new)
+            .map(details -> ExecutionDetailsDto.from(additionalInformationConverter, details))
             .collect(Guavate.toImmutableList());
     }
 
-    public static ExecutionDetailsDto from(TaskExecutionDetails taskDetails) {
-        return new ExecutionDetailsDto(taskDetails);
+    public static ExecutionDetailsDto from(DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationConverter,
+                                           TaskExecutionDetails taskDetails) {
+
+        return new ExecutionDetailsDto(taskDetails,
+            taskDetails.getAdditionalInformation()
+                .flatMap(additionalInformationConverter::toDTO));
     }
 
     private final TaskExecutionDetails executionDetails;
+    private final Optional<AdditionalInformationDTO> additionalInformation;
 
-    private ExecutionDetailsDto(TaskExecutionDetails executionDetails) {
+    private ExecutionDetailsDto(TaskExecutionDetails executionDetails,
+                                Optional<AdditionalInformationDTO> additionalInformation) {
         this.executionDetails = executionDetails;
+        this.additionalInformation = additionalInformation;
     }
 
     public UUID getTaskId() {
@@ -74,8 +84,8 @@ public class ExecutionDetailsDto {
             .map(Hostname::asString);
     }
 
-    public Optional<TaskExecutionDetails.AdditionalInformation> getAdditionalInformation() {
-        return executionDetails.getAdditionalInformation();
+    public Optional<AdditionalInformationDTO> getAdditionalInformation() {
+        return additionalInformation;
     }
 
     @JsonInclude(JsonInclude.Include.NON_ABSENT)
diff --git a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/TasksRoutes.java b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/TasksRoutes.java
index 231388a..9316ad7 100644
--- a/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/TasksRoutes.java
+++ b/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/TasksRoutes.java
@@ -31,6 +31,8 @@ import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 
+import org.apache.james.json.DTOConverter;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
 import org.apache.james.task.TaskExecutionDetails;
 import org.apache.james.task.TaskId;
 import org.apache.james.task.TaskManager;
@@ -60,14 +62,17 @@ import spark.Service;
 @Produces("application/json")
 public class TasksRoutes implements Routes {
     private static final Duration MAXIMUM_AWAIT_TIMEOUT = Duration.ofDays(365);
+    public static final String BASE = "/tasks";
+
     private final TaskManager taskManager;
     private final JsonTransformer jsonTransformer;
-    public static final String BASE = "/tasks";
+    private final DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationDTOConverter;
 
     @Inject
-    public TasksRoutes(TaskManager taskManager, JsonTransformer jsonTransformer) {
+    public TasksRoutes(TaskManager taskManager, JsonTransformer jsonTransformer, DTOConverter<TaskExecutionDetails.AdditionalInformation, AdditionalInformationDTO> additionalInformationDTOConverter) {
         this.taskManager = taskManager;
         this.jsonTransformer = jsonTransformer;
+        this.additionalInformationDTOConverter = additionalInformationDTOConverter;
     }
 
     @Override
@@ -105,7 +110,7 @@ public class TasksRoutes implements Routes {
     })
     public Object list(Request req, Response response) {
         try {
-            return ExecutionDetailsDto.from(
+            return ExecutionDetailsDto.from(additionalInformationDTOConverter,
                 Optional.ofNullable(req.queryParams("status"))
                 .map(TaskManager.Status::fromString)
                 .map(taskManager::list)
@@ -153,7 +158,7 @@ public class TasksRoutes implements Routes {
     private Object respondStatus(TaskId taskId, Supplier<TaskExecutionDetails> executionDetailsSupplier) {
         try {
             TaskExecutionDetails executionDetails = executionDetailsSupplier.get();
-            return ExecutionDetailsDto.from(executionDetails);
+            return ExecutionDetailsDto.from(additionalInformationDTOConverter, executionDetails);
         } catch (TaskNotFoundException e) {
             throw ErrorResponder.builder()
                 .message("%s can not be found", taskId.getValue())
diff --git a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/routes/TasksRoutesTest.java b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/routes/TasksRoutesTest.java
index c34baa4..acf53f7 100644
--- a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/routes/TasksRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/routes/TasksRoutesTest.java
@@ -33,6 +33,7 @@ import static org.hamcrest.Matchers.nullValue;
 import java.util.UUID;
 import java.util.concurrent.CountDownLatch;
 
+import org.apache.james.json.DTOConverter;
 import org.apache.james.task.Hostname;
 import org.apache.james.task.MemoryReferenceTask;
 import org.apache.james.task.MemoryTaskManager;
@@ -50,8 +51,8 @@ import org.junit.jupiter.api.Test;
 import io.restassured.RestAssured;
 
 class TasksRoutesTest {
+    private static final String HOSTNAME = "foo";
 
-    public static final String HOSTNAME = "foo";
     private MemoryTaskManager taskManager;
     private WebAdminServer webAdminServer;
     private CountDownLatch waitingForResultLatch;
@@ -60,7 +61,8 @@ class TasksRoutesTest {
     void setUp() {
         taskManager = new MemoryTaskManager(new Hostname(HOSTNAME));
 
-        webAdminServer = WebAdminUtils.createWebAdminServer(new TasksRoutes(taskManager, new JsonTransformer()))
+        webAdminServer = WebAdminUtils.createWebAdminServer(new TasksRoutes(taskManager, new JsonTransformer(),
+            DTOConverter.of()))
             .start();
 
         RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer)
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java
index 0a8a2e6..35e402e 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java
@@ -34,6 +34,7 @@ import org.apache.james.jmap.api.model.Preview;
 import org.apache.james.jmap.api.projections.MessageFastViewPrecomputedProperties;
 import org.apache.james.jmap.draft.utils.JsoupHtmlTextExtractor;
 import org.apache.james.jmap.memory.projections.MemoryMessageFastViewProjection;
+import org.apache.james.json.DTOConverter;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
@@ -119,7 +120,8 @@ class RecomputeAllFastViewProjectionItemsRequestToTaskTest {
         Preview.Factory previewFactory = new Preview.Factory(messageContentExtractor, htmlTextExtractor);
         MessageFastViewPrecomputedProperties.Factory projectionItemFactory = new MessageFastViewPrecomputedProperties.Factory(previewFactory);
         webAdminServer = WebAdminUtils.createWebAdminServer(
-            new TasksRoutes(taskManager, jsonTransformer),
+            new TasksRoutes(taskManager, jsonTransformer,
+                DTOConverter.of(RecomputeAllFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE)),
             new JMAPRoutes(
                 new MessageFastViewProjectionCorrector(usersRepository, mailboxManager, messageFastViewProjection, projectionItemFactory),
                 taskManager))
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTaskTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTaskTest.java
index 5a4d74a..91eabc8 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTaskTest.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTaskTest.java
@@ -35,6 +35,7 @@ import org.apache.james.jmap.api.model.Preview;
 import org.apache.james.jmap.api.projections.MessageFastViewPrecomputedProperties;
 import org.apache.james.jmap.draft.utils.JsoupHtmlTextExtractor;
 import org.apache.james.jmap.memory.projections.MemoryMessageFastViewProjection;
+import org.apache.james.json.DTOConverter;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
@@ -133,7 +134,8 @@ class RecomputeUserFastViewProjectionItemsRequestToTaskTest {
         Preview.Factory previewFactory = new Preview.Factory(messageContentExtractor, htmlTextExtractor);
         MessageFastViewPrecomputedProperties.Factory projectionItemFactory = new MessageFastViewPrecomputedProperties.Factory(previewFactory);
         webAdminServer = WebAdminUtils.createWebAdminServer(
-            new TasksRoutes(taskManager, jsonTransformer),
+            new TasksRoutes(taskManager, jsonTransformer,
+                DTOConverter.of(RecomputeUserFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE)),
             new JMAPRoutes(
                 new MessageFastViewProjectionCorrector(usersRepository, mailboxManager, messageFastViewProjection, projectionItemFactory),
                 taskManager, usersRepository))
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java
new file mode 100644
index 0000000..f387ecc
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java
@@ -0,0 +1,74 @@
+/****************************************************************
+ * 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.webadmin.vault.routes;
+
+import java.time.Instant;
+
+import org.apache.james.core.Username;
+import org.apache.james.json.DTOModule;
+import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO implements AdditionalInformationDTO {
+
+    public static AdditionalInformationDTOModule<DeletedMessagesVaultDeleteTask.AdditionalInformation, WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO> serializationModule(MessageId.Factory factory) {
+        return DTOModule.forDomainObject(DeletedMessagesVaultDeleteTask.AdditionalInformation.class)
+            .convertToDTO(WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.class)
+            .toDomainObjectConverter(dto -> new DeletedMessagesVaultDeleteTask.AdditionalInformation(Username.of(dto.username), factory.fromString(dto.getDeleteMessageId()), dto.getTimestamp()))
+            .toDTOConverter((details, type) -> new WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO(type, details.getUsername(), details.getDeleteMessageId(), details.timestamp()))
+            .typeName(DeletedMessagesVaultDeleteTask.TYPE.asString())
+            .withFactory(AdditionalInformationDTOModule::new);
+    }
+
+    private final String type;
+    private final String username;
+    private final String deleteMessageId;
+    private final Instant timestamp;
+
+    public WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO(@JsonProperty("type") String type,
+                                                                          @JsonProperty("username") String username,
+                                                                          @JsonProperty("deleteMessageId") String messageId,
+                                                                          @JsonProperty("timestamp") Instant timestamp) {
+        this.type = type;
+        this.username = username;
+        this.deleteMessageId = messageId;
+        this.timestamp = timestamp;
+    }
+
+    public String getDeleteMessageId() {
+        return deleteMessageId;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    @Override
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
+    @Override
+    public String getType() {
+        return type;
+    }
+}
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java
new file mode 100644
index 0000000..7e498ae
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java
@@ -0,0 +1,101 @@
+/**
+ * *************************************************************
+ * 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.webadmin.vault.routes;
+
+import java.time.Instant;
+
+import org.apache.james.core.Username;
+import org.apache.james.json.DTOModule;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO implements AdditionalInformationDTO {
+
+    private static WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO fromDomainObject(DeletedMessagesVaultRestoreTask.AdditionalInformation additionalInformation, String type) {
+        return new WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO(
+            type,
+            additionalInformation.getUsername(),
+            additionalInformation.getSuccessfulRestoreCount(),
+            additionalInformation.getErrorRestoreCount(),
+            additionalInformation.timestamp()
+        );
+    }
+
+    public static final AdditionalInformationDTOModule<DeletedMessagesVaultRestoreTask.AdditionalInformation, WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO> MODULE =
+        DTOModule
+            .forDomainObject(DeletedMessagesVaultRestoreTask.AdditionalInformation.class)
+            .convertToDTO(WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.class)
+            .toDomainObjectConverter(WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO::toDomainObject)
+            .toDTOConverter(WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO::fromDomainObject)
+            .typeName(DeletedMessagesVaultRestoreTask.TYPE.asString())
+            .withFactory(AdditionalInformationDTOModule::new);
+
+    private final String type;
+    private final String username;
+    private final Long successfulRestoreCount;
+    private final Long errorRestoreCount;
+    private final Instant timestamp;
+
+    public WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO(@JsonProperty("type") String type,
+                                                                           @JsonProperty("username") String username,
+                                                                           @JsonProperty("successfulRestoreCount") Long successfulRestoreCount,
+                                                                           @JsonProperty("errorRestoreCount") Long errorRestoreCount,
+                                                                           @JsonProperty("timestamp") Instant timestamp) {
+        this.type = type;
+        this.username = username;
+        this.successfulRestoreCount = successfulRestoreCount;
+        this.errorRestoreCount = errorRestoreCount;
+        this.timestamp = timestamp;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public Long getSuccessfulRestoreCount() {
+        return successfulRestoreCount;
+    }
+
+    public Long getErrorRestoreCount() {
+        return errorRestoreCount;
+    }
+
+    DeletedMessagesVaultRestoreTask.AdditionalInformation toDomainObject() {
+        return new DeletedMessagesVaultRestoreTask.AdditionalInformation(
+            Username.of(username),
+            successfulRestoreCount,
+            errorRestoreCount,
+            timestamp
+        );
+    }
+
+    @Override
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
+    @Override
+    public String getType() {
+        return type;
+    }
+}
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
index 4a4fc5a..c66f372 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
@@ -84,6 +84,7 @@ import org.apache.james.core.Username;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.domainlist.lib.DomainListConfiguration;
 import org.apache.james.domainlist.memory.MemoryDomainList;
+import org.apache.james.json.DTOConverter;
 import org.apache.james.mailbox.DefaultMailboxes;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
@@ -110,6 +111,7 @@ import org.apache.james.vault.DeletedMessageVault;
 import org.apache.james.vault.DeletedMessageZipper;
 import org.apache.james.vault.RetentionConfiguration;
 import org.apache.james.vault.blob.BlobStoreDeletedMessageVault;
+import org.apache.james.vault.blob.BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO;
 import org.apache.james.vault.blob.BucketNameGenerator;
 import org.apache.james.vault.dto.query.QueryTranslator;
 import org.apache.james.vault.memory.metadata.MemoryDeletedMessageMetadataVault;
@@ -193,7 +195,12 @@ class DeletedMessagesVaultRoutesTest {
         usersRepository = createUsersRepository();
         MessageId.Factory messageIdFactory = new InMemoryMessageId.Factory();
         webAdminServer = WebAdminUtils.createWebAdminServer(
-                new TasksRoutes(taskManager, jsonTransformer),
+                new TasksRoutes(taskManager, jsonTransformer,
+                    DTOConverter.of(
+                        WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.serializationModule(messageIdFactory),
+                        DeletedMessagesVaultExportTaskAdditionalInformationDTO.MODULE,
+                        WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.MODULE,
+                        BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.MODULE)),
                 new DeletedMessagesVaultRoutes(vault, vaultRestore, exportService, jsonTransformer, taskManager, queryTranslator, usersRepository, messageIdFactory))
             .start();
         RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer)
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultDeleteTaskSerializationTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultDeleteTaskSerializationTest.java
new file mode 100644
index 0000000..d02c2ce
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultDeleteTaskSerializationTest.java
@@ -0,0 +1,44 @@
+/****************************************************************
+ * 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.webadmin.vault.routes;
+
+import java.time.Instant;
+
+import org.apache.james.JsonSerializationVerifier;
+import org.apache.james.core.Username;
+import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.TestMessageId;
+import org.junit.jupiter.api.Test;
+
+class WebAdminDeletedMessagesVaultDeleteTaskSerializationTest {
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+
+    private final Username username = Username.of("james");
+    private final TestMessageId.Factory messageIdFactory = new TestMessageId.Factory();
+    private final MessageId messageId = messageIdFactory.generate();
+    private final String serializedAdditionalInformation = "{\"type\": \"deleted-messages-delete\", \"username\":\"james\", \"deleteMessageId\": \"" + messageId.serialize() + "\", \"timestamp\":\"2018-11-13T12:00:55Z\"}";
+
+    @Test
+    void additionalInformationShouldBeSerializable() throws Exception {
+        JsonSerializationVerifier.dtoModule(WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.serializationModule(messageIdFactory))
+            .bean(new DeletedMessagesVaultDeleteTask.AdditionalInformation(username, messageId, TIMESTAMP))
+            .json(serializedAdditionalInformation)
+            .verify();
+    }
+}
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultRestoreTaskSerializationTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultRestoreTaskSerializationTest.java
new file mode 100644
index 0000000..71e73d1
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultRestoreTaskSerializationTest.java
@@ -0,0 +1,41 @@
+/****************************************************************
+ * 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.webadmin.vault.routes;
+
+import java.time.Instant;
+
+import org.apache.james.JsonSerializationVerifier;
+import org.apache.james.core.Username;
+import org.junit.jupiter.api.Test;
+
+class WebAdminDeletedMessagesVaultRestoreTaskSerializationTest {
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+    private static final String USERNAME = "james";
+    private static final Username USERNAME_TO_RESTORE = Username.of(USERNAME);
+    private static final DeletedMessagesVaultRestoreTask.AdditionalInformation DETAILS = new DeletedMessagesVaultRestoreTask.AdditionalInformation(USERNAME_TO_RESTORE,42, 10, TIMESTAMP);
+    private static final String SERIALIZED_ADDITIONAL_INFORMATION_TASK = "{\"type\":\"deleted-messages-restore\", \"username\":\"james\",\"successfulRestoreCount\":42,\"errorRestoreCount\":10, \"timestamp\":\"2018-11-13T12:00:55Z\"}";
+
+    @Test
+    void additionalInformationShouldBeSerializable() throws Exception {
+        JsonSerializationVerifier.dtoModule(WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.MODULE)
+            .bean(DETAILS)
+            .json(SERIALIZED_ADDITIONAL_INFORMATION_TASK)
+            .verify();
+    }
+}
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-mailbox/pom.xml b/server/protocols/webadmin/webadmin-mailbox/pom.xml
index 44fd413..c4868ce 100644
--- a/server/protocols/webadmin/webadmin-mailbox/pom.xml
+++ b/server/protocols/webadmin/webadmin-mailbox/pom.xml
@@ -71,7 +71,6 @@
         <dependency>
             <groupId>${james.groupId}</groupId>
             <artifactId>apache-james-mailbox-tools-indexer</artifactId>
-            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SerializableReIndexingExecutionFailures.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/SerializableReIndexingExecutionFailures.java
similarity index 98%
rename from mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SerializableReIndexingExecutionFailures.java
rename to server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/SerializableReIndexingExecutionFailures.java
index 5c7c489..cd8fe9f 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SerializableReIndexingExecutionFailures.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/SerializableReIndexingExecutionFailures.java
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.mailbox.tools.indexer;
+package org.apache.james.webadmin.dto;
 
 import java.util.List;
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTO.java
new file mode 100644
index 0000000..0c67a50
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTO.java
@@ -0,0 +1,116 @@
+/****************************************************************
+ * 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.webadmin.dto;
+
+import java.time.Instant;
+
+import org.apache.commons.lang3.NotImplementedException;
+import org.apache.james.json.DTOModule;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+import org.apache.mailbox.tools.indexer.ErrorRecoveryIndexationTask;
+import org.apache.mailbox.tools.indexer.FullReindexingTask;
+import org.apache.mailbox.tools.indexer.ReprocessingContextInformationDTO;
+
+public class WebAdminReprocessingContextInformationDTO implements AdditionalInformationDTO {
+    public static class WebAdminErrorRecoveryIndexationDTO extends WebAdminReprocessingContextInformationDTO {
+        public static AdditionalInformationDTOModule<ReprocessingContextInformationDTO.ReprocessingContextInformationForErrorRecoveryIndexationTask, WebAdminErrorRecoveryIndexationDTO> serializationModule(MailboxId.Factory mailboxIdFactory) {
+            return DTOModule.forDomainObject(ReprocessingContextInformationDTO.ReprocessingContextInformationForErrorRecoveryIndexationTask.class)
+                .convertToDTO(WebAdminErrorRecoveryIndexationDTO.class)
+                .toDomainObjectConverter(dto -> {
+                    throw new NotImplementedException("Deserialization not implemented for this DTO");
+                })
+                .toDTOConverter((details, type) -> new WebAdminErrorRecoveryIndexationDTO(
+                    type,
+                    details.getSuccessfullyReprocessedMailCount(),
+                    details.getFailedReprocessedMailCount(),
+                    SerializableReIndexingExecutionFailures.from(details.failures()),
+                    details.timestamp()))
+                .typeName(ErrorRecoveryIndexationTask.PREVIOUS_FAILURES_INDEXING.asString())
+                .withFactory(AdditionalInformationDTOModule::new);
+        }
+
+        WebAdminErrorRecoveryIndexationDTO(String type, int successfullyReprocessedMailCount, int failedReprocessedMailCount,
+                                           SerializableReIndexingExecutionFailures failures, Instant timestamp) {
+            super(type, successfullyReprocessedMailCount, failedReprocessedMailCount, failures, timestamp);
+        }
+    }
+
+    public static class WebAdminFullIndexationDTO extends WebAdminReprocessingContextInformationDTO {
+        public static AdditionalInformationDTOModule<ReprocessingContextInformationDTO.ReprocessingContextInformationForFullReindexingTask, WebAdminFullIndexationDTO> serializationModule(MailboxId.Factory mailboxIdFactory) {
+            return DTOModule.forDomainObject(ReprocessingContextInformationDTO.ReprocessingContextInformationForFullReindexingTask.class)
+                .convertToDTO(WebAdminFullIndexationDTO.class)
+                .toDomainObjectConverter(dto -> {
+                    throw new NotImplementedException("Deserialization not implemented for this DTO");
+                })
+                .toDTOConverter((details, type) -> new WebAdminFullIndexationDTO(
+                    type,
+                    details.getSuccessfullyReprocessedMailCount(),
+                    details.getFailedReprocessedMailCount(),
+                    SerializableReIndexingExecutionFailures.from(details.failures()),
+                    details.timestamp()))
+                .typeName(FullReindexingTask.FULL_RE_INDEXING.asString())
+                .withFactory(AdditionalInformationDTOModule::new);
+        }
+
+        WebAdminFullIndexationDTO(String type, int successfullyReprocessedMailCount, int failedReprocessedMailCount,
+                                  SerializableReIndexingExecutionFailures failures, Instant timestamp) {
+            super(type, successfullyReprocessedMailCount, failedReprocessedMailCount, failures, timestamp);
+        }
+
+    }
+
+    protected final String type;
+    protected final int successfullyReprocessedMailCount;
+    protected final int failedReprocessedMailCount;
+    protected final SerializableReIndexingExecutionFailures failures;
+    protected final Instant timestamp;
+
+
+    WebAdminReprocessingContextInformationDTO(String type, int successfullyReprocessedMailCount, int failedReprocessedMailCount,
+                                              SerializableReIndexingExecutionFailures failures, Instant timestamp) {
+        this.type = type;
+        this.successfullyReprocessedMailCount = successfullyReprocessedMailCount;
+        this.failedReprocessedMailCount = failedReprocessedMailCount;
+        this.failures = failures;
+        this.timestamp = timestamp;
+    }
+
+    public int getSuccessfullyReprocessedMailCount() {
+        return successfullyReprocessedMailCount;
+    }
+
+    public int getFailedReprocessedMailCount() {
+        return failedReprocessedMailCount;
+    }
+
+    public SerializableReIndexingExecutionFailures getFailures() {
+        return failures;
+    }
+
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
+    @Override
+    public String getType() {
+        return type;
+    }
+}
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java
new file mode 100644
index 0000000..6574e7a
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java
@@ -0,0 +1,94 @@
+/****************************************************************
+ * 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.webadmin.dto;
+
+import java.time.Instant;
+
+import org.apache.commons.lang3.NotImplementedException;
+import org.apache.james.json.DTOModule;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+import org.apache.mailbox.tools.indexer.SingleMailboxReindexingTask;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO implements AdditionalInformationDTO {
+
+    public static AdditionalInformationDTOModule<SingleMailboxReindexingTask.AdditionalInformation, WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO> serializationModule(MailboxId.Factory factory) {
+        return DTOModule.forDomainObject(SingleMailboxReindexingTask.AdditionalInformation.class)
+            .convertToDTO(WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.class)
+            .toDomainObjectConverter(dto -> {
+                throw new NotImplementedException("Deserialization not implemented for this DTO");
+            })
+            .toDTOConverter((details, type) -> new WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO(
+                type,
+                details.getMailboxId(),
+                details.getSuccessfullyReprocessedMailCount(),
+                details.getFailedReprocessedMailCount(),
+                SerializableReIndexingExecutionFailures.from(details.failures()),
+                details.timestamp()))
+            .typeName(SingleMailboxReindexingTask.MAILBOX_RE_INDEXING.asString())
+            .withFactory(AdditionalInformationDTOModule::new);
+    }
+
+    private final WebAdminReprocessingContextInformationDTO reprocessingContextInformationDTO;
+    private final String mailboxId;
+
+    @JsonCreator
+    private WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO(@JsonProperty("type") String type,
+                                                                        @JsonProperty("mailboxId") String mailboxId,
+                                                                        @JsonProperty("successfullyReprocessedMailCount") int successfullyReprocessedMailCount,
+                                                                        @JsonProperty("failedReprocessedMailCount") int failedReprocessedMailCount,
+                                                                        @JsonProperty("failures") SerializableReIndexingExecutionFailures failures,
+                                                                        @JsonProperty("timestamp") Instant timestamp) {
+        this.mailboxId = mailboxId;
+        this.reprocessingContextInformationDTO = new WebAdminReprocessingContextInformationDTO(
+            type,
+            successfullyReprocessedMailCount,
+            failedReprocessedMailCount, failures,
+            timestamp);
+    }
+
+    @Override
+    public String getType() {
+        return reprocessingContextInformationDTO.getType();
+    }
+
+    public Instant getTimestamp() {
+        return reprocessingContextInformationDTO.getTimestamp();
+    }
+
+    public String getMailboxId() {
+        return mailboxId;
+    }
+
+    public int getSuccessfullyReprocessedMailCount() {
+        return reprocessingContextInformationDTO.getSuccessfullyReprocessedMailCount();
+    }
+
+    public int getFailedReprocessedMailCount() {
+        return reprocessingContextInformationDTO.getFailedReprocessedMailCount();
+    }
+
+    public SerializableReIndexingExecutionFailures getFailures() {
+        return reprocessingContextInformationDTO.getFailures();
+    }
+}
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminUserReindexingTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminUserReindexingTaskAdditionalInformationDTO.java
new file mode 100644
index 0000000..9d5c17a
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminUserReindexingTaskAdditionalInformationDTO.java
@@ -0,0 +1,93 @@
+/****************************************************************
+ * 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.webadmin.dto;
+
+import java.time.Instant;
+
+import org.apache.commons.lang3.NotImplementedException;
+import org.apache.james.json.DTOModule;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+import org.apache.mailbox.tools.indexer.UserReindexingTask;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class WebAdminUserReindexingTaskAdditionalInformationDTO implements AdditionalInformationDTO {
+
+    public static AdditionalInformationDTOModule<UserReindexingTask.AdditionalInformation, WebAdminUserReindexingTaskAdditionalInformationDTO> serializationModule(MailboxId.Factory factory) {
+        return DTOModule.forDomainObject(UserReindexingTask.AdditionalInformation.class)
+            .convertToDTO(WebAdminUserReindexingTaskAdditionalInformationDTO.class)
+            .toDomainObjectConverter(dto -> {
+                throw new NotImplementedException("Deserialization not implemented for this DTO");
+            })
+            .toDTOConverter((details, type) -> new WebAdminUserReindexingTaskAdditionalInformationDTO(
+                type,
+                details.getUsername(),
+                details.getSuccessfullyReprocessedMailCount(),
+                details.getFailedReprocessedMailCount(),
+                SerializableReIndexingExecutionFailures.from(details.failures()),
+                details.timestamp()))
+            .typeName(UserReindexingTask.USER_RE_INDEXING.asString())
+            .withFactory(AdditionalInformationDTOModule::new);
+    }
+
+    private final WebAdminReprocessingContextInformationDTO reprocessingContextInformationDTO;
+    private final String username;
+
+    @JsonCreator
+    private WebAdminUserReindexingTaskAdditionalInformationDTO(@JsonProperty("type") String type,
+                                                               @JsonProperty("username") String username,
+                                                               @JsonProperty("successfullyReprocessedMailCount") int successfullyReprocessedMailCount,
+                                                               @JsonProperty("failedReprocessedMailCount") int failedReprocessedMailCount,
+                                                               @JsonProperty("failures") SerializableReIndexingExecutionFailures failures,
+                                                               @JsonProperty("timestamp") Instant timestamp) {
+        this.username = username;
+        this.reprocessingContextInformationDTO = new WebAdminReprocessingContextInformationDTO(
+            type,
+            successfullyReprocessedMailCount,
+            failedReprocessedMailCount, failures, timestamp);
+    }
+
+    @Override
+    public String getType() {
+        return reprocessingContextInformationDTO.getType();
+    }
+
+    public Instant getTimestamp() {
+        return reprocessingContextInformationDTO.getTimestamp();
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public int getSuccessfullyReprocessedMailCount() {
+        return reprocessingContextInformationDTO.getSuccessfullyReprocessedMailCount();
+    }
+
+    public int getFailedReprocessedMailCount() {
+        return reprocessingContextInformationDTO.getFailedReprocessedMailCount();
+    }
+
+    public SerializableReIndexingExecutionFailures getFailures() {
+        return reprocessingContextInformationDTO.getFailures();
+    }
+}
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SerializableReIndexingExecutionFailuresTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/SerializableReIndexingExecutionFailuresTest.java
similarity index 98%
rename from mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SerializableReIndexingExecutionFailuresTest.java
rename to server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/SerializableReIndexingExecutionFailuresTest.java
index 5ef546a..e9ad633 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SerializableReIndexingExecutionFailuresTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/SerializableReIndexingExecutionFailuresTest.java
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.mailbox.tools.indexer;
+package org.apache.james.webadmin.dto;
 
 import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTOTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTOTest.java
new file mode 100644
index 0000000..c8d25af
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTOTest.java
@@ -0,0 +1,111 @@
+/****************************************************************
+ * 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.webadmin.dto;
+
+import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.time.Instant;
+import java.util.List;
+
+import org.apache.james.json.JsonGenericSerializer;
+import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.indexer.ReIndexer;
+import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
+import org.apache.james.mailbox.model.TestId;
+import org.apache.mailbox.tools.indexer.ReprocessingContextInformationDTO;
+import org.junit.jupiter.api.Test;
+
+import com.fasterxml.jackson.databind.exc.InvalidDefinitionException;
+import com.google.common.collect.ImmutableList;
+
+class WebAdminReprocessingContextInformationDTOTest {
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+
+    private final String serializedErrorRecoveryAdditionalInformation = "{\"type\":\"error-recovery-indexation\",\"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]},\"timestamp\":\"2018-11-13T12:00:55Z\"}";
+    private final String serializedFullAdditionalInformation = "{\"type\":\"full-reindexing\",\"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]},\"timestamp\":\"2018-11-13T12:00:55Z\"}";
+
+    private final TestId mailboxId = TestId.of(1L);
+    private final MessageUid messageUid = MessageUid.of(10L);
+    private final ReIndexingExecutionFailures.ReIndexingFailure indexingFailure = new ReIndexingExecutionFailures.ReIndexingFailure(mailboxId, messageUid);
+    private final TestId mailboxId2 = TestId.of(2L);
+    private final MessageUid messageUid2 = MessageUid.of(20L);
+    private final ReIndexingExecutionFailures.ReIndexingFailure indexingFailure2 = new ReIndexingExecutionFailures.ReIndexingFailure(mailboxId2, messageUid2);
+    private final List<ReIndexingExecutionFailures.ReIndexingFailure> failures = ImmutableList.of(indexingFailure, indexingFailure2);
+    private final ReIndexingExecutionFailures executionFailures = new ReIndexingExecutionFailures(failures);
+
+    @Test
+    void shouldSerializeErrorRecoveryAdditionalInformation() throws Exception {
+        ReprocessingContextInformationDTO.ReprocessingContextInformationForErrorRecoveryIndexationTask domainObject =
+            new ReprocessingContextInformationDTO.ReprocessingContextInformationForErrorRecoveryIndexationTask(
+                42,
+                2,
+                executionFailures,
+                TIMESTAMP,
+                ReIndexer.RunningOptions.DEFAULT);
+
+        String json =
+            JsonGenericSerializer.forModules(WebAdminReprocessingContextInformationDTO.WebAdminErrorRecoveryIndexationDTO
+                .serializationModule(new TestId.Factory()))
+                .withoutNestedType()
+                .serialize(domainObject);
+
+        assertThatJson(json)
+            .isEqualTo(serializedErrorRecoveryAdditionalInformation);
+    }
+
+    @Test
+    void deserializeErrorRecoveryShouldNotBeSupported() {
+        assertThatThrownBy(() -> JsonGenericSerializer.forModules(WebAdminReprocessingContextInformationDTO.WebAdminErrorRecoveryIndexationDTO
+            .serializationModule(new TestId.Factory()))
+            .withoutNestedType()
+            .deserialize(serializedErrorRecoveryAdditionalInformation))
+            .isInstanceOf(InvalidDefinitionException.class);
+    }
+
+    @Test
+    void shouldSerializeFullAdditionalInformation() throws Exception {
+        ReprocessingContextInformationDTO.ReprocessingContextInformationForFullReindexingTask domainObject =
+            new ReprocessingContextInformationDTO.ReprocessingContextInformationForFullReindexingTask(
+                42,
+                2,
+                executionFailures,
+                TIMESTAMP,
+                ReIndexer.RunningOptions.DEFAULT);
+
+        String json =
+            JsonGenericSerializer.forModules(WebAdminReprocessingContextInformationDTO.WebAdminFullIndexationDTO
+                .serializationModule(new TestId.Factory()))
+                .withoutNestedType()
+                .serialize(domainObject);
+
+        assertThatJson(json)
+            .isEqualTo(serializedFullAdditionalInformation);
+    }
+
+    @Test
+    void deserializeFullShouldNotBeSupported() {
+        assertThatThrownBy(() -> JsonGenericSerializer.forModules(WebAdminReprocessingContextInformationDTO.WebAdminFullIndexationDTO
+            .serializationModule(new TestId.Factory()))
+            .withoutNestedType()
+            .deserialize(serializedFullAdditionalInformation))
+            .isInstanceOf(InvalidDefinitionException.class);
+    }
+}
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReprocessingDTOTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReprocessingDTOTest.java
new file mode 100644
index 0000000..30bd411
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReprocessingDTOTest.java
@@ -0,0 +1,82 @@
+/****************************************************************
+ * 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.webadmin.dto;
+
+import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.time.Instant;
+import java.util.List;
+
+import org.apache.james.json.JsonGenericSerializer;
+import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.indexer.ReIndexer;
+import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
+import org.apache.james.mailbox.model.TestId;
+import org.apache.mailbox.tools.indexer.ReprocessingContextInformationDTO;
+import org.apache.mailbox.tools.indexer.SingleMailboxReindexingTask;
+import org.junit.jupiter.api.Test;
+
+import com.fasterxml.jackson.databind.exc.InvalidDefinitionException;
+import com.google.common.collect.ImmutableList;
+
+class WebAdminSingleMailboxReprocessingDTOTest {
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+
+    private final String serializedAdditionalInformation = "{\"type\":\"mailbox-reindexing\",\"mailboxId\":\"1\",\"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]},\"timestamp\":\"2018-11-13T12:00:55Z\"}";
+
+    private final TestId mailboxId = TestId.of(1L);
+    private final MessageUid messageUid = MessageUid.of(10L);
+    private final ReIndexingExecutionFailures.ReIndexingFailure indexingFailure = new ReIndexingExecutionFailures.ReIndexingFailure(mailboxId, messageUid);
+    private final TestId mailboxId2 = TestId.of(2L);
+    private final MessageUid messageUid2 = MessageUid.of(20L);
+    private final ReIndexingExecutionFailures.ReIndexingFailure indexingFailure2 = new ReIndexingExecutionFailures.ReIndexingFailure(mailboxId2, messageUid2);
+    private final List<ReIndexingExecutionFailures.ReIndexingFailure> failures = ImmutableList.of(indexingFailure, indexingFailure2);
+    private final ReIndexingExecutionFailures executionFailures = new ReIndexingExecutionFailures(failures);
+
+    @Test
+    void shouldSerializeAdditionalInformation() throws Exception {
+        SingleMailboxReindexingTask.AdditionalInformation domainObject =
+            new SingleMailboxReindexingTask.AdditionalInformation(
+                mailboxId,
+                42,
+                2,
+                executionFailures,
+                TIMESTAMP,
+                ReIndexer.RunningOptions.DEFAULT);
+
+        String json =
+            JsonGenericSerializer.forModules(WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO
+                .serializationModule(new TestId.Factory()))
+                .withoutNestedType()
+                .serialize(domainObject);
+
+        assertThatJson(json)
+            .isEqualTo(serializedAdditionalInformation);
+    }
+
+    @Test
+    void deserializeShouldNotBeSupported() {
+        assertThatThrownBy(() -> JsonGenericSerializer.forModules(WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO
+            .serializationModule(new TestId.Factory()))
+            .withoutNestedType()
+            .deserialize(serializedAdditionalInformation))
+            .isInstanceOf(InvalidDefinitionException.class);
+    }
+}
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminUserReprocessingDTOTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminUserReprocessingDTOTest.java
new file mode 100644
index 0000000..9ea55a7
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminUserReprocessingDTOTest.java
@@ -0,0 +1,83 @@
+/****************************************************************
+ * 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.webadmin.dto;
+
+import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.time.Instant;
+import java.util.List;
+
+import org.apache.james.core.Username;
+import org.apache.james.json.JsonGenericSerializer;
+import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.indexer.ReIndexer;
+import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
+import org.apache.james.mailbox.model.TestId;
+import org.apache.mailbox.tools.indexer.SingleMailboxReindexingTask;
+import org.apache.mailbox.tools.indexer.UserReindexingTask;
+import org.junit.jupiter.api.Test;
+
+import com.fasterxml.jackson.databind.exc.InvalidDefinitionException;
+import com.google.common.collect.ImmutableList;
+
+class WebAdminUserReprocessingDTOTest {
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+
+    private final String serializedAdditionalInformation = "{\"type\":\"user-reindexing\",\"username\":\"bob\",\"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]},\"timestamp\":\"2018-11-13T12:00:55Z\"}";
+
+    private final TestId mailboxId = TestId.of(1L);
+    private final MessageUid messageUid = MessageUid.of(10L);
+    private final ReIndexingExecutionFailures.ReIndexingFailure indexingFailure = new ReIndexingExecutionFailures.ReIndexingFailure(mailboxId, messageUid);
+    private final TestId mailboxId2 = TestId.of(2L);
+    private final MessageUid messageUid2 = MessageUid.of(20L);
+    private final ReIndexingExecutionFailures.ReIndexingFailure indexingFailure2 = new ReIndexingExecutionFailures.ReIndexingFailure(mailboxId2, messageUid2);
+    private final List<ReIndexingExecutionFailures.ReIndexingFailure> failures = ImmutableList.of(indexingFailure, indexingFailure2);
+    private final ReIndexingExecutionFailures executionFailures = new ReIndexingExecutionFailures(failures);
+
+    @Test
+    void shouldSerializeAdditionalInformation() throws Exception {
+        UserReindexingTask.AdditionalInformation domainObject =
+            new UserReindexingTask.AdditionalInformation(
+                Username.of("bob"),
+                42,
+                2,
+                executionFailures,
+                TIMESTAMP,
+                ReIndexer.RunningOptions.DEFAULT);
+
+        String json =
+            JsonGenericSerializer.forModules(WebAdminUserReindexingTaskAdditionalInformationDTO
+                .serializationModule(new TestId.Factory()))
+                .withoutNestedType()
+                .serialize(domainObject);
+
+        assertThatJson(json)
+            .isEqualTo(serializedAdditionalInformation);
+    }
+
+    @Test
+    void deserializeShouldNotBeSupported() {
+        assertThatThrownBy(() -> JsonGenericSerializer.forModules(WebAdminUserReindexingTaskAdditionalInformationDTO
+            .serializationModule(new TestId.Factory()))
+            .withoutNestedType()
+            .deserialize(serializedAdditionalInformation))
+            .isInstanceOf(InvalidDefinitionException.class);
+    }
+}
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/EventDeadLettersRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/EventDeadLettersRoutesTest.java
index f5b0c4f..eb08117 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/EventDeadLettersRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/EventDeadLettersRoutesTest.java
@@ -33,6 +33,7 @@ import static org.hamcrest.Matchers.nullValue;
 
 import org.apache.james.core.Username;
 import org.apache.james.event.json.EventSerializer;
+import org.apache.james.json.DTOConverter;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.events.Event;
 import org.apache.james.mailbox.events.EventBus;
@@ -59,6 +60,9 @@ import org.apache.james.webadmin.service.EventDeadLettersRedeliverAllTask;
 import org.apache.james.webadmin.service.EventDeadLettersRedeliverGroupTask;
 import org.apache.james.webadmin.service.EventDeadLettersRedeliverOneTask;
 import org.apache.james.webadmin.service.EventDeadLettersRedeliverService;
+import org.apache.james.webadmin.service.EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForAll;
+import org.apache.james.webadmin.service.EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForGroup;
+import org.apache.james.webadmin.service.EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForOne;
 import org.apache.james.webadmin.service.EventDeadLettersService;
 import org.apache.james.webadmin.utils.ErrorResponder;
 import org.apache.james.webadmin.utils.JsonTransformer;
@@ -123,7 +127,10 @@ class EventDeadLettersRoutesTest {
         taskManager = new MemoryTaskManager(new Hostname("foo"));
         webAdminServer = WebAdminUtils.createWebAdminServer(
                 new EventDeadLettersRoutes(service, eventSerializer, taskManager, jsonTransformer),
-                new TasksRoutes(taskManager, jsonTransformer))
+                new TasksRoutes(taskManager, jsonTransformer,
+                    DTOConverter.of(EventDeadLettersRedeliveryTaskAdditionalInformationForOne.MODULE,
+                        EventDeadLettersRedeliveryTaskAdditionalInformationForGroup.MODULE,
+                        EventDeadLettersRedeliveryTaskAdditionalInformationForAll.MODULE)))
             .start();
 
         RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer).build();
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesNoTasksTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesNoTasksTest.java
index 2a3b1d1..915454f 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesNoTasksTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesNoTasksTest.java
@@ -21,6 +21,7 @@ package org.apache.james.webadmin.routes;
 
 import static io.restassured.RestAssured.when;
 
+import org.apache.james.json.DTOConverter;
 import org.apache.james.task.Hostname;
 import org.apache.james.task.MemoryTaskManager;
 import org.apache.james.webadmin.WebAdminServer;
@@ -49,7 +50,7 @@ class MailboxesRoutesNoTasksTest {
         JsonTransformer jsonTransformer = new JsonTransformer();
 
         webAdminServer = WebAdminUtils.createWebAdminServer(
-                new TasksRoutes(taskManager, jsonTransformer),
+                new TasksRoutes(taskManager, jsonTransformer, DTOConverter.of()),
                 new MailboxesRoutes(taskManager,
                     jsonTransformer,
                     NO_ADDITIONAL_REGISTRATION,
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
index c8c29cc..56a2290 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
@@ -33,6 +33,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 
 import org.apache.james.core.Username;
+import org.apache.james.json.DTOConverter;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.indexer.ReIndexer;
@@ -49,15 +50,24 @@ import org.apache.james.task.Hostname;
 import org.apache.james.task.MemoryTaskManager;
 import org.apache.james.webadmin.WebAdminServer;
 import org.apache.james.webadmin.WebAdminUtils;
+import org.apache.james.webadmin.dto.WebAdminReprocessingContextInformationDTO;
+import org.apache.james.webadmin.dto.WebAdminReprocessingContextInformationDTO.WebAdminErrorRecoveryIndexationDTO;
+import org.apache.james.webadmin.dto.WebAdminReprocessingContextInformationDTO.WebAdminFullIndexationDTO;
+import org.apache.james.webadmin.dto.WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.service.PreviousReIndexingService;
 import org.apache.james.webadmin.utils.ErrorResponder;
 import org.apache.james.webadmin.utils.JsonTransformer;
 import org.apache.mailbox.tools.indexer.FullReindexingTask;
 import org.apache.mailbox.tools.indexer.ReIndexerImpl;
 import org.apache.mailbox.tools.indexer.ReIndexerPerformer;
+import org.apache.mailbox.tools.indexer.ReprocessingContextInformationDTO.ReprocessingContextInformationForErrorRecoveryIndexationTask;
+import org.apache.mailbox.tools.indexer.ReprocessingContextInformationDTO.ReprocessingContextInformationForFullReindexingTask;
 import org.apache.mailbox.tools.indexer.SingleMailboxReindexingTask;
+import org.apache.mailbox.tools.indexer.SingleMailboxReindexingTaskAdditionalInformationDTO;
 import org.apache.mailbox.tools.indexer.SingleMessageReindexingTask;
+import org.apache.mailbox.tools.indexer.SingleMessageReindexingTaskAdditionalInformationDTO;
 import org.eclipse.jetty.http.HttpStatus;
+import org.hamcrest.Matchers;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
@@ -97,7 +107,12 @@ class MailboxesRoutesTest {
         JsonTransformer jsonTransformer = new JsonTransformer();
 
         webAdminServer = WebAdminUtils.createWebAdminServer(
-                new TasksRoutes(taskManager, jsonTransformer),
+                new TasksRoutes(taskManager, jsonTransformer,
+                    DTOConverter.of(
+                        WebAdminErrorRecoveryIndexationDTO.serializationModule(mailboxIdFactory),
+                        WebAdminFullIndexationDTO.serializationModule(mailboxIdFactory),
+                        WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory),
+                        SingleMessageReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory))),
                 new MailboxesRoutes(taskManager,
                     jsonTransformer,
                     ImmutableSet.of(
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MessageRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MessageRoutesTest.java
index 45c4d98..bd24736 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MessageRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MessageRoutesTest.java
@@ -30,6 +30,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 
 import org.apache.james.core.Username;
+import org.apache.james.json.DTOConverter;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
@@ -48,6 +49,7 @@ import org.apache.james.webadmin.utils.ErrorResponder;
 import org.apache.james.webadmin.utils.JsonTransformer;
 import org.apache.mailbox.tools.indexer.MessageIdReIndexerImpl;
 import org.apache.mailbox.tools.indexer.MessageIdReIndexingTask;
+import org.apache.mailbox.tools.indexer.MessageIdReindexingTaskAdditionalInformationDTO;
 import org.apache.mailbox.tools.indexer.ReIndexerPerformer;
 import org.eclipse.jetty.http.HttpStatus;
 import org.junit.jupiter.api.AfterEach;
@@ -85,7 +87,9 @@ class MessageRoutesTest {
         JsonTransformer jsonTransformer = new JsonTransformer();
 
         webAdminServer = WebAdminUtils.createWebAdminServer(
-                new TasksRoutes(taskManager, jsonTransformer),
+                new TasksRoutes(taskManager, jsonTransformer,
+                    DTOConverter.of(
+                        MessageIdReindexingTaskAdditionalInformationDTO.serializationModule(mailboxManager.getMessageIdFactory()))),
                 new MessagesRoutes(taskManager,
                     new InMemoryMessageId.Factory(),
                     new MessageIdReIndexerImpl(reIndexerPerformer),
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesNoIndexationTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesNoIndexationTest.java
index bd8b402..71cf564 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesNoIndexationTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesNoIndexationTest.java
@@ -26,6 +26,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import org.apache.james.core.Username;
+import org.apache.james.json.DTOConverter;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.task.Hostname;
@@ -65,7 +66,7 @@ class UserMailboxesRoutesNoIndexationTest {
             new UserMailboxesRoutes(new UserMailboxesService(mailboxManager, usersRepository), new JsonTransformer(),
                 taskManager,
                 ImmutableSet.of()),
-            new TasksRoutes(taskManager, new JsonTransformer()))
+            new TasksRoutes(taskManager, new JsonTransformer(), DTOConverter.of()))
             .start();
 
         RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer)
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
index 5dd021b..2818968 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
@@ -46,6 +46,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.james.core.Username;
+import org.apache.james.json.DTOConverter;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
@@ -71,6 +72,7 @@ import org.apache.james.task.MemoryTaskManager;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.webadmin.WebAdminServer;
 import org.apache.james.webadmin.WebAdminUtils;
+import org.apache.james.webadmin.dto.WebAdminUserReindexingTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.service.UserMailboxesService;
 import org.apache.james.webadmin.utils.JsonTransformer;
 import org.apache.mailbox.tools.indexer.ReIndexerImpl;
@@ -103,7 +105,7 @@ class UserMailboxesRoutesTest {
     private ListeningMessageSearchIndex searchIndex;
     private MemoryTaskManager taskManager;
 
-    private void createServer(MailboxManager mailboxManager, MailboxSessionMapperFactory mapperFactory) throws Exception {
+    private void createServer(MailboxManager mailboxManager, MailboxSessionMapperFactory mapperFactory, MailboxId.Factory mailboxIdFactory) throws Exception {
         usersRepository = mock(UsersRepository.class);
         when(usersRepository.contains(USERNAME)).thenReturn(true);
 
@@ -125,7 +127,8 @@ class UserMailboxesRoutesTest {
                 new UserMailboxesRoutes(new UserMailboxesService(mailboxManager, usersRepository), new JsonTransformer(),
                     taskManager,
                     ImmutableSet.of(new UserMailboxesRoutes.UserReIndexingTaskRegistration(reIndexer))),
-                new TasksRoutes(taskManager, new JsonTransformer()))
+                new TasksRoutes(taskManager, new JsonTransformer(),
+                    DTOConverter.of(WebAdminUserReindexingTaskAdditionalInformationDTO.serializationModule(mailboxIdFactory))))
             .start();
 
         RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer)
@@ -145,7 +148,7 @@ class UserMailboxesRoutesTest {
         @BeforeEach
         void setUp() throws Exception {
             InMemoryMailboxManager mailboxManager = InMemoryIntegrationResources.defaultResources().getMailboxManager();
-            createServer(mailboxManager, mailboxManager.getMapperFactory());
+            createServer(mailboxManager, mailboxManager.getMapperFactory(), new InMemoryId.Factory());
         }
 
         @Test
@@ -854,7 +857,7 @@ class UserMailboxesRoutesTest {
             mailboxManager = mock(MailboxManager.class);
             when(mailboxManager.createSystemSession(any())).thenReturn(MailboxSessionUtil.create(USERNAME));
 
-            createServer(mailboxManager, mock(MailboxSessionMapperFactory.class));
+            createServer(mailboxManager, mock(MailboxSessionMapperFactory.class), new InMemoryId.Factory());
         }
 
         @Test
@@ -1112,7 +1115,7 @@ class UserMailboxesRoutesTest {
         @BeforeEach
         void setUp() throws Exception {
             mailboxManager = InMemoryIntegrationResources.defaultResources().getMailboxManager();
-            createServer(mailboxManager, mailboxManager.getMapperFactory());
+            createServer(mailboxManager, mailboxManager.getMapperFactory(), new InMemoryId.Factory());
         }
 
         @Nested
@@ -1176,9 +1179,9 @@ class UserMailboxesRoutesTest {
 
                 given()
                     .basePath(TasksRoutes.BASE)
-                    .when()
+                .when()
                     .get(taskId + "/await")
-                    .then()
+                .then()
                     .body("status", Matchers.is("completed"))
                     .body("taskId", Matchers.is(notNullValue()))
                     .body("type", Matchers.is(UserReindexingTask.USER_RE_INDEXING.asString()))
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/WebAdminQuotaSearchTestSystem.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/WebAdminQuotaSearchTestSystem.java
index b315dbc..a84d9f7 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/WebAdminQuotaSearchTestSystem.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/WebAdminQuotaSearchTestSystem.java
@@ -23,7 +23,9 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import org.apache.james.json.DTOConverter;
 import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasService;
+import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasTaskAdditionalInformationDTO;
 import org.apache.james.quota.search.QuotaSearchTestSystem;
 import org.apache.james.task.Hostname;
 import org.apache.james.task.MemoryTaskManager;
@@ -60,7 +62,8 @@ public class WebAdminQuotaSearchTestSystem {
         TaskManager taskManager = new MemoryTaskManager(new Hostname("foo"));
         RecomputeCurrentQuotasService mock = mock(RecomputeCurrentQuotasService.class);
         when(mock.recomputeCurrentQuotas(any(), any())).thenReturn(Mono.just(Task.Result.COMPLETED));
-        TasksRoutes tasksRoutes = new TasksRoutes(taskManager, new JsonTransformer());
+        TasksRoutes tasksRoutes = new TasksRoutes(taskManager, new JsonTransformer(),
+            DTOConverter.of(RecomputeCurrentQuotasTaskAdditionalInformationDTO.MODULE));
         UserQuotaRoutes userQuotaRoutes = new UserQuotaRoutes(quotaSearchTestSystem.getUsersRepository(),
             userQuotaService,
             jsonTransformer,
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/MailboxesExportRequestToTaskTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/MailboxesExportRequestToTaskTest.java
index 0e856dc..e518170 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/MailboxesExportRequestToTaskTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/MailboxesExportRequestToTaskTest.java
@@ -37,6 +37,7 @@ import java.util.Optional;
 
 import org.apache.james.blob.export.file.FileSystemExtension;
 import org.apache.james.filesystem.api.FileSystem;
+import org.apache.james.json.DTOConverter;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.backup.ZipAssert;
@@ -111,7 +112,8 @@ class MailboxesExportRequestToTaskTest {
 
         JsonTransformer jsonTransformer = new JsonTransformer();
         webAdminServer = WebAdminUtils.createWebAdminServer(
-            new TasksRoutes(taskManager, jsonTransformer),
+            new TasksRoutes(taskManager, jsonTransformer,
+                DTOConverter.of(MailboxesExportTaskAdditionalInformationDTO.SERIALIZATION_MODULE)),
             new ExportRoutes(
                 new ExportService(testSystem.backup, testSystem.blobStore, testSystem.blobExport, testSystem.usersRepository),
                 taskManager, testSystem.usersRepository))
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
new file mode 100644
index 0000000..dd62fdb
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
@@ -0,0 +1,110 @@
+package org.apache.james.webadmin.service;
+
+import java.time.Instant;
+import java.util.Optional;
+
+import org.apache.james.core.MailAddress;
+import org.apache.james.json.DTOModule;
+import org.apache.james.queue.api.MailQueueName;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.fge.lambdas.Throwing;
+
+public class WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO implements AdditionalInformationDTO {
+
+    public static final AdditionalInformationDTOModule<DeleteMailsFromMailQueueTask.AdditionalInformation, WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO> MODULE =
+        DTOModule
+            .forDomainObject(DeleteMailsFromMailQueueTask.AdditionalInformation.class)
+            .convertToDTO(WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.class)
+            .toDomainObjectConverter(WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO::fromDTO)
+            .toDTOConverter(WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO::toDTO)
+            .typeName(DeleteMailsFromMailQueueTask.TYPE.asString())
+            .withFactory(AdditionalInformationDTOModule::new);
+
+    private static WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO toDTO(DeleteMailsFromMailQueueTask.AdditionalInformation domainObject, String typeName) {
+        return new WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO(
+            typeName,
+            domainObject.getMailQueueName(),
+            domainObject.getSender(),
+            domainObject.getName(),
+            domainObject.getRecipient(),
+            domainObject.getInitialCount(),
+            domainObject.getRemainingCount(),
+            domainObject.timestamp());
+    }
+
+    private static DeleteMailsFromMailQueueTask.AdditionalInformation fromDTO(WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO dto) {
+        return new DeleteMailsFromMailQueueTask.AdditionalInformation(
+            MailQueueName.of(dto.getMailQueueName()),
+            dto.getInitialCount(),
+            dto.getRemainingCount(),
+            dto.sender.map(Throwing.<String, MailAddress>function(MailAddress::new).sneakyThrow()),
+            dto.name,
+            dto.recipient.map(Throwing.<String, MailAddress>function(MailAddress::new).sneakyThrow()),
+            dto.timestamp);
+    }
+
+    private final String mailQueueName;
+    private final String type;
+    private final Optional<String> sender;
+    private final Optional<String> name;
+    private final Optional<String> recipient;
+    private final long initialCount;
+    private final long remainingCount;
+    private final Instant timestamp;
+
+    public WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO(@JsonProperty("type") String type,
+                                                                        @JsonProperty("mailQueueName") String mailQueueName,
+                                                                        @JsonProperty("sender") Optional<String> sender,
+                                                                        @JsonProperty("name") Optional<String> name,
+                                                                        @JsonProperty("recipient") Optional<String> recipient,
+                                                                        @JsonProperty("initialCount") long initialCount,
+                                                                        @JsonProperty("remainingCount") long remainingCount,
+                                                                        @JsonProperty("timestamp") Instant timestamp) {
+        this.type = type;
+        this.mailQueueName = mailQueueName;
+        this.sender = sender;
+        this.name = name;
+        this.recipient = recipient;
+        this.initialCount = initialCount;
+        this.remainingCount = remainingCount;
+        this.timestamp = timestamp;
+    }
+
+
+    public String getMailQueueName() {
+        return mailQueueName;
+    }
+
+    public Optional<String> getSender() {
+        return sender;
+    }
+
+    public Optional<String> getName() {
+        return name;
+    }
+
+    public Optional<String> getRecipient() {
+        return recipient;
+    }
+
+    public long getInitialCount() {
+        return initialCount;
+    }
+
+    public long getRemainingCount() {
+        return remainingCount;
+    }
+
+    @Override
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
+    @Override
+    public String getType() {
+        return type;
+    }
+}
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java
index 6ba4b07..d16dd01 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java
@@ -38,6 +38,7 @@ import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.james.core.MailAddress;
+import org.apache.james.json.DTOConverter;
 import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.Mails;
 import org.apache.james.queue.api.ManageableMailQueue;
@@ -49,7 +50,10 @@ import org.apache.james.task.TaskManager;
 import org.apache.james.webadmin.WebAdminServer;
 import org.apache.james.webadmin.WebAdminUtils;
 import org.apache.james.webadmin.service.ClearMailQueueTask;
+import org.apache.james.webadmin.service.ClearMailQueueTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.service.DeleteMailsFromMailQueueTask;
+import org.apache.james.webadmin.service.DeleteMailsFromMailQueueTaskAdditionalInformationDTO;
+import org.apache.james.webadmin.service.WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.utils.JsonTransformer;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.test.FakeMail;
@@ -91,7 +95,9 @@ class MailQueueRoutesTest {
 
         return WebAdminUtils.createWebAdminServer(
                 new MailQueueRoutes(mailQueueFactory, jsonTransformer, taskManager),
-                new TasksRoutes(taskManager, jsonTransformer))
+                new TasksRoutes(taskManager, jsonTransformer,
+                    DTOConverter.of(WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.MODULE,
+                        ClearMailQueueTaskAdditionalInformationDTO.SERIALIZATION_MODULE)))
             .start();
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTOTest.java b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTOTest.java
new file mode 100644
index 0000000..9d6986a
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTOTest.java
@@ -0,0 +1,51 @@
+/****************************************************************
+ * 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.webadmin.service;
+
+import java.time.Instant;
+import java.util.Optional;
+
+import org.apache.james.JsonSerializationVerifier;
+import org.apache.james.core.MailAddress;
+import org.apache.james.queue.api.MailQueueName;
+import org.junit.jupiter.api.Test;
+
+class WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTOTest {
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+
+    private final static MailQueueName queueName = MailQueueName.of("anyQueue");
+
+    @Test
+    void additionalInformationShouldBeSerializable() throws Exception {
+        DeleteMailsFromMailQueueTask.AdditionalInformation detailsSender = new DeleteMailsFromMailQueueTask.AdditionalInformation(queueName, 10L, 5L,
+            Optional.of(new MailAddress("a@b.c")), Optional.empty(), Optional.empty(), TIMESTAMP);
+        DeleteMailsFromMailQueueTask.AdditionalInformation detailsName = new DeleteMailsFromMailQueueTask.AdditionalInformation(queueName, 1L, 0L,
+            Optional.empty(), Optional.of("name"), Optional.empty(), TIMESTAMP);
+        DeleteMailsFromMailQueueTask.AdditionalInformation detailsRecipient = new DeleteMailsFromMailQueueTask.AdditionalInformation(queueName, 6L, 6L,
+            Optional.empty(), Optional.empty(), Optional.of(new MailAddress("d@e.f")), TIMESTAMP);
+
+        JsonSerializationVerifier.dtoModule(WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.MODULE)
+            .testCase(detailsSender,
+                "{\"type\": \"delete-mails-from-mail-queue\", \"mailQueueName\": \"anyQueue\", \"sender\": \"a@b.c\", \"initialCount\" : 10, \"remainingCount\":5, \"timestamp\": \"2018-11-13T12:00:55Z\"}")
+            .testCase(detailsName,
+                "{\"type\": \"delete-mails-from-mail-queue\", \"mailQueueName\": \"anyQueue\", \"name\": \"name\", \"initialCount\" : 1, \"remainingCount\":0, \"timestamp\": \"2018-11-13T12:00:55Z\"}")
+            .testCase(detailsRecipient,
+                "{\"type\": \"delete-mails-from-mail-queue\", \"mailQueueName\": \"anyQueue\", \"recipient\": \"d@e.f\", \"initialCount\" : 6, \"remainingCount\":6, \"timestamp\": \"2018-11-13T12:00:55Z\"}")
+            .verify();
+    }
+}
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/WebAdminClearMailRepositoryTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/WebAdminClearMailRepositoryTaskAdditionalInformationDTO.java
new file mode 100644
index 0000000..25acd2e
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/WebAdminClearMailRepositoryTaskAdditionalInformationDTO.java
@@ -0,0 +1,88 @@
+/****************************************************************
+ * 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.webadmin.service;
+
+import java.time.Instant;
+
+import org.apache.james.json.DTOModule;
+import org.apache.james.mailrepository.api.MailRepositoryPath;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
+import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class WebAdminClearMailRepositoryTaskAdditionalInformationDTO implements AdditionalInformationDTO {
+
+    public static final AdditionalInformationDTOModule<ClearMailRepositoryTask.AdditionalInformation, WebAdminClearMailRepositoryTaskAdditionalInformationDTO> SERIALIZATION_MODULE =
+        DTOModule.forDomainObject(ClearMailRepositoryTask.AdditionalInformation.class)
+            .convertToDTO(WebAdminClearMailRepositoryTaskAdditionalInformationDTO.class)
+            .toDomainObjectConverter(dto -> new ClearMailRepositoryTask.AdditionalInformation(
+                MailRepositoryPath.from(dto.repositoryPath),
+                dto.initialCount,
+                dto.remainingCount,
+                dto.timestamp
+            ))
+            .toDTOConverter((details, type) -> new WebAdminClearMailRepositoryTaskAdditionalInformationDTO(
+                type,
+                details.getRepositoryPath(),
+                details.getInitialCount(),
+                details.getRemainingCount(),
+                details.timestamp()))
+            .typeName(ClearMailRepositoryTask.TYPE.asString())
+            .withFactory(AdditionalInformationDTOModule::new);
+
+    private final String repositoryPath;
+    private final String type;
+    private final long initialCount;
+    private final long remainingCount;
+    private final Instant timestamp;
+
+    public WebAdminClearMailRepositoryTaskAdditionalInformationDTO(@JsonProperty("type") String type,
+                                                                   @JsonProperty("repositoryPath") String repositoryPath,
+                                                                   @JsonProperty("initialCount") long initialCount,
+                                                                   @JsonProperty("remainingCount") long remainingCount,
+                                                                   @JsonProperty("timestamp") Instant timestamp) {
+        this.type = type;
+        this.repositoryPath = repositoryPath;
+        this.initialCount = initialCount;
+        this.remainingCount = remainingCount;
+        this.timestamp = timestamp;
+    }
+
+    public String getRepositoryPath() {
+        return repositoryPath;
+    }
+
+    public long getInitialCount() {
+        return initialCount;
+    }
+
+    public long getRemainingCount() {
+        return remainingCount;
+    }
+
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
+    @Override
+    public String getType() {
+        return type;
+    }
+}
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java
index b69d674..6444bee 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java
@@ -49,6 +49,7 @@ import org.apache.commons.configuration2.BaseHierarchicalConfiguration;
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.james.core.builder.MimeMessageBuilder.BodyPartBuilder;
+import org.apache.james.json.DTOConverter;
 import org.apache.james.mailrepository.api.MailKey;
 import org.apache.james.mailrepository.api.MailRepository;
 import org.apache.james.mailrepository.api.MailRepositoryPath;
@@ -71,10 +72,14 @@ import org.apache.james.webadmin.Constants;
 import org.apache.james.webadmin.WebAdminServer;
 import org.apache.james.webadmin.WebAdminUtils;
 import org.apache.james.webadmin.service.ClearMailRepositoryTask;
+import org.apache.james.webadmin.service.ClearMailRepositoryTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.service.MailRepositoryStoreService;
 import org.apache.james.webadmin.service.ReprocessingAllMailsTask;
+import org.apache.james.webadmin.service.ReprocessingAllMailsTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.service.ReprocessingOneMailTask;
+import org.apache.james.webadmin.service.ReprocessingOneMailTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.service.ReprocessingService;
+import org.apache.james.webadmin.service.WebAdminClearMailRepositoryTaskAdditionalInformationDTO;
 import org.apache.james.webadmin.utils.ErrorResponder;
 import org.apache.james.webadmin.utils.JsonTransformer;
 import org.apache.mailet.Attribute;
@@ -125,7 +130,10 @@ public class MailRepositoriesRoutesTest {
         webAdminServer = WebAdminUtils.createWebAdminServer(
                 new MailRepositoriesRoutes(repositoryStoreService,
                     jsonTransformer, reprocessingService, taskManager),
-            new TasksRoutes(taskManager, jsonTransformer))
+            new TasksRoutes(taskManager, jsonTransformer,
+                DTOConverter.of(ReprocessingOneMailTaskAdditionalInformationDTO.SERIALIZATION_MODULE,
+                    ReprocessingAllMailsTaskAdditionalInformationDTO.SERIALIZATION_MODULE,
+                    WebAdminClearMailRepositoryTaskAdditionalInformationDTO.SERIALIZATION_MODULE)))
             .start();
 
         RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer)
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/WebAdminClearMailRepositoryTaskDTOTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/WebAdminClearMailRepositoryTaskDTOTest.java
new file mode 100644
index 0000000..4496652
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/WebAdminClearMailRepositoryTaskDTOTest.java
@@ -0,0 +1,44 @@
+/****************************************************************
+ * 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.webadmin.service;
+
+import java.time.Instant;
+
+import org.apache.james.JsonSerializationVerifier;
+import org.apache.james.mailrepository.api.MailRepositoryPath;
+import org.junit.jupiter.api.Test;
+
+class WebAdminClearMailRepositoryTaskDTOTest {
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+
+    private static final String SERIALIZED_TASK_ADDITIONAL_INFORMATION = "{\"type\":\"clear-mail-repository\", \"repositoryPath\":\"a\", \"initialCount\": 0, \"remainingCount\": 10, \"timestamp\":\"2018-11-13T12:00:55Z\"}";
+    private static final MailRepositoryPath MAIL_REPOSITORY_PATH = MailRepositoryPath.from("a");
+    private static final long INITIAL_COUNT = 0L;
+    private static final long REMAINING_COUNT = 10L;
+
+
+    @Test
+    void additionalInformationShouldBeSerializable() throws Exception {
+        JsonSerializationVerifier.dtoModule(WebAdminClearMailRepositoryTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
+            .bean(new ClearMailRepositoryTask.AdditionalInformation(MAIL_REPOSITORY_PATH, INITIAL_COUNT, REMAINING_COUNT, TIMESTAMP))
+            .json(SERIALIZED_TASK_ADDITIONAL_INFORMATION)
+            .verify();
+    }
+}
\ No newline at end of file
diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md
index 8f2f797..806c67f 100644
--- a/src/site/markdown/server/manage-webadmin.md
+++ b/src/site/markdown/server/manage-webadmin.md
@@ -601,10 +601,11 @@ The scheduled task will have the following type `full-reindexing` and the follow
   },
   "successfullyReprocessedMailCount":18,
   "failedReprocessedMailCount": 3,
-  "failures": {
-    "mbx1": [{"uid": 35}, {"uid": 45}],
-    "mbx2": [{"uid": 38}]
-  }
+  "failures": [
+   {
+     "mailboxId": "1",
+      "uids": [1, 36]
+   }]
 }
 ```
 
@@ -642,10 +643,10 @@ The scheduled task will have the following type `error-recovery-indexation` and
   },
   "successfullyReprocessedMailCount":18,
   "failedReprocessedMailCount": 3,
-  "failures": {
-    "mbx1": [{"uid": 35}, {"uid": 45}],
-    "mbx2": [{"uid": 38}]
-  }
+  "failures": [{
+     "mailboxId": "1",
+      "uids": [1, 36]
+   }]
 }
 ```
 
@@ -694,10 +695,11 @@ The scheduled task will have the following type `mailbox-reindexing` and the fol
   "mailboxId":"{mailboxId}",
   "successfullyReprocessedMailCount":18,
   "failedReprocessedMailCount": 3,
-  "failures": {
-    "mbx1": [{"uid": 35}, {"uid": 45}],
-    "mbx2": [{"uid": 38}]
-  }
+  "failures": [
+   {
+     "mailboxId": "1",
+      "uids": [1, 36]
+   }]
 }
 ```
 
@@ -1019,10 +1021,11 @@ The scheduled task will have the following type `user-reindexing` and the follow
   "user":"user@domain.com",
   "successfullyReprocessedMailCount":18,
   "failedReprocessedMailCount": 3,
-  "failures": {
-    "mbx1": [{"uid": 35}, {"uid": 45}],
-    "mbx2": [{"uid": 38}]
-  }
+  "failures": [
+   {
+     "mailboxId": "1",
+      "uids": [1, 36]
+   }]
 }
 ```
 
@@ -1825,7 +1828,7 @@ If the server restarts during the migration, the migration is silently aborted.
 The scheduled task will have the following type `cassandra-migration` and the following `additionalInformation`:
 
 ```
-{"toVersion":3}
+{"targetVersion":3}
 ```
 
 ### Upgrading to the latest version
@@ -2711,7 +2714,7 @@ The scheduled task will have the following type `clear-mail-repository` and the
 
 ```
 {
-  "repositoryPath":"var/mail/error/",
+  "mailRepositoryPath":"var/mail/error/",
   "initialCount": 243,
   "remainingCount": 17
 }
@@ -2760,7 +2763,7 @@ The scheduled task will have the following type `reprocessing-all` and the follo
 
 ```
 {
-  "repositoryPath":"var/mail/error/",
+  "mailRepositoryPath":"var/mail/error/",
   "targetQueue":"spool",
   "targetProcessor":"transport",
   "initialCount": 243,
@@ -2811,7 +2814,7 @@ The scheduled task will have the following type `reprocessing-one` and the follo
 
 ```
 {
-  "repositoryPath":"var/mail/error/",
+  "mailRepositoryPath":"var/mail/error/",
   "targetQueue":"spool",
   "targetProcessor":"transport",
   "mailKey":"name1"
@@ -2918,7 +2921,7 @@ The scheduled task will have the following type `delete-mails-from-mail-queue` a
 
 ```
 {
-  "mailQueueName":"outgoing",
+  "queue":"outgoing",
   "initialCount":10,
   "remainingCount": 5,
   "sender": "sender@james.org",
@@ -2947,7 +2950,7 @@ The scheduled task will have the following type `clear-mail-queue` and the follo
 
 ```
 {
-  "mailQueueName":"outgoing",
+  "queue":"outgoing",
   "initialCount":10,
   "remainingCount": 0
 }
@@ -3601,8 +3604,8 @@ The scheduled task will have the following type `deleted-messages-delete` and th
  
 ```
  {
-   "user": "user@domain.ext",
-   "deleteMessageId": "3294a976-ce63-491e-bd52-1b6f465ed7a2"
+   "userName": "user@domain.ext",
+   "messageId": "3294a976-ce63-491e-bd52-1b6f465ed7a2"
  }
 ```
  


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


[james-project] 01/17: JAMES-3150 Add ScalaCheck for the garbadge collector

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 0769feee3aa2c89ca70bf0ccfccf5bb03d1409be
Author: Matthieu Baechler <ma...@apache.org>
AuthorDate: Thu Feb 27 11:24:20 2020 +0100

    JAMES-3150 Add ScalaCheck for the garbadge collector
---
 gc-properties.adoc                                 |  23 +++++
 server/blob/blob-deduplicating/pom.xml             | 106 ++++++++++++++++++++
 .../src/test/scala/GCPropertiesTest.scala          | 107 +++++++++++++++++++++
 server/blob/pom.xml                                |   1 +
 4 files changed, 237 insertions(+)

diff --git a/gc-properties.adoc b/gc-properties.adoc
new file mode 100644
index 0000000..7c69c01
--- /dev/null
+++ b/gc-properties.adoc
@@ -0,0 +1,23 @@
+= GC properties
+
+1. the execution time of the GC should be linked to
+active dataset but not to global dataset
+(for scalability purpose)
+
+2. GC should run on live dataset
+
+ 2.1. GC should not delete data being referenced by a pending process or
+still referenced
+
+ 2.2. GC should be idempotent: 2 concurrent or sequential runs should
+not have a different outcome than a single one
+
+3. GC should remove data from the underlying store
+
+ 3.1. an unreferenced piece of data should be removed after 1 day
+
+ 3.2. less than 10% of unreferenced data of a significant dataset
+should persist after three GC executions
+
+4. GC should report what it does
+
diff --git a/server/blob/blob-deduplicating/pom.xml b/server/blob/blob-deduplicating/pom.xml
new file mode 100644
index 0000000..e849535
--- /dev/null
+++ b/server/blob/blob-deduplicating/pom.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <artifactId>james-server-blob</artifactId>
+        <groupId>org.apache.james</groupId>
+        <version>3.5.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>blob-deduplicating</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Apache James :: Server :: Blob :: Deduplicating Blob Storage</name>
+    <description>
+        An implementation of BlobStore which deduplicate the stored blobs and use a garbage collector
+        to ensure their effective deletion.
+    </description>
+
+    <dependencies>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>blob-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>blob-api</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>blob-memory</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-testing</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>testing-base</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.scala-lang</groupId>
+            <artifactId>scala-library</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.scala-lang.modules</groupId>
+            <artifactId>scala-java8-compat_${scala.base}</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.scalactic</groupId>
+            <artifactId>scalactic_2.13</artifactId>
+            <version>3.1.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.scalatest</groupId>
+            <artifactId>scalatest_2.13</artifactId>
+            <version>3.1.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.scalacheck</groupId>
+            <artifactId>scalacheck_2.13</artifactId>
+            <version>1.14.3</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>net.alchim31.maven</groupId>
+                <artifactId>scala-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/server/blob/blob-deduplicating/src/test/scala/GCPropertiesTest.scala b/server/blob/blob-deduplicating/src/test/scala/GCPropertiesTest.scala
new file mode 100644
index 0000000..5de3f44
--- /dev/null
+++ b/server/blob/blob-deduplicating/src/test/scala/GCPropertiesTest.scala
@@ -0,0 +1,107 @@
+import org.apache.james.blob.api.{BlobId, TestBlobId}
+import org.scalacheck.Gen
+import org.scalatest.funsuite.AnyFunSuite
+
+case class Generation(id: Long)
+case class Iteration(id: Long)
+case class ExternalID(id: String) // TODO
+
+sealed trait Event
+case class Reference(externalId: ExternalID, blobId: BlobId, generation: Generation) extends Event
+case class Deletion(generation: Generation, reference: Reference) extends Event
+
+case class Report(iteration: Iteration,
+                  blobsToDelete: Set[(Generation, BlobId)]
+                 )
+
+object Generators {
+
+  val smallInteger = Gen.choose(0L,100L)
+  var current = 0;
+  val generationsGen: Gen[LazyList[Generation]] = Gen.infiniteLazyList(Gen.frequency((90, Gen.const(0)), (9, Gen.const(1)), (1, Gen.const(2))))
+    .map(list => list.scanLeft(0)(_ + _))
+    .map(list => list.map(_.toLong).map(Generation.apply))
+
+  val iterationGen = smallInteger.map(Iteration.apply)
+
+  val blobIdFactory = new TestBlobId.Factory
+
+  def blobIdGen(generation: Generation) : Gen[BlobId] = Gen.uuid.map(uuid =>
+    blobIdFactory.from(s"${generation}_$uuid"))
+
+  val externalIDGen = Gen.uuid.map(uuid => ExternalID(uuid.toString))
+
+  def referenceGen(generation: Generation): Gen[Reference] = for {
+    blobId <- blobIdGen(generation)
+    externalId <- externalIDGen
+  } yield Reference(externalId, blobId, generation)
+
+  def existingReferences : Seq[Event] => Set[Reference] = _
+    .foldLeft((Set[Reference](), Set[Reference]()))((acc, event) => event match {
+      case deletion: Deletion => (acc._1 ++ Set(deletion.reference), acc._2)
+      case reference: Reference => if (acc._1.contains(reference)) {
+        acc
+      } else {
+        (acc._1, acc._2 ++ Set(reference))
+      }
+    })._2
+
+  def deletionGen(previousEvents : Seq[Event], generation: Generation): Gen[Option[Deletion]] = {
+    val persistingReferences = existingReferences(previousEvents)
+    if (persistingReferences.isEmpty) {
+      Gen.const(None)
+    } else {
+      Gen.oneOf(persistingReferences)
+        .map(reference => Deletion(generation, reference))
+        .map(Some(_))
+    }
+  }
+
+  def duplicateReferenceGen(generation: Generation, reference: Reference): Gen[Reference] = {
+    if (reference.generation == generation) {
+      externalIDGen.map(id => reference.copy(externalId = id))
+    } else {
+      referenceGen(generation)
+    }
+  }
+
+  def eventGen(previousEvents: Seq[Event], generation: Generation): Gen[Event] = for {
+    greenAddEvent <- referenceGen(generation)
+    addEvents = previousEvents.flatMap {
+      case x: Reference => Some(x)
+      case _ => None
+    }
+    randomAddEvent <- Gen.oneOf(addEvents)
+    duplicateAddEvent <- duplicateReferenceGen(generation, randomAddEvent)
+    deleteEvent <- deletionGen(previousEvents, generation)
+    event <- Gen.oneOf(Seq(greenAddEvent, duplicateAddEvent) ++ deleteEvent)
+  } yield event
+
+  def eventsGen() : Gen[Seq[Event]] = for {
+    nbEvents <- Gen.choose(0, 100)
+    generations <- generationsGen.map(_.take(nbEvents))
+    startEvent <- referenceGen(Generation.apply(0))
+    events <- foldM(generations, (Seq(startEvent): Seq[Event]))((previousEvents, generation) => eventGen(previousEvents, generation).map(_ +: previousEvents))
+  } yield events.reverse
+
+  def foldM[A, B](fa: LazyList[A], z: B)(f: (B, A) => Gen[B]): Gen[B] = {
+    def step(in: (LazyList[A], B)): Gen[Either[(LazyList[A], B), B]] = {
+      val (s, b) = in
+      if (s.isEmpty)
+        Gen.const(Right(b))
+      else {
+        f (b, s.head).map { bnext =>
+          Left((s.tail, bnext))
+        }
+      }
+    }
+
+    Gen.tailRecM((fa, z))(step)
+  }
+}
+
+class GCPropertiesTest extends AnyFunSuite {
+  test("print sample") {
+    Generators.eventsGen().sample.foreach(_.foreach(println))
+  }
+}
diff --git a/server/blob/pom.xml b/server/blob/pom.xml
index 4351178..9744471 100644
--- a/server/blob/pom.xml
+++ b/server/blob/pom.xml
@@ -34,6 +34,7 @@
 
     <modules>
         <module>blob-api</module>
+        <module>blob-deduplicating</module>
         <module>blob-cassandra</module>
         <module>blob-common</module>
         <module>blob-export-api</module>


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


[james-project] 13/17: JAMES-3182 Detail filter visit algorithm in method name

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 8f867323609eb97b45aac1d74b3dda43e86b832f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Jun 5 15:50:03 2020 +0700

    JAMES-3182 Detail filter visit algorithm in method name
---
 .../jmap/draft/methods/GetMessageListMethod.java   |  2 +-
 .../org/apache/james/jmap/draft/model/Filter.java  |  8 ++--
 .../apache/james/jmap/draft/model/FilterTest.java  | 44 ++++++++++++++++------
 3 files changed, 37 insertions(+), 17 deletions(-)

diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessageListMethod.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessageListMethod.java
index 1ff48b2..39dc573 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessageListMethod.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessageListMethod.java
@@ -194,7 +194,7 @@ public class GetMessageListMethod implements Method {
     }
 
     private boolean containsMailboxFilters(Filter filter) {
-        return filter.flatten()
+        return filter.breadthFirstVisit()
             .stream()
             .anyMatch(this::hasMailboxClause);
     }
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/Filter.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/Filter.java
index 4294805..0f26d7c 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/Filter.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/Filter.java
@@ -39,12 +39,12 @@ public interface Filter {
 
     String prettyPrint(String indentation);
 
-    default List<FilterCondition> flatten() {
-        return this.flatten(0)
+    default List<FilterCondition> breadthFirstVisit() {
+        return this.breadthFirstVisit(0)
             .collect(Guavate.toImmutableList());
     }
 
-    default Stream<FilterCondition> flatten(int depth) {
+    default Stream<FilterCondition> breadthFirstVisit(int depth) {
         if (depth > MAX_FILTER_DEPTH) {
             throw new TooDeepFilterHierarchyException();
         }
@@ -52,7 +52,7 @@ public interface Filter {
             FilterOperator operator = (FilterOperator) this;
 
             return operator.getConditions().stream()
-                .flatMap(filter -> filter.flatten(depth + 1));
+                .flatMap(filter -> filter.breadthFirstVisit(depth + 1));
         }
         if (this instanceof FilterCondition) {
             return Stream.of((FilterCondition) this);
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/FilterTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/FilterTest.java
index b988822..79ce078 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/FilterTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/FilterTest.java
@@ -101,12 +101,12 @@ public class FilterTest {
             .to("bob@domain.tld")
             .build();
 
-        assertThat(condition.flatten(10))
+        assertThat(condition.breadthFirstVisit(10))
             .containsExactly(condition);
     }
 
     @Test
-    public void flattenShouldUnboxOneLevelOperator() {
+    public void breadthFirstVisitShouldUnboxOneLevelOperator() {
         FilterCondition condition1 = FilterCondition.builder()
             .to("bob@domain.tld")
             .build();
@@ -115,12 +115,12 @@ public class FilterTest {
             .build();
 
         assertThat(FilterOperator.and(condition1, condition2)
-                .flatten())
+                .breadthFirstVisit())
             .containsExactly(condition1, condition2);
     }
 
     @Test
-    public void flattenShouldUnboxTwoLevelOperator() {
+    public void breadthFirstVisitShouldUnboxTwoLevelOperator() {
         FilterCondition condition1 = FilterCondition.builder()
             .to("bob@domain.tld")
             .build();
@@ -132,12 +132,32 @@ public class FilterTest {
             .build();
 
         assertThat(FilterOperator.and(condition1, FilterOperator.and(condition2, condition3))
-                .flatten())
-            .containsExactly(condition1, condition2, condition3);
+                .breadthFirstVisit())
+            .containsOnly(condition1, condition2, condition3);
     }
 
     @Test
-    public void flattenShouldAllowUpToLimitNesting() {
+    public void breadthFirstVisitShouldBeBreadthFirst() {
+        FilterCondition condition1 = FilterCondition.builder()
+            .to("bob@domain.tld")
+            .build();
+        FilterCondition condition2 = FilterCondition.builder()
+            .to("alice@domain.tld")
+            .build();
+        FilterCondition condition3 = FilterCondition.builder()
+            .to("cedric@domain.tld")
+            .build();
+        FilterCondition condition4 = FilterCondition.builder()
+            .to("david@domain.tld")
+            .build();
+
+        assertThat(FilterOperator.and(condition1, FilterOperator.and(condition2, condition3), condition4)
+                .breadthFirstVisit())
+            .containsOnly(condition1, condition2, condition3, condition4);
+    }
+
+    @Test
+    public void breadthFirstVisitShouldAllowUpToLimitNesting() {
         FilterCondition condition = FilterCondition.builder()
             .to("bob@domain.tld")
             .build();
@@ -146,15 +166,15 @@ public class FilterTest {
             (Filter) condition,
             (filter, i) -> FilterOperator.and(filter),
             (f1, f2) -> {
-                throw new RuntimeException("unsuported combinaison");
+                throw new RuntimeException("unsupported combination");
             });
 
-        assertThat(nestedFilter.flatten())
+        assertThat(nestedFilter.breadthFirstVisit())
             .containsExactly(condition);
     }
 
     @Test
-    public void flattenShouldRejectDeepNesting() {
+    public void breadthFirstVisitShouldRejectDeepNesting() {
         FilterCondition condition = FilterCondition.builder()
             .to("bob@domain.tld")
             .build();
@@ -163,10 +183,10 @@ public class FilterTest {
             (Filter) condition,
             (filter, i) -> FilterOperator.and(filter),
             (f1, f2) -> {
-                throw new RuntimeException("unsuported combinaison");
+                throw new RuntimeException("unsupported combination");
             });
 
-        assertThatThrownBy(nestedFilter::flatten)
+        assertThatThrownBy(nestedFilter::breadthFirstVisit)
             .isInstanceOf(Filter.TooDeepFilterHierarchyException.class);
     }
 }


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


[james-project] 07/17: JAMES-3194 Add missing licenses

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 48baa237fa420fc6fa7ee8068de076d2d307a590
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Jun 2 11:02:20 2020 +0700

    JAMES-3194 Add missing licenses
---
 ...ailsFromMailQueueTaskAdditionalInformationDTO.java | 19 +++++++++++++++++++
 .../service/DeleteMailsFromMailQueueTaskDTO.java      | 19 +++++++++++++++++++
 ...ailsFromMailQueueTaskAdditionalInformationDTO.java | 19 +++++++++++++++++++
 3 files changed, 57 insertions(+)

diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
index a35c65f..077c1df 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
@@ -1,3 +1,22 @@
+/****************************************************************
+ * 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.webadmin.service;
 
 import java.time.Instant;
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskDTO.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskDTO.java
index fc30ab9..54f3287 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskDTO.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskDTO.java
@@ -1,3 +1,22 @@
+/****************************************************************
+ * 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.webadmin.service;
 
 import java.util.Optional;
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
index dd62fdb..fbd858e 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
@@ -1,3 +1,22 @@
+/****************************************************************
+ * 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.webadmin.service;
 
 import java.time.Instant;


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


[james-project] 15/17: JAMES-3204 Demonstrate CassandraMessageMapper partially applies limit

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3781196f9684961c843fabb9058d08e2aa1872cb
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Jun 8 17:40:36 2020 +0700

    JAMES-3204 Demonstrate CassandraMessageMapper partially applies limit
    
    This class ends up doing reads to messageV2 for entries that are later
    on discarded by the soft limit.
---
 .../cassandra/mail/CassandraMessageMapperTest.java | 44 ++++++++++++++++++----
 1 file changed, 37 insertions(+), 7 deletions(-)

diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
index 7898cb4..97f86ef 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
@@ -22,21 +22,28 @@ package org.apache.james.mailbox.cassandra.mail;
 import static org.apache.james.backends.cassandra.Scenario.Builder.fail;
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.util.Iterator;
 import java.util.Optional;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.StatementRecorder;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
+import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MessageRange;
-import org.apache.james.mailbox.store.mail.MessageMapper;
+import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.MapperProvider;
 import org.apache.james.mailbox.store.mail.model.MessageMapperTest;
 import org.assertj.core.api.SoftAssertions;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
+import org.testcontainers.shaded.com.google.common.collect.ImmutableList;
 
+import com.datastax.driver.core.BoundStatement;
 import com.github.fge.lambdas.Throwing;
 
 class CassandraMessageMapperTest extends MessageMapperTest {
@@ -48,6 +55,29 @@ class CassandraMessageMapperTest extends MessageMapperTest {
         return new CassandraMapperProvider(cassandraCluster.getCassandraCluster());
     }
 
+    @Disabled("Currently generates a read to messageV2 per stored message despite the limit")
+    @Test
+    void findInMailboxLimitShouldLimitProjectionReadCassandraQueries(CassandraCluster cassandra) throws MailboxException {
+        saveMessages();
+
+        StatementRecorder statementRecorder = new StatementRecorder();
+        cassandra.getConf().recordStatements(statementRecorder);
+
+        int limit = 2;
+        consume(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Full, limit));
+
+        assertThat(statementRecorder.listExecutedStatements())
+            .filteredOn(statement -> statement instanceof BoundStatement)
+            .extracting(BoundStatement.class::cast)
+            .extracting(statement -> statement.preparedStatement().getQueryString())
+            .filteredOn(statementString -> statementString.equals("SELECT messageId,internalDate,bodyStartOctet,fullContentOctets,bodyOctets,bodyContent,headerContent,textualLineCount,properties,attachments FROM messageV2 WHERE messageId=:messageId;"))
+            .hasSize(limit);
+    }
+
+    private void consume(Iterator<MailboxMessage> inMailbox) {
+        ImmutableList.copyOf(inMailbox);
+    }
+
     @Nested
     class FailureTesting {
         @Test
@@ -65,7 +95,7 @@ class CassandraMessageMapperTest extends MessageMapperTest {
 
             CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(cassandra.getConf(), new CassandraMessageId.Factory());
             SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
-                softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Metadata, 1))
+                softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Metadata, 1))
                     .toIterable()
                     .isEmpty();
                 softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
@@ -88,7 +118,7 @@ class CassandraMessageMapperTest extends MessageMapperTest {
 
             CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(cassandra.getConf(), new CassandraMessageId.Factory());
             SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
-                softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Metadata, 1))
+                softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Metadata, 1))
                     .toIterable()
                     .isEmpty();
                 softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
@@ -111,7 +141,7 @@ class CassandraMessageMapperTest extends MessageMapperTest {
 
             CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(cassandra.getConf(), new CassandraMessageId.Factory());
             SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
-                softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Metadata, 1))
+                softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Metadata, 1))
                     .toIterable()
                     .isEmpty();
                 softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
@@ -134,7 +164,7 @@ class CassandraMessageMapperTest extends MessageMapperTest {
 
             CassandraMessageIdDAO messageIdDAO = new CassandraMessageIdDAO(cassandra.getConf(), new CassandraMessageId.Factory());
             SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
-                softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Metadata, 1))
+                softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Metadata, 1))
                     .toIterable()
                     .isEmpty();
                 softly.assertThat(messageIdDAO.retrieveMessages((CassandraId) benwaInboxMailbox.getMailboxId(), MessageRange.all()).collectList().block())
@@ -158,7 +188,7 @@ class CassandraMessageMapperTest extends MessageMapperTest {
             CassandraMessageIdToImapUidDAO imapUidDAO = new CassandraMessageIdToImapUidDAO(cassandra.getConf(), new CassandraMessageId.Factory());
 
             SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
-                softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Metadata, 1))
+                softly.assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Metadata, 1))
                     .toIterable()
                     .isEmpty();
                 softly.assertThat(imapUidDAO.retrieve((CassandraMessageId) message1.getMessageId(), Optional.empty()).collectList().block())
@@ -175,7 +205,7 @@ class CassandraMessageMapperTest extends MessageMapperTest {
 
             messageMapper.add(benwaInboxMailbox, message1);
 
-            assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Metadata, 1))
+            assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), FetchType.Metadata, 1))
                 .toIterable()
                 .hasSize(1);
         }


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


[james-project] 05/17: JAMES-3194 Remove Jackson annotations from AdditionalInformation

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 4d529f74497b42c10247f8f6f651a2d658b42409
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon May 18 13:33:56 2020 +0700

    JAMES-3194 Remove Jackson annotations from AdditionalInformation
---
 .../cassandra/mail/task/RecomputeMailboxCountersTask.java        | 3 ---
 .../cassandra/mail/task/SolveMailboxInconsistenciesTask.java     | 6 ------
 .../cassandra/mail/task/SolveMessageInconsistenciesTask.java     | 9 ---------
 .../mailbox/tools/indexer/ReprocessingContextInformation.java    | 3 ---
 .../james/mailbox/quota/task/RecomputeCurrentQuotasTask.java     | 3 ---
 .../EventDeadLettersRedeliveryTaskAdditionalInformation.java     | 4 ----
 6 files changed, 28 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersTask.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersTask.java
index c93e1ea..e7433de 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersTask.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersTask.java
@@ -32,7 +32,6 @@ import org.apache.james.task.TaskType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
 import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
 
@@ -58,12 +57,10 @@ public class RecomputeMailboxCountersTask implements Task {
             return instant;
         }
 
-        @JsonProperty("processedMailboxes")
         long getProcessedMailboxes() {
             return processedMailboxes;
         }
 
-        @JsonProperty("failedMailboxes")
         ImmutableList<String> getFailedMailboxes() {
             return failedMailboxes;
         }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesTask.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesTask.java
index 2139d25..d68b800 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesTask.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesTask.java
@@ -30,7 +30,6 @@ import org.apache.james.task.TaskType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
 import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
 
@@ -62,27 +61,22 @@ public class SolveMailboxInconsistenciesTask implements Task {
             return instant;
         }
 
-        @JsonProperty("processedMailboxEntries")
         long getProcessedMailboxEntries() {
             return processedMailboxEntries;
         }
 
-        @JsonProperty("processedMailboxPathEntries")
         long getProcessedMailboxPathEntries() {
             return processedMailboxPathEntries;
         }
 
-        @JsonProperty("fixedInconsistencies")
         ImmutableList<String> getFixedInconsistencies() {
             return fixedInconsistencies;
         }
 
-        @JsonProperty("conflictingEntries")
         ImmutableList<ConflictingEntry> getConflictingEntries() {
             return conflictingEntries;
         }
 
-        @JsonProperty("errors")
         long getErrors() {
             return errors;
         }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTask.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTask.java
index c56b8b3..d85805d 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTask.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTask.java
@@ -31,7 +31,6 @@ import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
 import org.apache.james.task.TaskType;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
 import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
 
@@ -69,42 +68,34 @@ public class SolveMessageInconsistenciesTask implements Task {
             return instant;
         }
 
-        @JsonProperty("processedImapUidEntries")
         public long getProcessedImapUidEntries() {
             return processedImapUidEntries;
         }
 
-        @JsonProperty("processedMessageIdEntries")
         public long getProcessedMessageIdEntries() {
             return processedMessageIdEntries;
         }
 
-        @JsonProperty("addedMessageIdEntries")
         public long getAddedMessageIdEntries() {
             return addedMessageIdEntries;
         }
 
-        @JsonProperty("updatedMessageIdEntries")
         public long getUpdatedMessageIdEntries() {
             return updatedMessageIdEntries;
         }
 
-        @JsonProperty("removedMessageIdEntries")
         public long getRemovedMessageIdEntries() {
             return removedMessageIdEntries;
         }
 
-        @JsonProperty("runningOptions")
         public RunningOptions getRunningOptions() {
             return runningOptions;
         }
 
-        @JsonProperty("fixedInconsistencies")
         public ImmutableList<MessageInconsistenciesEntry> getFixedInconsistencies() {
             return fixedInconsistencies;
         }
 
-        @JsonProperty("errors")
         public ImmutableList<MessageInconsistenciesEntry> getErrors() {
             return errors;
         }
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformation.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformation.java
index 2517c07..0dc02b0 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformation.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformation.java
@@ -26,8 +26,6 @@ import org.apache.james.mailbox.indexer.ReIndexer.RunningOptions;
 import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
 import org.apache.james.task.TaskExecutionDetails;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
-
 public class ReprocessingContextInformation implements TaskExecutionDetails.AdditionalInformation, IndexingDetailInformation {
 
     private final int successfullyReprocessedMailCount;
@@ -56,7 +54,6 @@ public class ReprocessingContextInformation implements TaskExecutionDetails.Addi
     }
 
     @Override
-    @JsonIgnore
     public ReIndexingExecutionFailures failures() {
         return failures;
     }
diff --git a/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTask.java b/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTask.java
index 355c6bb..cfe6824 100644
--- a/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTask.java
+++ b/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTask.java
@@ -31,7 +31,6 @@ import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
 import org.apache.james.task.TaskType;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
 import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
 
@@ -58,12 +57,10 @@ public class RecomputeCurrentQuotasTask implements Task {
             return instant;
         }
 
-        @JsonProperty("processedQuotaRoots")
         long getProcessedQuotaRoots() {
             return processedQuotaRoots;
         }
 
-        @JsonProperty("failedQuotaRoots")
         ImmutableList<String> getFailedQuotaRoots() {
             return failedQuotaRoots;
         }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliveryTaskAdditionalInformation.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliveryTaskAdditionalInformation.java
index 95efa3f..cddf8d6 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliveryTaskAdditionalInformation.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliveryTaskAdditionalInformation.java
@@ -25,8 +25,6 @@ import org.apache.james.mailbox.events.EventDeadLetters;
 import org.apache.james.mailbox.events.Group;
 import org.apache.james.task.TaskExecutionDetails;
 
-import com.fasterxml.jackson.annotation.JsonInclude;
-
 public class EventDeadLettersRedeliveryTaskAdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
     private final long successfulRedeliveriesCount;
     private final long failedRedeliveriesCount;
@@ -54,12 +52,10 @@ public class EventDeadLettersRedeliveryTaskAdditionalInformation implements Task
         return failedRedeliveriesCount;
     }
 
-    @JsonInclude(JsonInclude.Include.NON_ABSENT)
     public Optional<String> getGroup() {
         return group.map(Group::asString);
     }
 
-    @JsonInclude(JsonInclude.Include.NON_ABSENT)
     public Optional<String> getInsertionId() {
         return insertionId.map(insertionId -> insertionId.getId().toString());
     }


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


[james-project] 12/17: JAMES-3204 additionalInformation.failures should be renamed to messageFailures

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit a4625e1666ecbb481f7b75f804b13946653374fa
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Jun 10 13:43:55 2020 +0700

    JAMES-3204 additionalInformation.failures should be renamed to messageFailures
    
    This avoids confusions with additionalInformation.mailboxFailures
---
 .../RabbitMQWebAdminServerTaskSerializationIntegrationTest.java   | 8 ++++----
 .../webadmin/dto/WebAdminReprocessingContextInformationDTO.java   | 2 +-
 ...bAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java | 4 ++--
 .../dto/WebAdminUserReindexingTaskAdditionalInformationDTO.java   | 4 ++--
 .../dto/WebAdminReprocessingContextInformationDTOTest.java        | 4 ++--
 .../webadmin/dto/WebAdminSingleMailboxReprocessingDTOTest.java    | 3 +--
 .../james/webadmin/dto/WebAdminUserReprocessingDTOTest.java       | 4 +---
 .../org/apache/james/webadmin/routes/MailboxesRoutesTest.java     | 6 +++---
 .../org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java | 2 +-
 src/site/markdown/server/manage-webadmin.md                       | 8 ++++----
 10 files changed, 21 insertions(+), 24 deletions(-)

diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java
index 0c165d2..753f992 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java
@@ -148,7 +148,7 @@ class RabbitMQWebAdminServerTaskSerializationIntegrationTest {
             .body("type", is("full-reindexing"))
             .body("additionalInformation.successfullyReprocessedMailCount", is(0))
             .body("additionalInformation.failedReprocessedMailCount", is(0))
-            .body("additionalInformation.failures", is(anEmptyMap()));
+            .body("additionalInformation.messageFailures", is(anEmptyMap()));
     }
 
     @Test
@@ -338,7 +338,7 @@ class RabbitMQWebAdminServerTaskSerializationIntegrationTest {
             .body("additionalInformation.successfullyReprocessedMailCount", is(0))
             .body("additionalInformation.failedReprocessedMailCount", is(0))
             .body("additionalInformation.username", is(USERNAME))
-            .body("additionalInformation.failures", is(anEmptyMap()));
+            .body("additionalInformation.messageFailures", is(anEmptyMap()));
     }
 
     @Test
@@ -438,7 +438,7 @@ class RabbitMQWebAdminServerTaskSerializationIntegrationTest {
             .body("type", is("error-recovery-indexation"))
             .body("additionalInformation.successfullyReprocessedMailCount", is(0))
             .body("additionalInformation.failedReprocessedMailCount", is(0))
-            .body("additionalInformation.failures", is(anEmptyMap()));
+            .body("additionalInformation.messageFailures", is(anEmptyMap()));
     }
 
     @Test
@@ -669,7 +669,7 @@ class RabbitMQWebAdminServerTaskSerializationIntegrationTest {
             .body("additionalInformation.successfullyReprocessedMailCount", is(0))
             .body("additionalInformation.failedReprocessedMailCount", is(0))
             .body("additionalInformation.mailboxId", is(mailboxId.serialize()))
-            .body("additionalInformation.failures", is(anEmptyMap()));
+            .body("additionalInformation.messageFailures", is(anEmptyMap()));
     }
 
     @Test
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTO.java
index 1b43b3e..124fec3 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTO.java
@@ -110,7 +110,7 @@ public class WebAdminReprocessingContextInformationDTO implements AdditionalInfo
         return failedReprocessedMailCount;
     }
 
-    public SerializableReIndexingExecutionFailures getFailures() {
+    public SerializableReIndexingExecutionFailures getMessageFailures() {
         return messageFailures;
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java
index 7b84cde..19733ae 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java
@@ -86,8 +86,8 @@ public class WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO impleme
         return reprocessingContextInformationDTO.getFailedReprocessedMailCount();
     }
 
-    public SerializableReIndexingExecutionFailures getFailures() {
-        return reprocessingContextInformationDTO.getFailures();
+    public SerializableReIndexingExecutionFailures getMessageFailures() {
+        return reprocessingContextInformationDTO.getMessageFailures();
     }
 
     public List<String> getMailboxFailures() {
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminUserReindexingTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminUserReindexingTaskAdditionalInformationDTO.java
index 7991a04..2b00d4f 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminUserReindexingTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminUserReindexingTaskAdditionalInformationDTO.java
@@ -88,8 +88,8 @@ public class WebAdminUserReindexingTaskAdditionalInformationDTO implements Addit
         return reprocessingContextInformationDTO.getFailedReprocessedMailCount();
     }
 
-    public SerializableReIndexingExecutionFailures getFailures() {
-        return reprocessingContextInformationDTO.getFailures();
+    public SerializableReIndexingExecutionFailures getMessageFailures() {
+        return reprocessingContextInformationDTO.getMessageFailures();
     }
 
     public List<String> getMailboxFailures() {
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTOTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTOTest.java
index cf0e6da..48ffab4 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTOTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminReprocessingContextInformationDTOTest.java
@@ -43,14 +43,14 @@ class WebAdminReprocessingContextInformationDTOTest {
         "  \"type\":\"error-recovery-indexation\"," +
         "  \"successfullyReprocessedMailCount\":42," +
         "  \"failedReprocessedMailCount\":2," +
-        "  \"failures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]}," +
+        "  \"messageFailures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]}," +
         "  \"mailboxFailures\":[\"3\", \"4\"]," +
         "  \"timestamp\":\"2018-11-13T12:00:55Z\"}";
     private final String serializedFullAdditionalInformation = "{" +
         "  \"type\":\"full-reindexing\"," +
         "  \"successfullyReprocessedMailCount\":42," +
         "  \"failedReprocessedMailCount\":2," +
-        "  \"failures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]}," +
+        "  \"messageFailures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]}," +
         "  \"mailboxFailures\":[\"3\", \"4\"]," +
         "  \"timestamp\":\"2018-11-13T12:00:55Z\"}";
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReprocessingDTOTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReprocessingDTOTest.java
index 02f4795..6409881 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReprocessingDTOTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReprocessingDTOTest.java
@@ -30,7 +30,6 @@ import org.apache.james.mailbox.indexer.ReIndexer;
 import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.TestId;
-import org.apache.mailbox.tools.indexer.ReprocessingContextInformationDTO;
 import org.apache.mailbox.tools.indexer.SingleMailboxReindexingTask;
 import org.junit.jupiter.api.Test;
 
@@ -45,7 +44,7 @@ class WebAdminSingleMailboxReprocessingDTOTest {
         "  \"mailboxId\":\"1\"," +
         "  \"successfullyReprocessedMailCount\":42," +
         "  \"failedReprocessedMailCount\":2," +
-        "  \"failures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]}," +
+        "  \"messageFailures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]}," +
         "  \"mailboxFailures\":[\"3\", \"4\"]," +
         "  \"timestamp\":\"2018-11-13T12:00:55Z\"}";
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminUserReprocessingDTOTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminUserReprocessingDTOTest.java
index 48acc11..05987d4 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminUserReprocessingDTOTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminUserReprocessingDTOTest.java
@@ -37,8 +37,6 @@ import org.junit.jupiter.api.Test;
 import com.fasterxml.jackson.databind.exc.InvalidDefinitionException;
 import com.google.common.collect.ImmutableList;
 
-import net.javacrumbs.jsonunit.core.Option;
-
 class WebAdminUserReprocessingDTOTest {
     private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
 
@@ -46,7 +44,7 @@ class WebAdminUserReprocessingDTOTest {
         "  \"type\":\"user-reindexing\",\"username\":\"bob\"," +
         "  \"successfullyReprocessedMailCount\":42," +
         "  \"failedReprocessedMailCount\":2," +
-        "  \"failures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]}," +
+        "  \"messageFailures\":{\"1\":[{\"uid\":10}],\"2\":[{\"uid\":20}]}," +
         "  \"mailboxFailures\":[\"3\", \"4\"]," +
         "  \"timestamp\":\"2018-11-13T12:00:55Z\"}";
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
index e9ce823..65ce22a 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
@@ -243,7 +243,7 @@ class MailboxesRoutesTest {
                     .body("type", is(FullReindexingTask.FULL_RE_INDEXING.asString()))
                     .body("additionalInformation.successfullyReprocessedMailCount", is(0))
                     .body("additionalInformation.failedReprocessedMailCount", is(1))
-                    .body("additionalInformation.failures.\"" + mailboxId.serialize() + "\"[0].uid", is(Long.valueOf(uidAsLong).intValue()))
+                    .body("additionalInformation.messageFailures.\"" + mailboxId.serialize() + "\"[0].uid", is(Long.valueOf(uidAsLong).intValue()))
                     .body("startedDate", is(notNullValue()))
                     .body("submitDate", is(notNullValue()));
             }
@@ -456,7 +456,7 @@ class MailboxesRoutesTest {
                     .body("type", is(SingleMailboxReindexingTask.TYPE.asString()))
                     .body("additionalInformation.successfullyReprocessedMailCount", is(0))
                     .body("additionalInformation.failedReprocessedMailCount", is(1))
-                    .body("additionalInformation.failures.\"" + mailboxId.serialize() + "\"[0].uid", is(Long.valueOf(uidAsLong).intValue()))
+                    .body("additionalInformation.messageFailures.\"" + mailboxId.serialize() + "\"[0].uid", is(Long.valueOf(uidAsLong).intValue()))
                     .body("startedDate", is(notNullValue()))
                     .body("submitDate", is(notNullValue()));
             }
@@ -877,7 +877,7 @@ class MailboxesRoutesTest {
                     .body("type", is("error-recovery-indexation"))
                     .body("additionalInformation.successfullyReprocessedMailCount", is(0))
                     .body("additionalInformation.failedReprocessedMailCount", is(1))
-                    .body("additionalInformation.failures.\"" + mailboxId.serialize() + "\"[0].uid", is(Long.valueOf(uidAsLong).intValue()))
+                    .body("additionalInformation.messageFailures.\"" + mailboxId.serialize() + "\"[0].uid", is(Long.valueOf(uidAsLong).intValue()))
                     .body("startedDate", is(notNullValue()))
                     .body("submitDate", is(notNullValue()));
             }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
index 2e8068d..f6eb6b5 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
@@ -1255,7 +1255,7 @@ class UserMailboxesRoutesTest {
                     .body("type", Matchers.is(UserReindexingTask.USER_RE_INDEXING.asString()))
                     .body("additionalInformation.successfullyReprocessedMailCount", Matchers.is(0))
                     .body("additionalInformation.failedReprocessedMailCount", Matchers.is(1))
-                    .body("additionalInformation.failures.\"" + mailboxId.serialize() + "\"[0].uid", Matchers.is(Long.valueOf(uidAsLong).intValue()))
+                    .body("additionalInformation.messageFailures.\"" + mailboxId.serialize() + "\"[0].uid", Matchers.is(Long.valueOf(uidAsLong).intValue()))
                     .body("startedDate", Matchers.is(notNullValue()))
                     .body("submitDate", Matchers.is(notNullValue()));
             }
diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md
index d3b0e93..abffd56 100644
--- a/src/site/markdown/server/manage-webadmin.md
+++ b/src/site/markdown/server/manage-webadmin.md
@@ -602,7 +602,7 @@ The scheduled task will have the following type `full-reindexing` and the follow
   "successfullyReprocessedMailCount":18,
   "failedReprocessedMailCount": 3,
   "mailboxFailures": ["12", "23" ],
-  "failures": [
+  "messageFailures": [
    {
      "mailboxId": "1",
       "uids": [1, 36]
@@ -645,7 +645,7 @@ The scheduled task will have the following type `error-recovery-indexation` and
   "successfullyReprocessedMailCount":18,
   "failedReprocessedMailCount": 3,
   "mailboxFailures": ["12", "23" ],
-  "failures": [{
+  "messageFailures": [{
      "mailboxId": "1",
       "uids": [1, 36]
    }]
@@ -698,7 +698,7 @@ The scheduled task will have the following type `mailbox-reindexing` and the fol
   "successfullyReprocessedMailCount":18,
   "failedReprocessedMailCount": 3,
   "mailboxFailures": ["12"],
-  "failures": [
+  "messageFailures": [
    {
      "mailboxId": "1",
       "uids": [1, 36]
@@ -1025,7 +1025,7 @@ The scheduled task will have the following type `user-reindexing` and the follow
   "successfullyReprocessedMailCount":18,
   "failedReprocessedMailCount": 3,
   "mailboxFailures": ["12", "23" ],
-  "failures": [
+  "messageFailures": [
    {
      "mailboxId": "1",
       "uids": [1, 36]


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


[james-project] 10/17: JAMES-3201 Add missign tests for ReIndexing tasks mailboxFailures

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 24e68333b4e4d90648ea184bc8aff79b1a2a8e33
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Jun 10 13:37:46 2020 +0700

    JAMES-3201 Add missign tests for ReIndexing tasks mailboxFailures
---
 .../james/webadmin/routes/MailboxesRoutesTest.java | 81 ++++++++++++++++++++++
 .../webadmin/routes/UserMailboxesRoutesTest.java   | 25 +++++++
 2 files changed, 106 insertions(+)

diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
index dfb5867..e9ce823 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
@@ -63,6 +63,7 @@ import org.apache.mailbox.tools.indexer.SingleMailboxReindexingTask;
 import org.apache.mailbox.tools.indexer.SingleMessageReindexingTask;
 import org.apache.mailbox.tools.indexer.SingleMessageReindexingTaskAdditionalInformationDTO;
 import org.eclipse.jetty.http.HttpStatus;
+import org.hamcrest.Matchers;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
@@ -246,6 +247,30 @@ class MailboxesRoutesTest {
                     .body("startedDate", is(notNullValue()))
                     .body("submitDate", is(notNullValue()));
             }
+
+            @Test
+            void userReprocessingShouldReturnTaskDetailsWhenFailingAtTheMailboxLevel() throws Exception {
+                MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME);
+                MailboxId mailboxId = mailboxManager.createMailbox(INBOX, systemSession).get();
+
+                doReturn(Mono.error(new RuntimeException()))
+                    .when(searchIndex)
+                    .deleteAll(any(MailboxSession.class), any(MailboxId.class));
+
+                String taskId = with()
+                    .post("/mailboxes?task=reIndex")
+                    .jsonPath()
+                    .get("taskId");
+
+                given()
+                    .basePath(TasksRoutes.BASE)
+                .when()
+                    .get(taskId + "/await")
+                .then()
+                    .body("status", Matchers.is("failed"))
+                    .body("taskId", Matchers.is(notNullValue()))
+                    .body("additionalInformation.mailboxFailures", Matchers.containsInAnyOrder(mailboxId.serialize()));
+            }
         }
 
         @Nested
@@ -435,6 +460,31 @@ class MailboxesRoutesTest {
                     .body("startedDate", is(notNullValue()))
                     .body("submitDate", is(notNullValue()));
             }
+
+            @Test
+            void userReprocessingShouldReturnTaskDetailsWhenFailingAtTheMailboxLevel() throws Exception {
+                MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME);
+                MailboxId mailboxId = mailboxManager.createMailbox(INBOX, systemSession).get();
+
+                doReturn(Mono.error(new RuntimeException()))
+                    .when(searchIndex)
+                    .deleteAll(any(MailboxSession.class), any(MailboxId.class));
+
+                String taskId = with()
+                    .queryParam("task", "reIndex")
+                    .post("/mailboxes/" + mailboxId.serialize())
+                    .jsonPath()
+                    .get("taskId");
+
+                given()
+                    .basePath(TasksRoutes.BASE)
+                .when()
+                    .get(taskId + "/await")
+                .then()
+                    .body("status", Matchers.is("failed"))
+                    .body("taskId", Matchers.is(notNullValue()))
+                    .body("additionalInformation.mailboxFailures", Matchers.containsInAnyOrder(mailboxId.serialize()));
+            }
         }
 
         @Nested
@@ -831,6 +881,37 @@ class MailboxesRoutesTest {
                     .body("startedDate", is(notNullValue()))
                     .body("submitDate", is(notNullValue()));
             }
+
+            @Test
+            void userReprocessingShouldReturnTaskDetailsWhenFailingAtTheMailboxLevel() throws Exception {
+                MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME);
+                MailboxId mailboxId = mailboxManager.createMailbox(INBOX, systemSession).get();
+
+                doReturn(Mono.error(new RuntimeException()))
+                    .when(searchIndex)
+                    .deleteAll(any(MailboxSession.class), any(MailboxId.class));
+
+                String taskId = with()
+                    .post("/mailboxes?task=reIndex")
+                    .jsonPath()
+                    .get("taskId");
+
+                String fixingTaskId = with()
+                    .queryParam("reIndexFailedMessagesOf", taskId)
+                    .queryParam("task", "reIndex")
+                    .post("/mailboxes")
+                    .jsonPath()
+                    .get("taskId");
+
+                given()
+                    .basePath(TasksRoutes.BASE)
+                .when()
+                    .get(fixingTaskId + "/await")
+                .then()
+                    .body("status", Matchers.is("failed"))
+                    .body("taskId", Matchers.is(notNullValue()))
+                    .body("additionalInformation.mailboxFailures", Matchers.containsInAnyOrder(mailboxId.serialize()));
+            }
         }
 
         @Nested
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
index 2818968..2e8068d 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
@@ -1259,6 +1259,31 @@ class UserMailboxesRoutesTest {
                     .body("startedDate", Matchers.is(notNullValue()))
                     .body("submitDate", Matchers.is(notNullValue()));
             }
+
+            @Test
+            void userReprocessingShouldReturnTaskDetailsWhenFailingAtTheMailboxLevel() throws Exception {
+                MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME);
+                MailboxId mailboxId = mailboxManager.createMailbox(INBOX, systemSession).get();
+
+                doReturn(Mono.error(new RuntimeException()))
+                    .when(searchIndex)
+                    .deleteAll(any(MailboxSession.class), any(MailboxId.class));
+
+                String taskId = with()
+                    .queryParam("task", "reIndex")
+                    .post()
+                    .jsonPath()
+                    .get("taskId");
+
+                given()
+                    .basePath(TasksRoutes.BASE)
+                .when()
+                    .get(taskId + "/await")
+                .then()
+                    .body("status", Matchers.is("failed"))
+                    .body("taskId", Matchers.is(notNullValue()))
+                    .body("additionalInformation.mailboxFailures", Matchers.containsInAnyOrder(mailboxId.serialize()));
+            }
         }
 
         @Nested


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