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 eb19b1a0b4c81e23407ec6d7ef1d23fe0a0a0bd7 Author: Rémi Kowalski <[email protected]> AuthorDate: Fri Jul 19 15:53:20 2019 +0200 JAMES-2813 serialization of DeletedMessageVaultRestoreTask --- .../routes/DeletedMessagesVaultRestoreTask.java | 77 +++++++++++++++++++- ...dMessagesVaultRestoreTaskSerializationTest.java | 83 ++++++++++++++++++++++ 2 files changed, 157 insertions(+), 3 deletions(-) diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTask.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTask.java index 9d855b8..0bae69e 100644 --- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTask.java +++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTask.java @@ -23,17 +23,89 @@ import static org.apache.james.webadmin.vault.routes.RestoreService.RestoreResul import java.util.Optional; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Function; + +import javax.inject.Inject; import org.apache.james.core.User; +import org.apache.james.json.DTOModule; import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.server.task.json.dto.TaskDTO; +import org.apache.james.server.task.json.dto.TaskDTOModule; import org.apache.james.task.Task; import org.apache.james.task.TaskExecutionDetails; +import org.apache.james.vault.dto.query.QueryDTO; +import org.apache.james.vault.dto.query.QueryTranslator; import org.apache.james.vault.search.Query; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.annotations.VisibleForTesting; + class DeletedMessagesVaultRestoreTask implements Task { + static final String TYPE = "deletedMessages/restore"; + + public static final Function<DeletedMessagesVaultRestoreTask.Factory, TaskDTOModule> MODULE = (factory) -> + DTOModule + .forDomainObject(DeletedMessagesVaultRestoreTask.class) + .convertToDTO(DeletedMessagesVaultRestoreTask.DeletedMessagesVaultRestoreTaskDTO.class) + .toDomainObjectConverter(factory::create) + .toDTOConverter(factory::createDTO) + .typeName(TYPE) + .withFactory(TaskDTOModule::new); + + public static class DeletedMessagesVaultRestoreTaskDTO implements TaskDTO { + + private final String type; + private final String userToRestore; + private final QueryDTO query; + + public DeletedMessagesVaultRestoreTaskDTO(@JsonProperty("type") String type, + @JsonProperty("userToRestore") String userToRestore, + @JsonProperty("query") QueryDTO query) { + this.type = type; + this.userToRestore = userToRestore; + this.query = query; + } + + public String getUserToRestore() { + return userToRestore; + } + + public QueryDTO getQuery() { + return query; + } + + public String getType() { + return type; + } + + } + + public static class Factory { + + private final RestoreService restoreService; + private final QueryTranslator queryTranslator; + + @Inject + public Factory(RestoreService restoreService, QueryTranslator queryTranslator) { + this.restoreService = restoreService; + this.queryTranslator = queryTranslator; + } + + public DeletedMessagesVaultRestoreTask create(DeletedMessagesVaultRestoreTask.DeletedMessagesVaultRestoreTaskDTO dto) { + User userToRestore = User.fromUsername(dto.userToRestore); + Query query = queryTranslator.translate(dto.query); + return new DeletedMessagesVaultRestoreTask(restoreService, userToRestore, query); + } + + public DeletedMessagesVaultRestoreTask.DeletedMessagesVaultRestoreTaskDTO createDTO(DeletedMessagesVaultRestoreTask task, String type) { + return new DeletedMessagesVaultRestoreTask.DeletedMessagesVaultRestoreTaskDTO(type, task.userToRestore.asString(), queryTranslator.toDTO(task.query)); + } + } + public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation { private final User user; private final AtomicLong successfulRestoreCount; @@ -68,12 +140,11 @@ class DeletedMessagesVaultRestoreTask implements Task { private static final Logger LOGGER = LoggerFactory.getLogger(DeletedMessagesVaultRestoreTask.class); - static final String TYPE = "deletedMessages/restore"; - private final User userToRestore; private final RestoreService vaultRestore; private final AdditionalInformation additionalInformation; - private final Query query; + @VisibleForTesting + final Query query; DeletedMessagesVaultRestoreTask(RestoreService vaultRestore, User userToRestore, Query query) { this.query = query; diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskSerializationTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskSerializationTest.java new file mode 100644 index 0000000..48a82ec --- /dev/null +++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskSerializationTest.java @@ -0,0 +1,83 @@ +/**************************************************************** + * 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.webadmin.vault.routes; + +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 org.apache.james.core.User; +import org.apache.james.mailbox.model.TestId; +import org.apache.james.server.task.json.JsonTaskSerializer; +import org.apache.james.task.Task; +import org.apache.james.vault.dto.query.QueryTranslator; +import org.apache.james.vault.search.CriterionFactory; +import org.apache.james.vault.search.Query; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.core.JsonProcessingException; + +class DeletedMessagesVaultRestoreTaskSerializationTest { + + private RestoreService exportService; + private final TestId.Factory mailboxIdFactory = new TestId.Factory(); + private final QueryTranslator queryTranslator = new QueryTranslator(mailboxIdFactory); + + private JsonTaskSerializer taskSerializer; + + private static final String username = "james"; + private static final User userToRestore = User.fromUsername(username); + private static final Query query = Query.of(CriterionFactory.hasAttachment(true)); + + private static final String serializedDeleteMessagesVaultRestoreTask = "{\"type\":\"deletedMessages/restore\"," + + "\"userToRestore\":\"james\"," + + "\"query\":{\"combinator\":\"and\",\"criteria\":[{\"fieldName\":\"hasAttachment\",\"operator\":\"equals\",\"value\":\"true\"}]}" + + "}"; + + @BeforeEach + void setUp() { + exportService = mock(RestoreService.class); + DeletedMessagesVaultRestoreTask.Factory factory = new DeletedMessagesVaultRestoreTask.Factory(exportService, queryTranslator); + taskSerializer = new JsonTaskSerializer(DeletedMessagesVaultRestoreTask.MODULE.apply(factory)); + } + + @Test + void deleteMessagesVaultRestoreTaskShouldBeSerializable() throws JsonProcessingException { + DeletedMessagesVaultRestoreTask task = new DeletedMessagesVaultRestoreTask(exportService, userToRestore, query); + + assertThatJson(taskSerializer.serialize(task)) + .isEqualTo(serializedDeleteMessagesVaultRestoreTask); + } + + @Test + void deleteMessagesVaultRestoreTaskShouldBeDeserializable() throws IOException { + DeletedMessagesVaultRestoreTask task = new DeletedMessagesVaultRestoreTask(exportService, userToRestore, query); + + Task deserializedTask = taskSerializer.deserialize(serializedDeleteMessagesVaultRestoreTask); + assertThat(deserializedTask) + .isEqualToComparingOnlyGivenFields(task, "userToRestore"); + + DeletedMessagesVaultRestoreTask deserializedRestoreTask = (DeletedMessagesVaultRestoreTask) deserializedTask; + assertThat(queryTranslator.toDTO(deserializedRestoreTask.query)).isEqualTo(queryTranslator.toDTO(query)); + } + +} \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
