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/24 08:04:19 UTC

[10/11] james-project git commit: JAMES-2293 WebAdmin should allow to retrieve a MailRepository size

JAMES-2293 WebAdmin should allow to retrieve a MailRepository size


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/ff8e7790
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/ff8e7790
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/ff8e7790

Branch: refs/heads/master
Commit: ff8e7790b64a1c6995d0ff8c5518b077d0f1af83
Parents: 438c3a4
Author: benwa <bt...@linagora.com>
Authored: Mon Jan 22 12:55:49 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Jan 24 15:00:41 2018 +0700

----------------------------------------------------------------------
 .../org/apache/james/util/streams/Offset.java   | 66 +++++++++++++++
 .../apache/james/util/streams/OffsetTest.java   | 59 +++++++++++++
 .../mailrepository/file/MBoxMailRepository.java |  1 -
 .../memory/MemoryMailRepository.java            |  2 -
 .../dto/ExtendedMailRepositoryResponse.java     | 34 ++++++++
 .../webadmin/routes/MailRepositoriesRoutes.java | 73 ++++++++++++----
 .../service/MailRepositoryStoreService.java     | 25 ++++--
 .../routes/MailRepositoriesRoutesTest.java      | 87 +++++++++++++++++++-
 .../service/MailRepositoryStoreServiceTest.java | 11 ++-
 9 files changed, 325 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/ff8e7790/server/container/util-java8/src/main/java/org/apache/james/util/streams/Offset.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/main/java/org/apache/james/util/streams/Offset.java b/server/container/util-java8/src/main/java/org/apache/james/util/streams/Offset.java
new file mode 100644
index 0000000..109ecae
--- /dev/null
+++ b/server/container/util-java8/src/main/java/org/apache/james/util/streams/Offset.java
@@ -0,0 +1,66 @@
+/****************************************************************
+ * 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.util.streams;
+
+import java.util.Objects;
+import java.util.Optional;
+
+import com.google.common.base.Preconditions;
+
+public class Offset {
+
+    public static Offset from(Optional<Integer> offset) {
+        return offset.map(Offset::from)
+            .orElse(none());
+    }
+
+    public static Offset none() {
+        return new Offset(0);
+    }
+
+    public static Offset from(int offset) {
+        Preconditions.checkArgument(offset >= 0, "offset should be positive");
+        return new Offset(offset);
+    }
+
+    private final int offset;
+
+    private Offset(int offset) {
+        this.offset = offset;
+    }
+
+    public int getOffset() {
+        return offset;
+    }
+
+    @Override
+    public final boolean equals(Object o) {
+        if (o instanceof Offset) {
+            Offset other = (Offset) o;
+            return Objects.equals(this.offset, other.offset);
+        }
+        return false;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash(offset);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/ff8e7790/server/container/util-java8/src/test/java/org/apache/james/util/streams/OffsetTest.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/test/java/org/apache/james/util/streams/OffsetTest.java b/server/container/util-java8/src/test/java/org/apache/james/util/streams/OffsetTest.java
new file mode 100644
index 0000000..5a5b2b0
--- /dev/null
+++ b/server/container/util-java8/src/test/java/org/apache/james/util/streams/OffsetTest.java
@@ -0,0 +1,59 @@
+/****************************************************************
+ * 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.util.streams;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Optional;
+
+import org.junit.Test;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+public class OffsetTest {
+
+    public static final int VALUE = 18;
+
+    @Test
+    public void shouldMatchBeanContract() {
+        EqualsVerifier.forClass(Offset.class)
+            .allFieldsShouldBeUsed()
+            .verify();
+    }
+
+    @Test
+    public void fromZeroShouldBeEquivalentToNone() {
+        assertThat(Offset.from(0))
+            .isEqualTo(Offset.none());
+    }
+
+    @Test
+    public void getOffsetShouldReturnContainedValue() {
+        assertThat(Offset.from(VALUE).getOffset())
+            .isEqualTo(VALUE);
+    }
+
+    @Test
+    public void fromOptionalShouldBeEquivalentToFromValueWhenPresent() {
+        assertThat(Offset.from(Optional.of(VALUE)))
+            .isEqualTo(Offset.from(VALUE));
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/ff8e7790/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/MBoxMailRepository.java
----------------------------------------------------------------------
diff --git a/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/MBoxMailRepository.java b/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/MBoxMailRepository.java
index b2f7510..b0b3992 100755
--- a/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/MBoxMailRepository.java
+++ b/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/MBoxMailRepository.java
@@ -77,7 +77,6 @@ import org.apache.mailet.Mail;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.collect.Iterators;
 import com.google.common.hash.Hashing;
 
 /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/ff8e7790/server/mailrepository/mailrepository-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepository.java
----------------------------------------------------------------------
diff --git a/server/mailrepository/mailrepository-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepository.java b/server/mailrepository/mailrepository-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepository.java
index e6b0bbf..b201bc2 100644
--- a/server/mailrepository/mailrepository-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepository.java
+++ b/server/mailrepository/mailrepository-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepository.java
@@ -23,8 +23,6 @@ import java.util.Collection;
 import java.util.Iterator;
 import java.util.concurrent.ConcurrentHashMap;
 
-import javax.mail.MessagingException;
-
 import org.apache.james.mailrepository.api.MailRepository;
 import org.apache.mailet.Mail;
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/ff8e7790/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/ExtendedMailRepositoryResponse.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/ExtendedMailRepositoryResponse.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/ExtendedMailRepositoryResponse.java
new file mode 100644
index 0000000..c8258be
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/ExtendedMailRepositoryResponse.java
@@ -0,0 +1,34 @@
+/****************************************************************
+ * 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;
+
+public class ExtendedMailRepositoryResponse extends MailRepositoryResponse {
+
+    private final long size;
+
+    public ExtendedMailRepositoryResponse(String repository, long size) {
+        super(repository);
+        this.size = size;
+    }
+
+    public long getSize() {
+        return size;
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/ff8e7790/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 529dfd5..9250946 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
@@ -32,9 +32,12 @@ import javax.ws.rs.Produces;
 
 import org.apache.james.mailrepository.api.MailRepositoryStore;
 import org.apache.james.util.streams.Limit;
+import org.apache.james.util.streams.Offset;
 import org.apache.james.webadmin.Routes;
+import org.apache.james.webadmin.dto.ExtendedMailRepositoryResponse;
 import org.apache.james.webadmin.service.MailRepositoryStoreService;
 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;
 
@@ -55,7 +58,6 @@ import spark.Service;
 public class MailRepositoriesRoutes implements Routes {
 
     public static final String MAIL_REPOSITORIES = "mailRepositories";
-    public static final int NO_OFFSET = 0;
 
     private final JsonTransformer jsonTransformer;
     private final MailRepositoryStoreService repositoryStoreService;
@@ -74,6 +76,8 @@ public class MailRepositoriesRoutes implements Routes {
         defineGetMailRepositories();
 
         defineListMails();
+
+        defineGetMailRepository();
     }
 
     @GET
@@ -82,6 +86,7 @@ public class MailRepositoriesRoutes implements Routes {
     @ApiImplicitParams({
         @ApiImplicitParam(
             required = false,
+            name = "offset",
             paramType = "query parameter",
             dataType = "Integer",
             defaultValue = "0",
@@ -90,6 +95,7 @@ public class MailRepositoriesRoutes implements Routes {
         @ApiImplicitParam(
             required = false,
             paramType = "query parameter",
+            name = "limit",
             dataType = "Integer",
             defaultValue = "absent",
             example = "?limit=100",
@@ -97,19 +103,26 @@ public class MailRepositoriesRoutes implements Routes {
     })
     @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.BAD_REQUEST_400, message = "Bad request - invalid parameter")
+        @ApiResponse(code = HttpStatus.BAD_REQUEST_400, message = "Bad request - invalid parameter"),
+        @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "The repository does not exist", response = ErrorResponder.class),
+        @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "Internal server error - Something went bad on the server side.")
     })
     public void defineListMails() {
         service.get(MAIL_REPOSITORIES + "/:encodedUrl/mails", (request, response) -> {
-            int offset = asInteger(request, "offset").orElse(NO_OFFSET);
-            Limit limit = Limit.from(asInteger(request, "limit")
-                .map(value -> keepNotZero(value, "limit")));
+            Offset offset = Offset.from(assertPositiveInteger(request, "offset"));
+            Limit limit = Limit.from(assertPositiveInteger(request, "limit")
+                .map(value -> assertNotZero(value, "limit")));
             String encodedUrl = request.params("encodedUrl");
             String url = URLDecoder.decode(encodedUrl, StandardCharsets.UTF_8.displayName());
             try {
-                return repositoryStoreService.listMails(url, offset, limit);
-            } catch (MailRepositoryStore.MailRepositoryStoreException| MessagingException e) {
+                return repositoryStoreService.listMails(url, offset, limit)
+                    .orElseThrow(() -> ErrorResponder.builder()
+                            .statusCode(HttpStatus.NOT_FOUND_404)
+                            .type(ErrorType.NOT_FOUND)
+                            .message("The repository " + encodedUrl + "(decoded value: '" + url + "') does not exist")
+                            .haltError());
+
+            } catch (MailRepositoryStore.MailRepositoryStoreException | MessagingException e) {
                 throw ErrorResponder.builder()
                     .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500)
                     .type(ErrorResponder.ErrorType.SERVER_ERROR)
@@ -127,18 +140,48 @@ public class MailRepositoriesRoutes implements Routes {
         @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "Internal server error - Something went bad on the server side.")
     })
     public void defineGetMailRepositories() {
-        service.get(MAIL_REPOSITORIES, (request, response) -> {
-            response.status(HttpStatus.OK_200);
-            return repositoryStoreService.listMailRepositories();
+        service.get(MAIL_REPOSITORIES,
+            (request, response) -> repositoryStoreService.listMailRepositories(),
+            jsonTransformer);
+    }
+
+    @GET
+    @Path("/{encodedUrl}")
+    @ApiOperation(value = "Reading the information of a repository, such as size (can take some time to compute)")
+    @ApiResponses(value = {
+        @ApiResponse(code = HttpStatus.OK_200, message = "The repository information", response = List.class),
+        @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "The repository does not exist", response = ErrorResponder.class),
+        @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "Internal server error - Something went bad on the server side."),
+    })
+    public void defineGetMailRepository() {
+        service.get(MAIL_REPOSITORIES + "/:encodedUrl", (request, response) -> {
+            String encodedUrl = request.params("encodedUrl");
+            String url = URLDecoder.decode(encodedUrl, StandardCharsets.UTF_8.displayName());
+            try {
+                long size = repositoryStoreService.size(url)
+                    .orElseThrow(() -> ErrorResponder.builder()
+                            .statusCode(HttpStatus.NOT_FOUND_404)
+                            .type(ErrorType.NOT_FOUND)
+                            .message("The repository " + encodedUrl + "(decoded value: '" + url + "') does not exist")
+                            .haltError());
+                return new ExtendedMailRepositoryResponse(url, size);
+            } 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 repository information")
+                    .haltError();
+            }
         }, jsonTransformer);
     }
 
-    private Optional<Integer> asInteger(Request request, String parameterName) {
+    private Optional<Integer> assertPositiveInteger(Request request, String parameterName) {
         try {
             return Optional.ofNullable(request.queryParams(parameterName))
                 .filter(s -> !Strings.isNullOrEmpty(s))
                 .map(Integer::valueOf)
-                .map(value -> keepPositive(value, parameterName));
+                .map(value -> assertPositive(value, parameterName));
         } catch (NumberFormatException e) {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
@@ -149,7 +192,7 @@ public class MailRepositoriesRoutes implements Routes {
         }
     }
 
-    private int keepPositive(int value, String parameterName) {
+    private int assertPositive(int value, String parameterName) {
         if (value < 0) {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
@@ -160,7 +203,7 @@ public class MailRepositoriesRoutes implements Routes {
         return value;
     }
 
-    private int keepNotZero(int value, String parameterName) {
+    private int assertNotZero(int value, String parameterName) {
         if (value == 0) {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)

http://git-wip-us.apache.org/repos/asf/james-project/blob/ff8e7790/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 8be5c44..996b0a2 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
@@ -20,6 +20,7 @@
 package org.apache.james.webadmin.service;
 
 import java.util.List;
+import java.util.Optional;
 
 import javax.inject.Inject;
 import javax.mail.MessagingException;
@@ -28,9 +29,12 @@ import org.apache.james.mailrepository.api.MailRepository;
 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.MailKey;
 import org.apache.james.webadmin.dto.MailRepositoryResponse;
 
+import com.github.fge.lambdas.Throwing;
+import com.github.fge.lambdas.functions.ThrowingFunction;
 import com.github.steveash.guavate.Guavate;
 
 public class MailRepositoryStoreService {
@@ -48,13 +52,22 @@ public class MailRepositoryStoreService {
             .collect(Guavate.toImmutableList());
     }
 
-    public List<MailKey> listMails(String url, long offset, Limit limit) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
-        MailRepository mailRepository = mailRepositoryStore.select(url);
+    public Optional<List<MailKey>> listMails(String url, Offset offset, Limit limit) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
+        Optional<MailRepository> mailRepository = Optional.ofNullable(mailRepositoryStore.select(url));
+        ThrowingFunction<MailRepository, List<MailKey>> list = repository -> list(repository, offset, limit);
+        return mailRepository.map(Throwing.function(list).sneakyThrow());
+    }
+
+    private List<MailKey> list(MailRepository mailRepository, Offset offset, Limit limit) throws MessagingException {
         return limit.applyOnStream(
-            Iterators.toStream(mailRepository.list())
-                .skip(offset))
-            .map(MailKey::new)
-            .collect(Guavate.toImmutableList());
+                Iterators.toStream(mailRepository.list())
+                    .skip(offset.getOffset()))
+                .map(MailKey::new)
+                .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());
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ff8e7790/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 d318715..52bddca 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
@@ -19,13 +19,16 @@
 
 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;
 import static org.apache.james.webadmin.WebAdminServer.NO_CONFIGURATION;
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.hamcrest.Matchers.contains;
 import static org.hamcrest.Matchers.containsInAnyOrder;
 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.mockito.Mockito.mock;
@@ -36,7 +39,7 @@ import java.util.List;
 
 import org.apache.james.mailrepository.api.MailRepositoryStore;
 import org.apache.james.mailrepository.memory.MemoryMailRepository;
-import org.apache.james.metrics.logger.DefaultMetricFactory;
+import org.apache.james.metrics.api.NoopMetricFactory;
 import org.apache.james.webadmin.WebAdminServer;
 import org.apache.james.webadmin.WebAdminUtils;
 import org.apache.james.webadmin.service.MailRepositoryStoreService;
@@ -68,7 +71,7 @@ public class MailRepositoriesRoutesTest {
         mailRepository = new MemoryMailRepository();
 
         webAdminServer = WebAdminUtils.createWebAdminServer(
-                new DefaultMetricFactory(),
+                new NoopMetricFactory(),
                 new MailRepositoriesRoutes(new MailRepositoryStoreService(mailRepositoryStore), new JsonTransformer()));
         webAdminServer.configure(NO_CONFIGURATION);
         webAdminServer.await();
@@ -138,6 +141,14 @@ public class MailRepositoriesRoutesTest {
     }
 
     @Test
+    public void listingKeysShouldReturnNotFoundWhenNoRepository() throws Exception {
+        when()
+            .get(MY_REPO_MAILS)
+        .then()
+            .statusCode(HttpStatus.NOT_FOUND_404);
+    }
+
+    @Test
     public void listingKeysShouldReturnEmptyWhenNoMail() throws Exception {
         when(mailRepositoryStore.select(URL_MY_REPO)).thenReturn(mailRepository);
 
@@ -186,7 +197,7 @@ public class MailRepositoriesRoutesTest {
         .then()
             .statusCode(HttpStatus.OK_200)
             .body("", hasSize(1))
-            .body("mailKey", containsInAnyOrder("name2"));
+            .body("mailKey", contains("name2"));
     }
 
     @Test
@@ -227,6 +238,27 @@ public class MailRepositoriesRoutesTest {
     }
 
     @Test
+    public void listingKeysShouldReturnEmptyWhenOffsetExceedsSize() throws Exception {
+        when(mailRepositoryStore.select(URL_MY_REPO)).thenReturn(mailRepository);
+
+        mailRepository.store(FakeMail.builder()
+            .name("name1")
+            .build());
+        mailRepository.store(FakeMail.builder()
+            .name("name2")
+            .build());
+        mailRepository.store(FakeMail.builder()
+            .name("name3")
+            .build());
+
+        when()
+            .get(MY_REPO_MAILS + "?offset=5")
+            .then()
+            .statusCode(HttpStatus.OK_200)
+            .body("", hasSize(0));
+    }
+
+    @Test
     public void listingKeysShouldReturnErrorOnInvalidLimit() throws Exception {
         when()
             .get(MY_REPO_MAILS + "?limit=invalid")
@@ -277,4 +309,53 @@ public class MailRepositoriesRoutesTest {
             .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
             .body("message", is("limit can not be equal to zero"));
     }
+
+    @Test
+    public void retrievingRepositoryShouldReturnNotFoundWhenNone() throws Exception {
+        given()
+            .get(URL_ESCAPED_MY_REPO)
+        .then()
+            .statusCode(HttpStatus.NOT_FOUND_404);
+    }
+
+    @Test
+    public void retrievingRepositoryShouldReturnBasicInformation() throws Exception {
+        when(mailRepositoryStore.select(URL_MY_REPO)).thenReturn(mailRepository);
+
+        given()
+            .get(URL_ESCAPED_MY_REPO)
+        .then()
+            .statusCode(HttpStatus.OK_200)
+            .contentType(ContentType.JSON)
+            .body("repository", is(URL_MY_REPO))
+            .body("encodedUrl", is(URL_ESCAPED_MY_REPO));
+    }
+
+    @Test
+    public void retrievingRepositorySizeShouldReturnZeroWhenEmpty() throws Exception {
+        when(mailRepositoryStore.select(URL_MY_REPO)).thenReturn(mailRepository);
+
+        given()
+            .get(URL_ESCAPED_MY_REPO)
+        .then()
+            .statusCode(HttpStatus.OK_200)
+            .contentType(ContentType.JSON)
+            .body("size", equalTo(0));
+    }
+
+    @Test
+    public void retrievingRepositorySizeShouldReturnNumberOfContainedMails() throws Exception {
+        when(mailRepositoryStore.select(URL_MY_REPO)).thenReturn(mailRepository);
+
+        mailRepository.store(FakeMail.builder()
+            .name("name1")
+            .build());
+
+        given()
+            .get(URL_ESCAPED_MY_REPO)
+        .then()
+            .statusCode(HttpStatus.OK_200)
+            .contentType(ContentType.JSON)
+            .body("size", equalTo(1));
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ff8e7790/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/MailRepositoryStoreServiceTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/MailRepositoryStoreServiceTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/MailRepositoryStoreServiceTest.java
index 9079ae6..505d5ca 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/MailRepositoryStoreServiceTest.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/MailRepositoryStoreServiceTest.java
@@ -26,9 +26,9 @@ import static org.mockito.Mockito.when;
 import org.apache.james.mailrepository.api.MailRepositoryStore;
 import org.apache.james.mailrepository.memory.MemoryMailRepository;
 import org.apache.james.util.streams.Limit;
+import org.apache.james.util.streams.Offset;
 import org.apache.james.webadmin.dto.MailKey;
 import org.apache.james.webadmin.dto.MailRepositoryResponse;
-import org.apache.james.webadmin.routes.MailRepositoriesRoutes;
 import org.apache.mailet.base.test.FakeMail;
 import org.junit.Before;
 import org.junit.Test;
@@ -80,7 +80,7 @@ public class MailRepositoryStoreServiceTest {
         when(mailRepositoryStore.select(FIRST_REPOSITORY))
             .thenThrow(new MailRepositoryStore.MailRepositoryStoreException("message"));
 
-        assertThatThrownBy(() -> testee.listMails(FIRST_REPOSITORY, MailRepositoriesRoutes.NO_OFFSET, Limit.unlimited()))
+        assertThatThrownBy(() -> testee.listMails(FIRST_REPOSITORY, Offset.none(), Limit.unlimited()))
             .isInstanceOf(MailRepositoryStore.MailRepositoryStoreException.class);
     }
 
@@ -88,7 +88,7 @@ public class MailRepositoryStoreServiceTest {
     public void listMailsShouldReturnEmptyWhenMailRepositoryIsEmpty() throws Exception {
         when(mailRepositoryStore.select(FIRST_REPOSITORY)).thenReturn(repository);
 
-        assertThat(testee.listMails(FIRST_REPOSITORY, MailRepositoriesRoutes.NO_OFFSET, Limit.unlimited()))
+        assertThat(testee.listMails(FIRST_REPOSITORY, Offset.none(), Limit.unlimited()).get())
             .isEmpty();
     }
 
@@ -103,7 +103,7 @@ public class MailRepositoryStoreServiceTest {
             .name(NAME_2)
             .build());
 
-        assertThat(testee.listMails(FIRST_REPOSITORY, MailRepositoriesRoutes.NO_OFFSET, Limit.unlimited()))
+        assertThat(testee.listMails(FIRST_REPOSITORY, Offset.none(), Limit.unlimited()).get())
             .containsOnly(new MailKey(NAME_1), new MailKey(NAME_2));
     }
 
@@ -121,8 +121,7 @@ public class MailRepositoryStoreServiceTest {
             .name("name3")
             .build());
 
-        int offset = 1;
-        assertThat(testee.listMails(FIRST_REPOSITORY, offset, Limit.from(1)))
+        assertThat(testee.listMails(FIRST_REPOSITORY, Offset.from(1), Limit.from(1)).get())
             .containsOnly(new MailKey(NAME_2));
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org