You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2018/01/25 05:02:27 UTC
[16/16] james-project git commit: JAMES-2292 Limit the number of
messages
JAMES-2292 Limit the number of messages
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/b9ee9077
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/b9ee9077
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/b9ee9077
Branch: refs/heads/master
Commit: b9ee9077638b169839014602f7ff343aa5d3ef4f
Parents: 60b743a
Author: Antoine Duprat <ad...@linagora.com>
Authored: Tue Jan 23 16:55:09 2018 +0100
Committer: benwa <bt...@linagora.com>
Committed: Thu Jan 25 11:46:42 2018 +0700
----------------------------------------------------------------------
.../james/webadmin/routes/MailQueueRoutes.java | 69 ++++++++++----
.../webadmin/routes/MailQueueRoutesTest.java | 96 +++++++++++++++-----
.../routes/MailQueueRoutesUnitTest.java | 34 +++++++
3 files changed, 158 insertions(+), 41 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/b9ee9077/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 bcaee97..6e67340 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
@@ -33,6 +33,7 @@ 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.util.streams.Iterators;
+import org.apache.james.util.streams.Limit;
import org.apache.james.webadmin.Routes;
import org.apache.james.webadmin.dto.MailQueueDTO;
import org.apache.james.webadmin.dto.MailQueueItemDTO;
@@ -40,8 +41,6 @@ import org.apache.james.webadmin.utils.ErrorResponder;
import org.apache.james.webadmin.utils.ErrorResponder.ErrorType;
import org.apache.james.webadmin.utils.JsonTransformer;
import org.eclipse.jetty.http.HttpStatus;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import com.github.fge.lambdas.Throwing;
import com.github.steveash.guavate.Guavate;
@@ -53,6 +52,7 @@ import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
+import spark.HaltException;
import spark.Request;
import spark.Service;
@@ -64,12 +64,12 @@ public class MailQueueRoutes implements Routes {
@VisibleForTesting static final String BASE_URL = "/mailQueues";
@VisibleForTesting static final String MAIL_QUEUE_NAME = ":mailQueueName";
- @VisibleForTesting static final String MESSAGES = "/messages";
+ @VisibleForTesting static final String MAILS = "/mails";
private static final String DELAYED_QUERY_PARAM = "delayed";
+ private static final String LIMIT_QUERY_PARAM = "limit";
+ @VisibleForTesting static final int DEFAULT_LIMIT_VALUE = 100;
- private static final Logger LOGGER = LoggerFactory.getLogger(MailQueueRoutes.class);
-
private final MailQueueFactory<ManageableMailQueue> mailQueueFactory;
private final JsonTransformer jsonTransformer;
@@ -85,7 +85,7 @@ public class MailQueueRoutes implements Routes {
getMailQueue(service);
- listMessages(service);
+ listMails(service);
}
@GET
@@ -152,29 +152,44 @@ public class MailQueueRoutes implements Routes {
}
@GET
- @Path("/{mailQueueName}/messages")
+ @Path("/{mailQueueName}/mails")
@ApiImplicitParams({
@ApiImplicitParam(required = true, dataType = "string", name = "mailQueueName", paramType = "path"),
- @ApiImplicitParam(required = false, dataType = "boolean", name = DELAYED_QUERY_PARAM, paramType = "query")
+ @ApiImplicitParam(
+ required = false,
+ dataType = "boolean",
+ name = DELAYED_QUERY_PARAM,
+ paramType = "query",
+ example = "?delayed=true",
+ value = "Whether the mails are delayed in the mail queue or not (already sent)."),
+ @ApiImplicitParam(
+ required = false,
+ dataType = "int",
+ name = LIMIT_QUERY_PARAM,
+ paramType = "query",
+ example = "?limit=100",
+ defaultValue = "100",
+ value = "Limits the maximum number of mails returned by this endpoint")
})
@ApiOperation(
- value = "List the messages of the MailQueue"
+ value = "List the mails of the MailQueue"
)
@ApiResponses(value = {
@ApiResponse(code = HttpStatus.OK_200, message = "OK", response = List.class),
@ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "The MailQueue does not exist."),
+ @ApiResponse(code = HttpStatus.BAD_REQUEST_400, message = "Invalid request for listing the 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 listMessages(Service service) {
- service.get(BASE_URL + SEPARATOR + MAIL_QUEUE_NAME + MESSAGES,
- (request, response) -> listMessages(request),
+ public void listMails(Service service) {
+ service.get(BASE_URL + SEPARATOR + MAIL_QUEUE_NAME + MAILS,
+ (request, response) -> listMails(request),
jsonTransformer);
}
- private List<MailQueueItemDTO> listMessages(Request request) {
+ private List<MailQueueItemDTO> listMails(Request request) {
String mailQueueName = request.params(MAIL_QUEUE_NAME);
return mailQueueFactory.getQueue(mailQueueName)
- .map(name -> listMessages(name, isDelayed(request.queryParams(DELAYED_QUERY_PARAM))))
+ .map(name -> listMails(name, isDelayed(request.queryParams(DELAYED_QUERY_PARAM)), limit(request.queryParams(LIMIT_QUERY_PARAM))))
.orElseThrow(
() -> ErrorResponder.builder()
.message(String.format("%s can not be found", mailQueueName))
@@ -188,25 +203,39 @@ public class MailQueueRoutes implements Routes {
.map(Boolean::parseBoolean);
}
- private List<MailQueueItemDTO> listMessages(ManageableMailQueue queue, Optional<Boolean> isDelayed) {
+ @VisibleForTesting Limit limit(String limitAsString) throws HaltException {
try {
- return Iterators.toStream(queue.browse())
- .map(Throwing.function(MailQueueItemDTO::from))
+ return Optional.ofNullable(limitAsString)
+ .map(Integer::parseInt)
+ .map(Limit::limit)
+ .orElseGet(() -> Limit.from(DEFAULT_LIMIT_VALUE));
+ } catch (IllegalArgumentException e) {
+ throw ErrorResponder.builder()
+ .message(String.format("limit can't be less or equals to zero"))
+ .statusCode(HttpStatus.BAD_REQUEST_400)
+ .type(ErrorResponder.ErrorType.NOT_FOUND)
+ .haltError();
+ }
+ }
+
+ private List<MailQueueItemDTO> listMails(ManageableMailQueue queue, Optional<Boolean> isDelayed, Limit limit) {
+ try {
+ return limit.applyOnStream(Iterators.toStream(queue.browse()))
+ .map(Throwing.function(MailQueueItemDTO::from).sneakyThrow())
.filter(item -> filter(item, isDelayed))
.collect(Guavate.toImmutableList());
} catch (MailQueueException e) {
- LOGGER.info("Invalid request for getting the mail queue " + queue, e);
throw ErrorResponder.builder()
.statusCode(HttpStatus.BAD_REQUEST_400)
.type(ErrorType.INVALID_ARGUMENT)
- .message("Invalid request for getting the mail queue " + queue)
+ .message("Invalid request for listing the mails from the mail queue " + queue)
.cause(e)
.haltError();
}
}
private boolean filter(MailQueueItemDTO item, Optional<Boolean> isDelayed) {
- return isDelayed.map(delayed -> delayed == item.isDelayed())
+ return isDelayed.map(delayed -> delayed == item.getNextDelivery().isPresent())
.orElse(true);
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/b9ee9077/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 1e0f942..291c6b1 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
@@ -19,6 +19,7 @@
package org.apache.james.webadmin.routes;
+import static com.jayway.restassured.RestAssured.given;
import static com.jayway.restassured.RestAssured.when;
import static com.jayway.restassured.config.EncoderConfig.encoderConfig;
import static com.jayway.restassured.config.RestAssuredConfig.newConfig;
@@ -170,11 +171,11 @@ public class MailQueueRoutesTest {
}
@Test
- public void listMessagesShouldReturnEmptyListWhenNoMessages() {
+ public void listMailsShouldReturnEmptyListWhenNoMails() {
mailQueueFactory.createQueue(FIRST_QUEUE);
when()
- .get(FIRST_QUEUE + "/messages")
+ .get(FIRST_QUEUE + "/mails")
.then()
.statusCode(HttpStatus.OK_200)
.contentType(ContentType.JSON)
@@ -182,13 +183,13 @@ public class MailQueueRoutesTest {
}
@Test
- public void listMessagesShouldReturnMessagesWhenSome() throws Exception {
+ public void listMailsShouldReturnMailsWhenSome() throws Exception {
MemoryMailQueue queue = mailQueueFactory.createQueue(FIRST_QUEUE);
queue.enQueue(Mails.defaultMail().build());
queue.enQueue(Mails.defaultMail().build());
when()
- .get(FIRST_QUEUE + "/messages")
+ .get(FIRST_QUEUE + "/mails")
.then()
.statusCode(HttpStatus.OK_200)
.contentType(ContentType.JSON)
@@ -196,38 +197,37 @@ public class MailQueueRoutesTest {
}
@Test
- public void listMessagesShouldReturnMessageDetailWhenSome() throws Exception {
+ public void listMailsShouldReturnMailDetailsWhenSome() throws Exception {
MemoryMailQueue queue = mailQueueFactory.createQueue(FIRST_QUEUE);
FakeMail mail = Mails.defaultMail().build();
queue.enQueue(mail);
- String firstMessage = "[0]";
+ String firstMail = "[0]";
List<String> expectedRecipients = mail.getRecipients().stream()
- .map(MailAddress::asPrettyString)
+ .map(MailAddress::asString)
.collect(Guavate.toImmutableList());
when()
- .get(FIRST_QUEUE + "/messages")
+ .get(FIRST_QUEUE + "/mails")
.then()
.statusCode(HttpStatus.OK_200)
.contentType(ContentType.JSON)
.body(".", hasSize(1))
- .body(firstMessage + ".name", equalTo(mail.getName()))
- .body(firstMessage + ".sender", equalTo(mail.getSender().asPrettyString()))
- .body(firstMessage + ".recipients", equalTo(expectedRecipients))
- .body(firstMessage + ".delayed", equalTo(false));
+ .body(firstMail + ".name", equalTo(mail.getName()))
+ .body(firstMail + ".sender", equalTo(mail.getSender().asString()))
+ .body(firstMail + ".recipients", equalTo(expectedRecipients));
}
@Test
- public void listMessagesShouldReturnEmptyWhenNoDelayedMessagesAndAskFor() throws Exception {
+ public void listMailsShouldReturnEmptyWhenNoDelayedMailsAndAskFor() throws Exception {
MemoryMailQueue queue = mailQueueFactory.createQueue(FIRST_QUEUE);
FakeMail mail = Mails.defaultMail().build();
queue.enQueue(mail);
- RestAssured.given()
+ given()
.param("delayed", "true")
.when()
- .get(FIRST_QUEUE + "/messages")
+ .get(FIRST_QUEUE + "/mails")
.then()
.statusCode(HttpStatus.OK_200)
.contentType(ContentType.JSON)
@@ -235,15 +235,15 @@ public class MailQueueRoutesTest {
}
@Test
- public void listMessagesShouldReturnCurrentMessagesWhenMessagesAndAskForNotDelayed() throws Exception {
+ public void listMailsShouldReturnCurrentMailsWhenMailsAndAskForNotDelayed() throws Exception {
MemoryMailQueue queue = mailQueueFactory.createQueue(FIRST_QUEUE);
FakeMail mail = Mails.defaultMail().build();
queue.enQueue(mail);
- RestAssured.given()
+ given()
.param("delayed", "false")
.when()
- .get(FIRST_QUEUE + "/messages")
+ .get(FIRST_QUEUE + "/mails")
.then()
.statusCode(HttpStatus.OK_200)
.contentType(ContentType.JSON)
@@ -252,18 +252,72 @@ public class MailQueueRoutesTest {
@Ignore("MemoryMailQueueFactory doesn't support delay")
@Test
- public void listMessagesShouldReturnDelayedMessagesAndAskFor() throws Exception {
+ public void listMailsShouldReturnDelayedMailsWhenAskFor() throws Exception {
MemoryMailQueue queue = mailQueueFactory.createQueue(FIRST_QUEUE);
FakeMail mail = Mails.defaultMail().build();
queue.enQueue(mail, 10, TimeUnit.MINUTES);
- RestAssured.given()
+ given()
.param("delayed", "true")
.when()
- .get(FIRST_QUEUE + "/messages")
+ .get(FIRST_QUEUE + "/mails")
.then()
.statusCode(HttpStatus.OK_200)
.contentType(ContentType.JSON)
.body(".", hasSize(1));
}
+
+ @Test
+ public void listMailsShouldReturnOneMailWhenMailsAndAskForALimitOfOne() throws Exception {
+ MemoryMailQueue queue = mailQueueFactory.createQueue(FIRST_QUEUE);
+ FakeMail mail = Mails.defaultMail().build();
+ queue.enQueue(mail);
+ queue.enQueue(mail);
+ queue.enQueue(mail);
+
+ given()
+ .param("limit", "1")
+ .when()
+ .get(FIRST_QUEUE + "/mails")
+ .then()
+ .statusCode(HttpStatus.OK_200)
+ .contentType(ContentType.JSON)
+ .body(".", hasSize(1));
+ }
+
+ @Test
+ public void listMailsShouldReturnBadRequestWhenLimitIsLessThanZero() throws Exception {
+ mailQueueFactory.createQueue(FIRST_QUEUE);
+
+ given()
+ .param("limit", "-1")
+ .when()
+ .get(FIRST_QUEUE + "/mails")
+ .then()
+ .statusCode(HttpStatus.BAD_REQUEST_400);
+ }
+
+ @Test
+ public void listMailsShouldReturnBadRequestWhenLimitEqualsToZero() throws Exception {
+ mailQueueFactory.createQueue(FIRST_QUEUE);
+
+ given()
+ .param("limit", "0")
+ .when()
+ .get(FIRST_QUEUE + "/mails")
+ .then()
+ .statusCode(HttpStatus.BAD_REQUEST_400);
+ }
+
+ @Test
+ public void listMailsShouldReturnBadRequestWhenLimitIsInvalid() throws Exception {
+ mailQueueFactory.createQueue(FIRST_QUEUE);
+
+ given()
+ .param("limit", "abc")
+ .when()
+ .get(FIRST_QUEUE + "/mails")
+ .then()
+ .statusCode(HttpStatus.BAD_REQUEST_400);
+ }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/b9ee9077/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 859f52e..16d534e 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
@@ -20,15 +20,19 @@
package org.apache.james.webadmin.routes;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
import java.util.Optional;
import org.apache.james.queue.api.MailQueueFactory;
import org.apache.james.queue.api.ManageableMailQueue;
+import org.apache.james.util.streams.Limit;
import org.apache.james.webadmin.utils.JsonTransformer;
import org.junit.Before;
import org.junit.Test;
+import spark.HaltException;
+
public class MailQueueRoutesUnitTest {
MailQueueRoutes testee;
@@ -62,4 +66,34 @@ public class MailQueueRoutesUnitTest {
Optional<Boolean> delayed = testee.isDelayed("abc");
assertThat(delayed).contains(false);
}
+
+ @Test
+ public void limitShouldBeEqualsToDefaultValueWhenNull() {
+ Limit limit = testee.limit(null);
+ assertThat(limit.getLimit()).contains(MailQueueRoutes.DEFAULT_LIMIT_VALUE);
+ }
+
+ @Test
+ public void limitShouldBeEqualsToTheValueWhenOne() {
+ Limit limit = testee.limit("123");
+ assertThat(limit.getLimit()).contains(123);
+ }
+
+ @Test
+ public void limitShouldThrowWhenOtherValue() {
+ assertThatThrownBy(() -> testee.limit("abc"))
+ .isInstanceOf(HaltException.class);
+ }
+
+ @Test
+ public void limitShouldThrowWhenEqualsToZero() {
+ assertThatThrownBy(() -> testee.limit("0"))
+ .isInstanceOf(HaltException.class);
+ }
+
+ @Test
+ public void limitShouldThrowWhenLessThanZero() {
+ assertThatThrownBy(() -> testee.limit("-1"))
+ .isInstanceOf(HaltException.class);
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org