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 10c4b4d59161f759dd3635498ee7faad0bce26a2 Author: Benoit Tellier <[email protected]> AuthorDate: Thu May 21 15:06:57 2020 +0700 JAMES-3184 RecomputeCurrentQuotasTask should take RunningOptions as a parameter --- .../quota/task/RecomputeCurrentQuotasTask.java | 21 ++++++++--- ...eCurrentQuotasTaskAdditionalInformationDTO.java | 13 ++++++- .../quota/task/RecomputeCurrentQuotasTaskDTO.java | 18 ++++++++-- ...ntQuotasTaskDTO.java => RunningOptionsDTO.java} | 41 +++++++++------------- ...ecomputeCurrentQuotasTaskSerializationTest.java | 39 ++++++++++++++++++-- .../james/webadmin/routes/UserQuotaRoutes.java | 3 +- 6 files changed, 98 insertions(+), 37 deletions(-) diff --git a/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTask.java b/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTask.java index 82d142d..355c6bb 100644 --- a/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTask.java +++ b/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTask.java @@ -44,11 +44,13 @@ public class RecomputeCurrentQuotasTask implements Task { private final Instant instant; private final long processedQuotaRoots; private final ImmutableList<String> failedQuotaRoots; + private final RunningOptions runningOptions; - Details(Instant instant, long processedQuotaRoots, ImmutableList<String> failedQuotaRoots) { + Details(Instant instant, long processedQuotaRoots, ImmutableList<String> failedQuotaRoots, RunningOptions runningOptions) { this.instant = instant; this.processedQuotaRoots = processedQuotaRoots; this.failedQuotaRoots = failedQuotaRoots; + this.runningOptions = runningOptions; } @Override @@ -65,14 +67,19 @@ public class RecomputeCurrentQuotasTask implements Task { ImmutableList<String> getFailedQuotaRoots() { return failedQuotaRoots; } + + public RunningOptions getRunningOptions() { + return runningOptions; + } } private final RecomputeCurrentQuotasService service; + private final RunningOptions runningOptions; + private final Context context; - private Context context; - - public RecomputeCurrentQuotasTask(RecomputeCurrentQuotasService service) { + public RecomputeCurrentQuotasTask(RecomputeCurrentQuotasService service, RunningOptions runningOptions) { this.service = service; + this.runningOptions = runningOptions; this.context = new Context(); } @@ -88,6 +95,10 @@ public class RecomputeCurrentQuotasTask implements Task { return RECOMPUTE_CURRENT_QUOTAS; } + public RunningOptions getRunningOptions() { + return runningOptions; + } + @Override public Optional<TaskExecutionDetails.AdditionalInformation> details() { Snapshot snapshot = context.snapshot(); @@ -97,6 +108,6 @@ public class RecomputeCurrentQuotasTask implements Task { snapshot.getFailedQuotaRoots() .stream() .map(QuotaRoot::asString) - .collect(Guavate.toImmutableList()))); + .collect(Guavate.toImmutableList()), runningOptions)); } } diff --git a/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskAdditionalInformationDTO.java b/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskAdditionalInformationDTO.java index 5bebcee..5d8a56f 100644 --- a/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskAdditionalInformationDTO.java +++ b/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskAdditionalInformationDTO.java @@ -20,8 +20,10 @@ package org.apache.james.mailbox.quota.task; import java.time.Instant; +import java.util.Optional; import org.apache.james.json.DTOModule; +import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasService.RunningOptions; import org.apache.james.server.task.json.dto.AdditionalInformationDTO; import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule; @@ -34,6 +36,7 @@ public class RecomputeCurrentQuotasTaskAdditionalInformationDTO implements Addit type, details.getProcessedQuotaRoots(), details.getFailedQuotaRoots(), + Optional.of(RunningOptionsDTO.asDTO(details.getRunningOptions())), details.timestamp()); } @@ -49,15 +52,18 @@ public class RecomputeCurrentQuotasTaskAdditionalInformationDTO implements Addit private final String type; private final long processedQuotaRoots; private final ImmutableList<String> failedQuotaRoots; + private final Optional<RunningOptionsDTO> runningOptions; private final Instant timestamp; public RecomputeCurrentQuotasTaskAdditionalInformationDTO(@JsonProperty("type") String type, @JsonProperty("processedQuotaRoots") long processedQuotaRoots, @JsonProperty("failedQuotaRoots") ImmutableList<String> failedQuotaRoots, + @JsonProperty("runningOptions") Optional<RunningOptionsDTO> runningOptions, @JsonProperty("timestamp") Instant timestamp) { this.type = type; this.processedQuotaRoots = processedQuotaRoots; this.failedQuotaRoots = failedQuotaRoots; + this.runningOptions = runningOptions; this.timestamp = timestamp; } @@ -79,9 +85,14 @@ public class RecomputeCurrentQuotasTaskAdditionalInformationDTO implements Addit return type; } + public Optional<RunningOptionsDTO> getRunningOptions() { + return runningOptions; + } + private RecomputeCurrentQuotasTask.Details toDomainObject() { return new RecomputeCurrentQuotasTask.Details(timestamp, processedQuotaRoots, - failedQuotaRoots); + failedQuotaRoots, + runningOptions.map(RunningOptionsDTO::asDomainObject).orElse(RunningOptions.DEFAULT)); } } diff --git a/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskDTO.java b/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskDTO.java index 33d5a4e..03a854f 100644 --- a/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskDTO.java +++ b/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskDTO.java @@ -19,7 +19,10 @@ package org.apache.james.mailbox.quota.task; +import java.util.Optional; + import org.apache.james.json.DTOModule; +import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasService.RunningOptions; import org.apache.james.server.task.json.dto.TaskDTO; import org.apache.james.server.task.json.dto.TaskDTOModule; @@ -27,7 +30,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; public class RecomputeCurrentQuotasTaskDTO implements TaskDTO { private static RecomputeCurrentQuotasTaskDTO toDTO(RecomputeCurrentQuotasTask domainObject, String typeName) { - return new RecomputeCurrentQuotasTaskDTO(typeName); + return new RecomputeCurrentQuotasTaskDTO(typeName, + Optional.of(RunningOptionsDTO.asDTO(domainObject.getRunningOptions()))); } public static TaskDTOModule<RecomputeCurrentQuotasTask, RecomputeCurrentQuotasTaskDTO> module(RecomputeCurrentQuotasService service) { @@ -41,13 +45,21 @@ public class RecomputeCurrentQuotasTaskDTO implements TaskDTO { } private final String type; + private final Optional<RunningOptionsDTO> runningOptions; - public RecomputeCurrentQuotasTaskDTO(@JsonProperty("type") String type) { + public RecomputeCurrentQuotasTaskDTO(@JsonProperty("type") String type, + @JsonProperty("runningOptions") Optional<RunningOptionsDTO> runningOptions) { this.type = type; + this.runningOptions = runningOptions; } private RecomputeCurrentQuotasTask toDomainObject(RecomputeCurrentQuotasService service) { - return new RecomputeCurrentQuotasTask(service); + return new RecomputeCurrentQuotasTask(service, + runningOptions.map(RunningOptionsDTO::asDomainObject).orElse(RunningOptions.DEFAULT)); + } + + public Optional<RunningOptionsDTO> getRunningOptions() { + return runningOptions; } @Override diff --git a/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskDTO.java b/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RunningOptionsDTO.java similarity index 50% copy from mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskDTO.java copy to mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RunningOptionsDTO.java index 33d5a4e..e73d267 100644 --- a/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskDTO.java +++ b/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RunningOptionsDTO.java @@ -19,39 +19,32 @@ package org.apache.james.mailbox.quota.task; -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 java.util.Optional; -import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasService.RunningOptions; -public class RecomputeCurrentQuotasTaskDTO implements TaskDTO { - private static RecomputeCurrentQuotasTaskDTO toDTO(RecomputeCurrentQuotasTask domainObject, String typeName) { - return new RecomputeCurrentQuotasTaskDTO(typeName); - } +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; - public static TaskDTOModule<RecomputeCurrentQuotasTask, RecomputeCurrentQuotasTaskDTO> module(RecomputeCurrentQuotasService service) { - return DTOModule - .forDomainObject(RecomputeCurrentQuotasTask.class) - .convertToDTO(RecomputeCurrentQuotasTaskDTO.class) - .toDomainObjectConverter(dto -> dto.toDomainObject(service)) - .toDTOConverter(RecomputeCurrentQuotasTaskDTO::toDTO) - .typeName(RecomputeCurrentQuotasTask.RECOMPUTE_CURRENT_QUOTAS.asString()) - .withFactory(TaskDTOModule::new); +public class RunningOptionsDTO { + public static RunningOptionsDTO asDTO(RunningOptions domainObject) { + return new RunningOptionsDTO(Optional.of(domainObject.getUsersPerSecond())); } - private final String type; + private final Optional<Integer> usersPerSecond; - public RecomputeCurrentQuotasTaskDTO(@JsonProperty("type") String type) { - this.type = type; + @JsonCreator + public RunningOptionsDTO( + @JsonProperty("usersPerSecond") Optional<Integer> usersPerSecond) { + this.usersPerSecond = usersPerSecond; } - private RecomputeCurrentQuotasTask toDomainObject(RecomputeCurrentQuotasService service) { - return new RecomputeCurrentQuotasTask(service); + public Optional<Integer> getUsersPerSecond() { + return usersPerSecond; } - @Override - public String getType() { - return type; + public RunningOptions asDomainObject() { + return usersPerSecond.map(RunningOptions::withUsersPerSecond) + .orElse(RunningOptions.DEFAULT); } } diff --git a/mailbox/tools/quota-recompute/src/test/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskSerializationTest.java b/mailbox/tools/quota-recompute/src/test/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskSerializationTest.java index 9eb7405..73fbc5b 100644 --- a/mailbox/tools/quota-recompute/src/test/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskSerializationTest.java +++ b/mailbox/tools/quota-recompute/src/test/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskSerializationTest.java @@ -19,11 +19,14 @@ package org.apache.james.mailbox.quota.task; +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.json.JsonGenericSerializer; +import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasService.RunningOptions; import org.junit.jupiter.api.Test; import com.google.common.collect.ImmutableList; @@ -33,13 +36,23 @@ class RecomputeCurrentQuotasTaskSerializationTest { static final String QUOTA_ROOT_AS_STRING = "bob@localhost"; static final RecomputeCurrentQuotasService SERVICE = mock(RecomputeCurrentQuotasService.class); - static final RecomputeCurrentQuotasTask TASK = new RecomputeCurrentQuotasTask(SERVICE); - static final String SERIALIZED_TASK = "{\"type\": \"recompute-current-quotas\"}"; - static final RecomputeCurrentQuotasTask.Details DETAILS = new RecomputeCurrentQuotasTask.Details(TIMESTAMP, 12, ImmutableList.of(QUOTA_ROOT_AS_STRING)); + static final RecomputeCurrentQuotasTask TASK = new RecomputeCurrentQuotasTask(SERVICE, RunningOptions.withUsersPerSecond(17)); + static final RecomputeCurrentQuotasTask TASK_DEFAULT = new RecomputeCurrentQuotasTask(SERVICE, RunningOptions.DEFAULT); + static final String SERIALIZED_TASK_LEGACY = "{\"type\": \"recompute-current-quotas\"}"; + static final String SERIALIZED_TASK = "{\"type\": \"recompute-current-quotas\",\"runningOptions\":{\"usersPerSecond\":17}}"; + static final RecomputeCurrentQuotasTask.Details DETAILS = new RecomputeCurrentQuotasTask.Details(TIMESTAMP, 12, ImmutableList.of(QUOTA_ROOT_AS_STRING), RunningOptions.withUsersPerSecond(17)); + static final RecomputeCurrentQuotasTask.Details DETAILS_DEFAULT = new RecomputeCurrentQuotasTask.Details(TIMESTAMP, 12, ImmutableList.of(QUOTA_ROOT_AS_STRING), RunningOptions.DEFAULT); + static final String SERIALIZED_ADDITIONAL_INFORMATION_LEGACY = "{" + + " \"type\":\"recompute-current-quotas\"," + + " \"processedQuotaRoots\":12," + + " \"failedQuotaRoots\":[\"bob@localhost\"]," + + " \"timestamp\":\"2018-11-13T12:00:55Z\"" + + "}"; static final String SERIALIZED_ADDITIONAL_INFORMATION = "{" + " \"type\":\"recompute-current-quotas\"," + " \"processedQuotaRoots\":12," + " \"failedQuotaRoots\":[\"bob@localhost\"]," + + " \"runningOptions\":{\"usersPerSecond\":17}," + " \"timestamp\":\"2018-11-13T12:00:55Z\"" + "}"; @@ -58,4 +71,24 @@ class RecomputeCurrentQuotasTaskSerializationTest { .json(SERIALIZED_ADDITIONAL_INFORMATION) .verify(); } + + @Test + void shouldDeserializeLegacyTask() throws Exception { + RecomputeCurrentQuotasTask legacyTask = JsonGenericSerializer.forModules(RecomputeCurrentQuotasTaskDTO.module(SERVICE)) + .withoutNestedType() + .deserialize(SERIALIZED_TASK_LEGACY); + + assertThat(legacyTask) + .isEqualToComparingFieldByFieldRecursively(TASK_DEFAULT); + } + + @Test + void shouldDeserializeLegacyDetails() throws Exception { + RecomputeCurrentQuotasTask.Details legacyDetails = JsonGenericSerializer.forModules(RecomputeCurrentQuotasTaskAdditionalInformationDTO.MODULE) + .withoutNestedType() + .deserialize(SERIALIZED_ADDITIONAL_INFORMATION_LEGACY); + + assertThat(legacyDetails) + .isEqualToComparingFieldByFieldRecursively(DETAILS_DEFAULT); + } } diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java index 0f73118..4201768 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java @@ -42,6 +42,7 @@ import org.apache.james.core.Username; import org.apache.james.core.quota.QuotaCountLimit; import org.apache.james.core.quota.QuotaSizeLimit; import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasService; +import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasService.RunningOptions; import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasTask; import org.apache.james.quota.search.Limit; import org.apache.james.quota.search.Offset; @@ -90,7 +91,7 @@ public class UserQuotaRoutes implements Routes { public static class RecomputeCurrentQuotasRequestToTask extends TaskFromRequestRegistry.TaskRegistration { @Inject public RecomputeCurrentQuotasRequestToTask(RecomputeCurrentQuotasService service) { - super(RECOMPUTE_CURRENT_QUOTAS, request -> new RecomputeCurrentQuotasTask(service)); + super(RECOMPUTE_CURRENT_QUOTAS, request -> new RecomputeCurrentQuotasTask(service, RunningOptions.DEFAULT)); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
