You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2021/05/17 02:21:52 UTC

[james-project] 09/11: [REFACTORING] Hide CassandraACLMapper behind an interface

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 <bt...@linagora.com>
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: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org