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

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

commit 9e7ad28ca351c7dbdedb61dddc8d1c78f9a48592
Author: Benoit Tellier <[email protected]>
AuthorDate: Thu May 13 16:47:42 2021 +0700

    [REFACTORING] Hide CassandraACLMapper behind an interface
    
    This enables tailor made James server for non collaborative
    environments to specify noop implementations for the ACLMapper.
    
    For my workloads at Linagora ACL read requests proved to be one of my
    top queries even if the backing table is empty.
---
 .../CassandraMailboxSessionMapperFactory.java      |  6 ++--
 .../mailbox/cassandra/DeleteMessageListener.java   |  6 ++--
 .../james/mailbox/cassandra/mail/ACLMapper.java    | 36 ++++++++++++++++++++++
 .../mailbox/cassandra/mail/CassandraACLMapper.java |  6 +++-
 .../cassandra/mail/CassandraMailboxMapper.java     | 14 ++++-----
 .../mail/task/MailboxMergingTaskRunner.java        | 14 ++++-----
 .../mailbox/cassandra/mail/utils/GuiceUtils.java   |  3 ++
 .../modules/mailbox/CassandraMailboxModule.java    |  2 ++
 8 files changed, 66 insertions(+), 21 deletions(-)

diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
index 4194924..5a809f2 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
@@ -26,7 +26,7 @@ import 
org.apache.james.backends.cassandra.utils.CassandraUtils;
 import 
org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager;
 import org.apache.james.blob.api.BlobStore;
 import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper;
+import org.apache.james.mailbox.cassandra.mail.ACLMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraAnnotationMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2;
@@ -92,7 +92,7 @@ public class CassandraMailboxSessionMapperFactory extends 
MailboxSessionMapperFa
     private final BlobStore blobStore;
     private final CassandraAttachmentMessageIdDAO attachmentMessageIdDAO;
     private final CassandraAttachmentOwnerDAO ownerDAO;
-    private final CassandraACLMapper aclMapper;
+    private final ACLMapper aclMapper;
     private final CassandraUserMailboxRightsDAO userMailboxRightsDAO;
     private final CassandraSchemaVersionManager versionManager;
     private final CassandraUtils cassandraUtils;
@@ -107,7 +107,7 @@ public class CassandraMailboxSessionMapperFactory extends 
MailboxSessionMapperFa
                                                 CassandraMailboxPathDAOImpl 
mailboxPathDAO, CassandraMailboxPathV2DAO mailboxPathV2DAO, 
CassandraMailboxPathV3DAO mailboxPathV3DAO, CassandraFirstUnseenDAO 
firstUnseenDAO, CassandraApplicableFlagDAO applicableFlagDAO,
                                                 CassandraAttachmentDAOV2 
attachmentDAOV2, CassandraDeletedMessageDAO deletedMessageDAO,
                                                 BlobStore blobStore, 
CassandraAttachmentMessageIdDAO attachmentMessageIdDAO,
-                                                CassandraAttachmentOwnerDAO 
ownerDAO, CassandraACLMapper aclMapper,
+                                                CassandraAttachmentOwnerDAO 
ownerDAO, ACLMapper aclMapper,
                                                 CassandraUserMailboxRightsDAO 
userMailboxRightsDAO,
                                                 CassandraSchemaVersionManager 
versionManager,
                                                 
RecomputeMailboxCountersService recomputeMailboxCountersService,
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java
index 25af4c3..bcde273 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java
@@ -38,7 +38,7 @@ import org.apache.james.events.Group;
 import org.apache.james.mailbox.acl.ACLDiff;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper;
+import org.apache.james.mailbox.cassandra.mail.ACLMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMessageIdDAO;
@@ -92,7 +92,7 @@ public class DeleteMessageListener implements 
EventListener.ReactiveGroupEventLi
     private final CassandraAttachmentDAOV2 attachmentDAO;
     private final CassandraAttachmentOwnerDAO ownerDAO;
     private final CassandraAttachmentMessageIdDAO attachmentMessageIdDAO;
-    private final CassandraACLMapper aclMapper;
+    private final ACLMapper aclMapper;
     private final CassandraUserMailboxRightsDAO rightsDAO;
     private final CassandraApplicableFlagDAO applicableFlagDAO;
     private final CassandraFirstUnseenDAO firstUnseenDAO;
@@ -105,7 +105,7 @@ public class DeleteMessageListener implements 
EventListener.ReactiveGroupEventLi
     @Inject
     public DeleteMessageListener(CassandraMessageIdToImapUidDAO imapUidDAO, 
CassandraMessageIdDAO messageIdDAO, CassandraMessageDAO messageDAO,
                                  CassandraMessageDAOV3 messageDAOV3, 
CassandraAttachmentDAOV2 attachmentDAO, CassandraAttachmentOwnerDAO ownerDAO,
-                                 CassandraAttachmentMessageIdDAO 
attachmentMessageIdDAO, CassandraACLMapper aclMapper,
+                                 CassandraAttachmentMessageIdDAO 
attachmentMessageIdDAO, ACLMapper aclMapper,
                                  CassandraUserMailboxRightsDAO rightsDAO, 
CassandraApplicableFlagDAO applicableFlagDAO,
                                  CassandraFirstUnseenDAO firstUnseenDAO, 
CassandraDeletedMessageDAO deletedMessageDAO,
                                  CassandraMailboxCounterDAO counterDAO, 
CassandraMailboxRecentsDAO recentsDAO, BlobStore blobStore,
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/ACLMapper.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/ACLMapper.java
new file mode 100644
index 0000000..aaa9290
--- /dev/null
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/ACLMapper.java
@@ -0,0 +1,36 @@
+/****************************************************************
+ * 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.mailbox.cassandra.mail;
+
+import org.apache.james.mailbox.acl.ACLDiff;
+import org.apache.james.mailbox.cassandra.ids.CassandraId;
+import org.apache.james.mailbox.model.MailboxACL;
+
+import reactor.core.publisher.Mono;
+
+public interface ACLMapper {
+    Mono<MailboxACL> getACL(CassandraId cassandraId);
+
+    Mono<ACLDiff> updateACL(CassandraId cassandraId, MailboxACL.ACLCommand 
command);
+
+    Mono<ACLDiff> setACL(CassandraId cassandraId, MailboxACL mailboxACL);
+
+    Mono<Void> delete(CassandraId cassandraId);
+}
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
index 97012c3..da83a9a 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
@@ -46,7 +46,7 @@ import com.google.common.collect.ImmutableSet;
 
 import reactor.core.publisher.Mono;
 
-public class CassandraACLMapper {
+public class CassandraACLMapper implements ACLMapper {
     public interface Store {
         Mono<MailboxACL> getACL(CassandraId cassandraId);
 
@@ -168,18 +168,22 @@ public class CassandraACLMapper {
             });
     }
 
+    @Override
     public Mono<MailboxACL> getACL(CassandraId cassandraId) {
         return store().flatMap(store -> store.getACL(cassandraId));
     }
 
+    @Override
     public Mono<ACLDiff> updateACL(CassandraId cassandraId, 
MailboxACL.ACLCommand command) {
         return store().flatMap(store -> store.updateACL(cassandraId, command));
     }
 
+    @Override
     public Mono<ACLDiff> setACL(CassandraId cassandraId, MailboxACL 
mailboxACL) {
         return store().flatMap(store -> store.setACL(cassandraId, mailboxACL));
     }
 
+    @Override
     public Mono<Void> delete(CassandraId cassandraId) {
         return store().flatMap(store -> store.delete(cassandraId));
     }
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
index 17fcae8..3454619 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
@@ -70,7 +70,7 @@ public class CassandraMailboxMapper implements MailboxMapper {
     private final CassandraMailboxPathDAOImpl mailboxPathDAO;
     private final CassandraMailboxPathV2DAO mailboxPathV2DAO;
     private final CassandraMailboxPathV3DAO mailboxPathV3DAO;
-    private final CassandraACLMapper cassandraACLMapper;
+    private final ACLMapper aclMapper;
     private final CassandraUserMailboxRightsDAO userMailboxRightsDAO;
     private final CassandraSchemaVersionManager versionManager;
     private final CassandraConfiguration cassandraConfiguration;
@@ -82,7 +82,7 @@ public class CassandraMailboxMapper implements MailboxMapper {
                                   CassandraMailboxPathV2DAO mailboxPathV2DAO,
                                   CassandraMailboxPathV3DAO mailboxPathV3DAO,
                                   CassandraUserMailboxRightsDAO 
userMailboxRightsDAO,
-                                  CassandraACLMapper aclMapper,
+                                  ACLMapper aclMapper,
                                   CassandraSchemaVersionManager versionManager,
                                   CassandraConfiguration 
cassandraConfiguration) {
         this.mailboxDAO = mailboxDAO;
@@ -90,7 +90,7 @@ public class CassandraMailboxMapper implements MailboxMapper {
         this.mailboxPathV2DAO = mailboxPathV2DAO;
         this.mailboxPathV3DAO = mailboxPathV3DAO;
         this.userMailboxRightsDAO = userMailboxRightsDAO;
-        this.cassandraACLMapper = aclMapper;
+        this.aclMapper = aclMapper;
         this.versionManager = versionManager;
         this.cassandraConfiguration = cassandraConfiguration;
         this.secureRandom = new SecureRandom();
@@ -182,7 +182,7 @@ public class CassandraMailboxMapper implements 
MailboxMapper {
 
     private Mono<Mailbox> addAcl(Mailbox mailbox) {
         CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
-        return cassandraACLMapper.getACL(mailboxId)
+        return aclMapper.getACL(mailboxId)
             .map(acl -> {
                 mailbox.setACL(acl);
                 return mailbox;
@@ -236,7 +236,7 @@ public class CassandraMailboxMapper implements 
MailboxMapper {
     }
 
     private Mono<MailboxACL> retrieveAcl(CassandraId mailboxId) {
-        return cassandraACLMapper.getACL(mailboxId)
+        return aclMapper.getACL(mailboxId)
             .defaultIfEmpty(MailboxACL.EMPTY);
     }
 
@@ -341,13 +341,13 @@ public class CassandraMailboxMapper implements 
MailboxMapper {
     @Override
     public Mono<ACLDiff> updateACL(Mailbox mailbox, MailboxACL.ACLCommand 
mailboxACLCommand) {
         CassandraId cassandraId = (CassandraId) mailbox.getMailboxId();
-        return cassandraACLMapper.updateACL(cassandraId, mailboxACLCommand);
+        return aclMapper.updateACL(cassandraId, mailboxACLCommand);
     }
 
     @Override
     public Mono<ACLDiff> setACL(Mailbox mailbox, MailboxACL mailboxACL) {
         CassandraId cassandraId = (CassandraId) mailbox.getMailboxId();
-        return cassandraACLMapper.setACL(cassandraId, mailboxACL);
+        return aclMapper.setACL(cassandraId, mailboxACL);
     }
 
     private Mono<Mailbox> toMailboxWithAcl(Mailbox mailbox) {
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskRunner.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskRunner.java
index 4231d50..f7be117 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskRunner.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskRunner.java
@@ -25,7 +25,7 @@ import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
-import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper;
+import org.apache.james.mailbox.cassandra.mail.ACLMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -50,16 +50,16 @@ public class MailboxMergingTaskRunner {
     private final StoreMessageIdManager messageIdManager;
     private final CassandraMessageIdDAO cassandraMessageIdDAO;
     private final CassandraMailboxDAO mailboxDAO;
-    private final CassandraACLMapper cassandraACLMapper;
+    private final ACLMapper aclMapper;
     private final MailboxSession mailboxSession;
 
     @Inject
-    public MailboxMergingTaskRunner(MailboxManager mailboxManager, 
StoreMessageIdManager messageIdManager, CassandraMessageIdDAO 
cassandraMessageIdDAO, CassandraMailboxDAO mailboxDAO, CassandraACLMapper 
cassandraACLMapper) {
+    public MailboxMergingTaskRunner(MailboxManager mailboxManager, 
StoreMessageIdManager messageIdManager, CassandraMessageIdDAO 
cassandraMessageIdDAO, CassandraMailboxDAO mailboxDAO, ACLMapper aclMapper) {
         this.mailboxSession = 
mailboxManager.createSystemSession(Username.of("task"));
         this.messageIdManager = messageIdManager;
         this.cassandraMessageIdDAO = cassandraMessageIdDAO;
         this.mailboxDAO = mailboxDAO;
-        this.cassandraACLMapper = cassandraACLMapper;
+        this.aclMapper = aclMapper;
     }
 
     public Task.Result run(CassandraId oldMailboxId, CassandraId newMailboxId, 
MailboxMergingTask.Context context) {
@@ -91,10 +91,10 @@ public class MailboxMergingTaskRunner {
 
     private Mono<Void> mergeRights(CassandraId oldMailboxId, CassandraId 
newMailboxId) {
             return Flux.concat(
-                    cassandraACLMapper.getACL(oldMailboxId),
-                    cassandraACLMapper.getACL(newMailboxId))
+                    aclMapper.getACL(oldMailboxId),
+                    aclMapper.getACL(newMailboxId))
                 .reduce(Throwing.biFunction(MailboxACL::union))
-                .flatMap(union -> cassandraACLMapper.setACL(newMailboxId, 
union))
+                .flatMap(union -> aclMapper.setACL(newMailboxId, union))
                 .then();
     }
 }
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java
index c1c9ba1..eb3f20b 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java
@@ -38,6 +38,8 @@ import 
org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTOModule;
 import org.apache.james.json.DTO;
 import org.apache.james.json.DTOModule;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
+import org.apache.james.mailbox.cassandra.mail.ACLMapper;
+import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraUidProvider;
 import org.apache.james.mailbox.cassandra.mail.eventsourcing.acl.ACLModule;
 import org.apache.james.mailbox.model.MessageId;
@@ -76,6 +78,7 @@ public class GuiceUtils {
         return Modules.combine(
             binder -> 
binder.bind(MessageId.Factory.class).toInstance(messageIdFactory),
             binder -> 
binder.bind(UidProvider.class).to(CassandraUidProvider.class),
+            binder -> 
binder.bind(ACLMapper.class).to(CassandraACLMapper.class),
             binder -> binder.bind(BlobId.Factory.class).toInstance(new 
HashBlobId.Factory()),
             binder -> binder.bind(BlobStore.class).toProvider(() -> 
CassandraBlobStoreFactory.forTesting(session).passthrough()),
             binder -> binder.bind(Session.class).toInstance(session),
diff --git 
a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
 
b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
index 01e47ca..8a83afe 100644
--- 
a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
+++ 
b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
@@ -54,6 +54,7 @@ import 
org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
 import org.apache.james.mailbox.cassandra.DeleteMessageListener;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
+import org.apache.james.mailbox.cassandra.mail.ACLMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraACLDAOV1;
 import org.apache.james.mailbox.cassandra.mail.CassandraACLDAOV2;
 import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper;
@@ -181,6 +182,7 @@ public class CassandraMailboxModule extends AbstractModule {
         
bind(MailboxSessionMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
         
bind(SubscriptionMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
 
+        bind(ACLMapper.class).to(CassandraACLMapper.class);
         bind(ModSeqProvider.class).to(CassandraModSeqProvider.class);
         bind(UidProvider.class).to(CassandraUidProvider.class);
         bind(SubscriptionManager.class).to(StoreSubscriptionManager.class);

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

Reply via email to