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 2019/03/28 03:22:02 UTC

[james-project] 18/23: MAILBOX-388 DeletedMessagesVault::usersWithVault

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit cfa210532f774947657a97abb422774c129b98c4
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Mar 21 15:51:02 2019 +0700

    MAILBOX-388 DeletedMessagesVault::usersWithVault
---
 .../java/org/apache/james/vault/DeletedMessageVault.java  |  2 ++
 .../james/vault/memory/MemoryDeletedMessagesVault.java    |  8 ++++++++
 .../apache/james/vault/DeletedMessageVaultContract.java   | 15 +++++++++++++++
 .../james/vault/MailRepositoryDeletedMessageVault.java    | 14 ++++++++++++++
 4 files changed, 39 insertions(+)

diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVault.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVault.java
index ff10a63..54d3579 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVault.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVault.java
@@ -34,4 +34,6 @@ public interface DeletedMessageVault {
     Publisher<Void> delete(User user, MessageId messageId);
 
     Publisher<DeletedMessage> search(User user, Query query);
+
+    Publisher<User> usersWithVault();
 }
diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/memory/MemoryDeletedMessagesVault.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/memory/MemoryDeletedMessagesVault.java
index 7e9faa3..3389dcb 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/memory/MemoryDeletedMessagesVault.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/memory/MemoryDeletedMessagesVault.java
@@ -31,6 +31,7 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.vault.DeletedMessage;
 import org.apache.james.vault.DeletedMessageVault;
 import org.apache.james.vault.search.Query;
+import org.reactivestreams.Publisher;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.HashBasedTable;
@@ -96,6 +97,13 @@ public class MemoryDeletedMessagesVault implements DeletedMessageVault {
             .filter(query.toPredicate());
     }
 
+    @Override
+    public Publisher<User> usersWithVault() {
+        synchronized (table) {
+            return Flux.fromIterable(ImmutableList.copyOf(table.rowKeySet()));
+        }
+    }
+
     private Flux<DeletedMessage> listAll(User user) {
         synchronized (table) {
             return Flux.fromIterable(ImmutableList.copyOf(table.row(user).values()))
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultContract.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultContract.java
index 7405c3e..0f4b3c6 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultContract.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultContract.java
@@ -164,6 +164,21 @@ public interface DeletedMessageVaultContract {
     }
 
     @Test
+    default void usersWithVaultShouldReturnEmptyWhenNoItem() {
+        assertThat(Flux.from(getVault().usersWithVault()).collectList().block())
+            .isEmpty();
+    }
+
+    @Test
+    default void usersWithVaultShouldReturnAllUsers() {
+        Mono.from(getVault().append(USER, DELETED_MESSAGE, new ByteArrayInputStream(CONTENT))).block();
+        Mono.from(getVault().append(USER_2, DELETED_MESSAGE, new ByteArrayInputStream(CONTENT))).block();
+
+        assertThat(Flux.from(getVault().usersWithVault()).collectList().block())
+            .containsOnly(USER, USER_2);
+    }
+
+    @Test
     default void appendShouldRunSuccessfullyInAConcurrentContext() throws Exception {
         int operationCount = 10;
         int threadCount = 10;
diff --git a/server/mailrepository/deleted-messages-vault-repository/src/main/java/org/apache/james/vault/MailRepositoryDeletedMessageVault.java b/server/mailrepository/deleted-messages-vault-repository/src/main/java/org/apache/james/vault/MailRepositoryDeletedMessageVault.java
index bd1943c..a99014b 100644
--- a/server/mailrepository/deleted-messages-vault-repository/src/main/java/org/apache/james/vault/MailRepositoryDeletedMessageVault.java
+++ b/server/mailrepository/deleted-messages-vault-repository/src/main/java/org/apache/james/vault/MailRepositoryDeletedMessageVault.java
@@ -28,6 +28,7 @@ import org.apache.james.core.User;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailrepository.api.MailKey;
 import org.apache.james.mailrepository.api.MailRepository;
+import org.apache.james.mailrepository.api.MailRepositoryPath;
 import org.apache.james.mailrepository.api.MailRepositoryStore;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.server.core.MimeMessageInputStream;
@@ -37,7 +38,9 @@ import org.reactivestreams.Publisher;
 
 import com.github.fge.lambdas.Throwing;
 import com.google.common.base.Preconditions;
+import com.google.common.collect.Iterables;
 
+import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 import reactor.core.scheduler.Schedulers;
 
@@ -124,6 +127,17 @@ public class MailRepositoryDeletedMessageVault implements DeletedMessageVault {
         }
     }
 
+    @Override
+    public Publisher<User> usersWithVault() {
+        return Flux.fromStream(mailRepositoryStore.getUrls()
+            .filter(url -> url.hasPrefix(configuration.urlPrefix))
+            .map(MailRepositoryUrl::getPath)
+            .map(MailRepositoryPath::parts)
+            .peek(parts -> Preconditions.checkState(!parts.isEmpty()))
+            .map(Iterables::getLast)
+            .map(User::fromUsername));
+    }
+
     private MailRepository repositoryForUser(User user) {
         MailRepositoryUrl mailRepositoryUrl = configuration.urlPrefix.subUrl(user.asString());
 


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