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 3567a93c41ba8e6b23eb893f617d3cedf2856bca
Author: Benoit Tellier <[email protected]>
AuthorDate: Wed Jun 17 15:34:17 2020 +0700

    JAMES-3167 Reactify right management in StoreMessageIdManager
---
 .../james/mailbox/store/StoreMessageIdManager.java | 59 ++++++++++------------
 1 file changed, 26 insertions(+), 33 deletions(-)

diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
index 4ed6fb9..994daad 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
@@ -118,7 +118,7 @@ public class StoreMessageIdManager implements 
MessageIdManager {
     public void setFlags(Flags newState, MessageManager.FlagsUpdateMode 
replace, MessageId messageId, List<MailboxId> mailboxIds, MailboxSession 
mailboxSession) throws MailboxException {
         MessageIdMapper messageIdMapper = 
mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession);
 
-        assertRightsOnMailboxes(mailboxIds, mailboxSession, Right.Write);
+        MailboxReactorUtils.block(assertRightsOnMailboxes(mailboxIds, 
mailboxSession, Right.Write));
 
         Multimap<MailboxId, UpdatedFlags> updatedFlags = 
messageIdMapper.setFlags(messageId, mailboxIds, newState, replace);
         for (Map.Entry<MailboxId, Collection<UpdatedFlags>> entry : 
updatedFlags.asMap().entrySet()) {
@@ -158,19 +158,19 @@ public class StoreMessageIdManager implements 
MessageIdManager {
             
.map(Throwing.function(messageResultConverter(fetchGroup)).sneakyThrow());
     }
 
-    private ImmutableSet<MailboxId> getAllowedMailboxIds(MailboxSession 
mailboxSession, List<MailboxMessage> messageList, Right... rights) {
-        return messageList.stream()
-                .map(MailboxMessage::getMailboxId)
-                .distinct()
-                .filter(hasRightsOnMailbox(mailboxSession, rights))
-                .collect(Guavate.toImmutableSet());
+    private ImmutableSet<MailboxId> getAllowedMailboxIds(MailboxSession 
mailboxSession, List<MailboxMessage> messageList, Right... rights) throws 
MailboxException {
+        return MailboxReactorUtils.block(Flux.fromIterable(messageList)
+            .map(MailboxMessage::getMailboxId)
+            .distinct()
+            .filterWhen(hasRightsOnMailboxReactive(mailboxSession, rights))
+            .collect(Guavate.toImmutableSet()));
     }
 
     @Override
     public DeleteResult delete(MessageId messageId, List<MailboxId> 
mailboxIds, MailboxSession mailboxSession) throws MailboxException {
         MessageIdMapper messageIdMapper = 
mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession);
 
-        assertRightsOnMailboxes(mailboxIds, mailboxSession, 
Right.DeleteMessages);
+        MailboxReactorUtils.block(assertRightsOnMailboxes(mailboxIds, 
mailboxSession, Right.DeleteMessages));
 
         List<MailboxMessage> messageList = messageIdMapper
             .find(ImmutableList.of(messageId), 
MessageMapper.FetchType.Metadata)
@@ -243,7 +243,7 @@ public class StoreMessageIdManager implements 
MessageIdManager {
 
     @Override
     public void setInMailboxes(MessageId messageId, Collection<MailboxId> 
targetMailboxIds, MailboxSession mailboxSession) throws MailboxException {
-        assertRightsOnMailboxes(targetMailboxIds, mailboxSession, Right.Read);
+        MailboxReactorUtils.block(assertRightsOnMailboxes(targetMailboxIds, 
mailboxSession, Right.Read));
 
         List<MailboxMessage> currentMailboxMessages = 
findRelatedMailboxMessages(messageId, mailboxSession);
 
@@ -276,18 +276,17 @@ public class StoreMessageIdManager implements 
MessageIdManager {
         }
     }
 
-    private List<MailboxMessage> findRelatedMailboxMessages(MessageId 
messageId, MailboxSession mailboxSession) {
+    private List<MailboxMessage> findRelatedMailboxMessages(MessageId 
messageId, MailboxSession mailboxSession) throws MailboxException {
         MessageIdMapper messageIdMapper = 
mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession);
 
-        return messageIdMapper.find(ImmutableList.of(messageId), 
MessageMapper.FetchType.Metadata)
-            .stream()
-            .filter(hasRightsOn(mailboxSession, Right.Read))
-            .collect(Guavate.toImmutableList());
+        return 
MailboxReactorUtils.block(messageIdMapper.findReactive(ImmutableList.of(messageId),
 MessageMapper.FetchType.Metadata)
+            .filterWhen(hasRightsOn(mailboxSession, Right.Read))
+            .collect(Guavate.toImmutableList()));
     }
 
     private void applyMessageMoves(MailboxSession mailboxSession, 
List<MailboxMessage> currentMailboxMessages, MessageMoves messageMoves) throws 
MailboxException {
-        assertRightsOnMailboxes(messageMoves.addedMailboxIds(), 
mailboxSession, Right.Insert);
-        assertRightsOnMailboxes(messageMoves.removedMailboxIds(), 
mailboxSession, Right.DeleteMessages);
+        
MailboxReactorUtils.block(assertRightsOnMailboxes(messageMoves.addedMailboxIds(),
 mailboxSession, Right.Insert));
+        
MailboxReactorUtils.block(assertRightsOnMailboxes(messageMoves.removedMailboxIds(),
 mailboxSession, Right.DeleteMessages));
 
         applyMessageMoveNoMailboxChecks(mailboxSession, 
currentMailboxMessages, messageMoves);
     }
@@ -427,14 +426,8 @@ public class StoreMessageIdManager implements 
MessageIdManager {
         return mailboxMessage -> 
mailboxIds.contains(mailboxMessage.getMailboxId());
     }
 
-    private Predicate<MailboxMessage> hasRightsOn(MailboxSession session, 
Right... rights) {
-        return message -> hasRightsOnMailbox(session, 
rights).test(message.getMailboxId());
-    }
-
-
-    private Predicate<MailboxId> hasRightsOnMailbox(MailboxSession session, 
Right... rights) {
-        return Throwing.predicate((MailboxId mailboxId) -> 
block(Mono.from(rightManager.myRights(mailboxId, session))).contains(rights))
-            .fallbackTo(any -> false);
+    private Function<MailboxMessage, Mono<Boolean>> hasRightsOn(MailboxSession 
session, Right... rights) {
+        return hasRightsOnMailboxReactive(session, 
rights).compose(MailboxMessage::getMailboxId);
     }
 
     private Function<MailboxId, Mono<Boolean>> 
hasRightsOnMailboxReactive(MailboxSession session, Right... rights) {
@@ -443,14 +436,14 @@ public class StoreMessageIdManager implements 
MessageIdManager {
             .onErrorResume(any -> Mono.just(false));
     }
 
-    private void assertRightsOnMailboxes(Collection<MailboxId> mailboxIds, 
MailboxSession mailboxSession, Right... rights) throws MailboxNotFoundException 
{
-        Optional<MailboxId> mailboxForbidden = mailboxIds.stream()
-            .filter(hasRightsOnMailbox(mailboxSession, rights).negate())
-            .findFirst();
-
-        if (mailboxForbidden.isPresent()) {
-            LOGGER.info("Mailbox with Id {} does not belong to {}", 
mailboxForbidden.get(), mailboxSession.getUser().asString());
-            throw new MailboxNotFoundException(mailboxForbidden.get());
-        }
+    private Mono<Void> assertRightsOnMailboxes(Collection<MailboxId> 
mailboxIds, MailboxSession mailboxSession, Right... rights) throws 
MailboxNotFoundException {
+        return Flux.fromIterable(mailboxIds)
+            .filterWhen(hasRightsOnMailboxReactive(mailboxSession, 
rights).andThen(result -> result.map(b -> !b)))
+            .next()
+            .flatMap(mailboxForbidden -> {
+                LOGGER.info("Mailbox with Id {} does not belong to {}", 
mailboxForbidden, mailboxSession.getUser().asString());
+                return Mono.error(new 
MailboxNotFoundException(mailboxForbidden));
+            })
+            .then();
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to