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/01/07 07:34:00 UTC

[james-project] 06/16: JAMES-2993 Task DTO & serialization test for user preview recomputation

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 a150fdb2d07e40cc177b6c4115a7c751238a2b16
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Fri Jan 3 10:16:10 2020 +0700

    JAMES-2993 Task DTO & serialization test for user preview recomputation
---
 .../jmap/MessageFastViewProjectionCorrector.java   |   2 +-
 .../RecomputeUserFastViewProjectionItemsTask.java  | 141 +++++++++++++++++++++
 ...teUserPreviewsTaskAdditionalInformationDTO.java |  88 +++++++++++++
 ...ctionItemsTaskAdditionalInformationDTOTest.java |  41 ++++++
 ...stViewProjectionItemsTaskSerializationTest.java |  45 +++++++
 .../json/recomputeUser.additionalInformation.json  |   7 +
 .../test/resources/json/recomputeUser.task.json    |   4 +
 7 files changed, 327 insertions(+), 1 deletion(-)

diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java
index 0eb7f08..53a9c21 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java
@@ -112,7 +112,7 @@ public class MessageFastViewProjectionCorrector {
         }
     }
 
-    private Mono<Void> correctUsersProjectionItems(Progress progress, Username username) {
+    Mono<Void> correctUsersProjectionItems(Progress progress, Username username) {
         try {
             MailboxSession session = mailboxManager.createSystemSession(username);
             return listUsersMailboxes(session)
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
new file mode 100644
index 0000000..4f30958
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTask.java
@@ -0,0 +1,141 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.webadmin.data.jmap;
+
+import java.time.Clock;
+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.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.scheduler.Schedulers;
+
+public class RecomputeUserFastViewProjectionItemsTask implements Task {
+    static final TaskType TASK_TYPE = TaskType.of("RecomputeUserFastViewProjectionItemsTask");
+
+    public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
+        private static AdditionalInformation from(MessageFastViewProjectionCorrector.Progress progress, Username username) {
+            return new AdditionalInformation(username,
+                progress.getProcessedMessageCount(),
+                progress.getFailedMessageCount(),
+                Clock.systemUTC().instant());
+        }
+
+        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) {
+            this.username = username;
+            this.processedMessageCount = processedMessageCount;
+            this.failedMessageCount = failedMessageCount;
+            this.timestamp = timestamp;
+        }
+
+        public long getProcessedMessageCount() {
+            return processedMessageCount;
+        }
+
+        public long getFailedMessageCount() {
+            return failedMessageCount;
+        }
+
+        public String getUsername() {
+            return username.asString();
+        }
+
+        @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
+    }
+
+    public static class RecomputeUserPreviewsTaskDTO implements TaskDTO {
+        private final String type;
+        private final String username;
+
+        public RecomputeUserPreviewsTaskDTO(
+            @JsonProperty("type") String type,
+            @JsonProperty("username") String username) {
+            this.type = type;
+            this.username = username;
+        }
+
+        @Override
+        public String getType() {
+            return type;
+        }
+
+        public String getUsername() {
+            return username;
+        }
+    }
+
+    public static TaskDTOModule<RecomputeUserFastViewProjectionItemsTask, RecomputeUserPreviewsTaskDTO> module(MessageFastViewProjectionCorrector corrector) {
+        return DTOModule
+            .forDomainObject(RecomputeUserFastViewProjectionItemsTask.class)
+            .convertToDTO(RecomputeUserPreviewsTaskDTO.class)
+            .toDomainObjectConverter(dto -> new RecomputeUserFastViewProjectionItemsTask(corrector, Username.of(dto.username)))
+            .toDTOConverter((task, type) -> new RecomputeUserPreviewsTaskDTO(type, task.username.asString()))
+            .typeName(TASK_TYPE.asString())
+            .withFactory(TaskDTOModule::new);
+    }
+
+    private final MessageFastViewProjectionCorrector corrector;
+    private final MessageFastViewProjectionCorrector.Progress progress;
+    private final Username username;
+
+    RecomputeUserFastViewProjectionItemsTask(MessageFastViewProjectionCorrector corrector, Username username) {
+        this.corrector = corrector;
+        this.username = username;
+        this.progress = new MessageFastViewProjectionCorrector.Progress();
+    }
+
+    @Override
+    public Result run() {
+        corrector.correctUsersProjectionItems(progress, username)
+            .subscribeOn(Schedulers.elastic())
+            .block();
+
+        if (progress.failed()) {
+            return Result.PARTIAL;
+        }
+        return Result.COMPLETED;
+    }
+
+    @Override
+    public TaskType type() {
+        return TASK_TYPE;
+    }
+
+    @Override
+    public Optional<TaskExecutionDetails.AdditionalInformation> details() {
+        return Optional.of(AdditionalInformation.from(progress, username));
+    }
+}
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserPreviewsTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserPreviewsTaskAdditionalInformationDTO.java
new file mode 100644
index 0000000..030c09c
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserPreviewsTaskAdditionalInformationDTO.java
@@ -0,0 +1,88 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.webadmin.data.jmap;
+
+import java.time.Instant;
+
+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 com.fasterxml.jackson.annotation.JsonProperty;
+
+public class RecomputeUserPreviewsTaskAdditionalInformationDTO implements AdditionalInformationDTO {
+    public static final AdditionalInformationDTOModule<RecomputeUserFastViewProjectionItemsTask.AdditionalInformation, RecomputeUserPreviewsTaskAdditionalInformationDTO> SERIALIZATION_MODULE =
+        DTOModule.forDomainObject(RecomputeUserFastViewProjectionItemsTask.AdditionalInformation.class)
+            .convertToDTO(RecomputeUserPreviewsTaskAdditionalInformationDTO.class)
+            .toDomainObjectConverter(dto -> new RecomputeUserFastViewProjectionItemsTask.AdditionalInformation(
+                Username.of(dto.username),
+                dto.getProcessedMessageCount(),
+                dto.getFailedMessageCount(),
+                dto.timestamp))
+            .toDTOConverter((details, type) -> new RecomputeUserPreviewsTaskAdditionalInformationDTO(
+                type,
+                details.timestamp(),
+                details.getUsername(),
+                details.getProcessedMessageCount(),
+                details.getFailedMessageCount()))
+            .typeName(RecomputeUserFastViewProjectionItemsTask.TASK_TYPE.asString())
+            .withFactory(AdditionalInformationDTOModule::new);
+
+    private final String type;
+    private final Instant timestamp;
+    private final String username;
+    private final long processedMessageCount;
+    private final long failedMessageCount;
+
+    private RecomputeUserPreviewsTaskAdditionalInformationDTO(@JsonProperty("type") String type,
+                                                              @JsonProperty("timestamp") Instant timestamp,
+                                                              @JsonProperty("username") String username,
+                                                              @JsonProperty("processedMessageCount") long processedMessageCount,
+                                                              @JsonProperty("failedMessageCount") long failedMessageCount) {
+        this.type = type;
+        this.timestamp = timestamp;
+        this.username = username;
+        this.processedMessageCount = processedMessageCount;
+        this.failedMessageCount = failedMessageCount;
+    }
+
+    @Override
+    public String getType() {
+        return type;
+    }
+
+    @Override
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
+    public long getProcessedMessageCount() {
+        return processedMessageCount;
+    }
+
+    public long getFailedMessageCount() {
+        return failedMessageCount;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+}
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
new file mode 100644
index 0000000..394d2b0
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest.java
@@ -0,0 +1,41 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.webadmin.data.jmap;
+
+import java.time.Instant;
+
+import org.apache.james.JsonSerializationVerifier;
+import org.apache.james.core.Username;
+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(
+        Username.of("bob"), 2, 3, INSTANT);
+
+    @Test
+    void shouldMatchJsonSerializationContract() throws Exception {
+        JsonSerializationVerifier.dtoModule(RecomputeUserPreviewsTaskAdditionalInformationDTO.SERIALIZATION_MODULE)
+            .bean(DOMAIN_OBJECT)
+            .json(ClassLoaderUtils.getSystemResourceAsString("json/recomputeUser.additionalInformation.json"))
+            .verify();
+    }
+}
\ 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
new file mode 100644
index 0000000..2d7d75d
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskSerializationTest.java
@@ -0,0 +1,45 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.webadmin.data.jmap;
+
+import static org.mockito.Mockito.mock;
+
+import org.apache.james.JsonSerializationVerifier;
+import org.apache.james.core.Username;
+import org.apache.james.util.ClassLoaderUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+class RecomputeUserFastViewProjectionItemsTaskSerializationTest {
+    MessageFastViewProjectionCorrector corrector;
+
+    @BeforeEach
+    void setUp() {
+        corrector = mock(MessageFastViewProjectionCorrector.class);
+    }
+
+    @Test
+    void shouldMatchJsonSerializationContract() throws Exception {
+        JsonSerializationVerifier.dtoModule(RecomputeUserFastViewProjectionItemsTask.module(corrector))
+            .bean(new RecomputeUserFastViewProjectionItemsTask(corrector, Username.of("bob")))
+            .json(ClassLoaderUtils.getSystemResourceAsString("json/recomputeUser.task.json"))
+            .verify();
+    }
+}
\ 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.json
new file mode 100644
index 0000000..7e24f49
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.additionalInformation.json
@@ -0,0 +1,7 @@
+{
+  "type":"RecomputeUserFastViewProjectionItemsTask",
+  "timestamp":"2007-12-03T10:15:30Z",
+  "username": "bob",
+  "processedMessageCount":2,
+  "failedMessageCount":3
+}
\ 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.json
new file mode 100644
index 0000000..fcd7712
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.task.json
@@ -0,0 +1,4 @@
+{
+  "type":"RecomputeUserFastViewProjectionItemsTask",
+  "username": "bob"
+}
\ No newline at end of file


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