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 ma...@apache.org on 2018/06/13 14:58:19 UTC

[3/5] james-project git commit: JAMES-2418 Strong typing for repository URLs and keys

http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailKeyDTO.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailKeyDTO.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailKeyDTO.java
new file mode 100644
index 0000000..64d4504
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailKeyDTO.java
@@ -0,0 +1,52 @@
+/****************************************************************
+ * 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.Objects;
+
+import org.apache.james.mailrepository.api.MailKey;
+
+public class MailKeyDTO {
+
+    private final MailKey mailKey;
+
+    public MailKeyDTO(MailKey mailKey) {
+        this.mailKey = mailKey;
+    }
+
+    public String getMailKey() {
+        return mailKey.asString();
+    }
+
+    @Override
+    public final boolean equals(Object o) {
+        if (o instanceof MailKeyDTO) {
+            MailKeyDTO that = (MailKeyDTO) o;
+
+            return Objects.equals(this.mailKey, that.mailKey);
+        }
+        return false;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash(mailKey);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailRepositoryResponse.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailRepositoryResponse.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailRepositoryResponse.java
index 6e58052..962ffa0 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailRepositoryResponse.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailRepositoryResponse.java
@@ -20,22 +20,22 @@
 package org.apache.james.webadmin.dto;
 
 import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
+
+import org.apache.james.mailrepository.api.MailRepositoryUrl;
 
 public class MailRepositoryResponse {
 
-    private final String repository;
+    private final MailRepositoryUrl repository;
 
-    public MailRepositoryResponse(String repository) {
+    public MailRepositoryResponse(MailRepositoryUrl repository) {
         this.repository = repository;
     }
 
     public String getRepository() {
-        return repository;
+        return repository.asString();
     }
 
     public String getId() throws UnsupportedEncodingException {
-        return URLEncoder.encode(repository, StandardCharsets.UTF_8.displayName());
+        return repository.urlEncoded();
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/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 b60bb6f..29ea380 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
@@ -22,8 +22,6 @@ package org.apache.james.webadmin.routes;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.nio.charset.StandardCharsets;
 import java.util.List;
 import java.util.Optional;
 import java.util.function.Supplier;
@@ -38,7 +36,9 @@ import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 
+import org.apache.james.mailrepository.api.MailKey;
 import org.apache.james.mailrepository.api.MailRepositoryStore;
+import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.queue.api.MailQueueFactory;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskId;
@@ -124,7 +124,7 @@ public class MailRepositoriesRoutes implements Routes {
     })
     public void definePutMailRepository() {
         service.put(MAIL_REPOSITORIES + "/:encodedUrl", (request, response) -> {
-            String url = decodedRepositoryUrl(request);
+            MailRepositoryUrl url = decodedRepositoryUrl(request);
             try {
                 repositoryStoreService.createMailRepository(url);
                 response.status(HttpStatus.NO_CONTENT_204);
@@ -134,7 +134,7 @@ public class MailRepositoriesRoutes implements Routes {
                     .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500)
                     .type(ErrorResponder.ErrorType.SERVER_ERROR)
                     .cause(e)
-                    .message(String.format("Error while creating a mail repository with url '%s'", url))
+                    .message(String.format("Error while creating a mail repository with url '%s'", url.asString()))
                     .haltError();
             }
         }, jsonTransformer);
@@ -172,7 +172,7 @@ public class MailRepositoriesRoutes implements Routes {
             Offset offset = ParametersExtractor.extractOffset(request);
             Limit limit = ParametersExtractor.extractLimit(request);
             String encodedUrl = request.params("encodedUrl");
-            String url = decodedRepositoryUrl(request);
+            MailRepositoryUrl url = MailRepositoryUrl.fromEncoded(encodedUrl);
             try {
                 return repositoryStoreService.listMails(url, offset, limit)
                     .orElseThrow(() -> ErrorResponder.builder()
@@ -214,13 +214,17 @@ public class MailRepositoriesRoutes implements Routes {
         @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", Constants.JSON_CONTENT_TYPE,
-            (request, response) -> getMailAsJson(decodedRepositoryUrl(request), request.params("mailKey")), jsonTransformer);
+            (request, response) -> getMailAsJson(
+                decodedRepositoryUrl(request),
+                new MailKey(request.params("mailKey"))),
+            jsonTransformer);
 
         service.get(MAIL_REPOSITORIES + "/:encodedUrl/mails/:mailKey", Constants.RFC822_CONTENT_TYPE,
             (request, response) -> writeMimeMessage(
-                getMailAsMimeMessage(decodedRepositoryUrl(request), request.params("mailKey")),
+                getMailAsMimeMessage(
+                    decodedRepositoryUrl(request),
+                    new MailKey(request.params("mailKey"))),
                 response.raw()));
     }
 
@@ -237,7 +241,7 @@ public class MailRepositoriesRoutes implements Routes {
         return byteArrayOutputStream.size();
     }
 
-    private MimeMessage getMailAsMimeMessage(String url, String mailKey) {
+    private MimeMessage getMailAsMimeMessage(MailRepositoryUrl url, MailKey mailKey) {
         try {
             return repositoryStoreService.retrieveMessage(url, mailKey)
                 .orElseThrow(mailNotFoundError(mailKey));
@@ -246,7 +250,7 @@ public class MailRepositoriesRoutes implements Routes {
         }
     }
 
-    private MailDto getMailAsJson(String url, String mailKey) {
+    private MailDto getMailAsJson(MailRepositoryUrl url, MailKey mailKey) {
         try {
             return repositoryStoreService.retrieveMail(url, mailKey)
                 .orElseThrow(mailNotFoundError(mailKey));
@@ -255,11 +259,11 @@ public class MailRepositoriesRoutes implements Routes {
         }
     }
 
-    private Supplier<HaltException> mailNotFoundError(String mailKey) {
+    private Supplier<HaltException> mailNotFoundError(MailKey mailKey) {
         return () -> ErrorResponder.builder()
             .statusCode(HttpStatus.NOT_FOUND_404)
             .type(ErrorResponder.ErrorType.NOT_FOUND)
-            .message("Could not retrieve " + mailKey)
+            .message("Could not retrieve " + mailKey.asString())
             .haltError();
     }
 
@@ -283,7 +287,7 @@ public class MailRepositoriesRoutes implements Routes {
     public void defineGetMailRepository() {
         service.get(MAIL_REPOSITORIES + "/:encodedUrl", (request, response) -> {
             String encodedUrl = request.params("encodedUrl");
-            String url = URLDecoder.decode(encodedUrl, StandardCharsets.UTF_8.displayName());
+            MailRepositoryUrl url = MailRepositoryUrl.fromEncoded(encodedUrl);
             try {
                 long size = repositoryStoreService.size(url)
                     .orElseThrow(() -> ErrorResponder.builder()
@@ -312,8 +316,8 @@ public class MailRepositoriesRoutes implements Routes {
     })
     public void defineDeleteMail() {
         service.delete(MAIL_REPOSITORIES + "/:encodedUrl/mails/:mailKey", (request, response) -> {
-            String url = decodedRepositoryUrl(request);
-            String mailKey = request.params("mailKey");
+            MailRepositoryUrl url = decodedRepositoryUrl(request);
+            MailKey mailKey = new MailKey(request.params("mailKey"));
             try {
                 response.status(HttpStatus.NO_CONTENT_204);
                 repositoryStoreService.deleteMail(url, mailKey);
@@ -339,7 +343,7 @@ public class MailRepositoriesRoutes implements Routes {
     })
     public void defineDeleteAll() {
         service.delete(MAIL_REPOSITORIES + "/:encodedUrl/mails", (request, response) -> {
-            String url = decodedRepositoryUrl(request);
+            MailRepositoryUrl url = decodedRepositoryUrl(request);
             try {
                 Task task = repositoryStoreService.createClearMailRepositoryTask(url);
                 TaskId taskId = taskManager.submit(task);
@@ -398,7 +402,7 @@ public class MailRepositoriesRoutes implements Routes {
     }
 
     private Task toAllMailReprocessingTask(Request request) throws UnsupportedEncodingException, MailRepositoryStore.MailRepositoryStoreException, MessagingException {
-        String url = decodedRepositoryUrl(request);
+        MailRepositoryUrl url = decodedRepositoryUrl(request);
         enforceActionParameter(request);
         Optional<String> targetProcessor = Optional.ofNullable(request.queryParams("processor"));
         String targetQueue = Optional.ofNullable(request.queryParams("queue")).orElse(MailQueueFactory.SPOOL);
@@ -450,8 +454,8 @@ public class MailRepositoriesRoutes implements Routes {
     }
 
     private Task toOneMailReprocessingTask(Request request) throws UnsupportedEncodingException {
-        String url = decodedRepositoryUrl(request);
-        String key = request.params("key");
+        MailRepositoryUrl url = decodedRepositoryUrl(request);
+        MailKey key = new MailKey(request.params("key"));
         enforceActionParameter(request);
         Optional<String> targetProcessor = Optional.ofNullable(request.queryParams("processor"));
         String targetQueue = Optional.ofNullable(request.queryParams("queue")).orElse(MailQueueFactory.SPOOL);
@@ -470,7 +474,7 @@ public class MailRepositoriesRoutes implements Routes {
         }
     }
 
-    private String decodedRepositoryUrl(Request request) throws UnsupportedEncodingException {
-        return URLDecoder.decode(request.params("encodedUrl"), StandardCharsets.UTF_8.displayName());
+    private MailRepositoryUrl decodedRepositoryUrl(Request request) throws UnsupportedEncodingException {
+        return MailRepositoryUrl.fromEncoded(request.params("encodedUrl"));
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTask.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTask.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTask.java
index 4dfc43e..853e530 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTask.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTask.java
@@ -25,6 +25,7 @@ import java.util.function.Supplier;
 import javax.mail.MessagingException;
 
 import org.apache.james.mailrepository.api.MailRepository;
+import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
 
@@ -33,18 +34,18 @@ public class ClearMailRepositoryTask implements Task {
     public static final String TYPE = "clearMailRepository";
 
     public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
-        private final String repositoryUrl;
+        private final MailRepositoryUrl repositoryUrl;
         private final Supplier<Long> countSupplier;
         private final long initialCount;
 
-        public AdditionalInformation(String repositoryUrl, Supplier<Long> countSupplier) {
+        public AdditionalInformation(MailRepositoryUrl repositoryUrl, Supplier<Long> countSupplier) {
             this.repositoryUrl = repositoryUrl;
             this.initialCount = countSupplier.get();
             this.countSupplier = countSupplier;
         }
 
         public String getRepositoryUrl() {
-            return repositoryUrl;
+            return repositoryUrl.asString();
         }
 
         public long getRemainingCount() {
@@ -59,7 +60,7 @@ public class ClearMailRepositoryTask implements Task {
     private final MailRepository mailRepository;
     private final AdditionalInformation additionalInformation;
 
-    public ClearMailRepositoryTask(MailRepository mailRepository, String url) {
+    public ClearMailRepositoryTask(MailRepository mailRepository, MailRepositoryUrl url) {
         this.mailRepository = mailRepository;
         this.additionalInformation = new AdditionalInformation(url, this::getRemainingSize);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/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 de33041..7a0d691 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
@@ -26,14 +26,16 @@ import javax.inject.Inject;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
+import org.apache.james.mailrepository.api.MailKey;
 import org.apache.james.mailrepository.api.MailRepository;
 import org.apache.james.mailrepository.api.MailRepositoryStore;
+import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.task.Task;
 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.MailKeyDTO;
 import org.apache.james.webadmin.dto.MailRepositoryResponse;
 import org.apache.james.webadmin.utils.ErrorResponder;
 import org.apache.mailet.Mail;
@@ -58,53 +60,53 @@ public class MailRepositoryStoreService {
             .collect(Guavate.toImmutableList());
     }
 
-    public MailRepository createMailRepository(String repositoryUrl) throws MailRepositoryStore.MailRepositoryStoreException {
+    public MailRepository createMailRepository(MailRepositoryUrl repositoryUrl) throws MailRepositoryStore.MailRepositoryStoreException {
         return mailRepositoryStore.create(repositoryUrl);
     }
 
-    public Optional<List<MailKey>> listMails(String url, Offset offset, Limit limit) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
+    public Optional<List<MailKeyDTO>> listMails(MailRepositoryUrl url, Offset offset, Limit limit) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
         Optional<MailRepository> mailRepository = Optional.ofNullable(getRepository(url));
-        ThrowingFunction<MailRepository, List<MailKey>> list = repository -> list(repository, offset, limit);
+        ThrowingFunction<MailRepository, List<MailKeyDTO>> 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 {
+    private List<MailKeyDTO> list(MailRepository mailRepository, Offset offset, Limit limit) throws MessagingException {
         return limit.applyOnStream(
                 Iterators.toStream(mailRepository.list())
                     .skip(offset.getOffset()))
-                .map(MailKey::new)
+                .map(MailKeyDTO::new)
                 .collect(Guavate.toImmutableList());
     }
 
-    public Optional<Long> size(String url) throws MailRepositoryStore.MailRepositoryStoreException {
+    public Optional<Long> size(MailRepositoryUrl url) throws MailRepositoryStore.MailRepositoryStoreException {
         Optional<MailRepository> mailRepository = Optional.ofNullable(getRepository(url));
         return mailRepository.map(Throwing.function(MailRepository::size).sneakyThrow());
     }
 
-    public Optional<MailDto> retrieveMail(String url, String mailKey) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
+    public Optional<MailDto> retrieveMail(MailRepositoryUrl url, MailKey mailKey) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
         MailRepository mailRepository = getRepository(url);
 
         return Optional.ofNullable(mailRepository.retrieve(mailKey))
             .map(Throwing.function(MailDto::fromMail).sneakyThrow());
     }
 
-    public Optional<MimeMessage> retrieveMessage(String url, String mailKey) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
+    public Optional<MimeMessage> retrieveMessage(MailRepositoryUrl url, MailKey mailKey) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
         MailRepository mailRepository = getRepository(url);
 
         return Optional.ofNullable(mailRepository.retrieve(mailKey))
             .map(Throwing.function(Mail::getMessage).sneakyThrow());
     }
 
-    public void deleteMail(String url, String mailKey) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
+    public void deleteMail(MailRepositoryUrl url, MailKey mailKey) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
         getRepository(url)
             .remove(mailKey);
     }
 
-    public Task createClearMailRepositoryTask(String url) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
+    public Task createClearMailRepositoryTask(MailRepositoryUrl url) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
         return new ClearMailRepositoryTask(getRepository(url), url);
     }
 
-    public MailRepository getRepository(String url) throws MailRepositoryStore.MailRepositoryStoreException {
+    public MailRepository getRepository(MailRepositoryUrl url) throws MailRepositoryStore.MailRepositoryStoreException {
         return mailRepositoryStore.get(url)
             .orElseThrow(() -> ErrorResponder.builder()
                 .statusCode(HttpStatus.NOT_FOUND_404)

http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTask.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTask.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTask.java
index 6f75e2e..26ad50d 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTask.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTask.java
@@ -24,7 +24,9 @@ import java.util.concurrent.atomic.AtomicLong;
 
 import javax.mail.MessagingException;
 
+import org.apache.james.mailrepository.api.MailKey;
 import org.apache.james.mailrepository.api.MailRepositoryStore;
+import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
 
@@ -35,13 +37,13 @@ public class ReprocessingAllMailsTask implements Task {
     public static final String TYPE = "reprocessingAllTask";
 
     public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
-        private final String repositoryUrl;
+        private final MailRepositoryUrl repositoryUrl;
         private final String targetQueue;
         private final Optional<String> targetProcessor;
         private final long initialCount;
         private final AtomicLong processedCount;
 
-        public AdditionalInformation(String repositoryUrl, String targetQueue, Optional<String> targetProcessor, long initialCount) {
+        public AdditionalInformation(MailRepositoryUrl repositoryUrl, String targetQueue, Optional<String> targetProcessor, long initialCount) {
             this.repositoryUrl = repositoryUrl;
             this.targetQueue = targetQueue;
             this.targetProcessor = targetProcessor;
@@ -58,7 +60,7 @@ public class ReprocessingAllMailsTask implements Task {
         }
 
         public String getRepositoryUrl() {
-            return repositoryUrl;
+            return repositoryUrl.asString();
         }
 
         public long getRemainingCount() {
@@ -70,19 +72,19 @@ public class ReprocessingAllMailsTask implements Task {
         }
 
         @JsonIgnore
-        public void notifyProgress(String key) {
+        public void notifyProgress(MailKey key) {
             processedCount.incrementAndGet();
         }
     }
 
     private final ReprocessingService reprocessingService;
-    private final String repositoryUrl;
+    private final MailRepositoryUrl repositoryUrl;
     private final String targetQueue;
     private final Optional<String> targetProcessor;
     private final AdditionalInformation additionalInformation;
 
     public ReprocessingAllMailsTask(ReprocessingService reprocessingService, long repositorySize,
-                                    String repositoryUrl, String targetQueue, Optional<String> targetProcessor) {
+                                    MailRepositoryUrl repositoryUrl, String targetQueue, Optional<String> targetProcessor) {
         this.reprocessingService = reprocessingService;
         this.repositoryUrl = repositoryUrl;
         this.targetQueue = targetQueue;

http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTask.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTask.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTask.java
index d476bfc..453ff8b 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTask.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTask.java
@@ -23,7 +23,9 @@ import java.util.Optional;
 
 import javax.mail.MessagingException;
 
+import org.apache.james.mailrepository.api.MailKey;
 import org.apache.james.mailrepository.api.MailRepositoryStore;
+import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
 
@@ -32,12 +34,12 @@ public class ReprocessingOneMailTask implements Task {
     public static final String TYPE = "reprocessingOneTask";
 
     public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
-        private final String repositoryUrl;
+        private final MailRepositoryUrl repositoryUrl;
         private final String targetQueue;
-        private final String mailKey;
+        private final MailKey mailKey;
         private final Optional<String> targetProcessor;
 
-        public AdditionalInformation(String repositoryUrl, String targetQueue, String mailKey, Optional<String> targetProcessor) {
+        public AdditionalInformation(MailRepositoryUrl repositoryUrl, String targetQueue, MailKey mailKey, Optional<String> targetProcessor) {
             this.repositoryUrl = repositoryUrl;
             this.targetQueue = targetQueue;
             this.mailKey = mailKey;
@@ -45,7 +47,7 @@ public class ReprocessingOneMailTask implements Task {
         }
 
         public String getMailKey() {
-            return mailKey;
+            return mailKey.asString();
         }
 
         public String getTargetQueue() {
@@ -57,19 +59,19 @@ public class ReprocessingOneMailTask implements Task {
         }
 
         public String getRepositoryUrl() {
-            return repositoryUrl;
+            return repositoryUrl.asString();
         }
     }
 
     private final ReprocessingService reprocessingService;
-    private final String repositoryUrl;
+    private final MailRepositoryUrl repositoryUrl;
     private final String targetQueue;
-    private final String mailKey;
+    private final MailKey mailKey;
     private final Optional<String> targetProcessor;
     private final AdditionalInformation additionalInformation;
 
     public ReprocessingOneMailTask(ReprocessingService reprocessingService,
-                                   String repositoryUrl, String targetQueue, String mailKey, Optional<String> targetProcessor) {
+                                   MailRepositoryUrl repositoryUrl, String targetQueue, MailKey mailKey, Optional<String> targetProcessor) {
         this.reprocessingService = reprocessingService;
         this.repositoryUrl = repositoryUrl;
         this.targetQueue = targetQueue;

http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingService.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingService.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingService.java
index 8eee51b..fbe68a4 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingService.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingService.java
@@ -25,8 +25,10 @@ import java.util.function.Consumer;
 import javax.inject.Inject;
 import javax.mail.MessagingException;
 
+import org.apache.james.mailrepository.api.MailKey;
 import org.apache.james.mailrepository.api.MailRepository;
 import org.apache.james.mailrepository.api.MailRepositoryStore;
+import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueueFactory;
 import org.apache.james.util.streams.Iterators;
@@ -46,7 +48,7 @@ public class ReprocessingService {
         this.mailRepositoryStoreService = mailRepositoryStoreService;
     }
 
-    public void reprocessAll(String url, Optional<String> targetProcessor, String targetQueue, Consumer<String> keyListener) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
+    public void reprocessAll(MailRepositoryUrl url, Optional<String> targetProcessor, String targetQueue, Consumer<MailKey> keyListener) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
         MailRepository repository = mailRepositoryStoreService.getRepository(url);
         MailQueue mailQueue = getMailQueue(targetQueue);
 
@@ -55,14 +57,14 @@ public class ReprocessingService {
             .forEach(Throwing.consumer(key -> reprocess(repository, mailQueue, key, targetProcessor)));
     }
 
-    public void reprocess(String url, String key, Optional<String> targetProcessor, String targetQueue) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
+    public void reprocess(MailRepositoryUrl url, MailKey key, Optional<String> targetProcessor, String targetQueue) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
         MailRepository repository = mailRepositoryStoreService.getRepository(url);
         MailQueue mailQueue = getMailQueue(targetQueue);
 
         reprocess(repository, mailQueue, key, targetProcessor);
     }
 
-    private void reprocess(MailRepository repository, MailQueue mailQueue, String key, Optional<String> targetProcessor) throws MessagingException {
+    private void reprocess(MailRepository repository, MailQueue mailQueue, MailKey key, Optional<String> targetProcessor) throws MessagingException {
         Mail mail = repository.retrieve(key);
         targetProcessor.ifPresent(mail::setState);
         mailQueue.enQueue(mail);

http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/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 7370e3c..ae90244 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
@@ -32,7 +32,7 @@ import static org.hamcrest.Matchers.hasSize;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.isEmptyOrNullString;
 import static org.hamcrest.Matchers.notNullValue;
-import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -43,7 +43,9 @@ import java.nio.charset.StandardCharsets;
 import java.util.List;
 import java.util.Optional;
 
+import org.apache.james.mailrepository.api.MailKey;
 import org.apache.james.mailrepository.api.MailRepositoryStore;
+import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.mailrepository.memory.MemoryMailRepository;
 import org.apache.james.metrics.api.NoopMetricFactory;
 import org.apache.james.queue.api.MailQueueFactory;
@@ -69,6 +71,7 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
+import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
 import com.jayway.restassured.RestAssured;
 import com.jayway.restassured.builder.RequestSpecBuilder;
@@ -77,7 +80,7 @@ import com.jayway.restassured.parsing.Parser;
 
 public class MailRepositoriesRoutesTest {
 
-    private static final String URL_MY_REPO = "url://myRepo";
+    private static final MailRepositoryUrl URL_MY_REPO = MailRepositoryUrl.from("url://myRepo");
     private static final String URL_ESCAPED_MY_REPO = "url%3A%2F%2FmyRepo";
     private static final String MY_REPO_MAILS = "url%3A%2F%2FmyRepo/mails";
     private static final String CUSTOM_QUEUE = "customQueue";
@@ -152,7 +155,7 @@ public class MailRepositoriesRoutesTest {
 
     @Test
     public void putMailRepositoryShouldReturnServerErrorWhenCannotCreateRepository() throws Exception {
-        when(mailRepositoryStore.create(anyString()))
+        when(mailRepositoryStore.create(any()))
             .thenThrow(new MailRepositoryStore.MailRepositoryStoreException("Error while selecting repository url://myRepo"));
 
         when()
@@ -191,13 +194,13 @@ public class MailRepositoriesRoutesTest {
         .then()
             .statusCode(HttpStatus.OK_200)
             .body("", hasSize(1))
-            .body("[0].repository", is(URL_MY_REPO))
+            .body("[0].repository", is(URL_MY_REPO.asString()))
             .body("[0].id", is(URL_ESCAPED_MY_REPO));
     }
 
     @Test
     public void getMailRepositoriesShouldReturnTwoRepositoriesWhenTwo() {
-        ImmutableList<String> myRepositories = ImmutableList.of(URL_MY_REPO, "url://mySecondRepo");
+        ImmutableList<MailRepositoryUrl> myRepositories = ImmutableList.of(URL_MY_REPO, MailRepositoryUrl.from("url://mySecondRepo"));
         when(mailRepositoryStore.getUrls())
             .thenReturn(myRepositories);
 
@@ -212,7 +215,10 @@ public class MailRepositoriesRoutesTest {
                 .jsonPath()
                 .getList("repository");
 
-        assertThat(mailRepositories).containsOnlyElementsOf(myRepositories);
+        assertThat(mailRepositories)
+            .containsOnlyElementsOf(myRepositories.stream()
+                .map(MailRepositoryUrl::asString)
+                .collect(Guavate.toImmutableList()));
     }
 
     @Test
@@ -423,7 +429,7 @@ public class MailRepositoriesRoutesTest {
         .then()
             .statusCode(HttpStatus.OK_200)
             .contentType(ContentType.JSON)
-            .body("repository", is(URL_MY_REPO))
+            .body("repository", is(URL_MY_REPO.asString()))
             .body("id", is(URL_ESCAPED_MY_REPO));
     }
 
@@ -653,7 +659,7 @@ public class MailRepositoriesRoutesTest {
             .body("status", is("completed"))
             .body("taskId", is(notNullValue()))
             .body("type", is(ClearMailRepositoryTask.TYPE))
-            .body("additionalInformation.repositoryUrl", is(URL_MY_REPO))
+            .body("additionalInformation.repositoryUrl", is(URL_MY_REPO.asString()))
             .body("additionalInformation.initialCount", is(2))
             .body("additionalInformation.remainingCount", is(0))
             .body("startedDate", is(notNullValue()))
@@ -780,7 +786,7 @@ public class MailRepositoriesRoutesTest {
             .body("status", is("completed"))
             .body("taskId", is(notNullValue()))
             .body("type", is(ReprocessingAllMailsTask.TYPE))
-            .body("additionalInformation.repositoryUrl", is(URL_MY_REPO))
+            .body("additionalInformation.repositoryUrl", is(URL_MY_REPO.asString()))
             .body("additionalInformation.initialCount", is(2))
             .body("additionalInformation.remainingCount", is(0))
             .body("additionalInformation.targetProcessor", isEmptyOrNullString())
@@ -819,7 +825,7 @@ public class MailRepositoriesRoutesTest {
             .body("status", is("completed"))
             .body("taskId", is(notNullValue()))
             .body("type", is(ReprocessingAllMailsTask.TYPE))
-            .body("additionalInformation.repositoryUrl", is(URL_MY_REPO))
+            .body("additionalInformation.repositoryUrl", is(URL_MY_REPO.asString()))
             .body("additionalInformation.initialCount", is(2))
             .body("additionalInformation.remainingCount", is(0))
             .body("additionalInformation.targetProcessor", is(transport))
@@ -1052,7 +1058,7 @@ public class MailRepositoriesRoutesTest {
             .body("status", is("completed"))
             .body("taskId", is(notNullValue()))
             .body("type", is(ReprocessingOneMailTask.TYPE))
-            .body("additionalInformation.repositoryUrl", is(URL_MY_REPO))
+            .body("additionalInformation.repositoryUrl", is(URL_MY_REPO.asString()))
             .body("additionalInformation.mailKey", is(NAME_1))
             .body("additionalInformation.targetProcessor", isEmptyOrNullString())
             .body("additionalInformation.targetQueue", is(MailQueueFactory.SPOOL))
@@ -1090,7 +1096,7 @@ public class MailRepositoriesRoutesTest {
             .body("status", is("completed"))
             .body("taskId", is(notNullValue()))
             .body("type", is(ReprocessingOneMailTask.TYPE))
-            .body("additionalInformation.repositoryUrl", is(URL_MY_REPO))
+            .body("additionalInformation.repositoryUrl", is(URL_MY_REPO.asString()))
             .body("additionalInformation.mailKey", is(NAME_1))
             .body("additionalInformation.targetProcessor", is(transport))
             .body("additionalInformation.targetQueue", is(CUSTOM_QUEUE))
@@ -1125,7 +1131,7 @@ public class MailRepositoriesRoutesTest {
             .get(taskId + "/await");
 
         assertThat(mailRepository.list())
-            .containsOnly(NAME_2);
+            .containsOnly(new MailKey(NAME_2));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/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 100959a..927c5136 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
@@ -29,13 +29,15 @@ import java.util.Optional;
 import javax.mail.internet.MimeMessage;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.james.mailrepository.api.MailKey;
 import org.apache.james.mailrepository.api.MailRepositoryStore;
+import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.mailrepository.memory.MemoryMailRepository;
 import org.apache.james.server.core.MimeMessageInputStream;
 import org.apache.james.util.ClassLoaderUtils;
 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.MailKeyDTO;
 import org.apache.james.webadmin.dto.MailRepositoryResponse;
 import org.apache.mailet.base.test.FakeMail;
 import org.junit.Before;
@@ -44,10 +46,10 @@ import org.junit.Test;
 import com.google.common.collect.ImmutableList;
 
 public class MailRepositoryStoreServiceTest {
-    private static final String FIRST_REPOSITORY = "url://repository";
-    private static final String SECOND_REPOSITORY = "url://repository2";
-    private static final String NAME_1 = "name1";
-    private static final String NAME_2 = "name2";
+    private static final MailRepositoryUrl FIRST_REPOSITORY = MailRepositoryUrl.from("url://repository");
+    private static final MailRepositoryUrl SECOND_REPOSITORY = MailRepositoryUrl.from("url://repository2");
+    private static final MailKey NAME_1 = new MailKey("name1");
+    private static final MailKey NAME_2 = new MailKey("name2");
 
     private MailRepositoryStore mailRepositoryStore;
     private MailRepositoryStoreService testee;
@@ -71,7 +73,7 @@ public class MailRepositoryStoreServiceTest {
             .thenReturn(ImmutableList.of(FIRST_REPOSITORY));
         assertThat(testee.listMailRepositories())
             .extracting(MailRepositoryResponse::getRepository)
-            .containsOnly(FIRST_REPOSITORY);
+            .containsOnly(FIRST_REPOSITORY.asString());
     }
 
     @Test
@@ -80,7 +82,7 @@ public class MailRepositoryStoreServiceTest {
             .thenReturn(ImmutableList.of(FIRST_REPOSITORY, SECOND_REPOSITORY));
         assertThat(testee.listMailRepositories())
             .extracting(MailRepositoryResponse::getRepository)
-            .containsOnly(FIRST_REPOSITORY, SECOND_REPOSITORY);
+            .containsOnly(FIRST_REPOSITORY.asString(), SECOND_REPOSITORY.asString());
     }
 
     @Test
@@ -105,14 +107,14 @@ public class MailRepositoryStoreServiceTest {
         when(mailRepositoryStore.get(FIRST_REPOSITORY)).thenReturn(Optional.of(repository));
 
         repository.store(FakeMail.builder()
-            .name(NAME_1)
+            .name(NAME_1.asString())
             .build());
         repository.store(FakeMail.builder()
-            .name(NAME_2)
+            .name(NAME_2.asString())
             .build());
 
         assertThat(testee.listMails(FIRST_REPOSITORY, Offset.none(), Limit.unlimited()).get())
-            .containsOnly(new MailKey(NAME_1), new MailKey(NAME_2));
+            .containsOnly(new MailKeyDTO(NAME_1), new MailKeyDTO(NAME_2));
     }
 
     @Test
@@ -120,22 +122,22 @@ public class MailRepositoryStoreServiceTest {
         when(mailRepositoryStore.get(FIRST_REPOSITORY)).thenReturn(Optional.of(repository));
 
         repository.store(FakeMail.builder()
-            .name(NAME_1)
+            .name(NAME_1.asString())
             .build());
         repository.store(FakeMail.builder()
-            .name(NAME_2)
+            .name(NAME_2.asString())
             .build());
         repository.store(FakeMail.builder()
             .name("name3")
             .build());
 
         assertThat(testee.listMails(FIRST_REPOSITORY, Offset.from(1), Limit.from(1)).get())
-            .containsOnly(new MailKey(NAME_2));
+            .containsOnly(new MailKeyDTO(NAME_2));
     }
 
     @Test
     public void retrieveMessageShouldThrownWhenUnknownRepository() throws Exception {
-        when(mailRepositoryStore.get("unkown")).thenReturn(Optional.empty());
+        when(mailRepositoryStore.get(MailRepositoryUrl.from("proto://unkown"))).thenReturn(Optional.empty());
 
         assertThatThrownBy(() -> testee.retrieveMessage(FIRST_REPOSITORY, NAME_1))
             .isInstanceOf(NullPointerException.class);
@@ -163,7 +165,7 @@ public class MailRepositoryStoreServiceTest {
         when(mailRepositoryStore.get(FIRST_REPOSITORY)).thenReturn(Optional.of(repository));
 
         FakeMail mail = FakeMail.builder()
-            .name(NAME_1)
+            .name(NAME_1.asString())
             .fileName("mail.eml")
             .build();
         repository.store(mail);


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