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

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

commit 1ce3b28b8f62160dbd70951c20c8b83f8387e110
Author: RĂ©mi Kowalski <[email protected]>
AuthorDate: Fri Aug 30 15:05:18 2019 +0200

    JAMES-2813 strongly type TaskType
---
 .../cassandra/migration/MigrationTask.java         |  5 ++-
 .../mail/migration/MailboxPathV2Migration.java     |  5 ++-
 .../cassandra/mail/task/MailboxMergingTask.java    |  7 ++--
 .../blob/BlobStoreVaultGarbageCollectionTask.java  |  5 ++-
 .../tools/indexer/ErrorRecoveryIndexationTask.java |  7 ++--
 .../mailbox/tools/indexer/FullReindexingTask.java  |  7 ++--
 .../tools/indexer/MessageIdReIndexerImpl.java      |  5 ++-
 .../tools/indexer/SingleMailboxReindexingTask.java |  7 ++--
 .../tools/indexer/SingleMessageReindexingTask.java |  7 ++--
 .../mailbox/tools/indexer/UserReindexingTask.java  |  7 ++--
 .../migration/MappingsSourcesMigration.java        |  9 ++---
 .../CassandraMappingsSolveInconsistenciesTask.java |  7 ++--
 .../james/webadmin/dto/ExecutionDetailsDto.java    |  2 +-
 .../routes/DeletedMessagesVaultDeleteTask.java     |  7 ++--
 .../routes/DeletedMessagesVaultExportTask.java     |  7 ++--
 .../routes/DeletedMessagesVaultRestoreTask.java    |  7 ++--
 .../WebadminApiQuerySerializationContractTest.java |  2 +-
 .../service/EventDeadLettersRedeliverTask.java     |  7 ++--
 .../service/PreviousReIndexingService.java         |  5 ++-
 .../james/webadmin/service/ClearMailQueueTask.java |  7 ++--
 .../service/DeleteMailsFromMailQueueTask.java      |  7 ++--
 .../webadmin/service/ClearMailRepositoryTask.java  |  7 ++--
 .../webadmin/service/ReprocessingAllMailsTask.java |  7 ++--
 .../webadmin/service/ReprocessingOneMailTask.java  |  7 ++--
 ...assandraTaskExecutionDetailsProjectionDAO.scala |  8 ++--
 .../apache/james/server/task/json/TestTask.java    |  5 ++-
 .../src/main/java/org/apache/james/task/Task.java  |  4 +-
 .../java/org/apache/james/task/TaskType.java}      | 44 ++++++++++++++++------
 .../apache/james/task/TaskExecutionDetails.scala   |  4 +-
 .../java/org/apache/james/task/CompletedTask.java  |  4 +-
 .../java/org/apache/james/task/FailedTask.java     |  4 +-
 .../org/apache/james/task/MemoryReferenceTask.java |  4 +-
 ...{MemoryReferenceTask.java => TaskTypeTest.java} | 34 ++++++++---------
 .../java/org/apache/james/task/ThrowingTask.java   |  4 +-
 .../james/task/TaskExecutionDetailsFixture.scala   |  9 +++--
 35 files changed, 158 insertions(+), 116 deletions(-)

diff --git 
a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTask.java
 
b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTask.java
index 632fdc0..538a6f5 100644
--- 
a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTask.java
+++ 
b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTask.java
@@ -34,6 +34,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.task.TaskType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -96,7 +97,7 @@ public class MigrationTask implements Task {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(MigrationTask.class);
 
-    public static final String CASSANDRA_MIGRATION = "CassandraMigration";
+    public static final TaskType CASSANDRA_MIGRATION = 
TaskType.of("CassandraMigration");
 
     public static class Details implements 
TaskExecutionDetails.AdditionalInformation {
         private final SchemaVersion toVersion;
@@ -170,7 +171,7 @@ public class MigrationTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return CASSANDRA_MIGRATION;
     }
 
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2Migration.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2Migration.java
index a063457..d3cb735 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2Migration.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2Migration.java
@@ -30,6 +30,7 @@ import 
org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAOImpl;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathV2DAO;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.task.TaskType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -96,8 +97,8 @@ public class MailboxPathV2Migration implements Migration {
             }
 
             @Override
-            public String type() {
-                return "Cassandra_mailboxPathV2Migration";
+            public TaskType type() {
+                return TaskType.of("Cassandra_mailboxPathV2Migration");
             }
 
             @Override
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTask.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTask.java
index 30ffb3b..87692a0 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTask.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTask.java
@@ -29,11 +29,12 @@ 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.TaskType;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class MailboxMergingTask implements Task {
-    public static final String MAILBOX_MERGING = "mailboxMerging";
+    public static final TaskType MAILBOX_MERGING = 
TaskType.of("mailboxMerging");
 
     public static class Details implements 
TaskExecutionDetails.AdditionalInformation {
         private final CassandraId oldMailboxId;
@@ -165,7 +166,7 @@ public class MailboxMergingTask implements Task {
             .convertToDTO(MailboxMergingTaskDTO.class)
             .toDomainObjectConverter(dto -> dto.toDTO(taskRunner))
             .toDTOConverter(MailboxMergingTaskDTO::fromDTO)
-            .typeName(MAILBOX_MERGING)
+            .typeName(MAILBOX_MERGING.asString())
             .withFactory(TaskDTOModule::new);
 
     private final MailboxMergingTaskRunner taskRunner;
@@ -186,7 +187,7 @@ public class MailboxMergingTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return MAILBOX_MERGING;
     }
 
diff --git 
a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTask.java
 
b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTask.java
index ec616c5..0d3c014 100644
--- 
a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTask.java
+++ 
b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTask.java
@@ -28,6 +28,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
 import org.apache.james.blob.api.BucketName;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.task.TaskType;
 
 import com.github.steveash.guavate.Guavate;
 
@@ -57,7 +58,7 @@ public class BlobStoreVaultGarbageCollectionTask implements 
Task {
         }
     }
 
-    public static final String TYPE = 
"deletedMessages/blobStoreBasedGarbageCollection";
+    private static final TaskType TYPE = 
TaskType.of("deletedMessages/blobStoreBasedGarbageCollection");
 
     private final Flux<BucketName> retentionOperation;
     private final ZonedDateTime beginningOfRetentionPeriod;
@@ -81,7 +82,7 @@ public class BlobStoreVaultGarbageCollectionTask implements 
Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return TYPE;
     }
 
diff --git 
a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTask.java
 
b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTask.java
index a7dc60e..01bf9b4 100644
--- 
a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTask.java
+++ 
b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTask.java
@@ -35,13 +35,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.task.TaskType;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.Multimap;
 
 public class ErrorRecoveryIndexationTask implements Task {
-    private static final String PREVIOUS_FAILURES_INDEXING = 
"ErrorRecoveryIndexation";
+    private static final TaskType PREVIOUS_FAILURES_INDEXING = 
TaskType.of("ErrorRecoveryIndexation");
 
     public static final Function<ErrorRecoveryIndexationTask.Factory, 
TaskDTOModule<ErrorRecoveryIndexationTask, ErrorRecoveryIndexationTaskDTO>> 
MODULE = (factory) ->
         DTOModule
@@ -49,7 +50,7 @@ public class ErrorRecoveryIndexationTask implements Task {
             
.convertToDTO(ErrorRecoveryIndexationTask.ErrorRecoveryIndexationTaskDTO.class)
             .toDomainObjectConverter(factory::create)
             
.toDTOConverter(ErrorRecoveryIndexationTask.ErrorRecoveryIndexationTaskDTO::of)
-            .typeName(PREVIOUS_FAILURES_INDEXING)
+            .typeName(PREVIOUS_FAILURES_INDEXING.asString())
             .withFactory(TaskDTOModule::new);
 
     public static class ErrorRecoveryIndexationTaskDTO implements TaskDTO {
@@ -156,7 +157,7 @@ public class ErrorRecoveryIndexationTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return PREVIOUS_FAILURES_INDEXING;
     }
 
diff --git 
a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/FullReindexingTask.java
 
b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/FullReindexingTask.java
index c6a8491..b30cb5d 100644
--- 
a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/FullReindexingTask.java
+++ 
b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/FullReindexingTask.java
@@ -30,12 +30,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.task.TaskType;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class FullReindexingTask implements Task {
 
-    public static final String FULL_RE_INDEXING = "FullReIndexing";
+    public static final TaskType FULL_RE_INDEXING = 
TaskType.of("FullReIndexing");
 
     private final ReIndexerPerformer reIndexerPerformer;
     private final ReprocessingContextInformation additionalInformation;
@@ -47,7 +48,7 @@ public class FullReindexingTask implements Task {
             .convertToDTO(FullReindexingTask.FullReindexingTaskDTO.class)
             .toDomainObjectConverter(factory::create)
             .toDTOConverter((task, type) -> new FullReindexingTaskDTO(type))
-            .typeName(FULL_RE_INDEXING)
+            .typeName(FULL_RE_INDEXING.asString())
             .withFactory(TaskDTOModule::new);
 
     public static class FullReindexingTaskDTO implements TaskDTO {
@@ -96,7 +97,7 @@ public class FullReindexingTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return FULL_RE_INDEXING;
     }
 
diff --git 
a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexerImpl.java
 
b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexerImpl.java
index 06ef559..27ae4f4 100644
--- 
a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexerImpl.java
+++ 
b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexerImpl.java
@@ -35,6 +35,7 @@ import 
org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.task.TaskType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,7 +45,7 @@ public class MessageIdReIndexerImpl implements 
MessageIdReIndexer {
     public static class MessageIdReIndexingTask implements Task {
         private static final Logger LOGGER = 
LoggerFactory.getLogger(MessageIdReIndexingTask.class);
 
-        public static final String TYPE = "MessageIdReIndexingTask";
+        public static final TaskType TYPE = new 
TaskType("MessageIdReIndexingTask");
 
         public final class AdditionalInformation implements 
TaskExecutionDetails.AdditionalInformation {
             private final MessageId messageId;
@@ -102,7 +103,7 @@ public class MessageIdReIndexerImpl implements 
MessageIdReIndexer {
         }
 
         @Override
-        public String type() {
+        public TaskType type() {
             return TYPE;
         }
 
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 e76f2f8..71cb0db 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
@@ -30,6 +30,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.task.TaskType;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
@@ -60,7 +61,7 @@ public class SingleMailboxReindexingTask implements Task {
 
     }
 
-    public static final String MAILBOX_RE_INDEXING = "mailboxReIndexing";
+    public static final TaskType MAILBOX_RE_INDEXING = 
TaskType.of("mailboxReIndexing");
 
     public static final Function<Factory, 
TaskDTOModule<SingleMailboxReindexingTask, SingleMailboxReindexingTaskDTO>> 
MODULE = (factory) ->
         DTOModule
@@ -68,7 +69,7 @@ public class SingleMailboxReindexingTask implements Task {
             .convertToDTO(SingleMailboxReindexingTaskDTO.class)
             .toDomainObjectConverter(factory::create)
             .toDTOConverter(SingleMailboxReindexingTaskDTO::of)
-            .typeName(MAILBOX_RE_INDEXING)
+            .typeName(MAILBOX_RE_INDEXING.asString())
             .withFactory(TaskDTOModule::new);
 
     public static class AdditionalInformation extends 
ReprocessingContextInformation {
@@ -124,7 +125,7 @@ public class SingleMailboxReindexingTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return MAILBOX_RE_INDEXING;
     }
 
diff --git 
a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTask.java
 
b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTask.java
index 83b1be2..19b6ff0 100644
--- 
a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTask.java
+++ 
b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTask.java
@@ -32,6 +32,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.task.TaskType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,7 +41,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 public class SingleMessageReindexingTask implements Task {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(SingleMessageReindexingTask.class);
 
-    public static final String MESSAGE_RE_INDEXING = "messageReIndexing";
+    public static final TaskType MESSAGE_RE_INDEXING = 
TaskType.of("messageReIndexing");
 
     public static final Function<SingleMessageReindexingTask.Factory, 
TaskDTOModule<SingleMessageReindexingTask, 
SingleMessageReindexingTask.SingleMessageReindexingTaskDTO>> MODULE = (factory) 
->
         DTOModule
@@ -48,7 +49,7 @@ public class SingleMessageReindexingTask implements Task {
             
.convertToDTO(SingleMessageReindexingTask.SingleMessageReindexingTaskDTO.class)
             .toDomainObjectConverter(factory::create)
             
.toDTOConverter(SingleMessageReindexingTask.SingleMessageReindexingTaskDTO::of)
-            .typeName(MESSAGE_RE_INDEXING)
+            .typeName(MESSAGE_RE_INDEXING.asString())
             .withFactory(TaskDTOModule::new);
 
 
@@ -142,7 +143,7 @@ public class SingleMessageReindexingTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return MESSAGE_RE_INDEXING;
     }
 
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 af8b329..9be6734 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
@@ -31,12 +31,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.task.TaskType;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class UserReindexingTask implements Task {
 
-    public static final String USER_RE_INDEXING = "userReIndexing";
+    public static final TaskType USER_RE_INDEXING = 
TaskType.of("userReIndexing");
 
     public static final Function<UserReindexingTask.Factory, 
TaskDTOModule<UserReindexingTask, UserReindexingTask.UserReindexingTaskDTO>> 
MODULE = (factory) ->
         DTOModule
@@ -44,7 +45,7 @@ public class UserReindexingTask implements Task {
             .convertToDTO(UserReindexingTask.UserReindexingTaskDTO.class)
             .toDomainObjectConverter(factory::create)
             .toDTOConverter(UserReindexingTask.UserReindexingTaskDTO::of)
-            .typeName(USER_RE_INDEXING)
+            .typeName(USER_RE_INDEXING.asString())
             .withFactory(TaskDTOModule::new);
 
     public static class UserReindexingTaskDTO implements TaskDTO {
@@ -123,7 +124,7 @@ public class UserReindexingTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return USER_RE_INDEXING;
     }
 
diff --git 
a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigration.java
 
b/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigration.java
index 990d994..6d4f887 100644
--- 
a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigration.java
+++ 
b/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigration.java
@@ -33,6 +33,7 @@ import org.apache.james.rrt.lib.Mapping;
 import org.apache.james.rrt.lib.MappingSource;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.task.TaskType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,7 +41,7 @@ import reactor.core.publisher.Mono;
 
 public class MappingsSourcesMigration implements Migration {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(MappingsSourcesMigration.class);
-    private static final String TYPE = "mappingsSourcesMigration";
+    private static final TaskType TYPE = 
TaskType.of("mappingsSourcesMigration");
 
     public static class AdditionalInformation implements 
TaskExecutionDetails.AdditionalInformation {
         private final long successfulMappingsCount;
@@ -93,7 +94,7 @@ public class MappingsSourcesMigration implements Migration {
             .then()
             .onErrorResume(t -> {
                 LOGGER.error("Error while performing migration of mapping 
source: {} with mapping: {}",
-                        mappingEntry.getLeft().asString(), 
mappingEntry.getRight().asString(), t);
+                    mappingEntry.getLeft().asString(), 
mappingEntry.getRight().asString(), t);
                 errorMappingsCount.incrementAndGet();
                 return Mono.empty();
             });
@@ -109,7 +110,7 @@ public class MappingsSourcesMigration implements Migration {
             }
 
             @Override
-            public String type() {
+            public TaskType type() {
                 return TYPE;
             }
 
@@ -120,8 +121,6 @@ public class MappingsSourcesMigration implements Migration {
         };
     }
 
-
-
     AdditionalInformation createAdditionalInformation() {
         return new AdditionalInformation(
             successfulMappingsCount.get(),
diff --git 
a/server/protocols/webadmin/webadmin-cassandra-data/src/main/java/org/apache/james/webadmin/service/CassandraMappingsSolveInconsistenciesTask.java
 
b/server/protocols/webadmin/webadmin-cassandra-data/src/main/java/org/apache/james/webadmin/service/CassandraMappingsSolveInconsistenciesTask.java
index 040ce34..f951dbf 100644
--- 
a/server/protocols/webadmin/webadmin-cassandra-data/src/main/java/org/apache/james/webadmin/service/CassandraMappingsSolveInconsistenciesTask.java
+++ 
b/server/protocols/webadmin/webadmin-cassandra-data/src/main/java/org/apache/james/webadmin/service/CassandraMappingsSolveInconsistenciesTask.java
@@ -31,12 +31,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.task.TaskType;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import reactor.core.publisher.Mono;
 
 public class CassandraMappingsSolveInconsistenciesTask implements Task {
-    public static final String TYPE = "cassandraMappingsSolveInconsistencies";
+    public static final TaskType TYPE = 
TaskType.of("cassandraMappingsSolveInconsistencies");
 
     private static class CassandraMappingsSolveInconsistenciesTaskDTO 
implements TaskDTO {
 
@@ -58,7 +59,7 @@ public class CassandraMappingsSolveInconsistenciesTask 
implements Task {
             .convertToDTO(CassandraMappingsSolveInconsistenciesTaskDTO.class)
             .toDomainObjectConverter(dto -> new 
CassandraMappingsSolveInconsistenciesTask(mappingsSourcesMigration, 
cassandraMappingsSourcesDAO))
             .toDTOConverter((domainObject, typeName) -> new 
CassandraMappingsSolveInconsistenciesTaskDTO(typeName))
-            .typeName(TYPE)
+            .typeName(TYPE.asString())
             .withFactory(TaskDTOModule::new);
 
     private final Task mappingsSourcesMigration;
@@ -81,7 +82,7 @@ public class CassandraMappingsSolveInconsistenciesTask 
implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return TYPE;
     }
 
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 31216cb..7819977 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
@@ -53,7 +53,7 @@ public class ExecutionDetailsDto {
     }
 
     public String getType() {
-        return executionDetails.getType();
+        return executionDetails.getType().asString();
     }
 
     public String getStatus() {
diff --git 
a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTask.java
 
b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTask.java
index 1af3326..4584a3e 100644
--- 
a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTask.java
+++ 
b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTask.java
@@ -31,6 +31,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.task.TaskType;
 import org.apache.james.vault.DeletedMessageVault;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -38,7 +39,7 @@ import reactor.core.publisher.Mono;
 
 public class DeletedMessagesVaultDeleteTask implements Task {
 
-    static final String TYPE = "deletedMessages/delete";
+    static final TaskType TYPE = TaskType.of("deletedMessages/delete");
 
     public static final Function<DeletedMessagesVaultDeleteTask.Factory, 
TaskDTOModule<DeletedMessagesVaultDeleteTask, 
DeletedMessagesVaultDeleteTaskDTO>> MODULE = (factory) ->
         DTOModule
@@ -46,7 +47,7 @@ public class DeletedMessagesVaultDeleteTask implements Task {
             
.convertToDTO(DeletedMessagesVaultDeleteTask.DeletedMessagesVaultDeleteTaskDTO.class)
             .toDomainObjectConverter(factory::create)
             
.toDTOConverter(DeletedMessagesVaultDeleteTask.DeletedMessagesVaultDeleteTaskDTO::of)
-            .typeName(TYPE)
+            .typeName(TYPE.asString())
             .withFactory(TaskDTOModule::new);
 
     public static class DeletedMessagesVaultDeleteTaskDTO implements TaskDTO {
@@ -135,7 +136,7 @@ public class DeletedMessagesVaultDeleteTask implements Task 
{
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return TYPE;
     }
 
diff --git 
a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTask.java
 
b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTask.java
index 9b65c20..d10cc1c 100644
--- 
a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTask.java
+++ 
b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTask.java
@@ -34,6 +34,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.task.TaskType;
 import org.apache.james.vault.dto.query.QueryDTO;
 import org.apache.james.vault.dto.query.QueryTranslator;
 import org.apache.james.vault.search.Query;
@@ -45,7 +46,7 @@ import com.google.common.annotations.VisibleForTesting;
 
 class DeletedMessagesVaultExportTask implements Task {
 
-    static final String TYPE = "deletedMessages/export";
+    static final TaskType TYPE = TaskType.of("deletedMessages/export");
 
     public static final Function<DeletedMessagesVaultExportTask.Factory, 
TaskDTOModule<DeletedMessagesVaultExportTask, 
DeletedMessagesVaultExportTaskDTO>> MODULE = (factory) ->
         DTOModule
@@ -59,7 +60,7 @@ class DeletedMessagesVaultExportTask implements Task {
                 }
             })
             .toDTOConverter(factory::createDTO)
-            .typeName(TYPE)
+            .typeName(TYPE.asString())
             .withFactory(TaskDTOModule::new);
 
     public static class DeletedMessagesVaultExportTaskDTO implements TaskDTO {
@@ -175,7 +176,7 @@ class DeletedMessagesVaultExportTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return TYPE;
     }
 
diff --git 
a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTask.java
 
b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTask.java
index 786a73b..75249d5 100644
--- 
a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTask.java
+++ 
b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTask.java
@@ -34,6 +34,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.task.TaskType;
 import org.apache.james.vault.dto.query.QueryDTO;
 import org.apache.james.vault.dto.query.QueryTranslator;
 import org.apache.james.vault.search.Query;
@@ -45,7 +46,7 @@ import com.google.common.annotations.VisibleForTesting;
 
 class DeletedMessagesVaultRestoreTask implements Task {
 
-    static final String TYPE = "deletedMessages/restore";
+    static final TaskType TYPE = TaskType.of("deletedMessages/restore");
 
     public static final Function<DeletedMessagesVaultRestoreTask.Factory, 
TaskDTOModule<DeletedMessagesVaultRestoreTask, 
DeletedMessagesVaultRestoreTaskDTO>> MODULE = (factory) ->
         DTOModule
@@ -53,7 +54,7 @@ class DeletedMessagesVaultRestoreTask implements Task {
             
.convertToDTO(DeletedMessagesVaultRestoreTask.DeletedMessagesVaultRestoreTaskDTO.class)
             .toDomainObjectConverter(factory::create)
             .toDTOConverter(factory::createDTO)
-            .typeName(TYPE)
+            .typeName(TYPE.asString())
             .withFactory(TaskDTOModule::new);
 
     public static class DeletedMessagesVaultRestoreTaskDTO implements TaskDTO {
@@ -186,7 +187,7 @@ class DeletedMessagesVaultRestoreTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return TYPE;
     }
 
diff --git 
a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebadminApiQuerySerializationContractTest.java
 
b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebadminApiQuerySerializationContractTest.java
index 32b3d66..967ef88 100644
--- 
a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebadminApiQuerySerializationContractTest.java
+++ 
b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebadminApiQuerySerializationContractTest.java
@@ -109,7 +109,7 @@ class WebadminApiQuerySerializationContractTest {
     void respectAPIContract(String jsonFilePath, QueryDTO 
expectedDeserializedValue) throws Exception {
         String jsonContent = 
ClassLoaderUtils.getSystemResourceAsString("query/" + jsonFilePath);
         QueryDTO extractedQueryDTO = 
factory.createDTO((DeletedMessagesVaultRestoreTask) 
taskSerializer.deserialize(jsonContent),
-            DeletedMessagesVaultRestoreTask.TYPE).getQuery();
+            DeletedMessagesVaultRestoreTask.TYPE.asString()).getQuery();
         
Assertions.assertThat(extractedQueryDTO).isEqualTo(expectedDeserializedValue);
     }
 
diff --git 
a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverTask.java
 
b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverTask.java
index 0ac810b..53a4832 100644
--- 
a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverTask.java
+++ 
b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverTask.java
@@ -30,12 +30,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.task.TaskType;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class EventDeadLettersRedeliverTask implements Task {
-    public static final String TYPE = "eventDeadLettersRedeliverTask";
+    public static final TaskType TYPE = 
TaskType.of("eventDeadLettersRedeliverTask");
 
     public static class AdditionalInformation implements 
TaskExecutionDetails.AdditionalInformation {
         private final long successfulRedeliveriesCount;
@@ -90,7 +91,7 @@ public class EventDeadLettersRedeliverTask implements Task {
             .convertToDTO(EventDeadLettersRedeliverTaskDTO.class)
             .toDomainObjectConverter(dto -> new 
EventDeadLettersRedeliverTask(service, eventRetriever))
             .toDTOConverter((domainObject, typeName) -> new 
EventDeadLettersRedeliverTaskDTO(typeName))
-            .typeName(TYPE)
+            .typeName(TYPE.asString())
             .withFactory(TaskDTOModule::new);
 
     private final EventDeadLettersRedeliverService service;
@@ -128,7 +129,7 @@ public class EventDeadLettersRedeliverTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return TYPE;
     }
 
diff --git 
a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/PreviousReIndexingService.java
 
b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/PreviousReIndexingService.java
index 9c00dea..e03f6cd 100644
--- 
a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/PreviousReIndexingService.java
+++ 
b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/PreviousReIndexingService.java
@@ -26,6 +26,7 @@ import org.apache.james.task.TaskExecutionDetails;
 import org.apache.james.task.TaskId;
 import org.apache.james.task.TaskManager;
 import org.apache.james.task.TaskNotFoundException;
+import org.apache.james.task.TaskType;
 
 public class PreviousReIndexingService {
     public static class TaskNotYetFinishedException extends RuntimeException {
@@ -35,8 +36,8 @@ public class PreviousReIndexingService {
     }
 
     public static class NotAnIndexingRetriableTask extends RuntimeException {
-        NotAnIndexingRetriableTask(String type) {
-            super("'" + type + "' is not a valid type of task for retrying a 
failed indexing");
+        NotAnIndexingRetriableTask(TaskType type) {
+            super("'" + type.asString() + "' is not a valid type of task for 
retrying a failed indexing");
         }
     }
 
diff --git 
a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTask.java
 
b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTask.java
index b9dc686..7e92601 100644
--- 
a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTask.java
+++ 
b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTask.java
@@ -32,6 +32,7 @@ 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.TaskType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -98,14 +99,14 @@ public class ClearMailQueueTask implements Task {
     }
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(ClearMailQueueTask.class);
-    public static final String TYPE = "clear-mail-queue";
+    public static final TaskType TYPE = TaskType.of("clear-mail-queue");
     public static final Function<MailQueueFactory<ManageableMailQueue>, 
TaskDTOModule<ClearMailQueueTask, ClearMailQueueTaskDTO>> MODULE = 
(mailQueueFactory) ->
         DTOModule
             .forDomainObject(ClearMailQueueTask.class)
             .convertToDTO(ClearMailQueueTaskDTO.class)
             .toDomainObjectConverter(dto -> dto.fromDTO(mailQueueFactory))
             .toDTOConverter(ClearMailQueueTaskDTO::toDTO)
-            .typeName(TYPE)
+            .typeName(TYPE.asString())
             .withFactory(TaskDTOModule::new);
 
     private final ManageableMailQueue queue;
@@ -129,7 +130,7 @@ public class ClearMailQueueTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return TYPE;
     }
 
diff --git 
a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTask.java
 
b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTask.java
index b156fc4..bf41ea8 100644
--- 
a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTask.java
+++ 
b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTask.java
@@ -32,6 +32,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.task.TaskType;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.github.fge.lambdas.Throwing;
@@ -153,14 +154,14 @@ public class DeleteMailsFromMailQueueTask implements Task 
{
         }
     }
 
-    public static final String TYPE = "delete-mails-from-mail-queue";
+    public static final TaskType TYPE = 
TaskType.of("delete-mails-from-mail-queue");
     public static final Function<MailQueueFactory<ManageableMailQueue>, 
TaskDTOModule<DeleteMailsFromMailQueueTask,DeleteMailsFromMailQueueTaskDTO>> 
MODULE = (mailQueueFactory) ->
         DTOModule
             .forDomainObject(DeleteMailsFromMailQueueTask.class)
             .convertToDTO(DeleteMailsFromMailQueueTaskDTO.class)
             .toDomainObjectConverter(dto -> dto.fromDTO(mailQueueFactory))
             .toDTOConverter(DeleteMailsFromMailQueueTaskDTO::toDTO)
-            .typeName(TYPE)
+            .typeName(TYPE.asString())
             .withFactory(TaskDTOModule::new);
 
     private final ManageableMailQueue queue;
@@ -197,7 +198,7 @@ public class DeleteMailsFromMailQueueTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return TYPE;
     }
 
diff --git 
a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTask.java
 
b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTask.java
index 8fe7e41..bb5d530 100644
--- 
a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTask.java
+++ 
b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTask.java
@@ -33,13 +33,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.task.TaskType;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.github.fge.lambdas.Throwing;
 
 public class ClearMailRepositoryTask implements Task {
 
-    public static final String TYPE = "clearMailRepository";
+    public static final TaskType TYPE = TaskType.of("clearMailRepository");
 
     public static class AdditionalInformation implements 
TaskExecutionDetails.AdditionalInformation {
         private final MailRepositoryPath repositoryPath;
@@ -121,7 +122,7 @@ public class ClearMailRepositoryTask implements Task {
             .convertToDTO(ClearMailRepositoryTaskDTO.class)
             .toDomainObjectConverter(dto -> dto.fromDTO(mailRepositories))
             .toDTOConverter(ClearMailRepositoryTaskDTO::toDTO)
-            .typeName(TYPE)
+            .typeName(TYPE.asString())
             .withFactory(TaskDTOModule::new);
 
     private final List<MailRepository> mailRepositories;
@@ -148,7 +149,7 @@ public class ClearMailRepositoryTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return TYPE;
     }
 
diff --git 
a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTask.java
 
b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTask.java
index b8f9409..2c669bf 100644
--- 
a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTask.java
+++ 
b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTask.java
@@ -33,13 +33,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.task.TaskType;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class ReprocessingAllMailsTask implements Task {
 
-    public static final String TYPE = "reprocessingAllTask";
+    public static final TaskType TYPE = TaskType.of("reprocessingAllTask");
 
     public static class AdditionalInformation implements 
TaskExecutionDetails.AdditionalInformation {
         private final MailRepositoryPath repositoryPath;
@@ -172,7 +173,7 @@ public class ReprocessingAllMailsTask implements Task {
             .convertToDTO(ReprocessingAllMailsTaskDTO.class)
             .toDomainObjectConverter(dto -> dto.fromDTO(reprocessingService))
             .toDTOConverter(ReprocessingAllMailsTaskDTO::toDTO)
-            .typeName(TYPE)
+            .typeName(TYPE.asString())
             .withFactory(TaskDTOModule::new);
 
     private final ReprocessingService reprocessingService;
@@ -203,7 +204,7 @@ public class ReprocessingAllMailsTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return TYPE;
     }
 
diff --git 
a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTask.java
 
b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTask.java
index 6ccfadd..dbffedc 100644
--- 
a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTask.java
+++ 
b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTask.java
@@ -31,12 +31,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.task.TaskType;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class ReprocessingOneMailTask implements Task {
 
-    public static final String TYPE = "reprocessingOneTask";
+    public static final TaskType TYPE = TaskType.of("reprocessingOneTask");
 
     public static class AdditionalInformation implements 
TaskExecutionDetails.AdditionalInformation {
         private final MailRepositoryPath repositoryPath;
@@ -162,7 +163,7 @@ public class ReprocessingOneMailTask implements Task {
             .convertToDTO(ReprocessingOneMailTaskDTO.class)
             .toDomainObjectConverter(dto -> dto.fromDTO(reprocessingService))
             .toDTOConverter(ReprocessingOneMailTaskDTO::toDTO)
-            .typeName(TYPE)
+            .typeName(TYPE.asString())
             .withFactory(TaskDTOModule::new);
 
     private final ReprocessingService reprocessingService;
@@ -194,7 +195,7 @@ public class ReprocessingOneMailTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return TYPE;
     }
 
diff --git 
a/server/task-distributed/src/main/scala/org/apache/james/task/eventsourcing/cassandra/CassandraTaskExecutionDetailsProjectionDAO.scala
 
b/server/task-distributed/src/main/scala/org/apache/james/task/eventsourcing/cassandra/CassandraTaskExecutionDetailsProjectionDAO.scala
index fdcf2ac..232def3 100644
--- 
a/server/task-distributed/src/main/scala/org/apache/james/task/eventsourcing/cassandra/CassandraTaskExecutionDetailsProjectionDAO.scala
+++ 
b/server/task-distributed/src/main/scala/org/apache/james/task/eventsourcing/cassandra/CassandraTaskExecutionDetailsProjectionDAO.scala
@@ -26,9 +26,9 @@ import com.datastax.driver.core.{Row, Session}
 import javax.inject.Inject
 import org.apache.james.backends.cassandra.init.{CassandraTypesProvider, 
CassandraZonedDateTimeModule}
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor
-import 
org.apache.james.task.eventsourcing.cassandra.CassandraTaskExecutionDetailsProjectionTable._
 import org.apache.james.task.eventsourcing.Hostname
-import org.apache.james.task.{TaskExecutionDetails, TaskId, TaskManager}
+import 
org.apache.james.task.eventsourcing.cassandra.CassandraTaskExecutionDetailsProjectionTable._
+import org.apache.james.task.{TaskExecutionDetails, TaskId, TaskManager, 
TaskType}
 import reactor.core.publisher.{Flux, Mono}
 
 @Inject
@@ -58,7 +58,7 @@ class CassandraTaskExecutionDetailsProjectionDAO(session: 
Session, typesProvider
   def saveDetails(details : TaskExecutionDetails): Mono[Void] = 
cassandraAsyncExecutor.executeVoid(
     insertStatement.bind
       .setUUID(TASK_ID, details.getTaskId.getValue)
-      .setString(TYPE, details.getType)
+      .setString(TYPE, details.getType.asString())
       .setString(STATUS, details.getStatus.getValue)
       .setUDTValue(SUBMITTED_DATE, 
CassandraZonedDateTimeModule.toUDT(dateType, details.getSubmittedDate))
       .setString(SUBMITTED_NODE, details.getSubmittedNode.asString)
@@ -79,7 +79,7 @@ class CassandraTaskExecutionDetailsProjectionDAO(session: 
Session, typesProvider
 
   private def readRow(row: Row): TaskExecutionDetails = new 
TaskExecutionDetails(
     taskId = TaskId.fromUUID(row.getUUID(TASK_ID)),
-    `type` = row.getString(TYPE),
+    `type` = TaskType.of(row.getString(TYPE)),
     status = TaskManager.Status.fromString(row.getString(STATUS)),
     submittedDate = 
CassandraZonedDateTimeModule.fromUDT(row.getUDTValue(SUBMITTED_DATE)),
     submittedNode = Hostname(row.getString(SUBMITTED_NODE)),
diff --git 
a/server/task-json/src/test/java/org/apache/james/server/task/json/TestTask.java
 
b/server/task-json/src/test/java/org/apache/james/server/task/json/TestTask.java
index 91c1b18..579e1f2 100644
--- 
a/server/task-json/src/test/java/org/apache/james/server/task/json/TestTask.java
+++ 
b/server/task-json/src/test/java/org/apache/james/server/task/json/TestTask.java
@@ -20,6 +20,7 @@ import java.util.Optional;
 
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
+import org.apache.james.task.TaskType;
 
 public class TestTask implements Task {
 
@@ -39,8 +40,8 @@ public class TestTask implements Task {
     }
 
     @Override
-    public String type() {
-        return "testTask";
+    public TaskType type() {
+        return TaskType.of("testTask");
     }
 
     @Override
diff --git a/server/task/src/main/java/org/apache/james/task/Task.java 
b/server/task/src/main/java/org/apache/james/task/Task.java
index 2edb39d..c66e40c 100644
--- a/server/task/src/main/java/org/apache/james/task/Task.java
+++ b/server/task/src/main/java/org/apache/james/task/Task.java
@@ -93,7 +93,7 @@ public interface Task {
     Result run() throws InterruptedException;
 
 
-    default String type() {
+    default TaskType type() {
         return UNKNOWN;
     }
 
@@ -105,5 +105,5 @@ public interface Task {
     String TASK_TYPE = "taskType";
     String TASK_DETAILS = "taskDetails";
 
-    String UNKNOWN = "unknown";
+    TaskType UNKNOWN = TaskType.of("unknown");
 }
diff --git 
a/server/task/src/test/java/org/apache/james/task/MemoryReferenceTask.java 
b/server/task/src/main/java/org/apache/james/task/TaskType.java
similarity index 57%
copy from 
server/task/src/test/java/org/apache/james/task/MemoryReferenceTask.java
copy to server/task/src/main/java/org/apache/james/task/TaskType.java
index 16f2a7e..00476bb 100644
--- a/server/task/src/test/java/org/apache/james/task/MemoryReferenceTask.java
+++ b/server/task/src/main/java/org/apache/james/task/TaskType.java
@@ -18,28 +18,48 @@
  ****************************************************************/
 package org.apache.james.task;
 
-import java.util.Optional;
+import java.util.Objects;
 
-public class MemoryReferenceTask implements Task {
-    public static final String TYPE = "memory-reference-task";
-    private final Task task;
+import com.google.common.base.MoreObjects;
 
-    public MemoryReferenceTask(Task task) {
-        this.task = task;
+public class TaskType {
+    private final String typeName;
+
+    public static TaskType of(String typeName) {
+        if (typeName == null || typeName.isEmpty()) {
+            throw new IllegalArgumentException("Task type should be defined");
+        }
+        return new TaskType(typeName);
+    }
+
+    private TaskType(String typeName) {
+        this.typeName = typeName;
+    }
+
+    public String asString() {
+        return typeName;
     }
 
     @Override
-    public Result run() throws InterruptedException {
-        return task.run();
+    public final boolean equals(Object o) {
+        if (o instanceof TaskType) {
+            TaskType taskId = (TaskType) o;
+
+            return Objects.equals(this.typeName, taskId.typeName);
+        }
+        return false;
     }
 
     @Override
-    public String type() {
-        return TYPE;
+    public final int hashCode() {
+        return Objects.hash(typeName);
     }
 
     @Override
-    public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return Optional.empty();
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+            .add("typeName", typeName)
+            .toString();
     }
+
 }
diff --git 
a/server/task/src/main/scala/org/apache/james/task/TaskExecutionDetails.scala 
b/server/task/src/main/scala/org/apache/james/task/TaskExecutionDetails.scala
index 13cf7d0..d541bf4 100644
--- 
a/server/task/src/main/scala/org/apache/james/task/TaskExecutionDetails.scala
+++ 
b/server/task/src/main/scala/org/apache/james/task/TaskExecutionDetails.scala
@@ -35,7 +35,7 @@ object TaskExecutionDetails {
 }
 
 class TaskExecutionDetails(val taskId: TaskId,
-                           private val `type`: String,
+                           private val `type`: TaskType,
                            private val status: TaskManager.Status,
                            private val submittedDate: ZonedDateTime,
                            private val submittedNode: Hostname,
@@ -48,7 +48,7 @@ class TaskExecutionDetails(val taskId: TaskId,
                            private val failedDate: Optional[ZonedDateTime] = 
Optional.empty()) {
   def getTaskId: TaskId = taskId
 
-  def getType: String = `type`
+  def getType: TaskType = `type`
 
   def getStatus: TaskManager.Status = status
 
diff --git a/server/task/src/test/java/org/apache/james/task/CompletedTask.java 
b/server/task/src/test/java/org/apache/james/task/CompletedTask.java
index 96133ed..b918532 100644
--- a/server/task/src/test/java/org/apache/james/task/CompletedTask.java
+++ b/server/task/src/test/java/org/apache/james/task/CompletedTask.java
@@ -21,7 +21,7 @@ package org.apache.james.task;
 import java.util.Optional;
 
 public class CompletedTask implements Task {
-    public static final String TYPE = "completed";
+    public static final TaskType TYPE = TaskType.of("completed");
 
     @Override
     public Result run() throws InterruptedException {
@@ -29,7 +29,7 @@ public class CompletedTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return TYPE;
     }
 
diff --git a/server/task/src/test/java/org/apache/james/task/FailedTask.java 
b/server/task/src/test/java/org/apache/james/task/FailedTask.java
index 127c96e..e17031a 100644
--- a/server/task/src/test/java/org/apache/james/task/FailedTask.java
+++ b/server/task/src/test/java/org/apache/james/task/FailedTask.java
@@ -21,7 +21,7 @@ package org.apache.james.task;
 import java.util.Optional;
 
 public class FailedTask implements Task {
-    public static final String TYPE = "failed";
+    public static final TaskType TYPE = TaskType.of("failed");
 
     @Override
     public Result run() throws InterruptedException {
@@ -29,7 +29,7 @@ public class FailedTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return TYPE;
     }
 
diff --git 
a/server/task/src/test/java/org/apache/james/task/MemoryReferenceTask.java 
b/server/task/src/test/java/org/apache/james/task/MemoryReferenceTask.java
index 16f2a7e..6ce1499 100644
--- a/server/task/src/test/java/org/apache/james/task/MemoryReferenceTask.java
+++ b/server/task/src/test/java/org/apache/james/task/MemoryReferenceTask.java
@@ -21,7 +21,7 @@ package org.apache.james.task;
 import java.util.Optional;
 
 public class MemoryReferenceTask implements Task {
-    public static final String TYPE = "memory-reference-task";
+    public static final TaskType TYPE = TaskType.of("memory-reference-task");
     private final Task task;
 
     public MemoryReferenceTask(Task task) {
@@ -34,7 +34,7 @@ public class MemoryReferenceTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return TYPE;
     }
 
diff --git 
a/server/task/src/test/java/org/apache/james/task/MemoryReferenceTask.java 
b/server/task/src/test/java/org/apache/james/task/TaskTypeTest.java
similarity index 66%
copy from 
server/task/src/test/java/org/apache/james/task/MemoryReferenceTask.java
copy to server/task/src/test/java/org/apache/james/task/TaskTypeTest.java
index 16f2a7e..c76bc2d 100644
--- a/server/task/src/test/java/org/apache/james/task/MemoryReferenceTask.java
+++ b/server/task/src/test/java/org/apache/james/task/TaskTypeTest.java
@@ -16,30 +16,30 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
+
 package org.apache.james.task;
 
-import java.util.Optional;
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.Test;
 
-public class MemoryReferenceTask implements Task {
-    public static final String TYPE = "memory-reference-task";
-    private final Task task;
+import nl.jqno.equalsverifier.EqualsVerifier;
 
-    public MemoryReferenceTask(Task task) {
-        this.task = task;
-    }
+public class TaskTypeTest {
 
-    @Override
-    public Result run() throws InterruptedException {
-        return task.run();
+    @Test
+    public void taskTypeShouldMatchBeanContract() {
+        EqualsVerifier.forClass(TaskType.class)
+            .verify();
     }
 
-    @Override
-    public String type() {
-        return TYPE;
+    @Test
+    public void serializingATaskTypeToAValueShouldReturnTheInitialValue() {
+        Assertions.assertThat(TaskType.of("foo").asString()).isEqualTo("foo");
     }
 
-    @Override
-    public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return Optional.empty();
+    @Test
+    public void creatingATaskTypeFromNullShouldThrow() {
+        Assertions.assertThatThrownBy(() -> 
TaskType.of(null)).isInstanceOf(IllegalArgumentException.class);
     }
-}
+
+}
\ No newline at end of file
diff --git a/server/task/src/test/java/org/apache/james/task/ThrowingTask.java 
b/server/task/src/test/java/org/apache/james/task/ThrowingTask.java
index eafe862..77f14c3 100644
--- a/server/task/src/test/java/org/apache/james/task/ThrowingTask.java
+++ b/server/task/src/test/java/org/apache/james/task/ThrowingTask.java
@@ -21,7 +21,7 @@ package org.apache.james.task;
 import java.util.Optional;
 
 public class ThrowingTask implements Task {
-    public static final String TYPE = "throwing";
+    public static final TaskType TYPE = TaskType.of("throwing");
 
     @Override
     public Result run() throws InterruptedException {
@@ -29,7 +29,7 @@ public class ThrowingTask implements Task {
     }
 
     @Override
-    public String type() {
+    public TaskType type() {
         return TYPE;
     }
 
diff --git 
a/server/task/src/test/scala/org/apache/james/task/TaskExecutionDetailsFixture.scala
 
b/server/task/src/test/scala/org/apache/james/task/TaskExecutionDetailsFixture.scala
index ddcf176..b6310f8 100644
--- 
a/server/task/src/test/scala/org/apache/james/task/TaskExecutionDetailsFixture.scala
+++ 
b/server/task/src/test/scala/org/apache/james/task/TaskExecutionDetailsFixture.scala
@@ -33,13 +33,14 @@ object TaskExecutionDetailsFixture {
   val TASK_ID_2 = TaskId.fromString("2c7f4081-aa30-11e9-bf6c-2d3b9e84aafe")
   val ADDITIONAL_INFORMATION: () => Optional[AdditionalInformation] = 
Optional.empty
 
-  val TASK_EXECUTION_DETAILS = new TaskExecutionDetails(TASK_ID, "type", 
TaskManager.Status.COMPLETED, SUBMITTED_DATE, SUBMITTED_NODE, 
ADDITIONAL_INFORMATION)
-  val TASK_EXECUTION_DETAILS_2 = new TaskExecutionDetails(TASK_ID_2, "type", 
TaskManager.Status.COMPLETED, SUBMITTED_DATE, SUBMITTED_NODE, 
ADDITIONAL_INFORMATION)
-  val TASK_EXECUTION_DETAILS_UPDATED = new TaskExecutionDetails(TASK_ID, 
"type", TaskManager.Status.FAILED, SUBMITTED_DATE, SUBMITTED_NODE, 
ADDITIONAL_INFORMATION)
+  val TYPE = TaskType.of("type")
+  val TASK_EXECUTION_DETAILS = new TaskExecutionDetails(TASK_ID, TYPE, 
TaskManager.Status.COMPLETED, SUBMITTED_DATE, SUBMITTED_NODE, 
ADDITIONAL_INFORMATION)
+  val TASK_EXECUTION_DETAILS_2 = new TaskExecutionDetails(TASK_ID_2, TYPE, 
TaskManager.Status.COMPLETED, SUBMITTED_DATE, SUBMITTED_NODE, 
ADDITIONAL_INFORMATION)
+  val TASK_EXECUTION_DETAILS_UPDATED = new TaskExecutionDetails(TASK_ID, TYPE, 
TaskManager.Status.FAILED, SUBMITTED_DATE, SUBMITTED_NODE, 
ADDITIONAL_INFORMATION)
 
 
   val ADDITIONAL_INFORMATION_2: () => Optional[AdditionalInformation] = () => 
Optional.of(new CustomAdditionalInformation("hello"))
-  val TASK_EXECUTION_DETAILS_WITH_ADDITIONAL_INFORMATION = new 
TaskExecutionDetails(TASK_ID, "type", TaskManager.Status.COMPLETED, 
SUBMITTED_DATE_2, SUBMITTED_NODE_2, ADDITIONAL_INFORMATION)
+  val TASK_EXECUTION_DETAILS_WITH_ADDITIONAL_INFORMATION = new 
TaskExecutionDetails(TASK_ID, TYPE, TaskManager.Status.COMPLETED, 
SUBMITTED_DATE_2, SUBMITTED_NODE_2, ADDITIONAL_INFORMATION)
 
 }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to