Repository: james-project Updated Branches: refs/heads/master 3ae482a71 -> 92a15670f
JAMES-2320 Making deleting mails performed in tasks Updating asynchronous executions on existing synchronous mails deleting. Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/92a15670 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/92a15670 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/92a15670 Branch: refs/heads/master Commit: 92a15670f669437ac285c3f455541904ed3356eb Parents: 3ae482a Author: duc <[email protected]> Authored: Tue May 15 16:17:39 2018 +0700 Committer: Matthieu Baechler <[email protected]> Committed: Mon May 21 11:41:38 2018 +0200 ---------------------------------------------------------------------- .../james/webadmin/routes/MailQueueRoutes.java | 33 ++- .../service/DeleteMailsFromMailQueueTask.java | 135 +++++++++ .../webadmin/routes/MailQueueRoutesTest.java | 287 ++++++++++++++++--- .../routes/MailQueueRoutesUnitTest.java | 6 +- src/site/markdown/server/manage-webadmin.md | 16 +- 5 files changed, 420 insertions(+), 57 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/92a15670/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java index 6815258..cff5936 100644 --- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java +++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java @@ -35,14 +35,17 @@ import org.apache.james.core.MailAddress; import org.apache.james.queue.api.MailQueue.MailQueueException; import org.apache.james.queue.api.MailQueueFactory; import org.apache.james.queue.api.ManageableMailQueue; -import org.apache.james.queue.api.ManageableMailQueue.Type; +import org.apache.james.task.Task; +import org.apache.james.task.TaskId; +import org.apache.james.task.TaskManager; import org.apache.james.util.streams.Iterators; import org.apache.james.util.streams.Limit; -import org.apache.james.webadmin.Constants; import org.apache.james.webadmin.Routes; import org.apache.james.webadmin.dto.ForceDelivery; import org.apache.james.webadmin.dto.MailQueueDTO; import org.apache.james.webadmin.dto.MailQueueItemDTO; +import org.apache.james.webadmin.dto.TaskIdDto; +import org.apache.james.webadmin.service.DeleteMailsFromMailQueueTask; import org.apache.james.webadmin.utils.ErrorResponder; import org.apache.james.webadmin.utils.ErrorResponder.ErrorType; import org.apache.james.webadmin.utils.JsonExtractException; @@ -87,13 +90,16 @@ public class MailQueueRoutes implements Routes { private final MailQueueFactory<ManageableMailQueue> mailQueueFactory; private final JsonTransformer jsonTransformer; private final JsonExtractor<ForceDelivery> jsonExtractor; + private final TaskManager taskManager; @Inject @SuppressWarnings("unchecked") - @VisibleForTesting MailQueueRoutes(MailQueueFactory<?> mailQueueFactory, JsonTransformer jsonTransformer) { + @VisibleForTesting MailQueueRoutes(MailQueueFactory<?> mailQueueFactory, JsonTransformer jsonTransformer, + TaskManager taskManager) { this.mailQueueFactory = (MailQueueFactory<ManageableMailQueue>) mailQueueFactory; this.jsonTransformer = jsonTransformer; this.jsonExtractor = new JsonExtractor<>(ForceDelivery.class); + this.taskManager = taskManager; } @Override @@ -292,20 +298,21 @@ public class MailQueueRoutes implements Routes { value = "Delete mails from the MailQueue" ) @ApiResponses(value = { - @ApiResponse(code = HttpStatus.NO_CONTENT_204, message = "OK, the request is being processed"), + @ApiResponse(code = HttpStatus.CREATED_201, message = "OK, the task for deleting mails is created"), @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "The MailQueue does not exist."), @ApiResponse(code = HttpStatus.BAD_REQUEST_400, message = "Invalid request for deleting mails from the mail queue."), @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "Internal server error - Something went bad on the server side.") }) public void deleteMails(Service service) { service.delete(BASE_URL + SEPARATOR + MAIL_QUEUE_NAME + MAILS, - (request, response) -> deleteMails(request, response)); + (request, response) -> deleteMails(request, response), + jsonTransformer); } private Object deleteMails(Request request, Response response) { String mailQueueName = request.params(MAIL_QUEUE_NAME); - Object bodyResponse = mailQueueFactory.getQueue(mailQueueName) - .map(name -> deleteMails(name, + Task task = mailQueueFactory.getQueue(mailQueueName) + .map(name -> deleteMailsTask(name, sender(request.queryParams(SENDER_QUERY_PARAM)), name(request.queryParams(NAME_QUERY_PARAM)), recipient(request.queryParams(RECIPIENT_QUERY_PARAM)))) @@ -315,8 +322,9 @@ public class MailQueueRoutes implements Routes { .statusCode(HttpStatus.NOT_FOUND_404) .type(ErrorResponder.ErrorType.NOT_FOUND) .haltError()); - response.status(HttpStatus.NO_CONTENT_204); - return bodyResponse; + + TaskId taskId = taskManager.submit(task); + return TaskIdDto.respond(response, taskId); } private Optional<MailAddress> sender(String senderAsString) throws HaltException { @@ -424,7 +432,7 @@ public class MailQueueRoutes implements Routes { } } - private Object deleteMails(ManageableMailQueue queue, Optional<MailAddress> maybeSender, Optional<String> maybeName, Optional<MailAddress> maybeRecipient) { + private Task deleteMailsTask(ManageableMailQueue queue, Optional<MailAddress> maybeSender, Optional<String> maybeName, Optional<MailAddress> maybeRecipient) { if (Booleans.countTrue(maybeSender.isPresent(), maybeName.isPresent(), maybeRecipient.isPresent()) != 1) { throw ErrorResponder.builder() .statusCode(HttpStatus.BAD_REQUEST_400) @@ -433,10 +441,7 @@ public class MailQueueRoutes implements Routes { .haltError(); } - maybeSender.ifPresent(Throwing.consumer((MailAddress sender) -> queue.remove(Type.Sender, sender.asString())).sneakyThrow()); - maybeName.ifPresent(Throwing.consumer((String name) -> queue.remove(Type.Name, name)).sneakyThrow()); - maybeRecipient.ifPresent(Throwing.consumer((MailAddress recipient) -> queue.remove(Type.Recipient, recipient.asString())).sneakyThrow()); - return Constants.EMPTY_BODY; + return new DeleteMailsFromMailQueueTask(queue, maybeSender, maybeName, maybeRecipient); } private void assertDelayedParamIsTrue(Request request) { http://git-wip-us.apache.org/repos/asf/james-project/blob/92a15670/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTask.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTask.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTask.java new file mode 100644 index 0000000..7ab692f --- /dev/null +++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTask.java @@ -0,0 +1,135 @@ +/**************************************************************** + * 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.service; + +import java.util.Optional; +import java.util.function.Supplier; + +import org.apache.james.core.MailAddress; +import org.apache.james.queue.api.MailQueue; +import org.apache.james.queue.api.ManageableMailQueue; +import org.apache.james.task.Task; +import org.apache.james.task.TaskExecutionDetails; + +import com.github.fge.lambdas.Throwing; +import com.google.common.base.Preconditions; +import com.google.common.primitives.Booleans; + +public class DeleteMailsFromMailQueueTask implements Task { + + public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation { + private final String mailQueueName; + private final Supplier<Long> countSupplier; + private final long initialCount; + + private final Optional<String> sender; + private final Optional<String> name; + private final Optional<String> recipient; + + public AdditionalInformation(String mailQueueName, Supplier<Long> countSupplier, + Optional<MailAddress> maybeSender, Optional<String> maybeName, + Optional<MailAddress> maybeRecipient) { + this.mailQueueName = mailQueueName; + this.initialCount = countSupplier.get(); + this.countSupplier = countSupplier; + + sender = maybeSender.map(MailAddress::asString); + name = maybeName; + recipient = maybeRecipient.map(MailAddress::asString); + } + + public String getMailQueueName() { + return mailQueueName; + } + + public long getRemainingCount() { + return countSupplier.get(); + } + + public long getInitialCount() { + return initialCount; + } + + public Optional<String> getSender() { + return sender; + } + + public Optional<String> getName() { + return name; + } + + public Optional<String> getRecipient() { + return recipient; + } + } + + public static final String TYPE = "deleteMailsFromMailQueue"; + + private final ManageableMailQueue queue; + private final Optional<MailAddress> maybeSender; + private final Optional<String> maybeName; + private final Optional<MailAddress> maybeRecipient; + private final AdditionalInformation additionalInformation; + + public DeleteMailsFromMailQueueTask(ManageableMailQueue queue, Optional<MailAddress> maybeSender, + Optional<String> maybeName, Optional<MailAddress> maybeRecipient) { + Preconditions.checkArgument( + Booleans.countTrue(maybeSender.isPresent(), maybeName.isPresent(), maybeRecipient.isPresent()) == 1, + "You should provide one and only one of the query parameters 'sender', 'name' or 'recipient'."); + + this.queue = queue; + this.maybeSender = maybeSender; + this.maybeName = maybeName; + this.maybeRecipient = maybeRecipient; + + additionalInformation = new AdditionalInformation(queue.getName(), this::getRemainingSize, maybeSender, + maybeName, maybeRecipient); + } + + @Override + public Result run() { + maybeSender.ifPresent(Throwing.consumer( + (MailAddress sender) -> queue.remove(ManageableMailQueue.Type.Sender, sender.asString()))); + maybeName.ifPresent(Throwing.consumer( + (String name) -> queue.remove(ManageableMailQueue.Type.Name, name))); + maybeRecipient.ifPresent(Throwing.consumer( + (MailAddress recipient) -> queue.remove(ManageableMailQueue.Type.Recipient, recipient.asString()))); + + return Result.COMPLETED; + } + + @Override + public String type() { + return TYPE; + } + + @Override + public Optional<TaskExecutionDetails.AdditionalInformation> details() { + return Optional.of(additionalInformation); + } + + public long getRemainingSize() { + try { + return queue.getSize(); + } catch (MailQueue.MailQueueException e) { + throw new RuntimeException(e); + } + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/92a15670/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java index ac75c9b..705a90d 100644 --- a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java +++ b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java @@ -29,6 +29,9 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; + import java.nio.charset.StandardCharsets; import java.time.ZonedDateTime; @@ -42,9 +45,13 @@ import org.apache.james.queue.api.ManageableMailQueue; import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory; import org.apache.james.queue.memory.MemoryMailQueueFactory; import org.apache.james.queue.memory.MemoryMailQueueFactory.MemoryMailQueue; +import org.apache.james.task.MemoryTaskManager; +import org.apache.james.task.TaskManager; import org.apache.james.webadmin.WebAdminServer; import org.apache.james.webadmin.WebAdminUtils; +import org.apache.james.webadmin.service.DeleteMailsFromMailQueueTask; import org.apache.james.webadmin.utils.JsonTransformer; +import org.apache.mailet.Mail; import org.apache.mailet.base.test.FakeMail; import org.eclipse.jetty.http.HttpStatus; import org.junit.After; @@ -63,14 +70,27 @@ public class MailQueueRoutesTest { static final String SECOND_QUEUE = "second one"; static final String THIRD_QUEUE = "third one"; static final String FOURTH_QUEUE = "fourth one"; + static final String SENDER_1_JAMES_ORG = "[email protected]"; + static final String SENDER_2_JAMES_ORG = "[email protected]"; + static final String RECIPIENT_JAMES_ORG = "[email protected]"; + static final String RECIPIENT_1_JAMES_ORG = "[email protected]"; + static final String RECIPIENT_2_JAMES_ORG = "[email protected]"; + static final String FAKE_MAIL_NAME_1 = "fake mail name 1"; + static final String FAKE_MAIL_NAME_2 = "fake mail name 2"; + static final String FAKE_MAIL_NAME_3 = "fake mail name 3"; + WebAdminServer webAdminServer; MemoryMailQueueFactory mailQueueFactory; WebAdminServer createServer(MemoryMailQueueFactory mailQueueFactory) throws Exception { + TaskManager taskManager = new MemoryTaskManager(); + JsonTransformer jsonTransformer = new JsonTransformer(); + WebAdminServer server = WebAdminUtils.createWebAdminServer( new NoopMetricFactory(), - new MailQueueRoutes(mailQueueFactory, new JsonTransformer())); + new MailQueueRoutes(mailQueueFactory, jsonTransformer, taskManager), + new TasksRoutes(taskManager, jsonTransformer)); server.configure(NO_CONFIGURATION); server.await(); return server; @@ -355,39 +375,57 @@ public class MailQueueRoutesTest { } @Test - public void deleteMailsShouldReturnNoContentWhenSenderIsValid() { + public void deleteMailsTasksShouldCompleteWhenSenderIsValid() throws Exception{ mailQueueFactory.createQueue(FIRST_QUEUE); + String taskId = with() + .param("sender", SENDER_1_JAMES_ORG) + .delete(FIRST_QUEUE + "/mails") + .jsonPath() + .getString("taskId"); + given() - .param("sender", "[email protected]") + .basePath(TasksRoutes.BASE) .when() - .delete(FIRST_QUEUE + "/mails") + .get(taskId + "/await") .then() - .statusCode(HttpStatus.NO_CONTENT_204); + .body("status", is("completed")); } @Test - public void deleteMailsShouldReturnNoContentWhenNameIsValid() { + public void deleteMailsShouldCompleteWhenNameIsValid() { mailQueueFactory.createQueue(FIRST_QUEUE); - given() + String taskId = with() .param("name", "mailName") + .delete(FIRST_QUEUE + "/mails") + .jsonPath() + .getString("taskId"); + + given() + .basePath(TasksRoutes.BASE) .when() - .delete(FIRST_QUEUE + "/mails") + .get(taskId + "/await") .then() - .statusCode(HttpStatus.NO_CONTENT_204); + .body("status", is("completed")); } @Test - public void deleteMailsShouldReturnNoContentWhenRecipientIsValid() { + public void deleteMailsShouldCompleteWhenRecipientIsValid() { mailQueueFactory.createQueue(FIRST_QUEUE); + String taskId = with() + .param("recipient", RECIPIENT_JAMES_ORG) + .delete(FIRST_QUEUE + "/mails") + .jsonPath() + .getString("taskId"); + given() - .param("recipient", "[email protected]") + .basePath(TasksRoutes.BASE) .when() - .delete(FIRST_QUEUE + "/mails") + .get(taskId + "/await") .then() - .statusCode(HttpStatus.NO_CONTENT_204); + .body("status", is("completed")); } @Test @@ -477,55 +515,218 @@ public class MailQueueRoutesTest { @Test public void deleteMailsShouldDeleteMailsWhenSenderIsGiven() throws Exception { MemoryMailQueue queue = mailQueueFactory.createQueue(FIRST_QUEUE); - String sender = "[email protected]"; - queue.enQueue(Mails.defaultMail() - .sender(sender) - .build()); + + queue.enQueue(FakeMail.builder() + .name(FAKE_MAIL_NAME_1) + .sender(SENDER_1_JAMES_ORG) + .build()); + + queue.enQueue(FakeMail.builder() + .name(FAKE_MAIL_NAME_2) + .sender(SENDER_2_JAMES_ORG) + .build()); + + String taskId = with() + .param("sender", SENDER_1_JAMES_ORG) + .delete(FIRST_QUEUE + "/mails") + .jsonPath() + .getString("taskId"); given() - .param("sender", sender) + .basePath(TasksRoutes.BASE) .when() - .delete(FIRST_QUEUE + "/mails") + .get(taskId + "/await") .then() - .statusCode(HttpStatus.NO_CONTENT_204); + .body("status", is("completed")); - assertThat(queue.browse()).isEmpty(); + assertThat(queue.browse()) + .hasSize(1) + .first() + .satisfies(mailView -> assertThat(mailView.getMail().getName()).isEqualTo(FAKE_MAIL_NAME_2)); } @Test public void deleteMailsShouldDeleteMailsWhenNameIsGiven() throws Exception { MemoryMailQueue queue = mailQueueFactory.createQueue(FIRST_QUEUE); - String name = "mailName"; - queue.enQueue(Mails.defaultMail() - .name(name) - .build()); + + queue.enQueue(FakeMail.builder() + .name(FAKE_MAIL_NAME_1) + .build()); + + queue.enQueue(FakeMail.builder() + .name(FAKE_MAIL_NAME_2) + .build()); + + String taskId = with() + .param("name", FAKE_MAIL_NAME_1) + .delete(FIRST_QUEUE + "/mails") + .jsonPath() + .getString("taskId"); given() - .param("name", name) + .basePath(TasksRoutes.BASE) .when() - .delete(FIRST_QUEUE + "/mails") + .get(taskId + "/await") .then() - .statusCode(HttpStatus.NO_CONTENT_204); + .body("status", is("completed")); - assertThat(queue.browse()).isEmpty(); + assertThat(queue.browse()) + .hasSize(1) + .first() + .satisfies(mailView -> assertThat(mailView.getMail().getName()).isEqualTo(FAKE_MAIL_NAME_2)); } @Test public void deleteMailsShouldDeleteMailsWhenRecipientIsGiven() throws Exception { MemoryMailQueue queue = mailQueueFactory.createQueue(FIRST_QUEUE); - String recipient = "[email protected]"; - queue.enQueue(Mails.defaultMail() - .recipient(recipient) - .build()); + + queue.enQueue(FakeMail.builder() + .name(FAKE_MAIL_NAME_1) + .recipient(RECIPIENT_JAMES_ORG) + .build()); + + queue.enQueue(FakeMail.builder() + .name(FAKE_MAIL_NAME_2) + .recipient(RECIPIENT_1_JAMES_ORG) + .build()); + + queue.enQueue(FakeMail.builder() + .name(FAKE_MAIL_NAME_3) + .recipient(RECIPIENT_2_JAMES_ORG) + .build()); + + String taskId = with() + .param("recipient", RECIPIENT_JAMES_ORG) + .delete(FIRST_QUEUE + "/mails") + .jsonPath() + .getString("taskId"); given() - .param("recipient", recipient) + .basePath(TasksRoutes.BASE) .when() - .delete(FIRST_QUEUE + "/mails") + .get(taskId + "/await") .then() - .statusCode(HttpStatus.NO_CONTENT_204); + .body("status", is("completed")); + + assertThat(queue.browse()) + .hasSize(2) + .extracting(ManageableMailQueue.MailQueueItemView::getMail) + .extracting(Mail::getName) + .contains(FAKE_MAIL_NAME_2, FAKE_MAIL_NAME_3); + } + + @Test + public void deleteMailsTasksShouldHaveDetailsWhenSenderIsGiven() throws Exception { + MemoryMailQueue queue = mailQueueFactory.createQueue(FIRST_QUEUE); + + queue.enQueue(FakeMail.builder() + .name(FAKE_MAIL_NAME_1) + .sender(SENDER_1_JAMES_ORG) + .build()); + + queue.enQueue(FakeMail.builder() + .name(FAKE_MAIL_NAME_2) + .sender(SENDER_2_JAMES_ORG) + .build()); + + String taskId = with() + .param("sender", SENDER_1_JAMES_ORG) + .delete(FIRST_QUEUE + "/mails") + .jsonPath() + .getString("taskId"); - assertThat(queue.browse()).isEmpty(); + given() + .basePath(TasksRoutes.BASE) + .when() + .get(taskId + "/await") + .then() + .body("status", is("completed")) + .body("taskId", is(notNullValue())) + .body("type", is(DeleteMailsFromMailQueueTask.TYPE)) + .body("additionalInformation.mailQueueName", is(FIRST_QUEUE)) + .body("additionalInformation.initialCount", is(2)) + .body("additionalInformation.remainingCount", is(1)) + .body("additionalInformation.sender", is(SENDER_1_JAMES_ORG)) + .body("startedDate", is(notNullValue())) + .body("submitDate", is(notNullValue())) + .body("completedDate", is(notNullValue())); + } + + @Test + public void deleteMailsTasksShouldHaveDetailsWhenNameIsGiven() throws Exception { + MemoryMailQueue queue = mailQueueFactory.createQueue(FIRST_QUEUE); + + queue.enQueue(FakeMail.builder() + .name(FAKE_MAIL_NAME_1) + .build()); + + queue.enQueue(FakeMail.builder() + .name(FAKE_MAIL_NAME_2) + .build()); + + String taskId = with() + .param("name", FAKE_MAIL_NAME_1) + .delete(FIRST_QUEUE + "/mails") + .jsonPath() + .getString("taskId"); + + given() + .basePath(TasksRoutes.BASE) + .when() + .get(taskId + "/await") + .then() + .body("status", is("completed")) + .body("taskId", is(notNullValue())) + .body("type", is(DeleteMailsFromMailQueueTask.TYPE)) + .body("additionalInformation.mailQueueName", is(FIRST_QUEUE)) + .body("additionalInformation.initialCount", is(2)) + .body("additionalInformation.remainingCount", is(1)) + .body("additionalInformation.name", is(FAKE_MAIL_NAME_1)) + .body("startedDate", is(notNullValue())) + .body("submitDate", is(notNullValue())) + .body("completedDate", is(notNullValue())); + } + + @Test + public void deleteMailsTasksShouldHaveDetailsWhenRecipientIsGiven() throws Exception { + MemoryMailQueue queue = mailQueueFactory.createQueue(FIRST_QUEUE); + + queue.enQueue(FakeMail.builder() + .name(FAKE_MAIL_NAME_1) + .recipient(RECIPIENT_JAMES_ORG) + .build()); + + queue.enQueue(FakeMail.builder() + .name(FAKE_MAIL_NAME_2) + .recipient(RECIPIENT_JAMES_ORG) + .build()); + + queue.enQueue(FakeMail.builder() + .name(FAKE_MAIL_NAME_2) + .recipient(RECIPIENT_1_JAMES_ORG) + .build()); + + String taskId = with() + .param("recipient", RECIPIENT_JAMES_ORG) + .delete(FIRST_QUEUE + "/mails") + .jsonPath() + .getString("taskId"); + + given() + .basePath(TasksRoutes.BASE) + .when() + .get(taskId + "/await") + .then() + .body("status", is("completed")) + .body("taskId", is(notNullValue())) + .body("type", is(DeleteMailsFromMailQueueTask.TYPE)) + .body("additionalInformation.mailQueueName", is(FIRST_QUEUE)) + .body("additionalInformation.initialCount", is(3)) + .body("additionalInformation.remainingCount", is(1)) + .body("additionalInformation.recipient", is(RECIPIENT_JAMES_ORG)) + .body("startedDate", is(notNullValue())) + .body("submitDate", is(notNullValue())) + .body("completedDate", is(notNullValue())); } @Test @@ -631,12 +832,18 @@ public class MailQueueRoutesTest { queue.enQueue(Mails.defaultMail().build()); queue.enQueue(Mails.defaultMail().build()); - given() + String taskId = with() .param("recipient", recipient) + .delete(FIRST_QUEUE + "/mails") + .jsonPath() + .getString("taskId"); + + given() + .basePath(TasksRoutes.BASE) .when() - .delete(FIRST_QUEUE + "/mails") + .get(taskId + "/await") .then() - .statusCode(HttpStatus.NO_CONTENT_204); + .body("status", is("completed")); MailAddress deletedRecipientMailAddress = new MailAddress(recipient); assertThat(queue.browse()) http://git-wip-us.apache.org/repos/asf/james-project/blob/92a15670/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesUnitTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesUnitTest.java b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesUnitTest.java index 16d534e..3f53ed0 100644 --- a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesUnitTest.java +++ b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesUnitTest.java @@ -26,6 +26,7 @@ import java.util.Optional; import org.apache.james.queue.api.MailQueueFactory; import org.apache.james.queue.api.ManageableMailQueue; +import org.apache.james.task.MemoryTaskManager; import org.apache.james.util.streams.Limit; import org.apache.james.webadmin.utils.JsonTransformer; import org.junit.Before; @@ -38,9 +39,10 @@ public class MailQueueRoutesUnitTest { MailQueueRoutes testee; @Before - public void setup() { + public void setup() { + MemoryTaskManager taskManager = new MemoryTaskManager(); MailQueueFactory<ManageableMailQueue> mailQueueFactory = null; - testee = new MailQueueRoutes(mailQueueFactory, new JsonTransformer()); + testee = new MailQueueRoutes(mailQueueFactory, new JsonTransformer(), taskManager); } @Test http://git-wip-us.apache.org/repos/asf/james-project/blob/92a15670/src/site/markdown/server/manage-webadmin.md ---------------------------------------------------------------------- diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md index 0748379..423204f 100644 --- a/src/site/markdown/server/manage-webadmin.md +++ b/src/site/markdown/server/manage-webadmin.md @@ -1596,6 +1596,7 @@ curl -XDELETE http://ip:port/mailQueues/mailQueueName/mails?sender=senderMailAdd ``` This request should have exactly one query parameter from the following list: + * sender: which is a mail address (i.e. [email protected]) * name: which is a string * recipient: which is a mail address (i.e. [email protected]) @@ -1605,11 +1606,24 @@ The mails from the given mail queue matching the query parameter will be deleted Response codes: - - 204: Success (No content) + - 201: Success. Corresponding task id is returned. - 400: Invalid request - 404: The mail queue does not exist - 500: Internal error +The scheduled task will have the following type `deleteMailsFromMailQueue` and the following `additionalInformation`: + +``` +{ + "mailQueueName":"outgoing", + "initialCount":10, + "remainingCount": 5, + "sender": "[email protected]", + "name": "Java Developer", + "recipient: "[email protected]" +} +``` + ### Flushing mails from a mail queue ``` --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
