You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2023/06/15 03:22:17 UTC

[james-project] 02/03: [REFACTOR] PropagateLookupRightListener implement Reactive group event listener

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 67f389e6195969850e9c6005a01907bdee83b758
Author: Tung Van TRAN <vt...@linagora.com>
AuthorDate: Fri Jun 9 10:15:04 2023 +0700

    [REFACTOR] PropagateLookupRightListener implement Reactive group event listener
---
 .../jmap/event/PropagateLookupRightListener.java   | 110 +++++++++++----------
 1 file changed, 56 insertions(+), 54 deletions(-)

diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
index e91e81481e..0d02571e19 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.jmap.event;
 
+import java.util.List;
+import java.util.function.Predicate;
 import java.util.stream.Stream;
 
 import javax.inject.Inject;
@@ -28,19 +30,23 @@ import org.apache.james.events.EventListener;
 import org.apache.james.events.Group;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.RightManager;
 import org.apache.james.mailbox.acl.ACLDiff;
 import org.apache.james.mailbox.events.MailboxEvents.MailboxACLUpdated;
 import org.apache.james.mailbox.events.MailboxEvents.MailboxRenamed;
-import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxACL.Entry;
 import org.apache.james.mailbox.model.MailboxACL.Right;
 import org.apache.james.mailbox.model.MailboxPath;
+import org.reactivestreams.Publisher;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class PropagateLookupRightListener implements EventListener.GroupEventListener {
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+public class PropagateLookupRightListener implements EventListener.ReactiveGroupEventListener {
     public static class PropagateLookupRightListenerGroup extends Group {
 
     }
@@ -63,75 +69,71 @@ public class PropagateLookupRightListener implements EventListener.GroupEventLis
     }
 
     @Override
-    public void event(Event event) throws MailboxException {
-        MailboxSession mailboxSession = createMailboxSession(event);
+    public boolean isHandling(Event event) {
+        return event instanceof MailboxACLUpdated || event instanceof MailboxRenamed;
+    }
 
+    @Override
+    public Publisher<Void> reactiveEvent(Event event) {
         if (event instanceof MailboxACLUpdated) {
-            MailboxACLUpdated aclUpdateEvent = (MailboxACLUpdated) event;
-            MailboxPath mailboxPath = mailboxManager.getMailbox(aclUpdateEvent.getMailboxId(), mailboxSession).getMailboxPath();
-
-            updateLookupRightOnParent(mailboxSession, mailboxPath, aclUpdateEvent.getAclDiff());
+            return updateLookupRightOnParent((MailboxACLUpdated) event);
         } else if (event instanceof MailboxRenamed) {
-            MailboxRenamed renamedEvent = (MailboxRenamed) event;
-            updateLookupRightOnParent(mailboxSession, renamedEvent.getNewPath());
+            return updateLookupRightOnParent((MailboxRenamed) event);
         }
+        return Mono.empty();
     }
 
-    @Override
-    public boolean isHandling(Event event) {
-        return event instanceof MailboxACLUpdated || event instanceof MailboxRenamed;
+    private Mono<Void> updateLookupRightOnParent(MailboxACLUpdated aclUpdateEvent) {
+        MailboxSession mailboxSession = createMailboxSession(aclUpdateEvent);
+        return Mono.from(mailboxManager.getMailboxReactive(aclUpdateEvent.getMailboxId(), mailboxSession))
+            .map(MessageManager::getMailboxPath)
+            .flatMapIterable(mailboxPath -> mailboxPath.getParents(mailboxSession.getPathDelimiter()))
+            .flatMap(parentPath -> updateLookupRight(mailboxSession, parentPath, aclUpdateEvent.getAclDiff()))
+            .then();
     }
 
-    private MailboxSession createMailboxSession(Event event) {
-        return mailboxManager.createSystemSession(event.getUsername());
+    private Mono<Void> updateLookupRightOnParent(MailboxRenamed mailboxRenamed) {
+        MailboxSession mailboxSession = createMailboxSession(mailboxRenamed);
+        return Mono.from(rightManager.listRightsReactive(mailboxRenamed.getNewPath(), mailboxSession))
+            .flatMapIterable(acl -> acl.getEntries().entrySet())
+            .map(mapEntry -> new Entry(mapEntry.getKey(), mapEntry.getValue()))
+            .filter(updateLookupRightPredicate())
+            .collectList()
+            .flatMap(entries -> Flux.fromIterable(mailboxRenamed.getNewPath().getParents(mailboxSession.getPathDelimiter()))
+                .flatMap(parentPath -> updateLookupRight(mailboxSession, parentPath, entries))
+                .then());
     }
 
-    private void updateLookupRightOnParent(MailboxSession session, MailboxPath path) throws MailboxException {
-        MailboxACL acl = rightManager.listRights(path, session);
-        listAncestors(session, path)
-            .forEach(parentMailboxPath ->
-                updateLookupRight(
-                    session,
-                    parentMailboxPath,
-                    acl.getEntries()
-                        .entrySet()
-                        .stream()
-                        .map(entry -> new Entry(entry.getKey(), entry.getValue()))));
+    private Mono<Void> updateLookupRight(MailboxSession session, MailboxPath mailboxPath, ACLDiff aclDiff) {
+        return updateLookupRight(session, mailboxPath, Stream.concat(aclDiff.addedEntries(), aclDiff.changedEntries()));
     }
 
-    private void updateLookupRightOnParent(MailboxSession mailboxSession, MailboxPath mailboxPath, ACLDiff aclDiff) {
-        listAncestors(mailboxSession, mailboxPath)
-            .forEach(path ->
-                updateLookupRight(
-                    mailboxSession, path,
-                    Stream.concat(aclDiff.addedEntries(), aclDiff.changedEntries())
-                ));
+    private Mono<Void> updateLookupRight(MailboxSession session, MailboxPath mailboxPath, Stream<Entry> entryStream) {
+        return Flux.fromStream(entryStream)
+            .filter(updateLookupRightPredicate())
+            .flatMap(entry -> applyLookupRight(session, mailboxPath, entry.getKey()))
+            .then();
     }
 
-    private void updateLookupRight(MailboxSession session, MailboxPath mailboxPath, Stream<Entry> entries) {
-        entries
-            .filter(entry -> !entry.getKey().isNegative())
-            .filter(entry -> entry.getValue().contains(Right.Lookup))
-            .forEach(entry -> applyLookupRight(session, mailboxPath, entry));
+    private Predicate<Entry> updateLookupRightPredicate() {
+        return entry -> !entry.getKey().isNegative() && entry.getValue().contains(Right.Lookup);
     }
 
-    private Stream<MailboxPath> listAncestors(MailboxSession mailboxSession, MailboxPath mailboxPath) {
-        return mailboxPath.getParents(mailboxSession.getPathDelimiter())
-            .stream();
+    private Mono<Void> updateLookupRight(MailboxSession session, MailboxPath mailboxPath, List<Entry> entries) {
+        return Flux.fromIterable(entries)
+            .flatMap(entry -> applyLookupRight(session, mailboxPath, entry.getKey()))
+            .then();
     }
 
-    private void applyLookupRight(MailboxSession session, MailboxPath mailboxPath, Entry entry) {
-        try {
-            rightManager.applyRightsCommand(mailboxPath,
-                MailboxACL.command()
-                    .rights(Right.Lookup)
-                    .key(entry.getKey())
-                    .asAddition(),
-                session);
-        } catch (MailboxException e) {
-            LOGGER.error(String.format("Mailbox '%s' does not exist, user '%s' cannot share mailbox",
-                mailboxPath,
-                session.getUser().asString()), e);
-        }
+    private MailboxSession createMailboxSession(Event event) {
+        return mailboxManager.createSystemSession(event.getUsername());
+    }
+
+    private Mono<Void> applyLookupRight(MailboxSession session, MailboxPath mailboxPath, MailboxACL.EntryKey entryKey) {
+        return Mono.fromCallable(() -> MailboxACL.command()
+                .rights(Right.Lookup)
+                .key(entryKey)
+                .asAddition())
+            .flatMap(aclCommand -> Mono.from(rightManager.applyRightsCommandReactive(mailboxPath, aclCommand, session)));
     }
 }


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