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

Reply via email to