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

[james-project] 04/11: JAMES-3184 RecomputeFastViewProjection task should take runningOptions as argument

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 7ec600de1a1237fafedc5816cc4b398a26398cd9
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed May 13 14:36:50 2020 +0700

    JAMES-3184 RecomputeFastViewProjection task should take runningOptions as argument
    
    Handle deserialization for running options, and legacy tasks
    deserialization
---
 ...uteAllFastViewProjectionItemsRequestToTask.java |  4 ++-
 .../RecomputeAllFastViewProjectionItemsTask.java   | 30 +++++++++++++---
 ...teUserFastViewProjectionItemsRequestToTask.java |  3 +-
 .../RecomputeUserFastViewProjectionItemsTask.java  | 37 ++++++++++++++++----
 .../webadmin/data/jmap/RunningOptionsDTO.java}     | 40 +++++++++++++---------
 ...stViewProjectionItemsTaskSerializationTest.java | 19 +++++++++-
 ...stViewProjectionItemsTaskSerializationTest.java | 21 +++++++++++-
 .../src/test/resources/json/recomputeAll.task.json |  7 +++-
 ...All.task.json => recomputeAll.task.legacy.json} |  0
 .../test/resources/json/recomputeUser.task.json    |  5 ++-
 ...er.task.json => recomputeUser.task.legacy.json} |  0
 11 files changed, 131 insertions(+), 35 deletions(-)

diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTask.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTask.java
index e8d8a23..e81cf79 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTask.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTask.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.webadmin.data.jmap;
 
+import static org.apache.james.webadmin.data.jmap.MessageFastViewProjectionCorrector.RunningOptions;
+
 import javax.inject.Inject;
 
 import org.apache.james.webadmin.tasks.TaskFromRequestRegistry;
@@ -27,6 +29,6 @@ public class RecomputeAllFastViewProjectionItemsRequestToTask extends TaskFromRe
     @Inject
     RecomputeAllFastViewProjectionItemsRequestToTask(MessageFastViewProjectionCorrector corrector) {
         super(Constants.TASK_REGISTRATION_KEY,
-            request -> new RecomputeAllFastViewProjectionItemsTask(corrector));
+            request -> new RecomputeAllFastViewProjectionItemsTask(corrector, RunningOptions.DEFAULT));
     }
 }
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 6acba49..a34e412 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
@@ -86,38 +86,58 @@ public class RecomputeAllFastViewProjectionItemsTask implements Task {
 
     public static class RecomputeAllFastViewTaskDTO implements TaskDTO {
         private final String type;
+        private final Optional<RunningOptionsDTO> runningOptions;
 
-        public RecomputeAllFastViewTaskDTO(@JsonProperty("type") String type) {
+        public RecomputeAllFastViewTaskDTO(@JsonProperty("type") String type,
+                                           @JsonProperty("runningOptions") Optional<RunningOptionsDTO> runningOptions) {
             this.type = type;
+            this.runningOptions = runningOptions;
         }
 
         @Override
         public String getType() {
             return type;
         }
+
+        public Optional<RunningOptionsDTO> getRunningOptions() {
+            return runningOptions;
+        }
     }
 
     public static TaskDTOModule<RecomputeAllFastViewProjectionItemsTask, RecomputeAllFastViewTaskDTO> module(MessageFastViewProjectionCorrector corrector) {
         return DTOModule
             .forDomainObject(RecomputeAllFastViewProjectionItemsTask.class)
             .convertToDTO(RecomputeAllFastViewTaskDTO.class)
-            .toDomainObjectConverter(dto -> new RecomputeAllFastViewProjectionItemsTask(corrector))
-            .toDTOConverter((task, type) -> new RecomputeAllFastViewTaskDTO(type))
+            .toDomainObjectConverter(dto -> asTask(corrector, dto))
+            .toDTOConverter(RecomputeAllFastViewProjectionItemsTask::asDTO)
             .typeName(TASK_TYPE.asString())
             .withFactory(TaskDTOModule::new);
     }
 
+    private static RecomputeAllFastViewTaskDTO asDTO(RecomputeAllFastViewProjectionItemsTask task, String type) {
+        return new RecomputeAllFastViewTaskDTO(type, Optional.of(RunningOptionsDTO.asDTO(task.runningOptions)));
+    }
+
+    private static RecomputeAllFastViewProjectionItemsTask asTask(MessageFastViewProjectionCorrector corrector, RecomputeAllFastViewTaskDTO dto) {
+        return new RecomputeAllFastViewProjectionItemsTask(corrector,
+            dto.getRunningOptions()
+                .map(RunningOptionsDTO::asDomainObject)
+                .orElse(RunningOptions.DEFAULT));
+    }
+
     private final MessageFastViewProjectionCorrector corrector;
     private final MessageFastViewProjectionCorrector.Progress progress;
+    private final RunningOptions runningOptions;
 
-    RecomputeAllFastViewProjectionItemsTask(MessageFastViewProjectionCorrector corrector) {
+    RecomputeAllFastViewProjectionItemsTask(MessageFastViewProjectionCorrector corrector, RunningOptions runningOptions) {
         this.corrector = corrector;
+        this.runningOptions = runningOptions;
         this.progress = new MessageFastViewProjectionCorrector.Progress();
     }
 
     @Override
     public Result run() {
-        return corrector.correctAllProjectionItems(progress, RunningOptions.DEFAULT)
+        return corrector.correctAllProjectionItems(progress, runningOptions)
             .subscribeOn(Schedulers.elastic())
             .block();
     }
diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTask.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTask.java
index c3a9f44..7b32ec6 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTask.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTask.java
@@ -25,6 +25,7 @@ import org.apache.james.core.Username;
 import org.apache.james.task.Task;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.UsersRepositoryException;
+import org.apache.james.webadmin.data.jmap.MessageFastViewProjectionCorrector.RunningOptions;
 import org.apache.james.webadmin.tasks.TaskFromRequestRegistry;
 import org.apache.james.webadmin.utils.ErrorResponder;
 import org.eclipse.jetty.http.HttpStatus;
@@ -43,7 +44,7 @@ public class RecomputeUserFastViewProjectionItemsRequestToTask extends TaskFromR
     private static Task toTask(MessageFastViewProjectionCorrector corrector, UsersRepository usersRepository, Request request) throws UsersRepositoryException {
         Username username = Username.of(request.params("username"));
         if (usersRepository.contains(username)) {
-            return new RecomputeUserFastViewProjectionItemsTask(corrector, username);
+            return new RecomputeUserFastViewProjectionItemsTask(corrector, RunningOptions.DEFAULT, username);
         }
 
         throw ErrorResponder.builder()
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 3e44238..ca41a3f 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
@@ -82,12 +82,16 @@ public class RecomputeUserFastViewProjectionItemsTask implements Task {
     public static class RecomputeUserFastViewTaskDTO implements TaskDTO {
         private final String type;
         private final String username;
+        private final Optional<RunningOptionsDTO> runningOptions;
 
         public RecomputeUserFastViewTaskDTO(
-            @JsonProperty("type") String type,
-            @JsonProperty("username") String username) {
+                @JsonProperty("type") String type,
+                @JsonProperty("username") String username,
+                @JsonProperty("runningOptions") Optional<RunningOptionsDTO> runningOptions) {
+
             this.type = type;
             this.username = username;
+            this.runningOptions = runningOptions;
         }
 
         @Override
@@ -98,31 +102,50 @@ public class RecomputeUserFastViewProjectionItemsTask implements Task {
         public String getUsername() {
             return username;
         }
+
+        public Optional<RunningOptionsDTO> getRunningOptions() {
+            return runningOptions;
+        }
     }
 
     public static TaskDTOModule<RecomputeUserFastViewProjectionItemsTask, RecomputeUserFastViewTaskDTO> module(MessageFastViewProjectionCorrector corrector) {
         return DTOModule
             .forDomainObject(RecomputeUserFastViewProjectionItemsTask.class)
             .convertToDTO(RecomputeUserFastViewTaskDTO.class)
-            .toDomainObjectConverter(dto -> new RecomputeUserFastViewProjectionItemsTask(corrector, Username.of(dto.username)))
-            .toDTOConverter((task, type) -> new RecomputeUserFastViewTaskDTO(type, task.username.asString()))
+            .toDomainObjectConverter(dto -> asTask(corrector, dto))
+            .toDTOConverter(RecomputeUserFastViewProjectionItemsTask::asDTO)
             .typeName(TASK_TYPE.asString())
             .withFactory(TaskDTOModule::new);
     }
 
+    private static RecomputeUserFastViewTaskDTO asDTO(RecomputeUserFastViewProjectionItemsTask task, String type) {
+        return new RecomputeUserFastViewTaskDTO(type, task.username.asString(),
+            Optional.of(RunningOptionsDTO.asDTO(task.runningOptions)));
+    }
+
+    private static RecomputeUserFastViewProjectionItemsTask asTask(MessageFastViewProjectionCorrector corrector, RecomputeUserFastViewTaskDTO dto) {
+        return new RecomputeUserFastViewProjectionItemsTask(corrector,
+            dto.getRunningOptions()
+                .map(RunningOptionsDTO::asDomainObject)
+                .orElse(RunningOptions.DEFAULT),
+            Username.of(dto.username));
+    }
+
     private final MessageFastViewProjectionCorrector corrector;
-    private final MessageFastViewProjectionCorrector.Progress progress;
+    private final RunningOptions runningOptions;
+    private final Progress progress;
     private final Username username;
 
-    RecomputeUserFastViewProjectionItemsTask(MessageFastViewProjectionCorrector corrector, Username username) {
+    RecomputeUserFastViewProjectionItemsTask(MessageFastViewProjectionCorrector corrector, RunningOptions runningOptions, Username username) {
         this.corrector = corrector;
+        this.runningOptions = runningOptions;
         this.username = username;
         this.progress = new MessageFastViewProjectionCorrector.Progress();
     }
 
     @Override
     public Result run() {
-        return corrector.correctUsersProjectionItems(progress, username, RunningOptions.DEFAULT)
+        return corrector.correctUsersProjectionItems(progress, username, runningOptions)
             .subscribeOn(Schedulers.elastic())
             .block();
     }
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskSerializationTest.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RunningOptionsDTO.java
similarity index 56%
copy from server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskSerializationTest.java
copy to server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RunningOptionsDTO.java
index 3d1b949..5fae5b5 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskSerializationTest.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RunningOptionsDTO.java
@@ -19,26 +19,32 @@
 
 package org.apache.james.webadmin.data.jmap;
 
-import static org.mockito.Mockito.mock;
+import java.util.Optional;
 
-import org.apache.james.JsonSerializationVerifier;
-import org.apache.james.util.ClassLoaderUtils;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
+import org.apache.james.webadmin.data.jmap.MessageFastViewProjectionCorrector.RunningOptions;
 
-class RecomputeAllFastViewProjectionItemsTaskSerializationTest {
-    MessageFastViewProjectionCorrector corrector;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
-    @BeforeEach
-    void setUp() {
-        corrector = mock(MessageFastViewProjectionCorrector.class);
+public class RunningOptionsDTO {
+    public static RunningOptionsDTO asDTO(RunningOptions domainObject) {
+        return new RunningOptionsDTO(Optional.of(domainObject.getMessageRatePerSecond()));
     }
 
-    @Test
-    void shouldMatchJsonSerializationContract() throws Exception {
-        JsonSerializationVerifier.dtoModule(RecomputeAllFastViewProjectionItemsTask.module(corrector))
-            .bean(new RecomputeAllFastViewProjectionItemsTask(corrector))
-            .json(ClassLoaderUtils.getSystemResourceAsString("json/recomputeAll.task.json"))
-            .verify();
+    private final Optional<Integer> messageRatePerSecond;
+
+    @JsonCreator
+    public RunningOptionsDTO(
+            @JsonProperty("messageRatePerSecond") Optional<Integer> messageRatePerSecond) {
+        this.messageRatePerSecond = messageRatePerSecond;
+    }
+
+    public Optional<Integer> getMessageRatePerSecond() {
+        return messageRatePerSecond;
+    }
+
+    public RunningOptions asDomainObject() {
+        return messageRatePerSecond.map(RunningOptions::withMessageRatePerSecond)
+            .orElse(RunningOptions.DEFAULT);
     }
-}
\ No newline at end of file
+}
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskSerializationTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskSerializationTest.java
index 3d1b949..fc9f89e 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskSerializationTest.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskSerializationTest.java
@@ -19,10 +19,13 @@
 
 package org.apache.james.webadmin.data.jmap;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 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.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -37,8 +40,22 @@ class RecomputeAllFastViewProjectionItemsTaskSerializationTest {
     @Test
     void shouldMatchJsonSerializationContract() throws Exception {
         JsonSerializationVerifier.dtoModule(RecomputeAllFastViewProjectionItemsTask.module(corrector))
-            .bean(new RecomputeAllFastViewProjectionItemsTask(corrector))
+            .bean(new RecomputeAllFastViewProjectionItemsTask(corrector,
+                RunningOptions.withMessageRatePerSecond(2)))
             .json(ClassLoaderUtils.getSystemResourceAsString("json/recomputeAll.task.json"))
             .verify();
     }
+
+    @Test
+    void shouldDeserializeLegacy() throws Exception {
+        RecomputeAllFastViewProjectionItemsTask legacyTask = JsonGenericSerializer.forModules(RecomputeAllFastViewProjectionItemsTask.module(corrector))
+            .withoutNestedType()
+            .deserialize(ClassLoaderUtils.getSystemResourceAsString("json/recomputeAll.task.legacy.json"));
+
+        RecomputeAllFastViewProjectionItemsTask expected = new RecomputeAllFastViewProjectionItemsTask(corrector,
+            RunningOptions.DEFAULT);
+
+        assertThat(legacyTask)
+            .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/RecomputeUserFastViewProjectionItemsTaskSerializationTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskSerializationTest.java
index 2d7d75d..b5796ba 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskSerializationTest.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskSerializationTest.java
@@ -19,11 +19,14 @@
 
 package org.apache.james.webadmin.data.jmap;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 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.apache.james.webadmin.data.jmap.MessageFastViewProjectionCorrector.RunningOptions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -38,8 +41,24 @@ class RecomputeUserFastViewProjectionItemsTaskSerializationTest {
     @Test
     void shouldMatchJsonSerializationContract() throws Exception {
         JsonSerializationVerifier.dtoModule(RecomputeUserFastViewProjectionItemsTask.module(corrector))
-            .bean(new RecomputeUserFastViewProjectionItemsTask(corrector, Username.of("bob")))
+            .bean(new RecomputeUserFastViewProjectionItemsTask(corrector,
+                RunningOptions.withMessageRatePerSecond(2),
+                Username.of("bob")))
             .json(ClassLoaderUtils.getSystemResourceAsString("json/recomputeUser.task.json"))
             .verify();
     }
+
+    @Test
+    void shouldDeserializeLegacy() throws Exception {
+        RecomputeUserFastViewProjectionItemsTask legacyTask = JsonGenericSerializer.forModules(RecomputeUserFastViewProjectionItemsTask.module(corrector))
+            .withoutNestedType()
+            .deserialize(ClassLoaderUtils.getSystemResourceAsString("json/recomputeUser.task.legacy.json"));
+
+        RecomputeUserFastViewProjectionItemsTask expected = new RecomputeUserFastViewProjectionItemsTask(corrector,
+            RunningOptions.DEFAULT,
+            Username.of("bob"));
+
+        assertThat(legacyTask)
+            .isEqualToComparingFieldByFieldRecursively(expected);
+    }
 }
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.task.json b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.task.json
index a76c799..0a61bed 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.task.json
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.task.json
@@ -1 +1,6 @@
-{"type":"RecomputeAllFastViewProjectionItemsTask"}
\ No newline at end of file
+{
+  "type":"RecomputeAllFastViewProjectionItemsTask",
+  "runningOptions": {
+    "messageRatePerSecond":2
+  }
+}
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.task.json b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.task.legacy.json
similarity index 100%
copy from server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.task.json
copy to server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.task.legacy.json
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.task.json b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.task.json
index fcd7712..2612c4c 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.task.json
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.task.json
@@ -1,4 +1,7 @@
 {
   "type":"RecomputeUserFastViewProjectionItemsTask",
-  "username": "bob"
+  "username": "bob",
+  "runningOptions": {
+    "messageRatePerSecond":2
+  }
 }
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.task.json b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.task.legacy.json
similarity index 100%
copy from server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.task.json
copy to server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.task.legacy.json


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