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:13 UTC
[02/16] james-project git commit: JAMES-2293 Webadmin allow
inspecting mail detail
JAMES-2293 Webadmin allow inspecting mail detail
Note that an offset and a limit can be specified.
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/2fd2e228
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/2fd2e228
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/2fd2e228
Branch: refs/heads/master
Commit: 2fd2e228e3f9bf4150e243f276bdc5a3b49d7f1f
Parents: f3eb9b1
Author: benwa <bt...@linagora.com>
Authored: Mon Jan 22 11:29:14 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Jan 24 15:09:50 2018 +0700
----------------------------------------------------------------------
.../org/apache/james/webadmin/dto/MailDto.java | 95 ++++++++++++++++++++
.../webadmin/routes/MailRepositoriesRoutes.java | 31 +++++++
.../service/MailRepositoryStoreService.java | 9 ++
.../routes/MailRepositoriesRoutesTest.java | 65 ++++++++++++++
4 files changed, 200 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/2fd2e228/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailDto.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailDto.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailDto.java
new file mode 100644
index 0000000..4587412
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailDto.java
@@ -0,0 +1,95 @@
+/****************************************************************
+ * 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.dto;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+import javax.mail.MessagingException;
+
+import org.apache.james.core.MailAddress;
+import org.apache.mailet.Mail;
+
+import com.github.steveash.guavate.Guavate;
+
+public class MailDto {
+ public static MailDto fromMail(Mail mail) throws MessagingException {
+ return new MailDto(mail.getName(),
+ Optional.ofNullable(mail.getSender()).map(MailAddress::asString),
+ mail.getRecipients().stream().map(MailAddress::asString).collect(Guavate.toImmutableList()),
+ Optional.ofNullable(mail.getErrorMessage()),
+ Optional.ofNullable(mail.getState()));
+ }
+
+ private final String name;
+ private final Optional<String> sender;
+ private final List<String> recipients;
+ private final Optional<String> error;
+ private final Optional<String> state;
+
+ public MailDto(String name, Optional<String> sender, List<String> recipients, Optional<String> error,
+ Optional<String> state) {
+ this.name = name;
+ this.sender = sender;
+ this.recipients = recipients;
+ this.error = error;
+ this.state = state;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Optional<String> getSender() {
+ return sender;
+ }
+
+ public List<String> getRecipients() {
+ return recipients;
+ }
+
+ public Optional<String> getError() {
+ return error;
+ }
+
+ public Optional<String> getState() {
+ return state;
+ }
+
+ @Override
+ public final boolean equals(Object o) {
+ if (o instanceof MailDto) {
+ MailDto mailDto = (MailDto) o;
+
+ return Objects.equals(this.name, mailDto.name)
+ && Objects.equals(this.sender, mailDto.sender)
+ && Objects.equals(this.recipients, mailDto.recipients)
+ && Objects.equals(this.error, mailDto.error)
+ && Objects.equals(this.state, mailDto.state);
+ }
+ return false;
+ }
+
+ @Override
+ public final int hashCode() {
+ return Objects.hash(name, sender, recipients, error, state);
+ }
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/2fd2e228/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/routes/MailRepositoriesRoutes.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/routes/MailRepositoriesRoutes.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/routes/MailRepositoriesRoutes.java
index 9250946..55dc43e 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/routes/MailRepositoriesRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/routes/MailRepositoriesRoutes.java
@@ -78,6 +78,8 @@ public class MailRepositoriesRoutes implements Routes {
defineListMails();
defineGetMailRepository();
+
+ defineGetMail();
}
@GET
@@ -145,6 +147,35 @@ public class MailRepositoriesRoutes implements Routes {
jsonTransformer);
}
+ @Path("/{encodedUrl}/mails/{mailKey}")
+ @ApiOperation(value = "Retrieving a specific mail details")
+ @ApiResponses(value = {
+ @ApiResponse(code = HttpStatus.OK_200, message = "The list of all mails in a repository", response = List.class),
+ @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "Internal server error - Something went bad on the server side."),
+ @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "Not found - Could not retrieve the given mail.")
+ })
+ public void defineGetMail() {
+ service.get(MAIL_REPOSITORIES + "/:encodedUrl/mails/:mailKey", (request, response) -> {
+ String url = URLDecoder.decode(request.params("encodedUrl"), StandardCharsets.UTF_8.displayName());
+ String mailKey = request.params("mailKey");
+ try {
+ return repositoryStoreService.retrieveMail(url, mailKey)
+ .orElseThrow(() -> ErrorResponder.builder()
+ .statusCode(HttpStatus.NOT_FOUND_404)
+ .type(ErrorResponder.ErrorType.NOT_FOUND)
+ .message("Could not retrieve " + mailKey)
+ .haltError());
+ } catch (MailRepositoryStore.MailRepositoryStoreException| MessagingException e) {
+ throw ErrorResponder.builder()
+ .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500)
+ .type(ErrorResponder.ErrorType.SERVER_ERROR)
+ .cause(e)
+ .message("Error while retrieving mail")
+ .haltError();
+ }
+ }, jsonTransformer);
+ }
+
@GET
@Path("/{encodedUrl}")
@ApiOperation(value = "Reading the information of a repository, such as size (can take some time to compute)")
http://git-wip-us.apache.org/repos/asf/james-project/blob/2fd2e228/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/MailRepositoryStoreService.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/MailRepositoryStoreService.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/MailRepositoryStoreService.java
index 996b0a2..d1117c5 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/MailRepositoryStoreService.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/MailRepositoryStoreService.java
@@ -30,6 +30,7 @@ import org.apache.james.mailrepository.api.MailRepositoryStore;
import org.apache.james.util.streams.Iterators;
import org.apache.james.util.streams.Limit;
import org.apache.james.util.streams.Offset;
+import org.apache.james.webadmin.dto.MailDto;
import org.apache.james.webadmin.dto.MailKey;
import org.apache.james.webadmin.dto.MailRepositoryResponse;
@@ -66,8 +67,16 @@ public class MailRepositoryStoreService {
.collect(Guavate.toImmutableList());
}
+
public Optional<Long> size(String url) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
Optional<MailRepository> mailRepository = Optional.ofNullable(mailRepositoryStore.select(url));
return mailRepository.map(Throwing.function(MailRepository::size).sneakyThrow());
}
+
+ public Optional<MailDto> retrieveMail(String url, String mailKey) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
+ MailRepository mailRepository = mailRepositoryStore.select(url);
+
+ return Optional.ofNullable(mailRepository.retrieve(mailKey))
+ .map(Throwing.function(MailDto::fromMail).sneakyThrow());
+ }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/2fd2e228/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java
index 433eeaa..56543ce 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java
@@ -31,6 +31,7 @@ import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.isEmptyOrNullString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -358,4 +359,68 @@ public class MailRepositoriesRoutesTest {
.contentType(ContentType.JSON)
.body("size", equalTo(1));
}
+
+ @Test
+ public void retrievingAMailShouldDisplayItsInformation() throws Exception {
+ when(mailRepositoryStore.select(URL_MY_REPO)).thenReturn(mailRepository);
+
+ String name = "name1";
+ String sender = "sender@domain";
+ String recipient1 = "recipient1@domain";
+ String recipient2 = "recipient2@domain";
+ String state = "state";
+ String errorMessage = "Error: why this mail is stored";
+ mailRepository.store(FakeMail.builder()
+ .name(name)
+ .sender(sender)
+ .recipients(recipient1, recipient2)
+ .state(state)
+ .errorMessage(errorMessage)
+ .build());
+
+ when()
+ .get(URL_ESCAPED_MY_REPO + "/mails/" + name)
+ .then()
+ .statusCode(HttpStatus.OK_200)
+ .body("name", is(name))
+ .body("sender", is(sender))
+ .body("state", is(state))
+ .body("error", is(errorMessage))
+ .body("recipients", containsInAnyOrder(recipient1, recipient2));
+ }
+
+ @Test
+ public void retrievingAMailShouldNotFailWhenOnlyNameProperty() throws Exception {
+ when(mailRepositoryStore.select(URL_MY_REPO)).thenReturn(mailRepository);
+
+ String name = "name1";
+ mailRepository.store(FakeMail.builder()
+ .name(name)
+ .build());
+
+ when()
+ .get(URL_ESCAPED_MY_REPO + "/mails/" + name)
+ .then()
+ .statusCode(HttpStatus.OK_200)
+ .body("name", is(name))
+ .body("sender", isEmptyOrNullString())
+ .body("state", isEmptyOrNullString())
+ .body("error", isEmptyOrNullString())
+ .body("recipients", hasSize(0));
+ }
+
+ @Test
+ public void retrievingAMailShouldFailWhenUnknown() throws Exception {
+ when(mailRepositoryStore.select(URL_MY_REPO)).thenReturn(mailRepository);
+
+ String name = "name";
+ when()
+ .get(URL_ESCAPED_MY_REPO + "/mails/" + name)
+ .then()
+ .statusCode(HttpStatus.NOT_FOUND_404)
+ .body("statusCode", is(404))
+ .body("type", is(ErrorResponder.ErrorType.NOT_FOUND.getType()))
+ .body("message", is("Could not retrieve " + name));
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org