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