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:43 UTC

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

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