You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2020/11/20 02:18:17 UTC

[james-project] 11/18: JAMES-3440 Tasks wrapper to populate EmailQueryView

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 f1cf25d3d58bff429002890d1f4d980309665193
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Nov 17 17:06:27 2020 +0700

    JAMES-3440 Tasks wrapper to populate EmailQueryView
---
 .../data/jmap/PopulateEmailQueryViewTask.java      | 160 +++++++++++++++++++++
 ...EmailQueryViewTaskAdditionalInformationDTO.java | 119 +++++++++++++++
 ...ctionItemsTaskAdditionalInformationDTOTest.java |  45 ++++++
 ...opulateEmailQueryViewTaskSerializationTest.java |  45 ++++++
 .../json/populateAll.additionalInformation.json    |  11 ++
 .../src/test/resources/json/populateAll.task.json  |   6 +
 6 files changed, 386 insertions(+)

diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewTask.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewTask.java
new file mode 100644
index 0000000..cd25741
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewTask.java
@@ -0,0 +1,160 @@
+/****************************************************************
+ * 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.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 PopulateEmailQueryViewTask implements Task {
+    static final TaskType TASK_TYPE = TaskType.of("PopulateEmailQueryViewTask");
+
+    public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
+        private static AdditionalInformation from(EmailQueryViewPopulator.Progress progress,
+                                                  RunningOptions runningOptions) {
+            return new AdditionalInformation(runningOptions,
+                progress.getProcessedUserCount(),
+                progress.getProcessedMessageCount(),
+                progress.getFailedUserCount(),
+                progress.getFailedMessageCount(),
+                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(RunningOptions runningOptions, long processedUserCount, long processedMessageCount, long failedUserCount, long failedMessageCount, Instant timestamp) {
+            this.runningOptions = runningOptions;
+            this.processedUserCount = processedUserCount;
+            this.processedMessageCount = processedMessageCount;
+            this.failedUserCount = failedUserCount;
+            this.failedMessageCount = failedMessageCount;
+            this.timestamp = timestamp;
+        }
+
+        public long getProcessedUserCount() {
+            return processedUserCount;
+        }
+
+        public long getProcessedMessageCount() {
+            return processedMessageCount;
+        }
+
+        public long getFailedUserCount() {
+            return failedUserCount;
+        }
+
+        public long getFailedMessageCount() {
+            return failedMessageCount;
+        }
+
+        public RunningOptions getRunningOptions() {
+            return runningOptions;
+        }
+
+        @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
+    }
+
+    public static class PopulateEmailQueryViewTaskDTO implements TaskDTO {
+        private final String type;
+        private final Optional<RunningOptionsDTO> runningOptions;
+
+        public PopulateEmailQueryViewTaskDTO(@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<PopulateEmailQueryViewTask, PopulateEmailQueryViewTaskDTO> module(EmailQueryViewPopulator populator) {
+        return DTOModule
+            .forDomainObject(PopulateEmailQueryViewTask.class)
+            .convertToDTO(PopulateEmailQueryViewTaskDTO.class)
+            .toDomainObjectConverter(dto -> asTask(populator, dto))
+            .toDTOConverter(PopulateEmailQueryViewTask::asDTO)
+            .typeName(TASK_TYPE.asString())
+            .withFactory(TaskDTOModule::new);
+    }
+
+    private static PopulateEmailQueryViewTaskDTO asDTO(PopulateEmailQueryViewTask task, String type) {
+        return new PopulateEmailQueryViewTaskDTO(type, Optional.of(RunningOptionsDTO.asDTO(task.runningOptions)));
+    }
+
+    private static PopulateEmailQueryViewTask asTask(EmailQueryViewPopulator populator, PopulateEmailQueryViewTaskDTO dto) {
+        return new PopulateEmailQueryViewTask(populator,
+            dto.getRunningOptions()
+                .map(RunningOptionsDTO::asDomainObject)
+                .orElse(RunningOptions.DEFAULT));
+    }
+
+    private final EmailQueryViewPopulator populator;
+    private final EmailQueryViewPopulator.Progress progress;
+    private final RunningOptions runningOptions;
+
+    PopulateEmailQueryViewTask(EmailQueryViewPopulator populator, RunningOptions runningOptions) {
+        this.populator = populator;
+        this.runningOptions = runningOptions;
+        this.progress = new EmailQueryViewPopulator.Progress();
+    }
+
+    @Override
+    public Result run() {
+        return populator.populateView(progress, runningOptions)
+            .subscribeOn(Schedulers.elastic())
+            .block();
+    }
+
+    @Override
+    public TaskType type() {
+        return TASK_TYPE;
+    }
+
+    @Override
+    public Optional<TaskExecutionDetails.AdditionalInformation> details() {
+        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/PopulateEmailQueryViewTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewTaskAdditionalInformationDTO.java
new file mode 100644
index 0000000..6e2c484
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewTaskAdditionalInformationDTO.java
@@ -0,0 +1,119 @@
+/****************************************************************
+ * 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 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 com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.annotations.VisibleForTesting;
+
+public class PopulateEmailQueryViewTaskAdditionalInformationDTO implements AdditionalInformationDTO {
+    public static AdditionalInformationDTOModule<PopulateEmailQueryViewTask.AdditionalInformation, PopulateEmailQueryViewTaskAdditionalInformationDTO> module() {
+        return DTOModule.forDomainObject(PopulateEmailQueryViewTask.AdditionalInformation.class)
+            .convertToDTO(PopulateEmailQueryViewTaskAdditionalInformationDTO.class)
+            .toDomainObjectConverter(PopulateEmailQueryViewTaskAdditionalInformationDTO::toDomainObject)
+            .toDTOConverter(PopulateEmailQueryViewTaskAdditionalInformationDTO::toDTO)
+            .typeName(PopulateEmailQueryViewTask.TASK_TYPE.asString())
+            .withFactory(AdditionalInformationDTOModule::new);
+    }
+
+    private static PopulateEmailQueryViewTask.AdditionalInformation toDomainObject(PopulateEmailQueryViewTaskAdditionalInformationDTO dto) {
+        return new PopulateEmailQueryViewTask.AdditionalInformation(
+            dto.getRunningOptions()
+                .map(RunningOptionsDTO::asDomainObject)
+                .orElse(RunningOptions.DEFAULT),
+            dto.getProcessedUserCount(),
+            dto.getProcessedMessageCount(),
+            dto.getFailedUserCount(),
+            dto.getFailedMessageCount(),
+            dto.timestamp);
+    }
+
+    private static PopulateEmailQueryViewTaskAdditionalInformationDTO toDTO(PopulateEmailQueryViewTask.AdditionalInformation details, String type) {
+        return new PopulateEmailQueryViewTaskAdditionalInformationDTO(
+            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
+    PopulateEmailQueryViewTaskAdditionalInformationDTO(@JsonProperty("type") String type,
+                                                       @JsonProperty("timestamp") Instant timestamp,
+                                                       @JsonProperty("processedUserCount") long processedUserCount,
+                                                       @JsonProperty("processedMessageCount") long processedMessageCount,
+                                                       @JsonProperty("failedUserCount") long failedUserCount,
+                                                       @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
+    public String getType() {
+        return type;
+    }
+
+    @Override
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
+    public long getProcessedUserCount() {
+        return processedUserCount;
+    }
+
+    public long getProcessedMessageCount() {
+        return processedMessageCount;
+    }
+
+    public long getFailedUserCount() {
+        return failedUserCount;
+    }
+
+    public long getFailedMessageCount() {
+        return failedMessageCount;
+    }
+
+    public Optional<RunningOptionsDTO> getRunningOptions() {
+        return runningOptions;
+    }
+}
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewProjectionItemsTaskAdditionalInformationDTOTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewProjectionItemsTaskAdditionalInformationDTOTest.java
new file mode 100644
index 0000000..09de56b
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewProjectionItemsTaskAdditionalInformationDTOTest.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 java.time.Instant;
+
+import org.apache.james.JsonSerializationVerifier;
+import org.apache.james.util.ClassLoaderUtils;
+import org.junit.jupiter.api.Test;
+
+class PopulateEmailQueryViewProjectionItemsTaskAdditionalInformationDTOTest {
+    private static final Instant INSTANT = Instant.parse("2007-12-03T10:15:30.00Z");
+    private static final PopulateEmailQueryViewTask.AdditionalInformation DOMAIN_OBJECT = new PopulateEmailQueryViewTask.AdditionalInformation(
+        RunningOptions.withMessageRatePerSecond(20),
+        1,
+        2,
+        3,
+        4,
+        INSTANT);
+
+    @Test
+    void shouldMatchJsonSerializationContract() throws Exception {
+        JsonSerializationVerifier.dtoModule(PopulateEmailQueryViewTaskAdditionalInformationDTO.module())
+            .bean(DOMAIN_OBJECT)
+            .json(ClassLoaderUtils.getSystemResourceAsString("json/populateAll.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/PopulateEmailQueryViewTaskSerializationTest.java b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewTaskSerializationTest.java
new file mode 100644
index 0000000..97b5ddc
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewTaskSerializationTest.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.util.ClassLoaderUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+class PopulateEmailQueryViewTaskSerializationTest {
+    EmailQueryViewPopulator populator;
+
+    @BeforeEach
+    void setUp() {
+        populator = mock(EmailQueryViewPopulator.class);
+    }
+
+    @Test
+    void shouldMatchJsonSerializationContract() throws Exception {
+        JsonSerializationVerifier.dtoModule(PopulateEmailQueryViewTask.module(populator))
+            .bean(new PopulateEmailQueryViewTask(populator,
+                RunningOptions.withMessageRatePerSecond(2)))
+            .json(ClassLoaderUtils.getSystemResourceAsString("json/populateAll.task.json"))
+            .verify();
+    }
+}
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/populateAll.additionalInformation.json b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/populateAll.additionalInformation.json
new file mode 100644
index 0000000..eb99605
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/populateAll.additionalInformation.json
@@ -0,0 +1,11 @@
+{
+  "type":"PopulateEmailQueryViewTask",
+  "timestamp":"2007-12-03T10:15:30Z",
+  "processedUserCount":1,
+  "processedMessageCount":2,
+  "failedUserCount":3,
+  "failedMessageCount":4,
+  "runningOptions": {
+    "messagesPerSecond":20
+  }
+}
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/populateAll.task.json b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/populateAll.task.json
new file mode 100644
index 0000000..ca9a5ee
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-jmap/src/test/resources/json/populateAll.task.json
@@ -0,0 +1,6 @@
+{
+  "type":"PopulateEmailQueryViewTask",
+  "runningOptions": {
+    "messagesPerSecond":2
+  }
+}
\ No newline at end of file


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