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 2163393e87949c027b8e72855a0f752c74b3f773 Author: Rémi Kowalski <[email protected]> AuthorDate: Fri Jul 19 15:08:48 2019 +0200 JAMES-2813 serialization of DeletedMessageVaultExportTask --- .../routes/DeletedMessagesVaultExportTask.java | 92 ++++++++++++++++++++- ...edMessagesVaultExportTaskSerializationTest.java | 93 ++++++++++++++++++++++ 2 files changed, 182 insertions(+), 3 deletions(-) diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTask.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTask.java index ca551d4..26092eb 100644 --- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTask.java +++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTask.java @@ -22,17 +22,104 @@ package org.apache.james.webadmin.vault.routes; import java.io.IOException; import java.util.Optional; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Function; + +import javax.inject.Inject; +import javax.mail.internet.AddressException; import org.apache.james.core.MailAddress; import org.apache.james.core.User; +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 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 DeletedMessagesVaultExportTask implements Task { + static final String TYPE = "deletedMessages/export"; + + public static final Function<DeletedMessagesVaultExportTask.Factory, TaskDTOModule> MODULE = (factory) -> + DTOModule + .forDomainObject(DeletedMessagesVaultExportTask.class) + .convertToDTO(DeletedMessagesVaultExportTask.DeletedMessagesVaultExportTaskDTO.class) + .toDomainObjectConverter(dto -> { + try { + return factory.create(dto); + } catch (AddressException e) { + throw new RuntimeException(e); + } + }) + .toDTOConverter(factory::createDTO) + .typeName(TYPE) + .withFactory(TaskDTOModule::new); + + public static class DeletedMessagesVaultExportTaskDTO implements TaskDTO { + + private final String type; + private final String userExportFrom; + private final QueryDTO exportQuery; + private final String exportTo; + + public DeletedMessagesVaultExportTaskDTO(@JsonProperty("type") String type, + @JsonProperty("userExportFrom") String userExportFrom, + @JsonProperty("exportQuery") QueryDTO exportQuery, + @JsonProperty("exportTo") String exportTo) { + this.type = type; + this.userExportFrom = userExportFrom; + this.exportQuery = exportQuery; + this.exportTo = exportTo; + } + + public String getUserExportFrom() { + return userExportFrom; + } + + public QueryDTO getExportQuery() { + return exportQuery; + } + + public String getExportTo() { + return exportTo; + } + + public String getType() { + return type; + } + + } + + public static class Factory { + + private final ExportService exportService; + private final QueryTranslator queryTranslator; + + @Inject + public Factory(ExportService exportService, QueryTranslator queryTranslator) { + this.exportService = exportService; + this.queryTranslator = queryTranslator; + } + + public DeletedMessagesVaultExportTask create(DeletedMessagesVaultExportTask.DeletedMessagesVaultExportTaskDTO dto) throws AddressException { + User userExportFrom = User.fromUsername(dto.userExportFrom); + Query exportQuery = queryTranslator.translate(dto.exportQuery); + MailAddress exportTo = new MailAddress(dto.exportTo); + return new DeletedMessagesVaultExportTask(exportService, userExportFrom, exportQuery, exportTo); + } + + public DeletedMessagesVaultExportTask.DeletedMessagesVaultExportTaskDTO createDTO(DeletedMessagesVaultExportTask task, String type) { + return new DeletedMessagesVaultExportTask.DeletedMessagesVaultExportTaskDTO(type, task.userExportFrom.asString(), queryTranslator.toDTO(task.exportQuery), task.exportTo.asString()); + } + } + public class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation { private final User userExportFrom; @@ -60,11 +147,10 @@ class DeletedMessagesVaultExportTask implements Task { private static final Logger LOGGER = LoggerFactory.getLogger(DeletedMessagesVaultExportTask.class); - static final String TYPE = "deletedMessages/export"; - private final ExportService exportService; private final User userExportFrom; - private final Query exportQuery; + @VisibleForTesting + public final Query exportQuery; private final MailAddress exportTo; private final AtomicLong totalExportedMessages; diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskSerializationTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskSerializationTest.java new file mode 100644 index 0000000..86f60c4 --- /dev/null +++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskSerializationTest.java @@ -0,0 +1,93 @@ +/**************************************************************** + * 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 javax.mail.internet.AddressException; + +import org.apache.james.core.MailAddress; +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.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.core.JsonProcessingException; + +class DeletedMessagesVaultExportTaskSerializationTest { + + private ExportService 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 userExportFrom = User.fromUsername(username); + private static final Query query = Query.of(CriterionFactory.hasAttachment(true)); + private static MailAddress exportTo; + + private static final String serializedDeleteMessagesVaultExportTask = "{\"type\":\"deletedMessages/export\"," + + "\"userExportFrom\":\"james\"," + + "\"exportQuery\":{\"combinator\":\"and\",\"criteria\":[{\"fieldName\":\"hasAttachment\",\"operator\":\"equals\",\"value\":\"true\"}]}," + + "\"exportTo\":\"[email protected]\"}\n"; + + @BeforeAll + static void init() throws AddressException { + exportTo = new MailAddress("[email protected]"); + } + + @BeforeEach + void setUp() { + exportService = mock(ExportService.class); + DeletedMessagesVaultExportTask.Factory factory = new DeletedMessagesVaultExportTask.Factory(exportService, queryTranslator); + taskSerializer = new JsonTaskSerializer(DeletedMessagesVaultExportTask.MODULE.apply(factory)); + } + + @Test + void deleteMessagesVaultExportTaskShouldBeSerializable() throws JsonProcessingException { + DeletedMessagesVaultExportTask task = new DeletedMessagesVaultExportTask(exportService, userExportFrom, query, exportTo); + + assertThatJson(taskSerializer.serialize(task)) + .isEqualTo(serializedDeleteMessagesVaultExportTask); + } + + @Test + void deleteMessagesVaultExportTaskShouldBeDeserializable() throws IOException { + DeletedMessagesVaultExportTask task = new DeletedMessagesVaultExportTask(exportService, userExportFrom, query, exportTo); + + Task deserializedTask = taskSerializer.deserialize(serializedDeleteMessagesVaultExportTask); + assertThat(deserializedTask) + .isEqualToComparingOnlyGivenFields(task, "userExportFrom", "exportTo"); + + DeletedMessagesVaultExportTask deserializedExportTask = (DeletedMessagesVaultExportTask) deserializedTask; + assertThat(queryTranslator.toDTO(deserializedExportTask.exportQuery)).isEqualTo(queryTranslator.toDTO(query)); + } + +} \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
