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 rc...@apache.org on 2020/05/20 01:58:15 UTC

[james-project] 06/11: JAMES-3184 Include RunningOptions in additional information

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

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

commit 18cab271f21e5468eee6404fa446f9c065eefdb2
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed May 13 17:42:12 2020 +0700

    JAMES-3184 Include RunningOptions in additional information
    
    An admlin then can retrieve these parameters for a running task in webAdmin
---
 .../RecomputeAllFastViewProjectionItemsTask.java   | 15 +++++--
 ...uteAllFastViewTaskAdditionalInformationDTO.java | 49 +++++++++++++++-------
 .../RecomputeUserFastViewProjectionItemsTask.java  | 14 +++++--
 ...teUserFastViewTaskAdditionalInformationDTO.java | 45 ++++++++++++++------
 ...llFastViewProjectionItemsRequestToTaskTest.java |  2 +-
 ...ctionItemsTaskAdditionalInformationDTOTest.java | 30 ++++++++++++-
 ...ctionItemsTaskAdditionalInformationDTOTest.java | 22 ++++++++++
 .../json/recomputeAll.additionalInformation.json   |  5 ++-
 ...recomputeAll.additionalInformation.legacy.json} |  0
 .../json/recomputeUser.additionalInformation.json  |  5 ++-
 ...ecomputeUser.additionalInformation.legacy.json} |  0
 11 files changed, 149 insertions(+), 38 deletions(-)

diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTask.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTask.java
index a34e412..5ff9dc5 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTask.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTask.java
@@ -39,8 +39,9 @@ public class RecomputeAllFastViewProjectionItemsTask implements Task {
     static final TaskType TASK_TYPE = TaskType.of("RecomputeAllFastViewProjectionItemsTask");
 
     public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
-        private static AdditionalInformation from(MessageFastViewProjectionCorrector.Progress progress) {
-            return new AdditionalInformation(
+        private static AdditionalInformation from(MessageFastViewProjectionCorrector.Progress progress,
+                                                  RunningOptions runningOptions) {
+            return new AdditionalInformation(runningOptions,
                 progress.getProcessedUserCount(),
                 progress.getProcessedMessageCount(),
                 progress.getFailedUserCount(),
@@ -48,13 +49,15 @@ public class RecomputeAllFastViewProjectionItemsTask implements Task {
                 Clock.systemUTC().instant());
         }
 
+        private final RunningOptions runningOptions;
         private final long processedUserCount;
         private final long processedMessageCount;
         private final long failedUserCount;
         private final long failedMessageCount;
         private final Instant timestamp;
 
-        public AdditionalInformation(long processedUserCount, long processedMessageCount, long failedUserCount, long failedMessageCount, Instant timestamp) {
+        public AdditionalInformation(RunningOptions runningOptions, long processedUserCount, long processedMessageCount, long failedUserCount, long failedMessageCount, Instant timestamp) {
+            this.runningOptions = runningOptions;
             this.processedUserCount = processedUserCount;
             this.processedMessageCount = processedMessageCount;
             this.failedUserCount = failedUserCount;
@@ -78,6 +81,10 @@ public class RecomputeAllFastViewProjectionItemsTask implements Task {
             return failedMessageCount;
         }
 
+        public RunningOptions getRunningOptions() {
+            return runningOptions;
+        }
+
         @Override
         public Instant timestamp() {
             return timestamp;
@@ -149,6 +156,6 @@ public class RecomputeAllFastViewProjectionItemsTask implements Task {
 
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return Optional.of(AdditionalInformation.from(progress));
+        return Optional.of(AdditionalInformation.from(progress, runningOptions));
     }
 }
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewTaskAdditionalInformationDTO.java
index 3c405d1..8e1461e 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewTaskAdditionalInformationDTO.java
@@ -20,10 +20,12 @@
 package org.apache.james.webadmin.data.jmap;
 
 import java.time.Instant;
+import java.util.Optional;
 
 import org.apache.james.json.DTOModule;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+import org.apache.james.webadmin.data.jmap.MessageFastViewProjectionCorrector.RunningOptions;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.annotations.VisibleForTesting;
@@ -32,28 +34,41 @@ public class RecomputeAllFastViewTaskAdditionalInformationDTO implements Additio
     public static final AdditionalInformationDTOModule<RecomputeAllFastViewProjectionItemsTask.AdditionalInformation, RecomputeAllFastViewTaskAdditionalInformationDTO> SERIALIZATION_MODULE =
         DTOModule.forDomainObject(RecomputeAllFastViewProjectionItemsTask.AdditionalInformation.class)
             .convertToDTO(RecomputeAllFastViewTaskAdditionalInformationDTO.class)
-            .toDomainObjectConverter(dto -> new RecomputeAllFastViewProjectionItemsTask.AdditionalInformation(
-                dto.getProcessedUserCount(),
-                dto.getProcessedMessageCount(),
-                dto.getFailedUserCount(),
-                dto.getFailedMessageCount(),
-                dto.timestamp))
-            .toDTOConverter((details, type) -> new RecomputeAllFastViewTaskAdditionalInformationDTO(
-                type,
-                details.timestamp(),
-                details.getProcessedUserCount(),
-                details.getProcessedMessageCount(),
-                details.getFailedUserCount(),
-                details.getFailedMessageCount()))
+            .toDomainObjectConverter(RecomputeAllFastViewTaskAdditionalInformationDTO::toDomainObject)
+            .toDTOConverter(RecomputeAllFastViewTaskAdditionalInformationDTO::toDTO)
             .typeName(RecomputeAllFastViewProjectionItemsTask.TASK_TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
 
+    private static RecomputeAllFastViewProjectionItemsTask.AdditionalInformation toDomainObject(RecomputeAllFastViewTaskAdditionalInformationDTO dto) {
+        return new RecomputeAllFastViewProjectionItemsTask.AdditionalInformation(
+            dto.getRunningOptions()
+                .map(RunningOptionsDTO::asDomainObject)
+                .orElse(RunningOptions.DEFAULT),
+            dto.getProcessedUserCount(),
+            dto.getProcessedMessageCount(),
+            dto.getFailedUserCount(),
+            dto.getFailedMessageCount(),
+            dto.timestamp);
+    }
+
+    private static RecomputeAllFastViewTaskAdditionalInformationDTO toDTO(RecomputeAllFastViewProjectionItemsTask.AdditionalInformation details, String type) {
+        return new RecomputeAllFastViewTaskAdditionalInformationDTO(
+            type,
+            details.timestamp(),
+            details.getProcessedUserCount(),
+            details.getProcessedMessageCount(),
+            details.getFailedUserCount(),
+            details.getFailedMessageCount(),
+            Optional.of(RunningOptionsDTO.asDTO(details.getRunningOptions())));
+    }
+
     private final String type;
     private final Instant timestamp;
     private final long processedUserCount;
     private final long processedMessageCount;
     private final long failedUserCount;
     private final long failedMessageCount;
+    private final Optional<RunningOptionsDTO> runningOptions;
 
     @VisibleForTesting
     RecomputeAllFastViewTaskAdditionalInformationDTO(@JsonProperty("type") String type,
@@ -61,13 +76,15 @@ public class RecomputeAllFastViewTaskAdditionalInformationDTO implements Additio
                                                      @JsonProperty("processedUserCount") long processedUserCount,
                                                      @JsonProperty("processedMessageCount") long processedMessageCount,
                                                      @JsonProperty("failedUserCount") long failedUserCount,
-                                                     @JsonProperty("failedMessageCount") long failedMessageCount) {
+                                                     @JsonProperty("failedMessageCount") long failedMessageCount,
+                                                     @JsonProperty("runningOptions") Optional<RunningOptionsDTO> runningOptions) {
         this.type = type;
         this.timestamp = timestamp;
         this.processedUserCount = processedUserCount;
         this.processedMessageCount = processedMessageCount;
         this.failedUserCount = failedUserCount;
         this.failedMessageCount = failedMessageCount;
+        this.runningOptions = runningOptions;
     }
 
     @Override
@@ -95,4 +112,8 @@ public class RecomputeAllFastViewTaskAdditionalInformationDTO implements Additio
     public long getFailedMessageCount() {
         return failedMessageCount;
     }
+
+    public Optional<RunningOptionsDTO> getRunningOptions() {
+        return runningOptions;
+    }
 }
diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTask.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTask.java
index ca41a3f..3c4d90c 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTask.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTask.java
@@ -42,25 +42,31 @@ public class RecomputeUserFastViewProjectionItemsTask implements Task {
     static final TaskType TASK_TYPE = TaskType.of("RecomputeUserFastViewProjectionItemsTask");
 
     public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
-        private static AdditionalInformation from(Progress progress, Username username) {
-            return new AdditionalInformation(username,
+        private static AdditionalInformation from(Progress progress, RunningOptions runningOptions, Username username) {
+            return new AdditionalInformation(runningOptions, username,
                 progress.getProcessedMessageCount(),
                 progress.getFailedMessageCount(),
                 Clock.systemUTC().instant());
         }
 
+        private final RunningOptions runningOptions;
         private final Username username;
         private final long processedMessageCount;
         private final long failedMessageCount;
         private final Instant timestamp;
 
-        public AdditionalInformation(Username username, long processedMessageCount, long failedMessageCount, Instant timestamp) {
+        public AdditionalInformation(RunningOptions runningOptions, Username username, long processedMessageCount, long failedMessageCount, Instant timestamp) {
+            this.runningOptions = runningOptions;
             this.username = username;
             this.processedMessageCount = processedMessageCount;
             this.failedMessageCount = failedMessageCount;
             this.timestamp = timestamp;
         }
 
+        public RunningOptions getRunningOptions() {
+            return runningOptions;
+        }
+
         public long getProcessedMessageCount() {
             return processedMessageCount;
         }
@@ -157,6 +163,6 @@ public class RecomputeUserFastViewProjectionItemsTask implements Task {
 
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return Optional.of(AdditionalInformation.from(progress, username));
+        return Optional.of(AdditionalInformation.from(progress, runningOptions, username));
     }
 }
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewTaskAdditionalInformationDTO.java
index f048a70..5a5c133 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewTaskAdditionalInformationDTO.java
@@ -20,11 +20,13 @@
 package org.apache.james.webadmin.data.jmap;
 
 import java.time.Instant;
+import java.util.Optional;
 
 import org.apache.james.core.Username;
 import org.apache.james.json.DTOModule;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
+import org.apache.james.webadmin.data.jmap.MessageFastViewProjectionCorrector.RunningOptions;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
@@ -32,36 +34,51 @@ public class RecomputeUserFastViewTaskAdditionalInformationDTO implements Additi
     public static final AdditionalInformationDTOModule<RecomputeUserFastViewProjectionItemsTask.AdditionalInformation, RecomputeUserFastViewTaskAdditionalInformationDTO> SERIALIZATION_MODULE =
         DTOModule.forDomainObject(RecomputeUserFastViewProjectionItemsTask.AdditionalInformation.class)
             .convertToDTO(RecomputeUserFastViewTaskAdditionalInformationDTO.class)
-            .toDomainObjectConverter(dto -> new RecomputeUserFastViewProjectionItemsTask.AdditionalInformation(
-                Username.of(dto.username),
-                dto.getProcessedMessageCount(),
-                dto.getFailedMessageCount(),
-                dto.timestamp))
-            .toDTOConverter((details, type) -> new RecomputeUserFastViewTaskAdditionalInformationDTO(
-                type,
-                details.timestamp(),
-                details.getUsername(),
-                details.getProcessedMessageCount(),
-                details.getFailedMessageCount()))
+            .toDomainObjectConverter(RecomputeUserFastViewTaskAdditionalInformationDTO::toDomainObject)
+            .toDTOConverter(RecomputeUserFastViewTaskAdditionalInformationDTO::toDTO)
             .typeName(RecomputeUserFastViewProjectionItemsTask.TASK_TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
 
+    private static RecomputeUserFastViewTaskAdditionalInformationDTO toDTO(RecomputeUserFastViewProjectionItemsTask.AdditionalInformation details, String type) {
+        return new RecomputeUserFastViewTaskAdditionalInformationDTO(
+            type,
+            details.timestamp(),
+            details.getUsername(),
+            details.getProcessedMessageCount(),
+            details.getFailedMessageCount(),
+            Optional.of(RunningOptionsDTO.asDTO(details.getRunningOptions())));
+    }
+
+    private static RecomputeUserFastViewProjectionItemsTask.AdditionalInformation toDomainObject(RecomputeUserFastViewTaskAdditionalInformationDTO dto) {
+        return new RecomputeUserFastViewProjectionItemsTask.AdditionalInformation(
+            dto.getRunningOptions()
+                .map(RunningOptionsDTO::asDomainObject)
+                .orElse(RunningOptions.DEFAULT),
+            Username.of(dto.username),
+            dto.getProcessedMessageCount(),
+            dto.getFailedMessageCount(),
+            dto.timestamp);
+    }
+
     private final String type;
     private final Instant timestamp;
     private final String username;
     private final long processedMessageCount;
     private final long failedMessageCount;
+    private final Optional<RunningOptionsDTO> runningOptions;
 
     private RecomputeUserFastViewTaskAdditionalInformationDTO(@JsonProperty("type") String type,
                                                               @JsonProperty("timestamp") Instant timestamp,
                                                               @JsonProperty("username") String username,
                                                               @JsonProperty("processedMessageCount") long processedMessageCount,
-                                                              @JsonProperty("failedMessageCount") long failedMessageCount) {
+                                                              @JsonProperty("failedMessageCount") long failedMessageCount,
+                                                              @JsonProperty("runningOptions") Optional<RunningOptionsDTO> runningOptionsDTO) {
         this.type = type;
         this.timestamp = timestamp;
         this.username = username;
         this.processedMessageCount = processedMessageCount;
         this.failedMessageCount = failedMessageCount;
+        this.runningOptions = runningOptionsDTO;
     }
 
     @Override
@@ -82,6 +99,10 @@ public class RecomputeUserFastViewTaskAdditionalInformationDTO implements Additi
         return failedMessageCount;
     }
 
+    public Optional<RunningOptionsDTO> getRunningOptions() {
+        return runningOptions;
+    }
+
     public String getUsername() {
         return username;
     }
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java
index 1e57577..85c3339 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java
@@ -279,7 +279,7 @@ class RecomputeAllFastViewProjectionItemsRequestToTaskTest {
         .then()
             .body("taskId", is(taskId))
             .body("type", is("RecomputeAllFastViewProjectionItemsTask"))
-            .body("additionalInformation.runningOptions.messageParallelism", is(20));
+            .body("additionalInformation.runningOptions.messageRatePerSecond", is(20));
     }
 
     @Test
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
index ad53227..15108e7 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
@@ -19,15 +19,25 @@
 
 package org.apache.james.webadmin.data.jmap;
 
+import static org.assertj.core.api.Assertions.assertThat;
+
 import java.time.Instant;
 
 import org.apache.james.JsonSerializationVerifier;
+import org.apache.james.json.JsonGenericSerializer;
 import org.apache.james.util.ClassLoaderUtils;
+import org.apache.james.webadmin.data.jmap.MessageFastViewProjectionCorrector.RunningOptions;
 import org.junit.jupiter.api.Test;
 
 class RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest {
     private static final Instant INSTANT = Instant.parse("2007-12-03T10:15:30.00Z");
-    private static final RecomputeAllFastViewProjectionItemsTask.AdditionalInformation DOMAIN_OBJECT = new RecomputeAllFastViewProjectionItemsTask.AdditionalInformation(1, 2, 3, 4, INSTANT);
+    private static final RecomputeAllFastViewProjectionItemsTask.AdditionalInformation DOMAIN_OBJECT = new RecomputeAllFastViewProjectionItemsTask.AdditionalInformation(
+        RunningOptions.withMessageRatePerSecond(20),
+        1,
+        2,
+        3,
+        4,
+        INSTANT);
 
     @Test
     void shouldMatchJsonSerializationContract() throws Exception {
@@ -36,4 +46,22 @@ class RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest {
             .json(ClassLoaderUtils.getSystemResourceAsString("json/recomputeAll.additionalInformation.json"))
             .verify();
     }
+
+    @Test
+    void shouldDeserializeLegacy() throws Exception {
+        RecomputeAllFastViewProjectionItemsTask.AdditionalInformation legacyDetails = JsonGenericSerializer.forModules(RecomputeAllFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
+            .withoutNestedType()
+            .deserialize(ClassLoaderUtils.getSystemResourceAsString("json/recomputeAll.additionalInformation.legacy.json"));
+
+        RecomputeAllFastViewProjectionItemsTask.AdditionalInformation expected = new RecomputeAllFastViewProjectionItemsTask.AdditionalInformation(
+            RunningOptions.DEFAULT,
+            1,
+            2,
+            3,
+            4,
+            INSTANT);
+
+        assertThat(legacyDetails)
+            .isEqualToComparingFieldByFieldRecursively(expected);
+    }
 }
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
index 569b071..22355a9 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
@@ -19,16 +19,20 @@
 
 package org.apache.james.webadmin.data.jmap;
 
+import static org.assertj.core.api.Assertions.assertThat;
+
 import java.time.Instant;
 
 import org.apache.james.JsonSerializationVerifier;
 import org.apache.james.core.Username;
+import org.apache.james.json.JsonGenericSerializer;
 import org.apache.james.util.ClassLoaderUtils;
 import org.junit.jupiter.api.Test;
 
 class RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest {
     private static final Instant INSTANT = Instant.parse("2007-12-03T10:15:30.00Z");
     private static final RecomputeUserFastViewProjectionItemsTask.AdditionalInformation DOMAIN_OBJECT = new RecomputeUserFastViewProjectionItemsTask.AdditionalInformation(
+        MessageFastViewProjectionCorrector.RunningOptions.withMessageRatePerSecond(20),
         Username.of("bob"), 2, 3, INSTANT);
 
     @Test
@@ -38,4 +42,22 @@ class RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest {
             .json(ClassLoaderUtils.getSystemResourceAsString("json/recomputeUser.additionalInformation.json"))
             .verify();
     }
+
+
+    @Test
+    void shouldDeserializeLegacy() throws Exception {
+        RecomputeUserFastViewProjectionItemsTask.AdditionalInformation legacyDetails = JsonGenericSerializer.forModules(RecomputeUserFastViewTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
+            .withoutNestedType()
+            .deserialize(ClassLoaderUtils.getSystemResourceAsString("json/recomputeUser.additionalInformation.legacy.json"));
+
+        RecomputeUserFastViewProjectionItemsTask.AdditionalInformation expected = new RecomputeUserFastViewProjectionItemsTask.AdditionalInformation(
+            MessageFastViewProjectionCorrector.RunningOptions.DEFAULT,
+            Username.of("bob"),
+            2,
+            3,
+            INSTANT);
+
+        assertThat(legacyDetails)
+            .isEqualToComparingFieldByFieldRecursively(expected);
+    }
 }
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.additionalInformation.json b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.additionalInformation.json
index 6d130f9..6d9b476 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.additionalInformation.json
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.additionalInformation.json
@@ -4,5 +4,8 @@
   "processedUserCount":1,
   "processedMessageCount":2,
   "failedUserCount":3,
-  "failedMessageCount":4
+  "failedMessageCount":4,
+  "runningOptions": {
+    "messageRatePerSecond":20
+  }
 }
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.additionalInformation.json b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.additionalInformation.legacy.json
similarity index 100%
copy from server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.additionalInformation.json
copy to server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.additionalInformation.legacy.json
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.additionalInformation.json b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.additionalInformation.json
index 7e24f49..c4c7bd7 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.additionalInformation.json
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.additionalInformation.json
@@ -3,5 +3,8 @@
   "timestamp":"2007-12-03T10:15:30Z",
   "username": "bob",
   "processedMessageCount":2,
-  "failedMessageCount":3
+  "failedMessageCount":3,
+  "runningOptions": {
+    "messageRatePerSecond":20
+  }
 }
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.additionalInformation.json b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.additionalInformation.legacy.json
similarity index 100%
copy from server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.additionalInformation.json
copy to server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.additionalInformation.legacy.json


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