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 bt...@apache.org on 2020/06/03 07:19:54 UTC

[james-project] 04/12: JAMES-3184 Update task serialization for UserReindexingTask

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 75ac541b425fc24921be5ddc271674f99eed2fbc
Author: LanKhuat <kh...@gmail.com>
AuthorDate: Thu May 21 15:09:41 2020 +0700

    JAMES-3184 Update task serialization for UserReindexingTask
---
 .../mailbox/tools/indexer/UserReindexingTask.java  | 25 +++++++++---
 ...UserReindexingTaskAdditionalInformationDTO.java | 28 +++++++++++---
 .../tools/indexer/UserReindexingTaskDTO.java       | 19 ++++++---
 .../UserReindexingTaskSerializationTest.java       | 45 +++++++++++++++++++---
 4 files changed, 95 insertions(+), 22 deletions(-)

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 d1ff42b..eb06e88 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
@@ -26,6 +26,7 @@ import java.util.Optional;
 import javax.inject.Inject;
 
 import org.apache.james.core.Username;
+import org.apache.james.mailbox.indexer.ReIndexer.RunningOptions;
 import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
@@ -40,8 +41,10 @@ public class UserReindexingTask implements Task {
     public static class AdditionalInformation extends ReprocessingContextInformation {
         private final Username username;
 
-        AdditionalInformation(Username username, int successfullyReprocessedMailCount, int failedReprocessedMailCount, ReIndexingExecutionFailures failures, Instant timestamp) {
-            super(successfullyReprocessedMailCount, failedReprocessedMailCount, failures, timestamp);
+        AdditionalInformation(Username username, int successfullyReprocessedMailCount,
+                              int failedReprocessedMailCount, ReIndexingExecutionFailures failures,
+                              Instant timestamp, RunningOptions runningOptions) {
+            super(successfullyReprocessedMailCount, failedReprocessedMailCount, failures, timestamp, runningOptions);
             this.username = username;
         }
 
@@ -54,12 +57,14 @@ public class UserReindexingTask implements Task {
     private final ReIndexerPerformer reIndexerPerformer;
     private final Username username;
     private final ReprocessingContext reprocessingContext;
+    private final RunningOptions runningOptions;
 
     @Inject
-    public UserReindexingTask(ReIndexerPerformer reIndexerPerformer, Username username) {
+    public UserReindexingTask(ReIndexerPerformer reIndexerPerformer, Username username, RunningOptions runningOptions) {
         this.reIndexerPerformer = reIndexerPerformer;
         this.username = username;
         this.reprocessingContext = new ReprocessingContext();
+        this.runningOptions = runningOptions;
     }
 
     public static class Factory {
@@ -73,13 +78,16 @@ public class UserReindexingTask implements Task {
 
         public UserReindexingTask create(UserReindexingTaskDTO dto) {
             Username username = Username.of(dto.getUsername());
-            return new UserReindexingTask(reIndexerPerformer, username);
+            return new UserReindexingTask(reIndexerPerformer, username,
+                dto.getRunningOptions()
+                .map(RunningOptionsDTO::toDomainObject)
+                .orElse(RunningOptions.DEFAULT));
         }
     }
 
     @Override
     public Result run() {
-        return reIndexerPerformer.reIndex(username, reprocessingContext)
+        return reIndexerPerformer.reIndex(username, reprocessingContext, runningOptions)
             .onErrorResume(e -> Mono.just(Result.PARTIAL))
             .block();
     }
@@ -93,13 +101,18 @@ public class UserReindexingTask implements Task {
         return USER_RE_INDEXING;
     }
 
+    public RunningOptions getRunningOptions() {
+        return runningOptions;
+    }
+
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
         return Optional.of(new UserReindexingTask.AdditionalInformation(username,
             reprocessingContext.successfullyReprocessedMailCount(),
             reprocessingContext.failedReprocessingMailCount(),
             reprocessingContext.failures(),
-            Clock.systemUTC().instant())
+            Clock.systemUTC().instant(),
+            runningOptions)
         );
     }
 }
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java
index 15e78ef..b76efe9 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java
@@ -20,9 +20,11 @@ package org.apache.mailbox.tools.indexer;
 
 import java.time.Instant;
 import java.util.List;
+import java.util.Optional;
 
 import org.apache.james.core.Username;
 import org.apache.james.json.DTOModule;
+import org.apache.james.mailbox.indexer.ReIndexer;
 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;
@@ -39,14 +41,20 @@ public class UserReindexingTaskAdditionalInformationDTO implements AdditionalInf
                 dto.getSuccessfullyReprocessedMailCount(),
                 dto.getFailedReprocessedMailCount(),
                 ReprocessingContextInformationDTO.deserializeFailures(factory, dto.getFailures()),
-                dto.getTimestamp()))
+                dto.getTimestamp(),
+                dto.getRunningOptions()
+                    .map(RunningOptionsDTO::toDomainObject)
+                    .orElse(ReIndexer.RunningOptions.DEFAULT)
+                ))
             .toDTOConverter((details, type) -> new UserReindexingTaskAdditionalInformationDTO(
                 type,
                 details.getUsername(),
                 details.getSuccessfullyReprocessedMailCount(),
                 details.getFailedReprocessedMailCount(),
                 ReprocessingContextInformationDTO.serializeFailures(details.failures()),
-                details.timestamp()))
+                details.timestamp(),
+                Optional.of(RunningOptionsDTO.toDTO(details.getRunningOptions()))
+                ))
             .typeName(UserReindexingTask.USER_RE_INDEXING.asString())
             .withFactory(AdditionalInformationDTOModule::new);
     }
@@ -60,12 +68,16 @@ public class UserReindexingTaskAdditionalInformationDTO implements AdditionalInf
                                                        @JsonProperty("successfullyReprocessedMailCount") int successfullyReprocessedMailCount,
                                                        @JsonProperty("failedReprocessedMailCount") int failedReprocessedMailCount,
                                                        @JsonProperty("failures") List<ReprocessingContextInformationDTO.ReindexingFailureDTO> failures,
-                                                       @JsonProperty("timestamp") Instant timestamp) {
+                                                       @JsonProperty("timestamp") Instant timestamp,
+                                                       @JsonProperty("runningOptions") Optional<RunningOptionsDTO> runningOptions
+                                                       ) {
         this.user = user;
-        this.reprocessingContextInformationDTO = new ReprocessingContextInformationDTO(
-            type,
+        this.reprocessingContextInformationDTO = new ReprocessingContextInformationDTO(type,
             successfullyReprocessedMailCount,
-            failedReprocessedMailCount, failures, timestamp);
+            failedReprocessedMailCount,
+            failures,
+            timestamp,
+            runningOptions);
     }
 
     @Override
@@ -92,4 +104,8 @@ public class UserReindexingTaskAdditionalInformationDTO implements AdditionalInf
     public List<ReprocessingContextInformationDTO.ReindexingFailureDTO> getFailures() {
         return reprocessingContextInformationDTO.getFailures();
     }
+
+    public Optional<RunningOptionsDTO> getRunningOptions() {
+        return reprocessingContextInformationDTO.getRunningOptions();
+    }
 }
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskDTO.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskDTO.java
index ac3a4ca..7ce4b7c 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskDTO.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskDTO.java
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.mailbox.tools.indexer;
 
+import java.util.Optional;
+
 import org.apache.james.json.DTOModule;
 import org.apache.james.server.task.json.dto.TaskDTO;
 import org.apache.james.server.task.json.dto.TaskDTOModule;
@@ -26,6 +28,10 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class UserReindexingTaskDTO implements TaskDTO {
 
+    private static UserReindexingTaskDTO of(UserReindexingTask task, String type) {
+        return new UserReindexingTaskDTO(type, task.getUsername().asString(), Optional.of(RunningOptionsDTO.toDTO(task.getRunningOptions())));
+    }
+
     public static TaskDTOModule<UserReindexingTask, UserReindexingTaskDTO> module(UserReindexingTask.Factory factory) {
         return DTOModule
             .forDomainObject(UserReindexingTask.class)
@@ -36,16 +42,16 @@ public class UserReindexingTaskDTO implements TaskDTO {
             .withFactory(TaskDTOModule::new);
     }
 
-    public static UserReindexingTaskDTO of(UserReindexingTask task, String type) {
-        return new UserReindexingTaskDTO(type, task.getUsername().asString());
-    }
-
     private final String type;
     private final String username;
+    private final Optional<RunningOptionsDTO> runningOptions;
 
-    private UserReindexingTaskDTO(@JsonProperty("type") String type, @JsonProperty("username") String username) {
+    private UserReindexingTaskDTO(@JsonProperty("type") String type,
+                                  @JsonProperty("username") String username,
+                                  @JsonProperty("runningOptions") Optional<RunningOptionsDTO> runningOptions) {
         this.type = type;
         this.username = username;
+        this.runningOptions = runningOptions;
     }
 
     @Override
@@ -57,4 +63,7 @@ public class UserReindexingTaskDTO implements TaskDTO {
         return username;
     }
 
+    public Optional<RunningOptionsDTO> getRunningOptions() {
+        return runningOptions;
+    }
 }
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java
index 39274b8..bcdcc3b 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java
@@ -18,13 +18,16 @@
  ****************************************************************/
 package org.apache.mailbox.tools.indexer;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 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.mailbox.MessageUid;
+import org.apache.james.mailbox.indexer.ReIndexer.RunningOptions;
 import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
 import org.apache.james.mailbox.model.TestId;
 import org.junit.jupiter.api.BeforeEach;
@@ -38,9 +41,10 @@ class UserReindexingTaskSerializationTest {
 
     private final int successfullyReprocessedMailCount = 42;
     private final int failedReprocessedMailCount = 2;
-    private final String serializedUserReindexingTask = "{\"type\": \"user-reindexing\", \"username\": \"foo@apache.org\"}";
-    private final String serializedAdditionalInformation = "{\"type\": \"user-reindexing\", \"user\": \"foo@apache.org\", \"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":[{\"mailboxId\":\"1\",\"uids\":[10]},{\"mailboxId\":\"2\",\"uids\":[20]}], \"timestamp\":\"2018-11-13T12:00:55Z\"}";
-
+    private final String serializedUserReindexingTask = "{\"type\": \"user-reindexing\", \"username\": \"foo@apache.org\", \"runningOptions\":{\"messagesPerSecond\":50}}";
+    private final String legacySerializedUserReindexingTask = "{\"type\": \"user-reindexing\", \"username\": \"foo@apache.org\"}";
+    private final String serializedAdditionalInformation = "{\"type\": \"user-reindexing\", \"user\": \"foo@apache.org\", \"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":[{\"mailboxId\":\"1\",\"uids\":[10]},{\"mailboxId\":\"2\",\"uids\":[20]}], \"timestamp\":\"2018-11-13T12:00:55Z\", \"runningOptions\":{\"messagesPerSecond\":50}}";
+    private final String legacySerializedAdditionalInformation = "{\"type\": \"user-reindexing\", \"user\": \"foo@apache.org\", \"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":[{\"mailboxId\":\"1\",\"uids\":[10]},{\"mailboxId\":\"2\",\"uids\":[20]}], \"timestamp\":\"2018-11-13T12:00:55Z\"}";
     private final TestId mailboxId = TestId.of(1L);
     private final MessageUid messageUid = MessageUid.of(10L);
     private final TestId mailboxId2 = TestId.of(2L);
@@ -63,18 +67,49 @@ class UserReindexingTaskSerializationTest {
     @Test
     void userReindexingShouldBeSerializable() throws Exception {
         JsonSerializationVerifier.dtoModule(UserReindexingTaskDTO.module(factory))
-            .bean(new UserReindexingTask(reIndexerPerformer, USERNAME))
+            .bean(new UserReindexingTask(reIndexerPerformer, USERNAME, RunningOptions.DEFAULT))
             .json(serializedUserReindexingTask)
             .verify();
     }
 
     @Test
+    void legacyTaskshouldBeDeserializable() throws Exception {
+        UserReindexingTask legacyTask = JsonGenericSerializer.forModules(UserReindexingTaskDTO.module(factory))
+            .withoutNestedType()
+            .deserialize(legacySerializedUserReindexingTask);
+
+        UserReindexingTask expected = new UserReindexingTask(reIndexerPerformer, USERNAME, RunningOptions.DEFAULT);
+
+        assertThat(legacyTask)
+            .isEqualToComparingFieldByFieldRecursively(expected);
+    }
+
+    @Test
     void additionalInformationShouldBeSerializable() throws Exception {
-        UserReindexingTask.AdditionalInformation details = new UserReindexingTask.AdditionalInformation(USERNAME, successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures, TIMESTAMP);
+        UserReindexingTask.AdditionalInformation details = new UserReindexingTask.AdditionalInformation(USERNAME, successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures, TIMESTAMP, RunningOptions.DEFAULT);
         JsonSerializationVerifier.dtoModule(UserReindexingTaskAdditionalInformationDTO.serializationModule(new TestId.Factory()))
             .bean(details)
             .json(serializedAdditionalInformation)
             .verify();
     }
+
+    @Test
+    void legacyAdditionalInformationShouldBeDeserializable() throws Exception {
+        UserReindexingTask.AdditionalInformation legacyAdditionalInformation = JsonGenericSerializer.forModules(UserReindexingTaskAdditionalInformationDTO.serializationModule(new TestId.Factory()))
+            .withoutNestedType()
+            .deserialize(legacySerializedAdditionalInformation);
+
+        UserReindexingTask.AdditionalInformation expected = new UserReindexingTask.AdditionalInformation(
+            USERNAME,
+            42,
+            2,
+            reIndexingExecutionFailures,
+            TIMESTAMP,
+            RunningOptions.DEFAULT
+        );
+
+        assertThat(legacyAdditionalInformation)
+            .isEqualToComparingFieldByFieldRecursively(expected);
+    }
 }
 


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