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 72eeef88e33c24d1b85d17b390e3184998d29201 Author: Rémi Kowalski <[email protected]> AuthorDate: Wed Sep 4 18:23:18 2019 +0200 JAMES-2813 don't serialize unnecessary information for BlobStoreVaultGarbageCollectionTask --- .../vault/blob/BlobStoreDeletedMessageVault.java | 23 +++++++---- .../blob/BlobStoreVaultGarbageCollectionTask.java | 22 +++++++++-- .../BlobStoreVaultGarbageCollectionTaskDTO.java | 45 +++++----------------- ...aultGarbageCollectionTaskSerializationTest.java | 32 ++++++++------- 4 files changed, 60 insertions(+), 62 deletions(-) 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 143825c..ac9c1b7 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 @@ -47,7 +47,6 @@ import org.slf4j.LoggerFactory; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; - import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; @@ -68,18 +67,20 @@ public class BlobStoreDeletedMessageVault implements DeletedMessageVault { private final BucketNameGenerator nameGenerator; private final Clock clock; private final RetentionConfiguration retentionConfiguration; + private final BlobStoreVaultGarbageCollectionTask.Factory taskFactory; @Inject public BlobStoreDeletedMessageVault(MetricFactory metricFactory, DeletedMessageMetadataVault messageMetadataVault, - BlobStore blobStore, BucketNameGenerator nameGenerator, - Clock clock, - RetentionConfiguration retentionConfiguration) { + BlobStore blobStore, BucketNameGenerator nameGenerator, + Clock clock, + RetentionConfiguration retentionConfiguration) { this.metricFactory = metricFactory; this.messageMetadataVault = messageMetadataVault; this.blobStore = blobStore; this.nameGenerator = nameGenerator; this.clock = clock; this.retentionConfiguration = retentionConfiguration; + this.taskFactory = new BlobStoreVaultGarbageCollectionTask.Factory(this); } @Override @@ -158,15 +159,21 @@ public class BlobStoreDeletedMessageVault implements DeletedMessageVault { @Override public Task deleteExpiredMessagesTask() { - ZonedDateTime now = ZonedDateTime.now(clock); - ZonedDateTime beginningOfRetentionPeriod = now.minus(retentionConfiguration.getRetentionPeriod()); + return taskFactory.create(); + } + - Flux<BucketName> metricAbleDeleteOperation = metricFactory.runPublishingTimerMetric( + Flux<BucketName> deleteExpiredMessages(ZonedDateTime beginningOfRetentionPeriod) { + return metricFactory.runPublishingTimerMetric( DELETE_EXPIRED_MESSAGES_METRIC_NAME, retentionQualifiedBuckets(beginningOfRetentionPeriod) .flatMap(bucketName -> deleteBucketData(bucketName).then(Mono.just(bucketName)))); - return new BlobStoreVaultGarbageCollectionTask(beginningOfRetentionPeriod, metricAbleDeleteOperation); + } + + ZonedDateTime getBeginningOfRetentionPeriod() { + ZonedDateTime now = ZonedDateTime.now(clock); + return now.minus(retentionConfiguration.getRetentionPeriod()); } @VisibleForTesting diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTask.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTask.java index cfddb37..cf49b6a 100644 --- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTask.java +++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTask.java @@ -25,13 +25,14 @@ import java.util.List; import java.util.Optional; import java.util.concurrent.ConcurrentLinkedQueue; +import javax.inject.Inject; + import org.apache.james.blob.api.BucketName; import org.apache.james.task.Task; import org.apache.james.task.TaskExecutionDetails; import org.apache.james.task.TaskType; import com.github.steveash.guavate.Guavate; - import reactor.core.publisher.Flux; import reactor.core.scheduler.Schedulers; @@ -64,9 +65,22 @@ public class BlobStoreVaultGarbageCollectionTask implements Task { private final ZonedDateTime beginningOfRetentionPeriod; private final Collection<BucketName> deletedBuckets; - BlobStoreVaultGarbageCollectionTask(ZonedDateTime beginningOfRetentionPeriod, Flux<BucketName> retentionOperation) { - this.retentionOperation = retentionOperation; - this.beginningOfRetentionPeriod = beginningOfRetentionPeriod; + public static class Factory { + private final BlobStoreDeletedMessageVault deletedMessageVault; + + @Inject + public Factory(BlobStoreDeletedMessageVault deletedMessageVault) { + this.deletedMessageVault = deletedMessageVault; + } + + public BlobStoreVaultGarbageCollectionTask create() { + return new BlobStoreVaultGarbageCollectionTask(deletedMessageVault); + } + } + + private BlobStoreVaultGarbageCollectionTask(BlobStoreDeletedMessageVault deletedMessageVault) { + this.beginningOfRetentionPeriod = deletedMessageVault.getBeginningOfRetentionPeriod(); + this.retentionOperation = deletedMessageVault.deleteExpiredMessages(beginningOfRetentionPeriod); this.deletedBuckets = new ConcurrentLinkedQueue<>(); } diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskDTO.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskDTO.java index bbdb794..da62197 100644 --- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskDTO.java +++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskDTO.java @@ -7,9 +7,9 @@ * 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 * @@ -20,57 +20,37 @@ package org.apache.james.vault.blob; -import java.time.ZonedDateTime; -import java.util.Collection; +import java.util.function.Function; -import org.apache.james.blob.api.BucketName; 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 com.fasterxml.jackson.annotation.JsonProperty; -import com.github.steveash.guavate.Guavate; -import reactor.core.publisher.Flux; public class BlobStoreVaultGarbageCollectionTaskDTO implements TaskDTO { static BlobStoreVaultGarbageCollectionTaskDTO fromDomainObject(BlobStoreVaultGarbageCollectionTask task, String type) { - return new BlobStoreVaultGarbageCollectionTaskDTO( - type, - task.getBeginningOfRetentionPeriod().toString(), - task.getRetentionOperation() - .map(BucketName::asString) - .collect(Guavate.toImmutableList()) - .block() - ); + return new BlobStoreVaultGarbageCollectionTaskDTO(type); } - public static final TaskDTOModule<BlobStoreVaultGarbageCollectionTask, BlobStoreVaultGarbageCollectionTaskDTO> MODULE = + public static final Function<BlobStoreVaultGarbageCollectionTask.Factory, TaskDTOModule<BlobStoreVaultGarbageCollectionTask, BlobStoreVaultGarbageCollectionTaskDTO>> MODULE = factory -> DTOModule .forDomainObject(BlobStoreVaultGarbageCollectionTask.class) .convertToDTO(BlobStoreVaultGarbageCollectionTaskDTO.class) - .toDomainObjectConverter(BlobStoreVaultGarbageCollectionTaskDTO::toDomainObject) + .toDomainObjectConverter(dto -> BlobStoreVaultGarbageCollectionTaskDTO.toDomainObject(factory)) .toDTOConverter(BlobStoreVaultGarbageCollectionTaskDTO::fromDomainObject) .typeName(BlobStoreVaultGarbageCollectionTask.TYPE.asString()) .withFactory(TaskDTOModule::new); private final String type; - private final String beginningOfRetentionPeriod; - private final Collection<String> retentionOperation; - BlobStoreVaultGarbageCollectionTaskDTO(@JsonProperty("type") String type, - @JsonProperty("beginningOfRetentionPeriod") String beginningOfRetentionPeriod, - @JsonProperty("retentionOperation") Collection<String> retentionOperation) { + BlobStoreVaultGarbageCollectionTaskDTO(@JsonProperty("type") String type) { this.type = type; - this.beginningOfRetentionPeriod = beginningOfRetentionPeriod; - this.retentionOperation = retentionOperation; } - BlobStoreVaultGarbageCollectionTask toDomainObject() { - return new BlobStoreVaultGarbageCollectionTask( - ZonedDateTime.parse(beginningOfRetentionPeriod), - Flux.fromIterable(retentionOperation) - .map(BucketName::of)); + private static BlobStoreVaultGarbageCollectionTask toDomainObject(BlobStoreVaultGarbageCollectionTask.Factory factory) { + return factory.create(); } @Override @@ -78,11 +58,4 @@ public class BlobStoreVaultGarbageCollectionTaskDTO implements TaskDTO { return type; } - public String getBeginningOfRetentionPeriod() { - return beginningOfRetentionPeriod; - } - - public Collection<String> getRetentionOperation() { - return retentionOperation; - } } diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskSerializationTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskSerializationTest.java index 97a93af..85e6f6b 100644 --- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskSerializationTest.java +++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskSerializationTest.java @@ -22,6 +22,7 @@ package org.apache.james.vault.blob; import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; import java.io.IOException; import java.time.ZonedDateTime; @@ -33,23 +34,37 @@ import org.apache.james.task.Task; import com.fasterxml.jackson.core.JsonProcessingException; import com.google.common.collect.ImmutableList; + +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + import reactor.core.publisher.Flux; class BlobStoreVaultGarbageCollectionTaskSerializationTest { + private static final BlobStoreDeletedMessageVault DELETED_MESSAGE_VAULT = Mockito.mock(BlobStoreDeletedMessageVault.class); + private static final BlobStoreVaultGarbageCollectionTask.Factory TASK_FACTORY = new BlobStoreVaultGarbageCollectionTask.Factory(DELETED_MESSAGE_VAULT); - private static final JsonTaskSerializer TASK_SERIALIZER = new JsonTaskSerializer(BlobStoreVaultGarbageCollectionTaskDTO.MODULE); + private static final JsonTaskSerializer TASK_SERIALIZER = new JsonTaskSerializer(BlobStoreVaultGarbageCollectionTaskDTO.MODULE.apply(TASK_FACTORY)); private static final ZonedDateTime BEGINNING_OF_RETENTION_PERIOD = ZonedDateTime.parse("2019-09-03T15:26:13.356+02:00[Europe/Paris]"); private static final ImmutableList<BucketName> BUCKET_IDS = ImmutableList.of(BucketName.of("1"), BucketName.of("2"), BucketName.of("3")); private static final Flux<BucketName> RETENTION_OPERATION = Flux.fromIterable(BUCKET_IDS); private static final BlobStoreVaultGarbageCollectionTask.AdditionalInformation DETAILS = new BlobStoreVaultGarbageCollectionTask.AdditionalInformation(BEGINNING_OF_RETENTION_PERIOD, BUCKET_IDS); - private static final BlobStoreVaultGarbageCollectionTask TASK = new BlobStoreVaultGarbageCollectionTask(BEGINNING_OF_RETENTION_PERIOD, RETENTION_OPERATION); + private static final BlobStoreVaultGarbageCollectionTask TASK = TASK_FACTORY.create(); - private static final String SERIALIZED_TASK = "{\"beginningOfRetentionPeriod\":\"2019-09-03T15:26:13.356+02:00[Europe/Paris]\",\"retentionOperation\":[\"1\", \"2\", \"3\"],\"type\":\"deletedMessages/blobStoreBasedGarbageCollection\"}"; + private static final String SERIALIZED_TASK = "{\"type\":\"deletedMessages/blobStoreBasedGarbageCollection\"}"; private static final String SERIALIZED_ADDITIONAL_INFORMATION_TASK = "{\"beginningOfRetentionPeriod\":\"2019-09-03T15:26:13.356+02:00[Europe/Paris]\",\"deletedBuckets\":[\"1\", \"2\", \"3\"]}"; private static final JsonTaskAdditionalInformationsSerializer JSON_TASK_ADDITIONAL_INFORMATIONS_SERIALIZER = new JsonTaskAdditionalInformationsSerializer(BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.MODULE); + @BeforeAll + static void setUp() { + Mockito.when(DELETED_MESSAGE_VAULT.getBeginningOfRetentionPeriod()) + .thenReturn(BEGINNING_OF_RETENTION_PERIOD); + Mockito.when(DELETED_MESSAGE_VAULT.deleteExpiredMessages(any())) + .thenReturn(RETENTION_OPERATION); + } + @Test void taskShouldBeSerializable() throws JsonProcessingException { assertThatJson(TASK_SERIALIZER.serialize(TASK)) @@ -61,17 +76,6 @@ class BlobStoreVaultGarbageCollectionTaskSerializationTest { Task deserialized = TASK_SERIALIZER.deserialize(SERIALIZED_TASK); assertThat(deserialized).isInstanceOf(BlobStoreVaultGarbageCollectionTask.class); - BlobStoreVaultGarbageCollectionTask blobStoreVaultGarbageCollectionTask = (BlobStoreVaultGarbageCollectionTask) deserialized; - assertThat(blobStoreVaultGarbageCollectionTask.getBeginningOfRetentionPeriod()) - .isEqualTo(TASK.getBeginningOfRetentionPeriod()); - assertThat(blobStoreVaultGarbageCollectionTask - .getRetentionOperation() - .collectList() - .block()) - .isEqualTo(TASK - .getRetentionOperation() - .collectList() - .block()); } @Test --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
