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 a4cee744d62023d5f89d1f1524c70e048ab30731 Author: LanKhuat <[email protected]> AuthorDate: Mon May 18 17:32:31 2020 +0700 JAMES-3184 Update task serialization/deserialization with RunningOptions --- .../cassandra/mail/task/RunningOptionsDTO.java | 34 +++++++++++------ .../mail/task/SolveMessageInconsistenciesTask.java | 22 +++++++++-- ...nconsistenciesTaskAdditionalInformationDTO.java | 13 +++++++ .../task/SolveMessageInconsistenciesTaskDTO.java | 19 ++++++++-- ...essageInconsistenciesTaskSerializationTest.java | 43 +++++++++++++++++++++- ...ssageInconsistencies.additionalInformation.json | 3 ++ ...onsistencies.additionalInformation.legacy.json} | 0 .../json/solveMessageInconsistencies.task.json | 5 ++- ...> solveMessageInconsistencies.task.legacy.json} | 0 .../SolveMessageInconsistenciesRequestToTask.java | 3 +- 10 files changed, 120 insertions(+), 22 deletions(-) diff --git a/server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/routes/SolveMessageInconsistenciesRequestToTask.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RunningOptionsDTO.java similarity index 57% copy from server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/routes/SolveMessageInconsistenciesRequestToTask.java copy to mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RunningOptionsDTO.java index 8702b86..96c21fd 100644 --- a/server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/routes/SolveMessageInconsistenciesRequestToTask.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RunningOptionsDTO.java @@ -17,20 +17,32 @@ * under the License. * ****************************************************************/ -package org.apache.james.webadmin.routes; +package org.apache.james.mailbox.cassandra.mail.task; -import javax.inject.Inject; +import java.util.Optional; -import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesService; -import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesTask; -import org.apache.james.webadmin.tasks.TaskFromRequestRegistry; -import org.apache.james.webadmin.tasks.TaskRegistrationKey; +import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesService.RunningOptions; -public class SolveMessageInconsistenciesRequestToTask extends TaskFromRequestRegistry.TaskRegistration { - private static final TaskRegistrationKey REGISTRATION_KEY = TaskRegistrationKey.of("SolveInconsistencies"); +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; - @Inject - public SolveMessageInconsistenciesRequestToTask(SolveMessageInconsistenciesService service) { - super(REGISTRATION_KEY, request -> new SolveMessageInconsistenciesTask(service)); +public class RunningOptionsDTO { + public static RunningOptionsDTO asDTO(SolveMessageInconsistenciesService.RunningOptions domainObject) { + return new RunningOptionsDTO(Optional.of(domainObject.getMessagesPerSecond())); + } + + private final Optional<Integer> messagesPerSecond; + + @JsonCreator + public RunningOptionsDTO(@JsonProperty("messagesPerSecond") Optional<Integer> messagesPerSecond) { + this.messagesPerSecond = messagesPerSecond; + } + + public Optional<Integer> getMessagesPerSecond() { + return messagesPerSecond; + } + + public RunningOptions asDomainObject() { + return new RunningOptions(messagesPerSecond.orElse(RunningOptions.DEFAULT.getMessagesPerSecond())); } } diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTask.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTask.java index 1fb540c..c56b8b3 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTask.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTask.java @@ -25,6 +25,7 @@ import java.util.Optional; import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesService.Context; import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesService.Context.Snapshot; +import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesService.RunningOptions; import org.apache.james.mailbox.model.ComposedMessageId; import org.apache.james.task.Task; import org.apache.james.task.TaskExecutionDetails; @@ -45,11 +46,12 @@ public class SolveMessageInconsistenciesTask implements Task { private final long addedMessageIdEntries; private final long updatedMessageIdEntries; private final long removedMessageIdEntries; + private final RunningOptions runningOptions; private final ImmutableList<MessageInconsistenciesEntry> fixedInconsistencies; private final ImmutableList<MessageInconsistenciesEntry> errors; public Details(Instant instant, long processedImapUidEntries, long processedMessageIdEntries, - long addedMessageIdEntries, long updatedMessageIdEntries, long removedMessageIdEntries, + long addedMessageIdEntries, long updatedMessageIdEntries, long removedMessageIdEntries, RunningOptions runningOptions, ImmutableList<MessageInconsistenciesEntry> fixedInconsistencies, ImmutableList<MessageInconsistenciesEntry> errors) { this.instant = instant; this.processedImapUidEntries = processedImapUidEntries; @@ -57,6 +59,7 @@ public class SolveMessageInconsistenciesTask implements Task { this.addedMessageIdEntries = addedMessageIdEntries; this.updatedMessageIdEntries = updatedMessageIdEntries; this.removedMessageIdEntries = removedMessageIdEntries; + this.runningOptions = runningOptions; this.fixedInconsistencies = fixedInconsistencies; this.errors = errors; } @@ -91,6 +94,11 @@ public class SolveMessageInconsistenciesTask implements Task { return removedMessageIdEntries; } + @JsonProperty("runningOptions") + public RunningOptions getRunningOptions() { + return runningOptions; + } + @JsonProperty("fixedInconsistencies") public ImmutableList<MessageInconsistenciesEntry> getFixedInconsistencies() { return fixedInconsistencies; @@ -104,15 +112,17 @@ public class SolveMessageInconsistenciesTask implements Task { private final SolveMessageInconsistenciesService service; private Context context; + private RunningOptions runningOptions; - public SolveMessageInconsistenciesTask(SolveMessageInconsistenciesService service) { + public SolveMessageInconsistenciesTask(SolveMessageInconsistenciesService service, RunningOptions runningOptions) { this.service = service; + this.runningOptions = runningOptions; this.context = new Context(); } @Override public Result run() { - return service.fixMessageInconsistencies(context) + return service.fixMessageInconsistencies(context, runningOptions) .block(); } @@ -121,11 +131,15 @@ public class SolveMessageInconsistenciesTask implements Task { return SOLVE_MESSAGE_INCONSISTENCIES; } + public RunningOptions getRunningOptions() { + return this.runningOptions; + } + @Override public Optional<TaskExecutionDetails.AdditionalInformation> details() { Snapshot snapshot = context.snapshot(); return Optional.of(new Details(Clock.systemUTC().instant(), snapshot.getProcessedImapUidEntries(), snapshot.getProcessedMessageIdEntries(), - snapshot.getAddedMessageIdEntries(), snapshot.getUpdatedMessageIdEntries(), snapshot.getRemovedMessageIdEntries(), + snapshot.getAddedMessageIdEntries(), snapshot.getUpdatedMessageIdEntries(), snapshot.getRemovedMessageIdEntries(), runningOptions, snapshot.getFixedInconsistencies().stream() .map(this::toMessageInconsistenciesEntry) .collect(Guavate.toImmutableList()), diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskAdditionalInformationDTO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskAdditionalInformationDTO.java index a7792db..c8ae05d 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskAdditionalInformationDTO.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskAdditionalInformationDTO.java @@ -22,8 +22,10 @@ package org.apache.james.mailbox.cassandra.mail.task; import static org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesTask.SOLVE_MESSAGE_INCONSISTENCIES; import java.time.Instant; +import java.util.Optional; import org.apache.james.json.DTOModule; +import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesService.RunningOptions; import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesTask.Details; import org.apache.james.server.task.json.dto.AdditionalInformationDTO; import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule; @@ -42,6 +44,7 @@ public class SolveMessageInconsistenciesTaskAdditionalInformationDTO implements details.getAddedMessageIdEntries(), details.getUpdatedMessageIdEntries(), details.getRemovedMessageIdEntries(), + Optional.of(RunningOptionsDTO.asDTO(details.getRunningOptions())), details.getFixedInconsistencies(), details.getErrors()); } @@ -62,6 +65,7 @@ public class SolveMessageInconsistenciesTaskAdditionalInformationDTO implements private final long addedMessageIdEntries; private final long updatedMessageIdEntries; private final long removedMessageIdEntries; + private final Optional<RunningOptionsDTO> runningOptions; private final ImmutableList<MessageInconsistenciesEntry> fixedInconsistencies; private final ImmutableList<MessageInconsistenciesEntry> errors; @@ -71,6 +75,7 @@ public class SolveMessageInconsistenciesTaskAdditionalInformationDTO implements @JsonProperty("addedMessageIdEntries") long addedMessageIdEntries, @JsonProperty("updatedMessageIdEntries") long updatedMessageIdEntries, @JsonProperty("removedMessageIdEntries")long removedMessageIdEntries, + @JsonProperty("runningOptions") Optional<RunningOptionsDTO> runningOptions, @JsonProperty("fixedInconsistencies") ImmutableList<MessageInconsistenciesEntry> fixedInconsistencies, @JsonProperty("errors") ImmutableList<MessageInconsistenciesEntry> errors) { this.timestamp = timestamp; @@ -80,6 +85,7 @@ public class SolveMessageInconsistenciesTaskAdditionalInformationDTO implements this.addedMessageIdEntries = addedMessageIdEntries; this.updatedMessageIdEntries = updatedMessageIdEntries; this.removedMessageIdEntries = removedMessageIdEntries; + this.runningOptions = runningOptions; this.fixedInconsistencies = fixedInconsistencies; this.errors = errors; } @@ -104,6 +110,10 @@ public class SolveMessageInconsistenciesTaskAdditionalInformationDTO implements return removedMessageIdEntries; } + public Optional<RunningOptionsDTO> getRunningOptions() { + return runningOptions; + } + public ImmutableList<MessageInconsistenciesEntry> getFixedInconsistencies() { return fixedInconsistencies; } @@ -129,6 +139,9 @@ public class SolveMessageInconsistenciesTaskAdditionalInformationDTO implements addedMessageIdEntries, updatedMessageIdEntries, removedMessageIdEntries, + runningOptions + .map(RunningOptionsDTO::asDomainObject) + .orElse(RunningOptions.DEFAULT), fixedInconsistencies, errors); } diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskDTO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskDTO.java index 7caeea6..d1356bd 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskDTO.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskDTO.java @@ -21,7 +21,10 @@ package org.apache.james.mailbox.cassandra.mail.task; import static org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesTask.SOLVE_MESSAGE_INCONSISTENCIES; +import java.util.Optional; + import org.apache.james.json.DTOModule; +import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesService.RunningOptions; import org.apache.james.server.task.json.dto.TaskDTO; import org.apache.james.server.task.json.dto.TaskDTOModule; @@ -30,7 +33,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; public class SolveMessageInconsistenciesTaskDTO implements TaskDTO { private static SolveMessageInconsistenciesTaskDTO toDTO(SolveMessageInconsistenciesTask domainObject, String typeName) { - return new SolveMessageInconsistenciesTaskDTO(typeName); + return new SolveMessageInconsistenciesTaskDTO(typeName, Optional.of(RunningOptionsDTO.asDTO(domainObject.getRunningOptions()))); } public static TaskDTOModule<SolveMessageInconsistenciesTask, SolveMessageInconsistenciesTaskDTO> module(SolveMessageInconsistenciesService service) { @@ -44,17 +47,27 @@ public class SolveMessageInconsistenciesTaskDTO implements TaskDTO { } private final String type; + private final Optional<RunningOptionsDTO> runningOptions; - public SolveMessageInconsistenciesTaskDTO(@JsonProperty("type") String type) { + public SolveMessageInconsistenciesTaskDTO(@JsonProperty("type") String type, + @JsonProperty("runningOptions") Optional<RunningOptionsDTO> runningOptions) { this.type = type; + this.runningOptions = runningOptions; } private SolveMessageInconsistenciesTask toDomainObject(SolveMessageInconsistenciesService service) { - return new SolveMessageInconsistenciesTask(service); + return new SolveMessageInconsistenciesTask(service, + runningOptions + .map(RunningOptionsDTO::asDomainObject) + .orElse(RunningOptions.DEFAULT)); } @Override public String getType() { return type; } + + public Optional<RunningOptionsDTO> getRunningOptions() { + return runningOptions; + } } diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskSerializationTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskSerializationTest.java index f6ec69d..3edb7ee 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskSerializationTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskSerializationTest.java @@ -19,11 +19,14 @@ package org.apache.james.mailbox.cassandra.mail.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.cassandra.mail.task.SolveMessageInconsistenciesService.RunningOptions; import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesTask.Details; import org.apache.james.util.ClassLoaderUtils; import org.junit.jupiter.api.Test; @@ -33,7 +36,8 @@ import com.google.common.collect.ImmutableList; public class SolveMessageInconsistenciesTaskSerializationTest { private static final SolveMessageInconsistenciesService SERVICE = mock(SolveMessageInconsistenciesService.class); - private static final SolveMessageInconsistenciesTask TASK = new SolveMessageInconsistenciesTask(SERVICE); + private static final SolveMessageInconsistenciesTask TASK = new SolveMessageInconsistenciesTask(SERVICE, new RunningOptions(2)); + private static final SolveMessageInconsistenciesTask LEGACY_TASK = new SolveMessageInconsistenciesTask(SERVICE, RunningOptions.DEFAULT); private static final Instant INSTANT = Instant.parse("2007-12-03T10:15:30.00Z"); private static final String MAILBOX_ID = "551f0580-82fb-11ea-970e-f9c83d4cf8c2"; @@ -57,7 +61,7 @@ public class SolveMessageInconsistenciesTaskSerializationTest { .messageId(MESSAGE_ID_3) .messageUid(MESSAGE_UID_3); - private static final Details DETAILS = new SolveMessageInconsistenciesTask.Details(INSTANT, 2, 1, 1, 0, 1, ImmutableList.of(MESSAGE_1, MESSAGE_2), ImmutableList.of(MESSAGE_3)); + private static final Details DETAILS = new SolveMessageInconsistenciesTask.Details(INSTANT, 2, 1, 1, 0, 1, new SolveMessageInconsistenciesService.RunningOptions(2), ImmutableList.of(MESSAGE_1, MESSAGE_2), ImmutableList.of(MESSAGE_3)); @Test void taskShouldBeSerializable() throws Exception { @@ -68,6 +72,20 @@ public class SolveMessageInconsistenciesTaskSerializationTest { } @Test + void legacyTaskShouldBeDeserializable() throws Exception { + SolveMessageInconsistenciesService service = mock(SolveMessageInconsistenciesService.class); + + SolveMessageInconsistenciesTask legacyTask = JsonGenericSerializer.forModules(SolveMessageInconsistenciesTaskDTO.module(service)) + .withoutNestedType() + .deserialize(ClassLoaderUtils.getSystemResourceAsString("json/solveMessageInconsistencies.task.legacy.json")); + + SolveMessageInconsistenciesTask expected = new SolveMessageInconsistenciesTask(service, RunningOptions.DEFAULT); + + assertThat(legacyTask) + .isEqualToComparingFieldByFieldRecursively(expected); + } + + @Test void additionalInformationShouldBeSerializable() throws Exception { JsonSerializationVerifier.dtoModule(SolveMessageInconsistenciesTaskAdditionalInformationDTO.MODULE) .bean(DETAILS) @@ -75,4 +93,25 @@ public class SolveMessageInconsistenciesTaskSerializationTest { .verify(); } + @Test + void legacyAdditionalInformationShouldBeDeserializable() throws Exception { + SolveMessageInconsistenciesTask.Details legacyDetails = JsonGenericSerializer.forModules(SolveMessageInconsistenciesTaskAdditionalInformationDTO.MODULE) + .withoutNestedType() + .deserialize(ClassLoaderUtils.getSystemResourceAsString("json/solveMessageInconsistencies.additionalInformation.legacy.json")); + + SolveMessageInconsistenciesTask.Details expected = new SolveMessageInconsistenciesTask.Details( + INSTANT, + 2, + 1, + 1, + 0, + 1, + RunningOptions.DEFAULT, + ImmutableList.of(MESSAGE_1, MESSAGE_2), + ImmutableList.of(MESSAGE_3) + ); + + assertThat(legacyDetails) + .isEqualToComparingFieldByFieldRecursively(expected); + } } diff --git a/mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.additionalInformation.json b/mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.additionalInformation.json index 5ab72a0..d651687 100644 --- a/mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.additionalInformation.json +++ b/mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.additionalInformation.json @@ -6,6 +6,9 @@ "addedMessageIdEntries": 1, "updatedMessageIdEntries": 0, "removedMessageIdEntries": 1, + "runningOptions":{ + "messagesPerSecond": 2 + }, "fixedInconsistencies": [ { "mailboxId": "551f0580-82fb-11ea-970e-f9c83d4cf8c2", diff --git a/mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.additionalInformation.json b/mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.additionalInformation.legacy.json similarity index 100% copy from mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.additionalInformation.json copy to mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.additionalInformation.legacy.json diff --git a/mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.task.json b/mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.task.json index f1c66ee..92b1edd 100644 --- a/mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.task.json +++ b/mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.task.json @@ -1,3 +1,6 @@ { - "type":"solve-message-inconsistencies" + "type":"solve-message-inconsistencies", + "runningOptions":{ + "messagesPerSecond":2 + } } \ No newline at end of file diff --git a/mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.task.json b/mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.task.legacy.json similarity index 100% copy from mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.task.json copy to mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.task.legacy.json diff --git a/server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/routes/SolveMessageInconsistenciesRequestToTask.java b/server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/routes/SolveMessageInconsistenciesRequestToTask.java index 8702b86..72e777a 100644 --- a/server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/routes/SolveMessageInconsistenciesRequestToTask.java +++ b/server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/routes/SolveMessageInconsistenciesRequestToTask.java @@ -22,6 +22,7 @@ package org.apache.james.webadmin.routes; import javax.inject.Inject; import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesService; +import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesService.RunningOptions; import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesTask; import org.apache.james.webadmin.tasks.TaskFromRequestRegistry; import org.apache.james.webadmin.tasks.TaskRegistrationKey; @@ -31,6 +32,6 @@ public class SolveMessageInconsistenciesRequestToTask extends TaskFromRequestReg @Inject public SolveMessageInconsistenciesRequestToTask(SolveMessageInconsistenciesService service) { - super(REGISTRATION_KEY, request -> new SolveMessageInconsistenciesTask(service)); + super(REGISTRATION_KEY, request -> new SolveMessageInconsistenciesTask(service, RunningOptions.DEFAULT)); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
