This is an automated email from the ASF dual-hosted git repository. rouazana pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 26c2722830c18afa8768cf5993ea5dc5305e834a Author: Rémi Kowalski <rkowal...@linagora.com> AuthorDate: Fri Jul 19 16:39:10 2019 +0200 JAMES-2813 serialization of VaultGarbageCollectionTask --- .../apache/james/vault/DeletedMessageVault.java | 3 + .../vault/blob/BlobStoreDeletedMessageVault.java | 6 ++ .../vault/memory/MemoryDeletedMessagesVault.java | 3 +- .../vault/utils/VaultGarbageCollectionTask.java | 57 ++++++++++++++-- ...aultGarbageCollectionTaskSerializationTest.java | 78 ++++++++++++++++++++++ .../vault/MailRepositoryDeletedMessageVault.java | 6 +- 6 files changed, 145 insertions(+), 8 deletions(-) diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVault.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVault.java index 26e6a45..57fa1a4 100644 --- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVault.java +++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVault.java @@ -25,6 +25,7 @@ import org.apache.james.core.User; import org.apache.james.mailbox.model.MessageId; import org.apache.james.task.Task; import org.apache.james.vault.search.Query; +import org.apache.james.vault.utils.DeleteByQueryExecutor; import org.reactivestreams.Publisher; public interface DeletedMessageVault { @@ -37,4 +38,6 @@ public interface DeletedMessageVault { Publisher<DeletedMessage> search(User user, Query query); Task deleteExpiredMessagesTask(); + + DeleteByQueryExecutor getDeleteByQueryExecutor(); } diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVault.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVault.java index 2efde1b..d8989bc 100644 --- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVault.java +++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVault.java @@ -40,6 +40,7 @@ import org.apache.james.vault.metadata.DeletedMessageMetadataVault; import org.apache.james.vault.metadata.DeletedMessageWithStorageInformation; import org.apache.james.vault.metadata.StorageInformation; import org.apache.james.vault.search.Query; +import org.apache.james.vault.utils.DeleteByQueryExecutor; import org.reactivestreams.Publisher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -131,6 +132,11 @@ public class BlobStoreDeletedMessageVault implements DeletedMessageVault { return new BlobStoreVaultGarbageCollectionTask(beginningOfRetentionPeriod, deleteOperation); } + @Override + public DeleteByQueryExecutor getDeleteByQueryExecutor() { + throw new NotImplementedException("Will be implemented later"); + } + @VisibleForTesting Flux<BucketName> retentionQualifiedBuckets(ZonedDateTime beginningOfRetentionPeriod) { return Flux.from(messageMetadataVault.listRelatedBuckets()) diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/memory/MemoryDeletedMessagesVault.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/memory/MemoryDeletedMessagesVault.java index cf24b0e..0781cd8 100644 --- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/memory/MemoryDeletedMessagesVault.java +++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/memory/MemoryDeletedMessagesVault.java @@ -125,11 +125,10 @@ public class MemoryDeletedMessagesVault implements DeletedMessageVault { ZonedDateTime beginningOfRetentionPeriod = now.minus(retentionConfiguration.getRetentionPeriod()); return new VaultGarbageCollectionTask( - getDeleteByQueryExecutor(), + this, beginningOfRetentionPeriod); } - @VisibleForTesting public DeleteByQueryExecutor getDeleteByQueryExecutor() { return deleteByQueryExecutor; } diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/utils/VaultGarbageCollectionTask.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/utils/VaultGarbageCollectionTask.java index 5a55c80..4d7cf16 100644 --- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/utils/VaultGarbageCollectionTask.java +++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/utils/VaultGarbageCollectionTask.java @@ -23,12 +23,58 @@ import java.time.ZonedDateTime; import java.util.Optional; import java.util.concurrent.atomic.AtomicLong; +import javax.inject.Inject; + +import org.apache.james.server.task.json.dto.TaskDTO; import org.apache.james.task.Task; import org.apache.james.task.TaskExecutionDetails; +import org.apache.james.vault.DeletedMessageVault; import org.apache.james.vault.search.CriterionFactory; import org.apache.james.vault.search.Query; +import com.fasterxml.jackson.annotation.JsonProperty; + public class VaultGarbageCollectionTask implements Task { + + public static class VaultGarbageCollectionTaskDTO implements TaskDTO { + private final String type; + private final String beginningOfRetentionPeriod; + + public VaultGarbageCollectionTaskDTO(@JsonProperty("type") String type, + @JsonProperty("beginningOfRetentionPeriod") String beginningOfRetentionPeriod) { + this.type = type; + this.beginningOfRetentionPeriod = beginningOfRetentionPeriod; + } + + @Override + public String getType() { + return type; + } + + public String getBeginningOfRetentionPeriod() { + return beginningOfRetentionPeriod; + } + + public static VaultGarbageCollectionTaskDTO of(String type, VaultGarbageCollectionTask task) { + return new VaultGarbageCollectionTaskDTO(type, task.beginningOfRetentionPeriod.toString()); + } + } + + public static class Factory { + + private final DeletedMessageVault deletedMessageVault; + + @Inject + public Factory(DeletedMessageVault deletedMessageVault) { + this.deletedMessageVault = deletedMessageVault; + } + + public VaultGarbageCollectionTask create(VaultGarbageCollectionTaskDTO dto) { + ZonedDateTime beginningOfRetentionPeriod = ZonedDateTime.parse(dto.beginningOfRetentionPeriod); + return new VaultGarbageCollectionTask(deletedMessageVault, beginningOfRetentionPeriod); + } + } + public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation { private final ZonedDateTime beginningOfRetentionPeriod; private final long handledUserCount; @@ -44,7 +90,7 @@ public class VaultGarbageCollectionTask implements Task { this.deletionErrorCount = deletionErrorCount; } - public ZonedDateTime getBeginningOfRetentionPeriod() { + public ZonedDateTime getBeginningOfRetentionPeriod() { return beginningOfRetentionPeriod; } @@ -67,7 +113,7 @@ public class VaultGarbageCollectionTask implements Task { public static final String TYPE = "deletedMessages/garbageCollection"; - private final DeleteByQueryExecutor deleteByQueryExecutor; + private final DeletedMessageVault deletedMessageVault; private final DeleteByQueryExecutor.Notifiers notifiers; private final AtomicLong handledUserCount; private final AtomicLong permanantlyDeletedMessages; @@ -75,8 +121,8 @@ public class VaultGarbageCollectionTask implements Task { private final AtomicLong deletionErrorCount; private final ZonedDateTime beginningOfRetentionPeriod; - public VaultGarbageCollectionTask(DeleteByQueryExecutor deleteByQueryExecutor, ZonedDateTime beginningOfRetentionPeriod) { - this.deleteByQueryExecutor = deleteByQueryExecutor; + public VaultGarbageCollectionTask(DeletedMessageVault deletedMessageVault, ZonedDateTime beginningOfRetentionPeriod) { + this.deletedMessageVault = deletedMessageVault; this.beginningOfRetentionPeriod = beginningOfRetentionPeriod; this.handledUserCount = new AtomicLong(0); @@ -95,7 +141,8 @@ public class VaultGarbageCollectionTask implements Task { public Result run() { Query query = Query.of(CriterionFactory.deletionDate().beforeOrEquals(beginningOfRetentionPeriod)); - return deleteByQueryExecutor.deleteByQuery(query, notifiers); + return deletedMessageVault.getDeleteByQueryExecutor() + .deleteByQuery(query, notifiers); } @Override diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/utils/VaultGarbageCollectionTaskSerializationTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/utils/VaultGarbageCollectionTaskSerializationTest.java new file mode 100644 index 0000000..60c8cb9 --- /dev/null +++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/utils/VaultGarbageCollectionTaskSerializationTest.java @@ -0,0 +1,78 @@ +/**************************************************************** + * 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.vault.utils; + +import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +import java.io.IOException; +import java.time.ZonedDateTime; + +import org.apache.james.server.task.json.JsonTaskSerializer; +import org.apache.james.server.task.json.dto.TaskDTOModule; +import org.apache.james.vault.DeletedMessageVault; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.core.JsonProcessingException; + +class VaultGarbageCollectionTaskSerializationTest { + + private DeletedMessageVault vault; + private JsonTaskSerializer taskSerializer; + private final ZonedDateTime beginningOfRetentionPeriod = ZonedDateTime.now(); + private final String serializedVaultGarbageCollectionTask = "{\"type\": \"vault-garbage-collection\", \"beginningOfRetentionPeriod\": \"" + beginningOfRetentionPeriod.toString() + "\"}"; + + @BeforeEach + void setUp() { + vault = mock(DeletedMessageVault.class); + taskSerializer = new JsonTaskSerializer(moduleVaultGarbageCollection()); + } + + private TaskDTOModule moduleVaultGarbageCollection() { + VaultGarbageCollectionTask.Factory factory = new VaultGarbageCollectionTask.Factory(vault); + return TaskDTOModule + .forTask(VaultGarbageCollectionTask.class) + .convertToDTO(VaultGarbageCollectionTask.VaultGarbageCollectionTaskDTO.class) + .toDomainObjectConverter(factory::create) + .toDTOConverter((task, typeName) -> + VaultGarbageCollectionTask.VaultGarbageCollectionTaskDTO.of(typeName, task) + ) + .typeName("vault-garbage-collection") + .withFactory(TaskDTOModule::new); + } + + @Test + void vaultGarbageCollectionShouldBeSerializable() throws JsonProcessingException { + VaultGarbageCollectionTask task = new VaultGarbageCollectionTask(vault, beginningOfRetentionPeriod); + + assertThatJson(taskSerializer.serialize(task)) + .isEqualTo(serializedVaultGarbageCollectionTask); + } + + @Test + void vaultGarbageCollectionShouldBeDeserializable() throws IOException { + VaultGarbageCollectionTask task = new VaultGarbageCollectionTask(vault, beginningOfRetentionPeriod); + + assertThat(taskSerializer.deserialize(serializedVaultGarbageCollectionTask)) + .isEqualToComparingOnlyGivenFields(task, "beginningOfRetentionPeriod"); + } + +} \ No newline at end of file diff --git a/server/mailrepository/deleted-messages-vault-repository/src/main/java/org/apache/james/vault/MailRepositoryDeletedMessageVault.java b/server/mailrepository/deleted-messages-vault-repository/src/main/java/org/apache/james/vault/MailRepositoryDeletedMessageVault.java index a230506..987f097 100644 --- a/server/mailrepository/deleted-messages-vault-repository/src/main/java/org/apache/james/vault/MailRepositoryDeletedMessageVault.java +++ b/server/mailrepository/deleted-messages-vault-repository/src/main/java/org/apache/james/vault/MailRepositoryDeletedMessageVault.java @@ -163,7 +163,7 @@ public class MailRepositoryDeletedMessageVault implements DeletedMessageVault { ZonedDateTime beginningOfRetentionPeriod = now.minus(retentionConfiguration.getRetentionPeriod()); return new VaultGarbageCollectionTask( - deleteByQueryExecutor, + this, beginningOfRetentionPeriod); } @@ -176,4 +176,8 @@ public class MailRepositoryDeletedMessageVault implements DeletedMessageVault { throw new RuntimeException(e); } } + + public DeleteByQueryExecutor getDeleteByQueryExecutor() { + return deleteByQueryExecutor; + } } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org