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]

Reply via email to