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/11/21 02:00:35 UTC

[james-project] branch master updated (9ed9a15 -> ab2db33)

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

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


    from 9ed9a15  Add news about BenoƮt's presentation at ApacheCon
     new c00ea1c  JAMES-2982 Moving user constraints out of the webadmin markdown
     new b0c98f3  [Refactoring] JPAUidProvider do not need JVM pathLocker as we rely on transactions
     new 89a8a0b  [Refactoring] JPAModSeqProvider do not need JVM pathLocker as we rely on transactions
     new 117d65f  [Refactoring] JPAModSeqProvider: transaction upon reads are not required
     new 0bd003c  [Refactoring] JPAUidProvider: transaction upon reads are not required
     new 33d2a5b  [Refactoring] Get rid of AbstractMailboxPathLocker
     new bfbcb6c  [Refactoring] MailboxPathLocker deprecated executeWithLock method is never used
     new e5b2ed4  [Refactoring] MailboxPathLocker::executeWithLock session parameter is never used
     new 20dc04d  [Refactoring] Enum for log type
     new d7816a6  [Refactoring] Refactor abstract test class AbstractSubscriptionManagerTest to interface SubscriptionManagerContract
     new bd701ad  [Refactoring] Refactor abstract test class MailboxManagerStressTest to interface MailboxManagerStressContract
     new f356eb7  [Refactoring] Refactor abstract test class QuotaMessageManagerTest to interface QuotaMessageManagerContract
     new ab2db33  [Refactoring] MailboxFixture should be an interface

The 13 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../apache/james/mailbox/MailboxPathLocker.java    |  13 +-
 .../mailbox/AbstractSubscriptionManagerTest.java   | 107 --------------
 ...Test.java => MailboxManagerStressContract.java} |  40 ++---
 .../james/mailbox/SubscriptionManagerContract.java |  84 +++++++++++
 .../james/mailbox/fixture/MailboxFixture.java      |  16 +-
 ...rTest.java => QuotaMessageManagerContract.java} | 161 +++++++++++----------
 .../CassandraMailboxManagerStressTest.java         |  25 +++-
 .../CassandraSubscriptionManagerTest.java          |  17 ++-
 .../james/mailbox/jpa/mail/JPAModSeqProvider.java  |  62 ++++----
 .../james/mailbox/jpa/mail/JPAUidProvider.java     |  32 ++--
 .../main/resources/META-INF/spring/mailbox-jpa.xml |   7 +-
 .../mailbox/jpa/JPASubscriptionManagerTest.java    |  27 ++--
 .../mailbox/jpa/JpaMailboxManagerProvider.java     |   4 +-
 .../mailbox/jpa/JpaMailboxManagerStressTest.java   |  23 +--
 .../james/mailbox/jpa/mail/JPAMapperProvider.java  |   8 +-
 .../james/mailbox/maildir/MaildirFolder.java       |  74 +++++-----
 .../apache/james/mailbox/maildir/MaildirStore.java |   6 +-
 .../mailbox/maildir/mail/MaildirMailboxMapper.java |   8 +-
 .../mailbox/maildir/mail/MaildirMessageMapper.java |  16 +-
 .../DomainUserMaildirMailboxManagerStressTest.java |  25 ++--
 .../FullUserMaildirMailboxManagerStressTest.java   |  25 ++--
 .../maildir/MaildirSubscriptionManagerTest.java    |  26 +++-
 .../UserMaildirMailboxManagerStressTest.java       |  25 ++--
 .../inmemory/MemoryMailboxManagerStressTest.java   |  20 ++-
 .../InMemoryQuotaMailboxMessageManagerTest.java    |  25 +++-
 .../mailbox/store/AbstractMailboxPathLocker.java   |  54 -------
 .../james/mailbox/store/JVMMailboxPathLocker.java  |  40 ++---
 .../james/mailbox/store/NoMailboxPathLocker.java   |  16 +-
 .../james/mailbox/store/StoreMailboxManager.java   |   8 +-
 .../james/mailbox/store/StoreMessageManager.java   |  12 +-
 .../store/mail/AbstractLockingModSeqProvider.java  |  57 --------
 .../store/mail/AbstractLockingUidProvider.java     |  59 --------
 .../mpt/imapmailbox/jpa/host/JPAHostSystem.java    |   6 +-
 src/site/markdown/server/manage-webadmin.md        |  10 +-
 src/site/xdoc/server/config-users.xml              |  16 +-
 35 files changed, 525 insertions(+), 629 deletions(-)
 delete mode 100644 mailbox/api/src/test/java/org/apache/james/mailbox/AbstractSubscriptionManagerTest.java
 rename mailbox/api/src/test/java/org/apache/james/mailbox/{MailboxManagerStressTest.java => MailboxManagerStressContract.java} (78%)
 create mode 100644 mailbox/api/src/test/java/org/apache/james/mailbox/SubscriptionManagerContract.java
 rename mailbox/api/src/test/java/org/apache/james/mailbox/manager/{QuotaMessageManagerTest.java => QuotaMessageManagerContract.java} (50%)
 delete mode 100644 mailbox/store/src/main/java/org/apache/james/mailbox/store/AbstractMailboxPathLocker.java
 delete mode 100644 mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractLockingModSeqProvider.java
 delete mode 100644 mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractLockingUidProvider.java


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


[james-project] 02/13: [Refactoring] JPAUidProvider do not need JVM pathLocker as we rely on transactions

Posted by bt...@apache.org.
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

View the commit online:
https://github.com/apache/james-project/commit/b0c98f320a2c55b7187efe2d9374e49ef8ee2021

commit b0c98f320a2c55b7187efe2d9374e49ef8ee2021
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 18 17:36:34 2019 +0700

    [Refactoring] JPAUidProvider do not need JVM pathLocker as we rely on transactions
---
 .../james/mailbox/jpa/mail/JPAUidProvider.java     | 27 ++++++----
 .../main/resources/META-INF/spring/mailbox-jpa.xml |  3 +-
 .../mailbox/jpa/JPASubscriptionManagerTest.java    |  2 +-
 .../mailbox/jpa/JpaMailboxManagerProvider.java     |  2 +-
 .../james/mailbox/jpa/mail/JPAMapperProvider.java  |  2 +-
 .../store/mail/AbstractLockingUidProvider.java     | 59 ----------------------
 .../mpt/imapmailbox/jpa/host/JPAHostSystem.java    |  2 +-
 7 files changed, 22 insertions(+), 75 deletions(-)

diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java
index c58205f..503cf8d 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java
@@ -19,31 +19,30 @@
 package org.apache.james.mailbox.jpa.mail;
 
 import java.util.Optional;
+
 import javax.inject.Inject;
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.PersistenceException;
 
-import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.JPAId;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.model.Mailbox;
-import org.apache.james.mailbox.store.mail.AbstractLockingUidProvider;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.store.mail.UidProvider;
 
-public class JPAUidProvider extends AbstractLockingUidProvider {
+public class JPAUidProvider implements UidProvider {
 
     private final EntityManagerFactory factory;
 
     @Inject
-    public JPAUidProvider(MailboxPathLocker locker, EntityManagerFactory factory) {
-        super(locker);
+    public JPAUidProvider(EntityManagerFactory factory) {
         this.factory = factory;
     }
-    
-    
+
     @Override
     public Optional<MessageUid> lastUid(MailboxSession session, Mailbox mailbox) throws MailboxException {
         EntityManager manager = null;
@@ -70,12 +69,20 @@ public class JPAUidProvider extends AbstractLockingUidProvider {
     }
 
     @Override
-    protected MessageUid lockedNextUid(MailboxSession session, Mailbox mailbox) throws MailboxException {
+    public MessageUid nextUid(MailboxSession session, Mailbox mailbox) throws MailboxException {
+        return nextUid((JPAId) mailbox.getMailboxId());
+    }
+
+    @Override
+    public MessageUid nextUid(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+        return nextUid((JPAId) mailboxId);
+    }
+
+    private MessageUid nextUid(JPAId mailboxId) throws MailboxException {
         EntityManager manager = null;
         try {
             manager = factory.createEntityManager();
             manager.getTransaction().begin();
-            JPAId mailboxId = (JPAId) mailbox.getMailboxId();
             JPAMailbox m = manager.find(JPAMailbox.class, mailboxId.getRawId());
             long uid = m.consumeUid();
             manager.persist(m);
@@ -85,7 +92,7 @@ public class JPAUidProvider extends AbstractLockingUidProvider {
             if (manager != null && manager.getTransaction().isActive()) {
                 manager.getTransaction().rollback();
             }
-            throw new MailboxException("Unable to save next uid for mailbox " + mailbox, e);
+            throw new MailboxException("Unable to save next uid for mailbox " + mailboxId, e);
         } finally {
             if (manager != null) {
                 manager.close();
diff --git a/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml b/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml
index 0c2876e..f55401b 100644
--- a/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml
+++ b/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml
@@ -53,8 +53,7 @@
         <constructor-arg index="2" ref="jpa-modSeqProvider"/>
     </bean>
     <bean id="jpa-uidProvider" class="org.apache.james.mailbox.jpa.mail.JPAUidProvider">
-        <constructor-arg index="0" ref="jpa-locker"/>
-        <constructor-arg index="1" ref="entityManagerFactory"/>
+        <constructor-arg index="0" ref="entityManagerFactory"/>
     </bean>
     <bean id="jpa-modSeqProvider" class="org.apache.james.mailbox.jpa.mail.JPAModSeqProvider">
         <constructor-arg index="0" ref="jpa-locker"/>
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java
index 3e2cca1..8481f80 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java
@@ -38,7 +38,7 @@ class JPASubscriptionManagerTest extends AbstractSubscriptionManagerTest {
 
         EntityManagerFactory entityManagerFactory = JPA_TEST_CLUSTER.getEntityManagerFactory();
         JPAMailboxSessionMapperFactory mf = new JPAMailboxSessionMapperFactory(entityManagerFactory,
-            new JPAUidProvider(locker, entityManagerFactory),
+            new JPAUidProvider(entityManagerFactory),
             new JPAModSeqProvider(locker, entityManagerFactory));
 
         return new JPASubscriptionManager(mf);
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java
index 7e216ab..29e3162 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java
@@ -53,7 +53,7 @@ public class JpaMailboxManagerProvider {
     public static OpenJPAMailboxManager provideMailboxManager(JpaTestCluster jpaTestCluster) {
         EntityManagerFactory entityManagerFactory = jpaTestCluster.getEntityManagerFactory();
         JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
-        JPAMailboxSessionMapperFactory mf = new JPAMailboxSessionMapperFactory(entityManagerFactory, new JPAUidProvider(locker, entityManagerFactory), new JPAModSeqProvider(locker, entityManagerFactory));
+        JPAMailboxSessionMapperFactory mf = new JPAMailboxSessionMapperFactory(entityManagerFactory, new JPAUidProvider(entityManagerFactory), new JPAModSeqProvider(locker, entityManagerFactory));
 
         MailboxACLResolver aclResolver = new UnionMailboxACLResolver();
         GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
index b35a402..f06f7a1 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
@@ -63,7 +63,7 @@ public class JPAMapperProvider implements MapperProvider {
         JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
 
         JPAMessageMapper messageMapper = new JPAMessageMapper(MailboxSessionUtil.create(Username.of("benwa")),
-            new JPAUidProvider(locker, entityManagerFactory), 
+            new JPAUidProvider(entityManagerFactory),
             new JPAModSeqProvider(locker, entityManagerFactory), 
             entityManagerFactory);
 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractLockingUidProvider.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractLockingUidProvider.java
deleted file mode 100644
index e12b872..0000000
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractLockingUidProvider.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/****************************************************************
- * 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.store.mail;
-
-import org.apache.commons.lang3.NotImplementedException;
-import org.apache.james.mailbox.MailboxPathLocker;
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.MessageUid;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.Mailbox;
-import org.apache.james.mailbox.model.MailboxId;
-
-
-/**
- * Abstract base implementation of {@link UidProvider} which used the given {@link MailboxPathLocker} to 
- * lock the {@link Mailbox} while the next uid is generated
- */
-public abstract class AbstractLockingUidProvider implements UidProvider {
-
-    private final MailboxPathLocker locker;
-
-    public AbstractLockingUidProvider(MailboxPathLocker locker) {
-        this.locker = locker;
-    }
-    
-    @Override
-    public MessageUid nextUid(MailboxSession session, Mailbox mailbox) throws MailboxException {
-        boolean writeLock = true;
-        return locker.executeWithLock(session, mailbox.generateAssociatedPath(),
-            () -> lockedNextUid(session, mailbox),
-            writeLock);
-    }
-    
-    /**
-     * Generate the next uid to use while the {@link Mailbox} is locked
-     */
-    protected abstract MessageUid lockedNextUid(MailboxSession session, Mailbox mailbox) throws MailboxException;
-
-    @Override
-    public MessageUid nextUid(MailboxSession session, MailboxId mailboxId) {
-        throw new NotImplementedException("Not implemented");
-    }
-}
diff --git a/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java b/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
index 9c57525..e3f8ac1 100644
--- a/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
+++ b/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
@@ -94,7 +94,7 @@ public class JPAHostSystem extends JamesImapHostSystem {
         super.beforeTest();
         EntityManagerFactory entityManagerFactory = JPA_TEST_CLUSTER.getEntityManagerFactory();
         JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
-        JPAUidProvider uidProvider = new JPAUidProvider(locker, entityManagerFactory);
+        JPAUidProvider uidProvider = new JPAUidProvider(entityManagerFactory);
         JPAModSeqProvider modSeqProvider = new JPAModSeqProvider(locker, entityManagerFactory);
         JPAMailboxSessionMapperFactory mapperFactory = new JPAMailboxSessionMapperFactory(entityManagerFactory, uidProvider, modSeqProvider);
 


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


[james-project] 10/13: [Refactoring] Refactor abstract test class AbstractSubscriptionManagerTest to interface SubscriptionManagerContract

Posted by bt...@apache.org.
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

View the commit online:
https://github.com/apache/james-project/commit/d7816a6e30a47a4cba149d23920955276f2ecbaa

commit d7816a6e30a47a4cba149d23920955276f2ecbaa
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Mon Nov 18 16:05:36 2019 +0700

    [Refactoring] Refactor abstract test class AbstractSubscriptionManagerTest to interface SubscriptionManagerContract
---
 .../mailbox/AbstractSubscriptionManagerTest.java   | 107 ---------------------
 .../james/mailbox/SubscriptionManagerContract.java |  84 ++++++++++++++++
 .../CassandraSubscriptionManagerTest.java          |  17 +++-
 .../mailbox/jpa/JPASubscriptionManagerTest.java    |  22 +++--
 .../maildir/MaildirSubscriptionManagerTest.java    |  26 ++++-
 5 files changed, 134 insertions(+), 122 deletions(-)

diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/AbstractSubscriptionManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/AbstractSubscriptionManagerTest.java
deleted file mode 100644
index 2a0b5a3..0000000
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/AbstractSubscriptionManagerTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/****************************************************************
- * 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;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import org.apache.james.core.Username;
-import org.apache.james.mailbox.exception.SubscriptionException;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-/**
- * Abstract base class to test {@link SubscriptionManager} implementations
- * 
- *
- */
-public abstract class AbstractSubscriptionManagerTest {
-
-    private static final Username USER1 = Username.of("test");
-    private static final String MAILBOX1 = "test1";
-    private static final String MAILBOX2 = "test2";
-    private SubscriptionManager manager;
-    private MailboxSession session;
-
-    protected abstract SubscriptionManager createSubscriptionManager();
-
-    @BeforeEach
-    void setup() {
-        manager = createSubscriptionManager();
-        session = MailboxSessionUtil.create(USER1);
-        manager.startProcessingRequest(session);
-    }
-
-    @AfterEach
-    void teardown() throws SubscriptionException {
-        manager.unsubscribe(session, MAILBOX1);
-        manager.unsubscribe(session, MAILBOX2);
-        manager.endProcessingRequest(session);
-    }
-    
-    @Test
-    void user1ShouldNotHaveAnySubscriptionByDefault() throws SubscriptionException {
-        assertThat(manager.subscriptions(session)).isEmpty();
-    }
-    
-    
-    @Test
-    void user1ShouldBeAbleToSubscribeOneMailbox() throws SubscriptionException {
-        manager.subscribe(session, MAILBOX1);
-
-        assertThat(manager.subscriptions(session)).containsExactly(MAILBOX1);
-    }
-
-    @Test
-    void subscribeShouldBeIdempotent() throws SubscriptionException {
-        manager.subscribe(session, MAILBOX1);
-        manager.subscribe(session, MAILBOX1);
-        
-        assertThat(manager.subscriptions(session)).containsExactly(MAILBOX1);
-    }
-    
-    @Test
-    void user1ShouldBeAbleToSubscribeTwoMailbox() throws SubscriptionException {
-        manager.subscribe(session, MAILBOX1);
-        manager.subscribe(session, MAILBOX2);
-        
-        assertThat(manager.subscriptions(session)).containsOnly(MAILBOX1, MAILBOX2);
-    }
-    
-    @Test
-    void user1ShouldBeAbleToUnsubscribeOneMailbox() throws SubscriptionException {
-        manager.subscribe(session, MAILBOX1);
-        manager.subscribe(session, MAILBOX2);
-
-        manager.unsubscribe(session, MAILBOX1);
-        
-        assertThat(manager.subscriptions(session)).containsExactly(MAILBOX2);
-    }
-    
-    @Test
-    void unsubscribeShouldBeIdempotent() throws SubscriptionException {
-        manager.subscribe(session, MAILBOX1);
-        manager.subscribe(session, MAILBOX2);
-        manager.unsubscribe(session, MAILBOX1);
-        manager.unsubscribe(session, MAILBOX1);
-        
-        assertThat(manager.subscriptions(session)).containsExactly(MAILBOX2);
-    }
-    
-}
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/SubscriptionManagerContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/SubscriptionManagerContract.java
new file mode 100644
index 0000000..ef5a19a
--- /dev/null
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/SubscriptionManagerContract.java
@@ -0,0 +1,84 @@
+/****************************************************************
+ * 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;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.james.core.Username;
+import org.apache.james.mailbox.exception.SubscriptionException;
+import org.junit.jupiter.api.Test;
+
+public interface SubscriptionManagerContract {
+
+    Username USER1 = Username.of("test");
+    String MAILBOX1 = "test1";
+    String MAILBOX2 = "test2";
+    MailboxSession SESSION = MailboxSessionUtil.create(USER1);
+
+    SubscriptionManager getSubscriptionManager();
+    
+    @Test
+    default void user1ShouldNotHaveAnySubscriptionByDefault() throws SubscriptionException {
+        assertThat(getSubscriptionManager().subscriptions(SESSION)).isEmpty();
+    }
+    
+    @Test
+    default void user1ShouldBeAbleToSubscribeOneMailbox() throws SubscriptionException {
+        getSubscriptionManager().subscribe(SESSION, MAILBOX1);
+
+        assertThat(getSubscriptionManager().subscriptions(SESSION)).containsExactly(MAILBOX1);
+    }
+
+    @Test
+    default void subscribeShouldBeIdempotent() throws SubscriptionException {
+        getSubscriptionManager().subscribe(SESSION, MAILBOX1);
+        getSubscriptionManager().subscribe(SESSION, MAILBOX1);
+        
+        assertThat(getSubscriptionManager().subscriptions(SESSION)).containsExactly(MAILBOX1);
+    }
+    
+    @Test
+    default void user1ShouldBeAbleToSubscribeTwoMailbox() throws SubscriptionException {
+        getSubscriptionManager().subscribe(SESSION, MAILBOX1);
+        getSubscriptionManager().subscribe(SESSION, MAILBOX2);
+        
+        assertThat(getSubscriptionManager().subscriptions(SESSION)).containsOnly(MAILBOX1, MAILBOX2);
+    }
+    
+    @Test
+    default void user1ShouldBeAbleToUnsubscribeOneMailbox() throws SubscriptionException {
+        getSubscriptionManager().subscribe(SESSION, MAILBOX1);
+        getSubscriptionManager().subscribe(SESSION, MAILBOX2);
+
+        getSubscriptionManager().unsubscribe(SESSION, MAILBOX1);
+        
+        assertThat(getSubscriptionManager().subscriptions(SESSION)).containsExactly(MAILBOX2);
+    }
+    
+    @Test
+    default void unsubscribeShouldBeIdempotent() throws SubscriptionException {
+        getSubscriptionManager().subscribe(SESSION, MAILBOX1);
+        getSubscriptionManager().subscribe(SESSION, MAILBOX2);
+        getSubscriptionManager().unsubscribe(SESSION, MAILBOX1);
+        getSubscriptionManager().unsubscribe(SESSION, MAILBOX1);
+        
+        assertThat(getSubscriptionManager().subscriptions(SESSION)).containsExactly(MAILBOX2);
+    }
+    
+}
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
index 8dc2ad8..d3b5376 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
@@ -24,8 +24,8 @@ import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.blob.api.BlobStore;
-import org.apache.james.mailbox.AbstractSubscriptionManagerTest;
 import org.apache.james.mailbox.SubscriptionManager;
+import org.apache.james.mailbox.SubscriptionManagerContract;
 import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAO;
@@ -47,6 +47,7 @@ import org.apache.james.mailbox.cassandra.mail.CassandraUidProvider;
 import org.apache.james.mailbox.cassandra.mail.CassandraUserMailboxRightsDAO;
 import org.apache.james.mailbox.cassandra.modules.CassandraSubscriptionModule;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
@@ -54,13 +55,20 @@ import org.junit.jupiter.api.extension.RegisterExtension;
  * Test Cassandra subscription against some general purpose written code.
  */
 @ExtendWith(CassandraRestartExtension.class)
-class CassandraSubscriptionManagerTest extends AbstractSubscriptionManagerTest {
+class CassandraSubscriptionManagerTest implements SubscriptionManagerContract {
 
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraSubscriptionModule.MODULE);
 
+    private SubscriptionManager subscriptionManager;
+
     @Override
-    protected SubscriptionManager createSubscriptionManager() {
+    public SubscriptionManager getSubscriptionManager() {
+        return subscriptionManager;
+    }
+
+    @BeforeEach
+    void setUp() {
         CassandraMessageIdToImapUidDAO imapUidDAO = null;
         CassandraMessageDAO messageDAO = null;
         CassandraMessageIdDAO messageIdDAO = null;
@@ -81,7 +89,8 @@ class CassandraSubscriptionManagerTest extends AbstractSubscriptionManagerTest {
         BlobStore blobStore = null;
         CassandraUidProvider uidProvider = null;
         CassandraModSeqProvider modSeqProvider = null;
-        return new StoreSubscriptionManager(
+
+        subscriptionManager = new StoreSubscriptionManager(
             new CassandraMailboxSessionMapperFactory(
                 uidProvider,
                 modSeqProvider,
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java
index 7b84db4..d799321 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java
@@ -21,28 +21,38 @@ package org.apache.james.mailbox.jpa;
 import javax.persistence.EntityManagerFactory;
 
 import org.apache.james.backends.jpa.JpaTestCluster;
-import org.apache.james.mailbox.AbstractSubscriptionManagerTest;
 import org.apache.james.mailbox.SubscriptionManager;
+import org.apache.james.mailbox.SubscriptionManagerContract;
 import org.apache.james.mailbox.jpa.mail.JPAModSeqProvider;
 import org.apache.james.mailbox.jpa.mail.JPAUidProvider;
 import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
 
-class JPASubscriptionManagerTest extends AbstractSubscriptionManagerTest {
+class JPASubscriptionManagerTest implements SubscriptionManagerContract {
 
     private static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(JPAMailboxFixture.MAILBOX_PERSISTANCE_CLASSES);
-    
+
+    private SubscriptionManager subscriptionManager;
+
     @Override
-    protected SubscriptionManager createSubscriptionManager() {
+    public SubscriptionManager getSubscriptionManager() {
+        return subscriptionManager;
+    }
+
+    @BeforeEach
+    void setUp() {
         EntityManagerFactory entityManagerFactory = JPA_TEST_CLUSTER.getEntityManagerFactory();
-        JPAMailboxSessionMapperFactory mf = new JPAMailboxSessionMapperFactory(entityManagerFactory,
+
+        JPAMailboxSessionMapperFactory mapperFactory = new JPAMailboxSessionMapperFactory(entityManagerFactory,
             new JPAUidProvider(entityManagerFactory),
             new JPAModSeqProvider(entityManagerFactory));
 
-        return new JPASubscriptionManager(mf);
+        subscriptionManager = new JPASubscriptionManager(mapperFactory);
     }
 
     @AfterEach
     void close() {
         JPA_TEST_CLUSTER.clear(JPAMailboxFixture.MAILBOX_TABLE_NAMES);
     }
+
 }
diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirSubscriptionManagerTest.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirSubscriptionManagerTest.java
index 48e4664..474ad74 100644
--- a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirSubscriptionManagerTest.java
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirSubscriptionManagerTest.java
@@ -20,22 +20,38 @@ package org.apache.james.mailbox.maildir;
 
 import java.io.File;
 
-import org.apache.james.mailbox.AbstractSubscriptionManagerTest;
 import org.apache.james.mailbox.SubscriptionManager;
+import org.apache.james.mailbox.SubscriptionManagerContract;
+import org.apache.james.mailbox.exception.SubscriptionException;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.io.TempDir;
 
-class MaildirSubscriptionManagerTest extends AbstractSubscriptionManagerTest {
+class MaildirSubscriptionManagerTest implements SubscriptionManagerContract {
 
     @TempDir
     File tmpFolder;
-    
+
+    private SubscriptionManager subscriptionManager;
+
     @Override
-    protected SubscriptionManager createSubscriptionManager() {
+    public SubscriptionManager getSubscriptionManager() {
+        return subscriptionManager;
+    }
+
+    @BeforeEach
+    void setUp() {
         MaildirStore store = new MaildirStore(tmpFolder + "/Maildir/%domain/%user", new JVMMailboxPathLocker());
         MaildirMailboxSessionMapperFactory factory = new MaildirMailboxSessionMapperFactory(store);
-        return new StoreSubscriptionManager(factory);
+
+        subscriptionManager = new StoreSubscriptionManager(factory);
     }
 
+    @AfterEach
+    void tearDown() throws SubscriptionException {
+        subscriptionManager.unsubscribe(SESSION, MAILBOX1);
+        subscriptionManager.unsubscribe(SESSION, MAILBOX2);
+    }
 }


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


[james-project] 05/13: [Refactoring] JPAUidProvider: transaction upon reads are not required

Posted by bt...@apache.org.
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

View the commit online:
https://github.com/apache/james-project/commit/0bd003c431bd8444cdd98192a03aa4f39a6e50f4

commit 0bd003c431bd8444cdd98192a03aa4f39a6e50f4
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 18 17:44:20 2019 +0700

    [Refactoring] JPAUidProvider: transaction upon reads are not required
---
 .../java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java     | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java
index 503cf8d..199d8f9 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java
@@ -48,18 +48,13 @@ public class JPAUidProvider implements UidProvider {
         EntityManager manager = null;
         try {
             manager = factory.createEntityManager();
-            manager.getTransaction().begin();
             JPAId mailboxId = (JPAId) mailbox.getMailboxId();
             long uid = (Long) manager.createNamedQuery("findLastUid").setParameter("idParam", mailboxId.getRawId()).getSingleResult();
-            manager.getTransaction().commit();
             if (uid == 0) {
                 return Optional.empty();
             }
             return Optional.of(MessageUid.of(uid));
         } catch (PersistenceException e) {
-            if (manager != null && manager.getTransaction().isActive()) {
-                manager.getTransaction().rollback();
-            }
             throw new MailboxException("Unable to get last uid for mailbox " + mailbox, e);
         } finally {
             if (manager != null) {
@@ -92,7 +87,7 @@ public class JPAUidProvider implements UidProvider {
             if (manager != null && manager.getTransaction().isActive()) {
                 manager.getTransaction().rollback();
             }
-            throw new MailboxException("Unable to save next uid for mailbox " + mailboxId, e);
+            throw new MailboxException("Unable to save next uid for mailbox " + mailboxId.serialize(), e);
         } finally {
             if (manager != null) {
                 manager.close();


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


[james-project] 01/13: JAMES-2982 Moving user constraints out of the webadmin markdown

Posted by bt...@apache.org.
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

View the commit online:
https://github.com/apache/james-project/commit/c00ea1c2b85fb75397aeb97117ed4b8482b4d455

commit c00ea1c2b85fb75397aeb97117ed4b8482b4d455
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Mon Nov 18 14:21:01 2019 +0700

    JAMES-2982 Moving user constraints out of the webadmin markdown
---
 src/site/markdown/server/manage-webadmin.md | 10 ++--------
 src/site/xdoc/server/config-users.xml       | 16 +++++++++++++++-
 2 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md
index c8c5750..746ba37 100644
--- a/src/site/markdown/server/manage-webadmin.md
+++ b/src/site/markdown/server/manage-webadmin.md
@@ -294,14 +294,8 @@ Response codes:
 curl -XPUT http://ip:port/users/usernameToBeUsed -d '{"password":"passwordToBeUsed"}'
 ```
 
-Resource name usernameToBeUsed:
-
- - can not be null or empty
- - can not be more than 255 characters
- - can not contain '/'
- - When virtual hosting is enabled, it should follow the format `localPart` + `@` + `domainPart`, 
- otherwise the valid format doesn't contain `@`
- 
+Resource name usernameToBeUsed representing valid users, 
+hence it should match the criteria at [User Repositories documentation](/server/config-users.html) 
 
 Response codes:
 
diff --git a/src/site/xdoc/server/config-users.xml b/src/site/xdoc/server/config-users.xml
index 11fe61d..8024dc4 100644
--- a/src/site/xdoc/server/config-users.xml
+++ b/src/site/xdoc/server/config-users.xml
@@ -33,6 +33,20 @@
 
       <p>Consult <a href="https://github.com/apache/james-project/tree/master/server/app/src/main/resources/usersrepository.xml">usersrepository.xml</a> in GIT to get some examples and hints.</p>
 
+      <p>
+        A user has two attributes: username and password. A valid user should satisfy these criteria:
+      </p>
+      <ul>
+        <li>username and password cannot be null or empty</li>
+        <li>username should not be longer than 255 characters</li>
+        <li>username can not contain '/'</li>
+        <li>username can not contain multiple domain delimiter('@')</li>
+        <li>A username can have only a local part when virtualHosting is disabled. E.g.'myUser'</li>
+        <li>
+            When virtualHosting is enabled, a username should have a domain part,
+            and the domain part should be concatenated after a domain delimiter('@'). E.g. 'myuser@james.org'
+        </li>
+      </ul>
     </subsection>
 
     <subsection name="General configuration">
@@ -43,7 +57,7 @@
         <dt><strong>enableVirtualHosting</strong></dt>
         <dd>true or false. Add domain support for users (default: false, except for Cassandra Users Repository)</dd>
         <dt><strong>administratorId</strong></dt>
-        <dd>user's name. Allow an user to access to the <a href="https://tools.ietf.org/html/rfc4616#section-2">impersonation command</a>, acting on the behalf of any user.</dd>
+        <dd>user's name. Allow a user to access to the <a href="https://tools.ietf.org/html/rfc4616#section-2">impersonation command</a>, acting on the behalf of any user.</dd>
       </dl>
 
     </subsection>


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


[james-project] 09/13: [Refactoring] Enum for log type

Posted by bt...@apache.org.
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

View the commit online:
https://github.com/apache/james-project/commit/20dc04d2363fb7f5075d29a8f0ed2541798cf164

commit 20dc04d2363fb7f5075d29a8f0ed2541798cf164
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Nov 20 10:24:33 2019 +0700

    [Refactoring] Enum for log type
---
 .../apache/james/mailbox/MailboxPathLocker.java    |  7 ++++++-
 .../james/mailbox/maildir/MaildirFolder.java       | 18 ++++++++--------
 .../james/mailbox/store/JVMMailboxPathLocker.java  | 24 +++++++++++++---------
 .../james/mailbox/store/NoMailboxPathLocker.java   |  2 +-
 .../james/mailbox/store/StoreMailboxManager.java   |  4 ++--
 .../james/mailbox/store/StoreMessageManager.java   |  6 +++---
 6 files changed, 35 insertions(+), 26 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxPathLocker.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxPathLocker.java
index 3935eb5..3ce7533 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxPathLocker.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxPathLocker.java
@@ -31,12 +31,17 @@ import org.apache.james.mailbox.model.MailboxPath;
  * Implementations that are not able to handle read / write locks in a different way are needed to handle all locks as write lock.
  */
 public interface MailboxPathLocker {
+    enum LockType {
+        Read,
+        Write
+    }
+
     /**
      * Execute the {@link LockAwareExecution} while holding a lock on the
      * {@link MailboxPath}. If writeLock is true the implementation need to make sure that no other threads can read and write while the lock
      * is hold. The contract is the same as documented in {@link ReadWriteLock}.
      */
-    <T> T executeWithLock(MailboxPath path, LockAwareExecution<T> execution, boolean writeLock) throws MailboxException;
+    <T> T executeWithLock(MailboxPath path, LockAwareExecution<T> execution, LockType lockType) throws MailboxException;
 
     /**
      * Execute code while holding a lock
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
index 02eab2b..946f6f2 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
@@ -239,7 +239,7 @@ public class MaildirFolder {
             } catch (IOException e) {
                 throw new MailboxException("Unable to read last uid", e);
             }
-        }, true);
+        }, MailboxPathLocker.LockType.Write);
         
         
     }
@@ -383,7 +383,7 @@ public class MaildirFolder {
             } catch (IOException e) {
                 throw new MailboxException("Unable to read messagename for uid " + uid, e);
             }
-        }, true);
+        }, MailboxPathLocker.LockType.Write);
     }
     
     /**
@@ -421,7 +421,7 @@ public class MaildirFolder {
                 uidMap.putAll(truncateMap(createUidFile(), from, to));
             }
             return uidMap;
-        }, true);
+        }, MailboxPathLocker.LockType.Write);
     }
     
     public SortedMap<MessageUid, MaildirMessageName> getUidMap(MailboxSession session, FilenameFilter filter, MessageUid from, MessageUid to)
@@ -546,7 +546,7 @@ public class MaildirFolder {
                 throw new MailboxException("Unable to read recent messages", e);
             }
             return recentMessages;
-        }, true);
+        }, MailboxPathLocker.LockType.Write);
     }
     
     
@@ -809,7 +809,7 @@ public class MaildirFolder {
             } else {
                return uid;
             }
-        }, true);
+        }, MailboxPathLocker.LockType.Write);
 
     }
 
@@ -841,7 +841,7 @@ public class MaildirFolder {
                 throw new MailboxException("Unable to update msg with uid " + uid, e);
             }
             return null;
-        }, true);
+        }, MailboxPathLocker.LockType.Write);
 
     }
     
@@ -895,7 +895,7 @@ public class MaildirFolder {
             } catch (IOException e) {
                 throw new MailboxException("Unable to delete msg with uid " + uid, e);
             }
-        }, true);
+        }, MailboxPathLocker.LockType.Write);
         
 
     }
@@ -935,7 +935,7 @@ public class MaildirFolder {
 
             return new MailboxACL(props);
 
-        }, true);
+        }, MailboxPathLocker.LockType.Write);
         
     }
     
@@ -975,7 +975,7 @@ public class MaildirFolder {
                 return null;
 
             }
-        }, true);
+        }, MailboxPathLocker.LockType.Write);
     }
 
     
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java
index 81d5b08..8f346e1 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java
@@ -24,6 +24,7 @@ import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
+import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -37,7 +38,7 @@ public final class JVMMailboxPathLocker implements MailboxPathLocker {
     private final ConcurrentHashMap<MailboxPath, ReadWriteLock> paths = new ConcurrentHashMap<>();
 
     @Override
-    public <T> T executeWithLock(MailboxPath path, LockAwareExecution<T> execution, boolean writeLock) throws MailboxException {
+    public <T> T executeWithLock(MailboxPath path, LockAwareExecution<T> execution, LockType writeLock) throws MailboxException {
         try {
             lock(path, writeLock);
             return execution.execute();
@@ -46,7 +47,7 @@ public final class JVMMailboxPathLocker implements MailboxPathLocker {
         }
     }
 
-    private void lock(MailboxPath path, boolean writeLock) {
+    private void lock(MailboxPath path, LockType lockType) {
         ReadWriteLock lock = paths.get(path);
         if (lock == null) {
             lock = new ReentrantReadWriteLock();
@@ -55,22 +56,25 @@ public final class JVMMailboxPathLocker implements MailboxPathLocker {
                 lock = storedLock;
             }
         }
-        getLock(lock, writeLock).lock();
+        getLock(lock, lockType).lock();
     }
 
-    private void unlock(MailboxPath path, boolean writeLock) {
+    private void unlock(MailboxPath path, LockType lockType) {
         ReadWriteLock lock = paths.get(path);
 
         if (lock != null) {
-            getLock(lock, writeLock).unlock();
+            getLock(lock, lockType).unlock();
         }
     }
 
-    private Lock getLock(ReadWriteLock lock, boolean writeLock) {
-        if (writeLock) {
-            return lock.writeLock();
-        } else {
-            return lock.readLock();
+    private Lock getLock(ReadWriteLock lock, LockType lockType) {
+        switch (lockType) {
+            case Write:
+                return lock.writeLock();
+            case Read:
+                return lock.readLock();
+            default:
+                throw new NotImplementedException("Unsupported lock tuype " + lockType);
         }
     }
 }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/NoMailboxPathLocker.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/NoMailboxPathLocker.java
index a744888..de87a19 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/NoMailboxPathLocker.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/NoMailboxPathLocker.java
@@ -30,7 +30,7 @@ import org.apache.james.mailbox.model.MailboxPath;
  */
 public class NoMailboxPathLocker implements MailboxPathLocker {
     @Override
-    public <T> T executeWithLock(MailboxPath path, LockAwareExecution<T> execution, boolean writeLock) throws MailboxException {
+    public <T> T executeWithLock(MailboxPath path, LockAwareExecution<T> execution, LockType lockType) throws MailboxException {
         return execution.execute();
     }
 }
\ No newline at end of file
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index d25539f..444bf47 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -397,7 +397,7 @@ public class StoreMailboxManager implements MailboxManager {
             }
             return null;
 
-        }, true);
+        }, MailboxPathLocker.LockType.Write);
 
         return mailboxIds;
     }
@@ -528,7 +528,7 @@ public class StoreMailboxManager implements MailboxManager {
             }
             return null;
 
-        }, true);
+        }, MailboxPathLocker.LockType.Write);
     }
 
     @Override
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
index 4fb3e81..73954ff 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
@@ -465,7 +465,7 @@ public class StoreMessageManager implements MessageManager {
                     new MailboxIdRegistrationKey(mailbox.getMailboxId()))
                     .block();
                 return new ComposedMessageId(mailbox.getMailboxId(), data.getMessageId(), data.getUid());
-            }, true);
+            }, MailboxPathLocker.LockType.Write);
         }
     }
 
@@ -653,7 +653,7 @@ public class StoreMessageManager implements MessageManager {
         return locker.executeWithLock(toMailbox.getMailboxPath(), () -> {
             SortedMap<MessageUid, MessageMetaData> copiedUids = copy(set, toMailbox, session);
             return MessageRange.toRanges(new ArrayList<>(copiedUids.keySet()));
-        }, true);
+        }, MailboxPathLocker.LockType.Write);
     }
 
     /**
@@ -671,7 +671,7 @@ public class StoreMessageManager implements MessageManager {
         return locker.executeWithLock(toMailbox.getMailboxPath(), () -> {
             SortedMap<MessageUid, MessageMetaData> movedUids = move(set, toMailbox, session);
             return MessageRange.toRanges(new ArrayList<>(movedUids.keySet()));
-        }, true);
+        }, MailboxPathLocker.LockType.Write);
     }
 
     protected MessageMetaData appendMessageToStore(final MailboxMessage message, final List<MessageAttachment> messageAttachments, MailboxSession session) throws MailboxException {


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


[james-project] 12/13: [Refactoring] Refactor abstract test class QuotaMessageManagerTest to interface QuotaMessageManagerContract

Posted by bt...@apache.org.
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

View the commit online:
https://github.com/apache/james-project/commit/f356eb75037bd5d3aea75173990fa8c9283ecd5e

commit f356eb75037bd5d3aea75173990fa8c9283ecd5e
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Mon Nov 18 17:27:51 2019 +0700

    [Refactoring] Refactor abstract test class QuotaMessageManagerTest to interface QuotaMessageManagerContract
---
 ...rTest.java => QuotaMessageManagerContract.java} | 161 +++++++++++----------
 .../InMemoryQuotaMailboxMessageManagerTest.java    |  25 +++-
 2 files changed, 106 insertions(+), 80 deletions(-)

diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerContract.java
similarity index 50%
rename from mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerTest.java
rename to mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerContract.java
index c97b475..a793b01 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerContract.java
@@ -33,21 +33,15 @@ import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MailboxManager;
-import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.OverQuotaException;
 import org.apache.james.mailbox.mock.MockMail;
-import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.QuotaRoot;
-import org.apache.james.mailbox.quota.MaxQuotaManager;
-import org.apache.james.mailbox.quota.QuotaManager;
-import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mime4j.dom.Message;
 import org.assertj.core.api.SoftAssertions;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -56,155 +50,167 @@ import org.junit.jupiter.api.Test;
  * Tests are performed with sufficient rights to ensure all underlying functions behave well.
  * Quota are adjusted and we check that exceptions are well thrown.
  */
-public abstract class QuotaMessageManagerTest<T extends MailboxManager> {
-
-    private ManagerTestProvisionner provisionner;
-
-    private MessageManager messageManager;
-    private MailboxManager mailboxManager;
-    private MaxQuotaManager maxQuotaManager;
-    private QuotaManager quotaManager;
-    private QuotaRootResolver quotaRootResolver;
-
-    private MailboxSession session;
-    private MailboxPath inbox;
-    private MailboxPath subFolder;
-
-    protected abstract IntegrationResources<T> createResources() throws Exception;
-
-    @BeforeEach
-    void setUp() throws Exception {
-        IntegrationResources<T> resources = createResources();
-        this.provisionner = new ManagerTestProvisionner(resources);
-        this.provisionner.createMailboxes();
-        messageManager = this.provisionner.getMessageManager();
-        mailboxManager = resources.getMailboxManager();
-        session = this.provisionner.getSession();
-        inbox = this.provisionner.getInbox();
-        subFolder = this.provisionner.getSubFolder();
-        maxQuotaManager = resources.getMaxQuotaManager();
-        quotaRootResolver = resources.getQuotaRootResolver();
-        quotaManager = resources.getQuotaManager();
-    }
+public interface QuotaMessageManagerContract<T extends MailboxManager> {
+
+    IntegrationResources<T> getResources();
+
+    ManagerTestProvisionner getProvisionner();
 
     @Test
-    void testAppendOverQuotaMessages() throws Exception {
+    default void testAppendOverQuotaMessages() throws Exception {
+        ManagerTestProvisionner provisionner = getProvisionner();
+        IntegrationResources<T> resources = getResources();
+
         QuotaCountLimit maxMessageCount = QuotaCountLimit.count(8);
-        maxQuotaManager.setMaxMessage(quotaRootResolver.getQuotaRoot(inbox), maxMessageCount);
+        resources.getMaxQuotaManager().setMaxMessage(resources.getQuotaRootResolver().getQuotaRoot(provisionner.getInbox()), maxMessageCount);
 
         assertThatThrownBy(() -> provisionner.fillMailbox())
             .isInstanceOf(OverQuotaException.class);
     }
 
     @Test
-    void testAppendOverQuotaSize() throws Exception {
+    default void testAppendOverQuotaSize() throws Exception {
+        ManagerTestProvisionner provisionner = getProvisionner();
+        IntegrationResources<T> resources = getResources();
+
         QuotaSizeLimit maxQuotaSize = QuotaSizeLimit.size(3 * MockMail.MAIL_TEXT_PLAIN.length() + 1);
-        maxQuotaManager.setMaxStorage(quotaRootResolver.getQuotaRoot(inbox), maxQuotaSize);
+        resources.getMaxQuotaManager().setMaxStorage(resources.getQuotaRootResolver().getQuotaRoot(provisionner.getInbox()), maxQuotaSize);
 
         assertThatThrownBy(() -> provisionner.fillMailbox())
             .isInstanceOf(OverQuotaException.class);
     }
 
     @Test
-    void testCopyOverQuotaMessages() throws Exception {
+    default void testCopyOverQuotaMessages() throws Exception {
+        ManagerTestProvisionner provisionner = getProvisionner();
+        IntegrationResources<T> resources = getResources();
+
         try {
             provisionner.fillMailbox();
         } catch (OverQuotaException overQuotaException) {
             // Silent these exception as we don't want it to disturb the test
         }
         QuotaCountLimit maxMessageCount = QuotaCountLimit.count(15L);
-        maxQuotaManager.setMaxMessage(quotaRootResolver.getQuotaRoot(inbox), maxMessageCount);
+        resources.getMaxQuotaManager().setMaxMessage(resources.getQuotaRootResolver().getQuotaRoot(provisionner.getInbox()), maxMessageCount);
 
-        assertThatThrownBy(() -> mailboxManager.copyMessages(MessageRange.all(), inbox, subFolder, session))
+        assertThatThrownBy(() -> resources.getMailboxManager().copyMessages(
+                MessageRange.all(), provisionner.getInbox(), provisionner.getSubFolder(), provisionner.getSession()))
             .isInstanceOf(OverQuotaException.class);
     }
 
     @Test
-    void testCopyOverQuotaSize() throws Exception {
+    default void testCopyOverQuotaSize() throws Exception {
+        ManagerTestProvisionner provisionner = getProvisionner();
+        IntegrationResources<T> resources = getResources();
+
         QuotaSizeLimit maxQuotaSize = QuotaSizeLimit.size(15L * MockMail.MAIL_TEXT_PLAIN.length());
-        maxQuotaManager.setMaxStorage(quotaRootResolver.getQuotaRoot(inbox), maxQuotaSize);
+        resources.getMaxQuotaManager().setMaxStorage(resources.getQuotaRootResolver().getQuotaRoot(provisionner.getInbox()), maxQuotaSize);
         try {
             provisionner.fillMailbox();
         } catch (OverQuotaException overQuotaException) {
             // Silent these exception as we don't want it to disturb the test
         }
-        assertThatThrownBy(() -> mailboxManager.copyMessages(MessageRange.all(), inbox, subFolder, session))
+        assertThatThrownBy(() -> resources.getMailboxManager().copyMessages(
+                MessageRange.all(), provisionner.getInbox(), provisionner.getSubFolder(), provisionner.getSession()))
             .isInstanceOf(OverQuotaException.class);
     }
 
     @Test
-    void testRetrievalOverMaxMessageAfterExpunge() throws Exception {
+    default void testRetrievalOverMaxMessageAfterExpunge() throws Exception {
+        ManagerTestProvisionner provisionner = getProvisionner();
+        IntegrationResources<T> resources = getResources();
+
         QuotaCountLimit maxMessageCount = QuotaCountLimit.count(15L);
-        maxQuotaManager.setMaxMessage(quotaRootResolver.getQuotaRoot(inbox), maxMessageCount);
+        resources.getMaxQuotaManager().setMaxMessage(resources.getQuotaRootResolver().getQuotaRoot(provisionner.getInbox()), maxMessageCount);
         try {
             provisionner.fillMailbox();
         } catch (OverQuotaException overQuotaException) {
             // We are here over quota
         }
-        messageManager.expunge(MessageRange.all(), session);
+        provisionner.getMessageManager().expunge(MessageRange.all(), provisionner.getSession());
         // We have suppressed at list one message. Ensure we can add an other message. If is impossible, an exception will be thrown.
-        assertThatCode(() -> provisionner.appendMessage(messageManager, session, new FlagsBuilder().add(Flags.Flag.SEEN).build()))
+        assertThatCode(() -> provisionner.appendMessage(
+                provisionner.getMessageManager(), provisionner.getSession(), new FlagsBuilder().add(Flags.Flag.SEEN).build()))
             .doesNotThrowAnyException();
     }
 
     @Test
-    void testRetrievalOverMaxStorageAfterExpunge() throws Exception {
+    default void testRetrievalOverMaxStorageAfterExpunge() throws Exception {
+        ManagerTestProvisionner provisionner = getProvisionner();
+        IntegrationResources<T> resources = getResources();
+
         QuotaSizeLimit maxQuotaSize = QuotaSizeLimit.size(15 * MockMail.MAIL_TEXT_PLAIN.getBytes(StandardCharsets.UTF_8).length + 1);
-        maxQuotaManager.setMaxStorage(quotaRootResolver.getQuotaRoot(inbox), maxQuotaSize);
+        resources.getMaxQuotaManager().setMaxStorage(resources.getQuotaRootResolver().getQuotaRoot(provisionner.getInbox()), maxQuotaSize);
         try {
             provisionner.fillMailbox();
         } catch (OverQuotaException overQuotaException) {
             // We are here over quota
         }
-        messageManager.expunge(MessageRange.all(), session);
+        provisionner.getMessageManager().expunge(MessageRange.all(), provisionner.getSession());
         // We have suppressed at list one message. Ensure we can add an other message. If is impossible, an exception will be thrown.
-        assertThatCode(() -> provisionner.appendMessage(messageManager, session, new FlagsBuilder().add(Flags.Flag.SEEN).build()))
+        assertThatCode(() -> provisionner.appendMessage(
+                provisionner.getMessageManager(), provisionner.getSession(), new FlagsBuilder().add(Flags.Flag.SEEN).build()))
             .doesNotThrowAnyException();
     }
 
     @Test
-    void testRetrievalOverMaxMessageAfterDelete() throws Exception {
+    default void testRetrievalOverMaxMessageAfterDelete() throws Exception {
+        ManagerTestProvisionner provisionner = getProvisionner();
+        IntegrationResources<T> resources = getResources();
+
         QuotaCountLimit maxMessageCount = QuotaCountLimit.count(15L);
-        maxQuotaManager.setMaxMessage(quotaRootResolver.getQuotaRoot(inbox), maxMessageCount);
+        resources.getMaxQuotaManager().setMaxMessage(resources.getQuotaRootResolver().getQuotaRoot(provisionner.getInbox()), maxMessageCount);
         try {
             provisionner.fillMailbox();
         } catch (OverQuotaException overQuotaException) {
             // We are here over quota
         }
 
-        List<MessageUid> uids = messageManager.getMetaData(true, session, MessageManager.MetaData.FetchGroup.UNSEEN_COUNT).getRecent();
-        messageManager.delete(uids, session);
+        List<MessageUid> uids = provisionner.getMessageManager()
+            .getMetaData(true, provisionner.getSession(), MessageManager.MetaData.FetchGroup.UNSEEN_COUNT)
+            .getRecent();
+        provisionner.getMessageManager().delete(uids, provisionner.getSession());
         // We have suppressed at list one message. Ensure we can add an other message. If is impossible, an exception will be thrown.
-        assertThatCode(() -> provisionner.appendMessage(messageManager, session, new FlagsBuilder().add(Flags.Flag.SEEN).build()))
+        assertThatCode(() -> provisionner.appendMessage(
+                provisionner.getMessageManager(), provisionner.getSession(), new FlagsBuilder().add(Flags.Flag.SEEN).build()))
             .doesNotThrowAnyException();
     }
 
     @Test
-    void testRetrievalOverMaxStorageAfterDelete() throws Exception {
+    default void testRetrievalOverMaxStorageAfterDelete() throws Exception {
+        ManagerTestProvisionner provisionner = getProvisionner();
+        IntegrationResources<T> resources = getResources();
+
         QuotaSizeLimit maxQuotaSize = QuotaSizeLimit.size(15 * MockMail.MAIL_TEXT_PLAIN.getBytes(StandardCharsets.UTF_8).length + 1);
-        maxQuotaManager.setMaxStorage(quotaRootResolver.getQuotaRoot(inbox), maxQuotaSize);
+        resources.getMaxQuotaManager().setMaxStorage(resources.getQuotaRootResolver().getQuotaRoot(provisionner.getInbox()), maxQuotaSize);
         try {
             provisionner.fillMailbox();
         } catch (OverQuotaException overQuotaException) {
             // We are here over quota
         }
 
-        List<MessageUid> uids = messageManager.getMetaData(true, session, MessageManager.MetaData.FetchGroup.UNSEEN_COUNT).getRecent();
-        messageManager.delete(uids, session);
+        List<MessageUid> uids = provisionner.getMessageManager()
+            .getMetaData(true, provisionner.getSession(), MessageManager.MetaData.FetchGroup.UNSEEN_COUNT)
+            .getRecent();
+        provisionner.getMessageManager().delete(uids, provisionner.getSession());
         // We have suppressed at list one message. Ensure we can add an other message. If is impossible, an exception will be thrown.
-        assertThatCode(() -> provisionner.appendMessage(messageManager, session, new FlagsBuilder().add(Flags.Flag.SEEN).build()))
+        assertThatCode(() -> provisionner.appendMessage(
+                provisionner.getMessageManager(), provisionner.getSession(), new FlagsBuilder().add(Flags.Flag.SEEN).build()))
             .doesNotThrowAnyException();
     }
 
     @Test
-    void deletingAMailboxShouldDecreaseCurrentQuota() throws Exception {
+    default void deletingAMailboxShouldDecreaseCurrentQuota() throws Exception {
+        ManagerTestProvisionner provisionner = getProvisionner();
+        IntegrationResources<T> resources = getResources();
+
         provisionner.fillMailbox();
 
-        mailboxManager.deleteMailbox(inbox, session);
+        resources.getMailboxManager().deleteMailbox(provisionner.getInbox(), provisionner.getSession());
 
-        QuotaRoot quotaRoot = quotaRootResolver.getQuotaRoot(inbox);
-        Quota<QuotaCountLimit, QuotaCountUsage> messageQuota = quotaManager.getMessageQuota(quotaRoot);
-        Quota<QuotaSizeLimit, QuotaSizeUsage> storageQuota = quotaManager.getStorageQuota(quotaRoot);
+        QuotaRoot quotaRoot = resources.getQuotaRootResolver().getQuotaRoot(provisionner.getInbox());
+        Quota<QuotaCountLimit, QuotaCountUsage> messageQuota = resources.getQuotaManager().getMessageQuota(quotaRoot);
+        Quota<QuotaSizeLimit, QuotaSizeUsage> storageQuota = resources.getQuotaManager().getStorageQuota(quotaRoot);
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(messageQuota.getUsed()).isEqualTo(QuotaCountUsage.count(0));
             softly.assertThat(storageQuota.getUsed()).isEqualTo(QuotaSizeUsage.size(0));
@@ -212,21 +218,24 @@ public abstract class QuotaMessageManagerTest<T extends MailboxManager> {
     }
 
     @Test
-    void deletingAMailboxShouldPreserveQuotaOfOtherMailboxes() throws Exception {
+    default void deletingAMailboxShouldPreserveQuotaOfOtherMailboxes() throws Exception {
+        ManagerTestProvisionner provisionner = getProvisionner();
+        IntegrationResources<T> resources = getResources();
+
         provisionner.fillMailbox();
 
-        mailboxManager.getMailbox(subFolder, session)
+        resources.getMailboxManager().getMailbox(provisionner.getSubFolder(), provisionner.getSession())
             .appendMessage(MessageManager.AppendCommand.from(
                 Message.Builder.of()
                     .setSubject("test")
                     .setBody("testmail", StandardCharsets.UTF_8)
-                    .build()), session);
+                    .build()), provisionner.getSession());
 
-        mailboxManager.deleteMailbox(subFolder, session);
+        resources.getMailboxManager().deleteMailbox(provisionner.getSubFolder(), provisionner.getSession());
 
-        QuotaRoot quotaRoot = quotaRootResolver.getQuotaRoot(inbox);
-        Quota<QuotaCountLimit, QuotaCountUsage> messageQuota = quotaManager.getMessageQuota(quotaRoot);
-        Quota<QuotaSizeLimit, QuotaSizeUsage> storageQuota = quotaManager.getStorageQuota(quotaRoot);
+        QuotaRoot quotaRoot = resources.getQuotaRootResolver().getQuotaRoot(provisionner.getInbox());
+        Quota<QuotaCountLimit, QuotaCountUsage> messageQuota = resources.getQuotaManager().getMessageQuota(quotaRoot);
+        Quota<QuotaSizeLimit, QuotaSizeUsage> storageQuota = resources.getQuotaManager().getStorageQuota(quotaRoot);
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(messageQuota.getUsed()).isEqualTo(QuotaCountUsage.count(16));
             softly.assertThat(storageQuota.getUsed()).isEqualTo(QuotaSizeUsage.size(16 * 247));
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryQuotaMailboxMessageManagerTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryQuotaMailboxMessageManagerTest.java
index 0547189..5c236a5 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryQuotaMailboxMessageManagerTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryQuotaMailboxMessageManagerTest.java
@@ -19,8 +19,10 @@
 package org.apache.james.mailbox.inmemory.manager;
 
 import org.apache.james.mailbox.manager.IntegrationResources;
-import org.apache.james.mailbox.manager.QuotaMessageManagerTest;
+import org.apache.james.mailbox.manager.ManagerTestProvisionner;
+import org.apache.james.mailbox.manager.QuotaMessageManagerContract;
 import org.apache.james.mailbox.store.StoreMailboxManager;
+import org.junit.jupiter.api.BeforeEach;
 
 /**
  * Test for quota support upon basic MailboxMessage manager operation.
@@ -28,11 +30,26 @@ import org.apache.james.mailbox.store.StoreMailboxManager;
  * Tests are performed with sufficient rights to ensure all underlying functions behave well.
  * Quota are adjusted and we check that exceptions are well thrown.
  */
-public class InMemoryQuotaMailboxMessageManagerTest extends QuotaMessageManagerTest<StoreMailboxManager> {
+class InMemoryQuotaMailboxMessageManagerTest implements QuotaMessageManagerContract<StoreMailboxManager> {
+
+    private ManagerTestProvisionner provisionner;
+
+    private  IntegrationResources<StoreMailboxManager> resources;
+
+    @BeforeEach
+    void setUp() throws Exception {
+        this.resources = InMemoryIntegrationResources.defaultResources();
+        this.provisionner = new ManagerTestProvisionner(resources);
+        this.provisionner.createMailboxes();
+    }
 
     @Override
-    protected IntegrationResources<StoreMailboxManager> createResources() {
-        return InMemoryIntegrationResources.defaultResources();
+    public IntegrationResources<StoreMailboxManager> getResources() {
+        return resources;
     }
 
+    @Override
+    public ManagerTestProvisionner getProvisionner() {
+        return provisionner;
+    }
 }
\ No newline at end of file


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


[james-project] 08/13: [Refactoring] MailboxPathLocker::executeWithLock session parameter is never used

Posted by bt...@apache.org.
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

View the commit online:
https://github.com/apache/james-project/commit/e5b2ed426a31188f64714a89c3c91afd81ed2f09

commit e5b2ed426a31188f64714a89c3c91afd81ed2f09
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 18 17:54:58 2019 +0700

    [Refactoring] MailboxPathLocker::executeWithLock session parameter is never used
---
 .../apache/james/mailbox/MailboxPathLocker.java    |  2 +-
 .../james/mailbox/maildir/MaildirFolder.java       | 56 +++++++++++-----------
 .../apache/james/mailbox/maildir/MaildirStore.java |  6 +--
 .../mailbox/maildir/mail/MaildirMailboxMapper.java |  8 ++--
 .../mailbox/maildir/mail/MaildirMessageMapper.java | 16 +++----
 .../james/mailbox/store/JVMMailboxPathLocker.java  |  3 +-
 .../james/mailbox/store/NoMailboxPathLocker.java   |  3 +-
 .../james/mailbox/store/StoreMailboxManager.java   |  4 +-
 .../james/mailbox/store/StoreMessageManager.java   |  6 +--
 9 files changed, 51 insertions(+), 53 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxPathLocker.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxPathLocker.java
index 8e283fd..3935eb5 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxPathLocker.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxPathLocker.java
@@ -36,7 +36,7 @@ public interface MailboxPathLocker {
      * {@link MailboxPath}. If writeLock is true the implementation need to make sure that no other threads can read and write while the lock
      * is hold. The contract is the same as documented in {@link ReadWriteLock}.
      */
-    <T> T executeWithLock(MailboxSession session, MailboxPath path, LockAwareExecution<T> execution, boolean writeLock) throws MailboxException;
+    <T> T executeWithLock(MailboxPath path, LockAwareExecution<T> execution, boolean writeLock) throws MailboxException;
 
     /**
      * Execute code while holding a lock
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
index 82b6816..02eab2b 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
@@ -199,9 +199,9 @@ public class MaildirFolder {
     /**
      * Returns the last uid used in this mailbox
      */
-    public Optional<MessageUid> getLastUid(MailboxSession session) throws MailboxException {
+    public Optional<MessageUid> getLastUid() throws MailboxException {
         if (!lastUid.isPresent()) {
-            readLastUid(session);
+            readLastUid();
         }
         return lastUid;
     }
@@ -220,8 +220,8 @@ public class MaildirFolder {
      *
      * @throws MailboxException if there are problems with the uidList file
      */
-    private void readLastUid(MailboxSession session) throws MailboxException {
-        locker.executeWithLock(session, path,
+    private void readLastUid() throws MailboxException {
+        locker.executeWithLock(path,
             (LockAwareExecution<Void>) () -> {
             File uidList = uidFile;
 
@@ -352,9 +352,9 @@ public class MaildirFolder {
      * @return The {@link MaildirMessageName} that belongs to the uid
      * @throws MailboxException If the uidlist file cannot be found or read
      */
-    public MaildirMessageName getMessageNameByUid(final MailboxSession session, final MessageUid uid) throws MailboxException {
+    public MaildirMessageName getMessageNameByUid(final MessageUid uid) throws MailboxException {
        
-        return locker.executeWithLock(session, path, () -> {
+        return locker.executeWithLock(path, () -> {
             File uidList = uidFile;
             try (FileReader fileReader = new FileReader(uidList);
                  BufferedReader reader = new BufferedReader(fileReader)) {
@@ -395,9 +395,9 @@ public class MaildirFolder {
      * @return a {@link Map} whith all uids in the given range and associated {@link MaildirMessageName}s
      * @throws MailboxException if there is a problem with the uid list file
      */
-    public SortedMap<MessageUid, MaildirMessageName> getUidMap(final MailboxSession session, final MessageUid from, final MessageUid to)
+    public SortedMap<MessageUid, MaildirMessageName> getUidMap(final MessageUid from, final MessageUid to)
     throws MailboxException {
-        return locker.executeWithLock(session, path, () -> {
+        return locker.executeWithLock(path, () -> {
             final SortedMap<MessageUid, MaildirMessageName> uidMap = new TreeMap<>();
 
             File uidList = uidFile;
@@ -414,7 +414,7 @@ public class MaildirFolder {
                     }
                 } else {
                     // the uidList is up to date
-                    uidMap.putAll(readUidFile(session, from, to));
+                    uidMap.putAll(readUidFile(from, to));
                 }
             } else {
                 // the uidList does not exist
@@ -426,7 +426,7 @@ public class MaildirFolder {
     
     public SortedMap<MessageUid, MaildirMessageName> getUidMap(MailboxSession session, FilenameFilter filter, MessageUid from, MessageUid to)
     throws MailboxException {
-        SortedMap<MessageUid, MaildirMessageName> allUids = getUidMap(session, from, to);
+        SortedMap<MessageUid, MaildirMessageName> allUids = getUidMap(from, to);
         SortedMap<MessageUid, MaildirMessageName> filteredUids = new TreeMap<>();
         for (Entry<MessageUid, MaildirMessageName> entry : allUids.entrySet()) {
             if (filter.accept(null, entry.getValue().getFullName())) {
@@ -448,7 +448,7 @@ public class MaildirFolder {
      */
     public SortedMap<MessageUid, MaildirMessageName> getUidMap(MailboxSession session, FilenameFilter filter, int limit) throws MailboxException {
         MessageUid to = null;
-        SortedMap<MessageUid, MaildirMessageName> allUids = getUidMap(session, MessageUid.MIN_VALUE, to);
+        SortedMap<MessageUid, MaildirMessageName> allUids = getUidMap(MessageUid.MIN_VALUE, to);
         SortedMap<MessageUid, MaildirMessageName> filteredUids = new TreeMap<>();
         int theLimit = limit;
         if (limit < 1) {
@@ -473,11 +473,11 @@ public class MaildirFolder {
      * @return A {@link Map} with all uids and associated {@link MaildirMessageName}s of recent messages
      * @throws MailboxException If there is a problem with the uid list file
      */
-    public SortedMap<MessageUid, MaildirMessageName> getRecentMessages(final MailboxSession session) throws MailboxException {
+    public SortedMap<MessageUid, MaildirMessageName> getRecentMessages() throws MailboxException {
         final String[] recentFiles = getNewFolder().list();
         final LinkedList<String> lines = new LinkedList<>();
         final int theLimit = recentFiles.length;
-        return locker.executeWithLock(session, path, () -> {
+        return locker.executeWithLock(path, () -> {
             final SortedMap<MessageUid, MaildirMessageName> recentMessages = new TreeMap<>();
 
             File uidList = uidFile;
@@ -631,7 +631,7 @@ public class MaildirFolder {
         return uidMap;
     }
 
-    private Map<MessageUid, MaildirMessageName> readUidFile(MailboxSession session, MessageUid from, MessageUid to) throws MailboxException {
+    private Map<MessageUid, MaildirMessageName> readUidFile(MessageUid from, MessageUid to) throws MailboxException {
         final Map<MessageUid, MaildirMessageName> uidMap = new HashMap<>();
 
         File uidList = uidFile;
@@ -749,8 +749,8 @@ public class MaildirFolder {
      * @param name The name of the message's file
      * @return The uid of the message
      */
-    public MessageUid appendMessage(MailboxSession session, final String name) throws MailboxException {
-        return locker.executeWithLock(session, path, () -> {
+    public MessageUid appendMessage(final String name) throws MailboxException {
+        return locker.executeWithLock(path, () -> {
             File uidList = uidFile;
             MessageUid uid = null;
             try {
@@ -816,8 +816,8 @@ public class MaildirFolder {
     /**
      * Updates an entry in the uid list.
      */
-    public void update(MailboxSession session, final MessageUid uid, final String messageName) throws MailboxException {
-        locker.executeWithLock(session, path, (LockAwareExecution<Void>) () -> {
+    public void update(final MessageUid uid, final String messageName) throws MailboxException {
+        locker.executeWithLock(path, (LockAwareExecution<Void>) () -> {
             File uidList = uidFile;
             try (FileReader fileReader = new FileReader(uidList);
                 BufferedReader reader = new BufferedReader(fileReader)) {
@@ -852,8 +852,8 @@ public class MaildirFolder {
      * @return The {@link MaildirMessageName} of the deleted message
      * @throws MailboxException If the file cannot be deleted of there is a problem with the uid list
      */
-    public MaildirMessageName delete(final MailboxSession session, final MessageUid uid) throws MailboxException {        
-        return locker.executeWithLock(session, path, () -> {
+    public MaildirMessageName delete(final MessageUid uid) throws MailboxException {
+        return locker.executeWithLock(path, () -> {
             File uidList = uidFile;
             MaildirMessageName deletedMessage = null;
             try (FileReader fileReader = new FileReader(uidList);
@@ -908,9 +908,9 @@ public class MaildirFolder {
         return getRootFile().getAbsolutePath();
     }
     
-    public MailboxACL getACL(MailboxSession session) throws MailboxException {
+    public MailboxACL getACL() throws MailboxException {
         if (acl == null) {
-            acl = readACL(session);
+            acl = readACL();
         }
         return acl;
     }
@@ -920,9 +920,9 @@ public class MaildirFolder {
      *
      * @throws MailboxException if there are problems with the aclFile file
      */
-    private MailboxACL readACL(MailboxSession session) throws MailboxException {
+    private MailboxACL readACL() throws MailboxException {
         // FIXME Do we need this locking?
-        return locker.executeWithLock(session, path, (LockAwareExecution<MailboxACL>) () -> {
+        return locker.executeWithLock(path, (LockAwareExecution<MailboxACL>) () -> {
             File f = aclFile;
             Properties props = new Properties();
             if (f.exists()) {
@@ -939,19 +939,19 @@ public class MaildirFolder {
         
     }
     
-    public void setACL(MailboxSession session, MailboxACL acl) throws MailboxException {
+    public void setACL(MailboxACL acl) throws MailboxException {
         MailboxACL old = this.acl;
         if (!Objects.equals(old, acl)) {
             /* change only if different */
-            saveACL(acl, session);
+            saveACL(acl);
             this.acl = acl;
         }
         
     }
 
-    private void saveACL(final MailboxACL acl, MailboxSession session) throws MailboxException {
+    private void saveACL(final MailboxACL acl) throws MailboxException {
         // FIXME Do we need this locking?
-        locker.executeWithLock(session, path, new LockAwareExecution<Void>() {
+        locker.executeWithLock(path, new LockAwareExecution<Void>() {
             
             @Override
             public Void execute() throws MailboxException {
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
index fe07f53..a2384ec 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
@@ -132,7 +132,7 @@ public class MaildirStore implements UidProvider, ModSeqProvider {
         try {
             Mailbox loadedMailbox = new Mailbox(mailboxPath, folder.getUidValidity());
             loadedMailbox.setMailboxId(folder.readMailboxId());
-            loadedMailbox.setACL(folder.getACL(session));
+            loadedMailbox.setACL(folder.getACL());
             return loadedMailbox;
         } catch (IOException e) {
             throw new MailboxException("Unable to load Mailbox " + mailboxPath, e);
@@ -251,7 +251,7 @@ public class MaildirStore implements UidProvider, ModSeqProvider {
     @Override
     public MessageUid nextUid(MailboxSession session, Mailbox mailbox) throws MailboxException {
         try {
-            return createMaildirFolder(mailbox).getLastUid(session)
+            return createMaildirFolder(mailbox).getLastUid()
                 .map(MessageUid::next)
                 .orElse(MessageUid.MIN_VALUE);
         } catch (MailboxException e) {
@@ -275,7 +275,7 @@ public class MaildirStore implements UidProvider, ModSeqProvider {
 
     @Override
     public Optional<MessageUid> lastUid(MailboxSession session, Mailbox mailbox) throws MailboxException {
-       return createMaildirFolder(mailbox).getLastUid(session);
+       return createMaildirFolder(mailbox).getLastUid();
     }
 
     /**
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
index 9e0510f..50232e8 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
@@ -218,7 +218,7 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail
                     }
                 }
             }
-            folder.setACL(session, mailbox.getACL());
+            folder.setACL(mailbox.getACL());
         } catch (MailboxNotFoundException e) {
             // it cannot be found and is thus new
             MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
@@ -246,7 +246,7 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail
                 throw new MailboxException("Failed to save Mailbox " + mailbox, ioe);
 
             }
-            folder.setACL(session, mailbox.getACL());
+            folder.setACL(mailbox.getACL());
         }
         return maildirId;
     }
@@ -319,7 +319,7 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
         MailboxACL oldACL = mailbox.getACL();
         MailboxACL newACL = mailbox.getACL().apply(mailboxACLCommand);
-        folder.setACL(session, newACL);
+        folder.setACL(newACL);
         mailbox.setACL(newACL);
         return ACLDiff.computeDiff(oldACL, newACL);
     }
@@ -328,7 +328,7 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail
     public ACLDiff setACL(Mailbox mailbox, MailboxACL mailboxACL) throws MailboxException {
         MailboxACL oldAcl = mailbox.getACL();
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
-        folder.setACL(session, mailboxACL);
+        folder.setACL(mailboxACL);
         mailbox.setACL(mailboxACL);
         return ACLDiff.computeDiff(oldAcl, mailboxACL);
     }
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
index 2c9e427..6fccddd 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
@@ -100,7 +100,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper {
     public void delete(Mailbox mailbox, MailboxMessage message) throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
         try {
-            folder.delete(mailboxSession, message.getUid());
+            folder.delete(message.getUid());
         } catch (MailboxException e) {
             throw new MailboxException("Unable to delete MailboxMessage " + message + " in Mailbox " + mailbox, e);
         }
@@ -135,7 +135,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper {
     @Override
     public List<MessageUid> findRecentMessageUidsInMailbox(Mailbox mailbox) throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
-        SortedMap<MessageUid, MaildirMessageName> recentMessageNames = folder.getRecentMessages(mailboxSession);
+        SortedMap<MessageUid, MaildirMessageName> recentMessageNames = folder.getRecentMessages();
         return new ArrayList<>(recentMessageNames.keySet());
 
     }
@@ -170,7 +170,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper {
             Flags newFlags = member.createFlags();
 
             try {
-                MaildirMessageName messageName = folder.getMessageNameByUid(mailboxSession, member.getUid());
+                MaildirMessageName messageName = folder.getMessageNameByUid(member.getUid());
                 if (messageName != null) {
                     File messageFile = messageName.getFile();
                     messageName.setFlags(member.createFlags());
@@ -207,7 +207,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper {
                         .build());
 
                     MessageUid uid = member.getUid();
-                    folder.update(mailboxSession, uid, newMessageName);
+                    folder.update(uid, newMessageName);
                 }
             } catch (IOException e) {
                 throw new MailboxException("Failure while save MailboxMessage " + member + " in Mailbox " + mailbox, e);
@@ -335,7 +335,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper {
             throw new MailboxException("Failure while save MailboxMessage " + message + " in Mailbox " + mailbox, e);
         }
         try {
-            uid = folder.appendMessage(mailboxSession, newMessageFile.getName());
+            uid = folder.appendMessage(newMessageFile.getName());
             message.setUid(uid);
             message.setModSeq(newMessageFile.lastModified());
             return message.metaData();
@@ -362,7 +362,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper {
             throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
         try {
-            MaildirMessageName messageName = folder.getMessageNameByUid(mailboxSession, from);
+            MaildirMessageName messageName = folder.getMessageNameByUid(from);
 
             ArrayList<MailboxMessage> messages = new ArrayList<>();
             if (messageName != null && messageName.getFile().exists()) {
@@ -384,7 +384,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper {
             if (filter != null) {
                 uidMap = folder.getUidMap(mailboxSession, filter, from, to);
             } else {
-                uidMap = folder.getUidMap(mailboxSession, from, to);
+                uidMap = folder.getUidMap(from, to);
             }
 
             ArrayList<MailboxMessage> messages = new ArrayList<>();
@@ -425,7 +425,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper {
             throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
         try {
-            MaildirMessageName messageName = folder.getMessageNameByUid(mailboxSession, uid);
+            MaildirMessageName messageName = folder.getMessageNameByUid(uid);
             ArrayList<MailboxMessage> messages = new ArrayList<>();
             if (MaildirMessageName.FILTER_DELETED_MESSAGES.accept(null, messageName.getFullName())) {
                 messages.add(new MaildirMailboxMessage(mailbox, uid, messageName));
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java
index c40f18c..81d5b08 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java
@@ -25,7 +25,6 @@ import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import org.apache.james.mailbox.MailboxPathLocker;
-import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxPath;
 
@@ -38,7 +37,7 @@ public final class JVMMailboxPathLocker implements MailboxPathLocker {
     private final ConcurrentHashMap<MailboxPath, ReadWriteLock> paths = new ConcurrentHashMap<>();
 
     @Override
-    public <T> T executeWithLock(MailboxSession session, MailboxPath path, LockAwareExecution<T> execution, boolean writeLock) throws MailboxException {
+    public <T> T executeWithLock(MailboxPath path, LockAwareExecution<T> execution, boolean writeLock) throws MailboxException {
         try {
             lock(path, writeLock);
             return execution.execute();
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/NoMailboxPathLocker.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/NoMailboxPathLocker.java
index 279ebbd..a744888 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/NoMailboxPathLocker.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/NoMailboxPathLocker.java
@@ -20,7 +20,6 @@
 package org.apache.james.mailbox.store;
 
 import org.apache.james.mailbox.MailboxPathLocker;
-import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxPath;
 
@@ -31,7 +30,7 @@ import org.apache.james.mailbox.model.MailboxPath;
  */
 public class NoMailboxPathLocker implements MailboxPathLocker {
     @Override
-    public <T> T executeWithLock(MailboxSession session, MailboxPath path, LockAwareExecution<T> execution, boolean writeLock) throws MailboxException {
+    public <T> T executeWithLock(MailboxPath path, LockAwareExecution<T> execution, boolean writeLock) throws MailboxException {
         return execution.execute();
     }
 }
\ No newline at end of file
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 877fca0..d25539f 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -377,7 +377,7 @@ public class StoreMailboxManager implements MailboxManager {
 
     private List<MailboxId> performConcurrentMailboxCreation(MailboxSession mailboxSession, MailboxPath mailbox) throws MailboxException {
         List<MailboxId> mailboxIds = new ArrayList<>();
-        locker.executeWithLock(mailboxSession, mailbox, (LockAwareExecution<Void>) () -> {
+        locker.executeWithLock(mailbox, (LockAwareExecution<Void>) () -> {
             if (!mailboxExists(mailbox, mailboxSession)) {
                 Mailbox m = doCreateMailbox(mailbox);
                 MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession);
@@ -506,7 +506,7 @@ public class StoreMailboxManager implements MailboxManager {
             .expression(new PrefixedWildcard(from.getName() + getDelimiter()))
             .build()
             .asUserBound();
-        locker.executeWithLock(session, from, (LockAwareExecution<Void>) () -> {
+        locker.executeWithLock(from, (LockAwareExecution<Void>) () -> {
             List<Mailbox> subMailboxes = mapper.findMailboxWithPathLike(query);
             for (Mailbox sub : subMailboxes) {
                 String subOriginalName = sub.getName();
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
index 5cfca6d..4fb3e81 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
@@ -451,7 +451,7 @@ public class StoreMessageManager implements MessageManager {
 
             new QuotaChecker(quotaManager, quotaRootResolver, mailbox).tryAddition(1, size);
 
-            return locker.executeWithLock(mailboxSession, getMailboxPath(), () -> {
+            return locker.executeWithLock(getMailboxPath(), () -> {
                 MessageMetaData data = appendMessageToStore(message, attachments, mailboxSession);
 
                 Mailbox mailbox = getMailboxEntity();
@@ -650,7 +650,7 @@ public class StoreMessageManager implements MessageManager {
             throw new ReadOnlyException(toMailbox.getMailboxPath());
         }
 
-        return locker.executeWithLock(session, toMailbox.getMailboxPath(), () -> {
+        return locker.executeWithLock(toMailbox.getMailboxPath(), () -> {
             SortedMap<MessageUid, MessageMetaData> copiedUids = copy(set, toMailbox, session);
             return MessageRange.toRanges(new ArrayList<>(copiedUids.keySet()));
         }, true);
@@ -668,7 +668,7 @@ public class StoreMessageManager implements MessageManager {
         }
 
         //TODO lock the from mailbox too, in a non-deadlocking manner - how?
-        return locker.executeWithLock(session, toMailbox.getMailboxPath(), () -> {
+        return locker.executeWithLock(toMailbox.getMailboxPath(), () -> {
             SortedMap<MessageUid, MessageMetaData> movedUids = move(set, toMailbox, session);
             return MessageRange.toRanges(new ArrayList<>(movedUids.keySet()));
         }, true);


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


[james-project] 04/13: [Refactoring] JPAModSeqProvider: transaction upon reads are not required

Posted by bt...@apache.org.
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

View the commit online:
https://github.com/apache/james-project/commit/117d65f8bcc4ba6f99de63ebe1c63f05da85a16d

commit 117d65f8bcc4ba6f99de63ebe1c63f05da85a16d
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 18 17:44:06 2019 +0700

    [Refactoring] JPAModSeqProvider: transaction upon reads are not required
---
 .../apache/james/mailbox/jpa/mail/JPAModSeqProvider.java    | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAModSeqProvider.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAModSeqProvider.java
index 99e26ba..d1da257 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAModSeqProvider.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAModSeqProvider.java
@@ -75,7 +75,7 @@ public class JPAModSeqProvider implements ModSeqProvider {
             if (manager != null && manager.getTransaction().isActive()) {
                 manager.getTransaction().rollback();
             }
-            throw new MailboxException("Unable to save highest mod-sequence for mailbox " + mailboxId, e);
+            throw new MailboxException("Unable to save highest mod-sequence for mailbox " + mailboxId.serialize(), e);
         } finally {
             if (manager != null) {
                 manager.close();
@@ -87,15 +87,12 @@ public class JPAModSeqProvider implements ModSeqProvider {
         EntityManager manager = null;
         try {
             manager = factory.createEntityManager();
-            manager.getTransaction().begin();
-            long highest = (Long) manager.createNamedQuery("findHighestModSeq").setParameter("idParam", mailboxId.getRawId()).getSingleResult();
-            manager.getTransaction().commit();
+            long highest = (Long) manager.createNamedQuery("findHighestModSeq")
+                .setParameter("idParam", mailboxId.getRawId())
+                .getSingleResult();
             return highest;
         } catch (PersistenceException e) {
-            if (manager != null && manager.getTransaction().isActive()) {
-                manager.getTransaction().rollback();
-            }
-            throw new MailboxException("Unable to get highest mod-sequence for mailbox " + mailboxId, e);
+            throw new MailboxException("Unable to get highest mod-sequence for mailbox " + mailboxId.serialize(), e);
         } finally {
             if (manager != null) {
                 manager.close();


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


[james-project] 13/13: [Refactoring] MailboxFixture should be an interface

Posted by bt...@apache.org.
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

View the commit online:
https://github.com/apache/james-project/commit/ab2db336ccf021ee42070fa2c6a092fd776f6f11

commit ab2db336ccf021ee42070fa2c6a092fd776f6f11
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Tue Nov 19 14:01:55 2019 +0700

    [Refactoring] MailboxFixture should be an interface
---
 .../org/apache/james/mailbox/fixture/MailboxFixture.java | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/fixture/MailboxFixture.java b/mailbox/api/src/test/java/org/apache/james/mailbox/fixture/MailboxFixture.java
index 7f164ba..4024ea9 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/fixture/MailboxFixture.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/fixture/MailboxFixture.java
@@ -22,13 +22,13 @@ package org.apache.james.mailbox.fixture;
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MailboxPath;
 
-public class MailboxFixture {
-    public static final Username ALICE = Username.of("alice");
-    public static final Username BOB = Username.of("bob");
-    public static final Username CEDRIC = Username.of("cedric");
+public interface MailboxFixture {
+    Username ALICE = Username.of("alice");
+    Username BOB = Username.of("bob");
+    Username CEDRIC = Username.of("cedric");
 
-    public static final MailboxPath INBOX_ALICE = MailboxPath.forUser(ALICE, "INBOX");
-    public static final MailboxPath OUTBOX_ALICE = MailboxPath.forUser(ALICE, "OUTBOX");
-    public static final MailboxPath SENT_ALICE = MailboxPath.forUser(ALICE, "SENT");
-    public static final MailboxPath INBOX_BOB = MailboxPath.forUser(BOB, "INBOX");
+    MailboxPath INBOX_ALICE = MailboxPath.forUser(ALICE, "INBOX");
+    MailboxPath OUTBOX_ALICE = MailboxPath.forUser(ALICE, "OUTBOX");
+    MailboxPath SENT_ALICE = MailboxPath.forUser(ALICE, "SENT");
+    MailboxPath INBOX_BOB = MailboxPath.forUser(BOB, "INBOX");
 }


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


[james-project] 03/13: [Refactoring] JPAModSeqProvider do not need JVM pathLocker as we rely on transactions

Posted by bt...@apache.org.
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

View the commit online:
https://github.com/apache/james-project/commit/89a8a0b5ff4297f53d8140b8d34df79a8a94bb5b

commit 89a8a0b5ff4297f53d8140b8d34df79a8a94bb5b
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 18 17:42:27 2019 +0700

    [Refactoring] JPAModSeqProvider do not need JVM pathLocker as we rely on transactions
---
 .../james/mailbox/jpa/mail/JPAModSeqProvider.java  | 55 ++++++++++++---------
 .../main/resources/META-INF/spring/mailbox-jpa.xml |  4 +-
 .../mailbox/jpa/JPASubscriptionManagerTest.java    |  5 +-
 .../mailbox/jpa/JpaMailboxManagerProvider.java     |  4 +-
 .../james/mailbox/jpa/mail/JPAMapperProvider.java  |  6 +--
 .../store/mail/AbstractLockingModSeqProvider.java  | 57 ----------------------
 .../mpt/imapmailbox/jpa/host/JPAHostSystem.java    |  4 +-
 7 files changed, 38 insertions(+), 97 deletions(-)

diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAModSeqProvider.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAModSeqProvider.java
index 2f267fa..99e26ba 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAModSeqProvider.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAModSeqProvider.java
@@ -23,41 +23,59 @@ import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.PersistenceException;
 
-import org.apache.commons.lang3.NotImplementedException;
-import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.JPAId;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
-import org.apache.james.mailbox.store.mail.AbstractLockingModSeqProvider;
+import org.apache.james.mailbox.store.mail.ModSeqProvider;
 
-public class JPAModSeqProvider extends AbstractLockingModSeqProvider {
+public class JPAModSeqProvider implements ModSeqProvider {
 
     private final EntityManagerFactory factory;
 
     @Inject
-    public JPAModSeqProvider(MailboxPathLocker locker, EntityManagerFactory factory) {
-        super(locker);
+    public JPAModSeqProvider(EntityManagerFactory factory) {
         this.factory = factory;
     }
 
     @Override
     public long highestModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
+        JPAId mailboxId = (JPAId) mailbox.getMailboxId();
+        return highestModSeq(mailboxId);
+    }
+
+    @Override
+    public long nextModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
+        return nextModSeq((JPAId) mailbox.getMailboxId());
+    }
+
+    @Override
+    public long nextModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+        return nextModSeq((JPAId) mailboxId);
+    }
+
+    @Override
+    public long highestModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+        return highestModSeq((JPAId) mailboxId);
+    }
+
+    private long nextModSeq(JPAId mailboxId) throws MailboxException {
         EntityManager manager = null;
         try {
             manager = factory.createEntityManager();
             manager.getTransaction().begin();
-            JPAId mailboxId = (JPAId) mailbox.getMailboxId();
-            long highest = (Long) manager.createNamedQuery("findHighestModSeq").setParameter("idParam", mailboxId.getRawId()).getSingleResult();
+            JPAMailbox m = manager.find(JPAMailbox.class, mailboxId.getRawId());
+            long modSeq = m.consumeModSeq();
+            manager.persist(m);
             manager.getTransaction().commit();
-            return highest;
+            return modSeq;
         } catch (PersistenceException e) {
             if (manager != null && manager.getTransaction().isActive()) {
                 manager.getTransaction().rollback();
             }
-            throw new MailboxException("Unable to get highest mod-sequence for mailbox " + mailbox, e);
+            throw new MailboxException("Unable to save highest mod-sequence for mailbox " + mailboxId, e);
         } finally {
             if (manager != null) {
                 manager.close();
@@ -65,32 +83,23 @@ public class JPAModSeqProvider extends AbstractLockingModSeqProvider {
         }
     }
 
-    @Override
-    protected long lockedNextModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
+    private long highestModSeq(JPAId mailboxId) throws MailboxException {
         EntityManager manager = null;
         try {
             manager = factory.createEntityManager();
             manager.getTransaction().begin();
-            JPAId mailboxId = (JPAId) mailbox.getMailboxId();
-            JPAMailbox m = manager.find(JPAMailbox.class, mailboxId.getRawId());
-            long modSeq = m.consumeModSeq();
-            manager.persist(m);
+            long highest = (Long) manager.createNamedQuery("findHighestModSeq").setParameter("idParam", mailboxId.getRawId()).getSingleResult();
             manager.getTransaction().commit();
-            return modSeq;
+            return highest;
         } catch (PersistenceException e) {
             if (manager != null && manager.getTransaction().isActive()) {
                 manager.getTransaction().rollback();
             }
-            throw new MailboxException("Unable to save highest mod-sequence for mailbox " + mailbox, e);
+            throw new MailboxException("Unable to get highest mod-sequence for mailbox " + mailboxId, e);
         } finally {
             if (manager != null) {
                 manager.close();
             }
         }
     }
-
-    @Override
-    public long highestModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
-        throw new NotImplementedException("not implemented");
-    }
 }
diff --git a/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml b/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml
index f55401b..d41a13d 100644
--- a/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml
+++ b/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml
@@ -56,10 +56,8 @@
         <constructor-arg index="0" ref="entityManagerFactory"/>
     </bean>
     <bean id="jpa-modSeqProvider" class="org.apache.james.mailbox.jpa.mail.JPAModSeqProvider">
-        <constructor-arg index="0" ref="jpa-locker"/>
-        <constructor-arg index="1" ref="entityManagerFactory"/>
+        <constructor-arg index="0" ref="entityManagerFactory"/>
     </bean>
-    <alias name="jvm-locker" alias="jpa-locker"/>
 
     <!-- 
        Database DataSource
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java
index 8481f80..7b84db4 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java
@@ -25,7 +25,6 @@ import org.apache.james.mailbox.AbstractSubscriptionManagerTest;
 import org.apache.james.mailbox.SubscriptionManager;
 import org.apache.james.mailbox.jpa.mail.JPAModSeqProvider;
 import org.apache.james.mailbox.jpa.mail.JPAUidProvider;
-import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.junit.jupiter.api.AfterEach;
 
 class JPASubscriptionManagerTest extends AbstractSubscriptionManagerTest {
@@ -34,12 +33,10 @@ class JPASubscriptionManagerTest extends AbstractSubscriptionManagerTest {
     
     @Override
     protected SubscriptionManager createSubscriptionManager() {
-        JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
-
         EntityManagerFactory entityManagerFactory = JPA_TEST_CLUSTER.getEntityManagerFactory();
         JPAMailboxSessionMapperFactory mf = new JPAMailboxSessionMapperFactory(entityManagerFactory,
             new JPAUidProvider(entityManagerFactory),
-            new JPAModSeqProvider(locker, entityManagerFactory));
+            new JPAModSeqProvider(entityManagerFactory));
 
         return new JPASubscriptionManager(mf);
     }
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java
index 29e3162..2c850b0 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java
@@ -33,7 +33,6 @@ import org.apache.james.mailbox.jpa.mail.JPAUidProvider;
 import org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager;
 import org.apache.james.mailbox.store.Authenticator;
 import org.apache.james.mailbox.store.Authorizator;
-import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.SessionProvider;
 import org.apache.james.mailbox.store.StoreMailboxAnnotationManager;
 import org.apache.james.mailbox.store.StoreRightManager;
@@ -52,8 +51,7 @@ public class JpaMailboxManagerProvider {
 
     public static OpenJPAMailboxManager provideMailboxManager(JpaTestCluster jpaTestCluster) {
         EntityManagerFactory entityManagerFactory = jpaTestCluster.getEntityManagerFactory();
-        JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
-        JPAMailboxSessionMapperFactory mf = new JPAMailboxSessionMapperFactory(entityManagerFactory, new JPAUidProvider(entityManagerFactory), new JPAModSeqProvider(locker, entityManagerFactory));
+        JPAMailboxSessionMapperFactory mf = new JPAMailboxSessionMapperFactory(entityManagerFactory, new JPAUidProvider(entityManagerFactory), new JPAModSeqProvider(entityManagerFactory));
 
         MailboxACLResolver aclResolver = new UnionMailboxACLResolver();
         GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
index f06f7a1..eb164f0 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
@@ -34,7 +34,6 @@ import org.apache.james.mailbox.jpa.JPAId;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.mail.AttachmentMapper;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.MessageIdMapper;
@@ -58,13 +57,12 @@ public class JPAMapperProvider implements MapperProvider {
     }
 
     @Override
-    public MessageMapper createMessageMapper() throws MailboxException {
+    public MessageMapper createMessageMapper() {
         EntityManagerFactory entityManagerFactory = jpaTestCluster.getEntityManagerFactory();
-        JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
 
         JPAMessageMapper messageMapper = new JPAMessageMapper(MailboxSessionUtil.create(Username.of("benwa")),
             new JPAUidProvider(entityManagerFactory),
-            new JPAModSeqProvider(locker, entityManagerFactory), 
+            new JPAModSeqProvider(entityManagerFactory),
             entityManagerFactory);
 
         return new TransactionalMessageMapper(messageMapper);
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractLockingModSeqProvider.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractLockingModSeqProvider.java
deleted file mode 100644
index f51515b..0000000
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractLockingModSeqProvider.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/****************************************************************
- * 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.store.mail;
-
-import org.apache.commons.lang3.NotImplementedException;
-import org.apache.james.mailbox.MailboxPathLocker;
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.Mailbox;
-import org.apache.james.mailbox.model.MailboxId;
-
-/**
- * Abstract base implementation of {@link ModSeqProvider} which uses the given {@link MailboxPathLocker} to lock the {@link Mailbox} during the mod-seq generation.
- */
-public abstract class AbstractLockingModSeqProvider implements ModSeqProvider {
-
-    private final MailboxPathLocker locker;
-
-    public AbstractLockingModSeqProvider(MailboxPathLocker locker) {
-        this.locker = locker;
-    }
-    
-    @Override
-    public long nextModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
-        boolean writeLock = true;
-        return locker.executeWithLock(session, mailbox.generateAssociatedPath(),
-            () -> lockedNextModSeq(session, mailbox),
-            writeLock);
-    }
-    
-    @Override
-    public long nextModSeq(MailboxSession session, MailboxId mailboxId) {
-        throw new NotImplementedException("Not implemented");
-    }
-
-    /**
-     * Generate the next mod-seq for the given {@link Mailbox} while holding a lock on it.
-     */
-    protected abstract long lockedNextModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException;
-
-}
diff --git a/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java b/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
index e3f8ac1..6689e3c 100644
--- a/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
+++ b/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
@@ -45,7 +45,6 @@ import org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager;
 import org.apache.james.mailbox.jpa.quota.JPAPerUserMaxQuotaDAO;
 import org.apache.james.mailbox.jpa.quota.JPAPerUserMaxQuotaManager;
 import org.apache.james.mailbox.jpa.quota.JpaCurrentQuotaManager;
-import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.SessionProvider;
 import org.apache.james.mailbox.store.StoreMailboxAnnotationManager;
 import org.apache.james.mailbox.store.StoreRightManager;
@@ -93,9 +92,8 @@ public class JPAHostSystem extends JamesImapHostSystem {
     public void beforeTest() throws Exception {
         super.beforeTest();
         EntityManagerFactory entityManagerFactory = JPA_TEST_CLUSTER.getEntityManagerFactory();
-        JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
         JPAUidProvider uidProvider = new JPAUidProvider(entityManagerFactory);
-        JPAModSeqProvider modSeqProvider = new JPAModSeqProvider(locker, entityManagerFactory);
+        JPAModSeqProvider modSeqProvider = new JPAModSeqProvider(entityManagerFactory);
         JPAMailboxSessionMapperFactory mapperFactory = new JPAMailboxSessionMapperFactory(entityManagerFactory, uidProvider, modSeqProvider);
 
         MailboxACLResolver aclResolver = new UnionMailboxACLResolver();


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


[james-project] 06/13: [Refactoring] Get rid of AbstractMailboxPathLocker

Posted by bt...@apache.org.
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

View the commit online:
https://github.com/apache/james-project/commit/33d2a5be942868862268c567b53661a467d68dd3

commit 33d2a5be942868862268c567b53661a467d68dd3
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 18 17:49:35 2019 +0700

    [Refactoring] Get rid of AbstractMailboxPathLocker
---
 .../mailbox/store/AbstractMailboxPathLocker.java   | 54 ----------------------
 .../james/mailbox/store/JVMMailboxPathLocker.java  | 28 +++++++----
 .../james/mailbox/store/NoMailboxPathLocker.java   | 14 +++---
 3 files changed, 24 insertions(+), 72 deletions(-)

diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/AbstractMailboxPathLocker.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/AbstractMailboxPathLocker.java
deleted file mode 100644
index 13a61a8..0000000
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/AbstractMailboxPathLocker.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/****************************************************************
- * 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.store;
-
-import org.apache.james.mailbox.MailboxPathLocker;
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.MailboxPath;
-
-
-public abstract class AbstractMailboxPathLocker implements MailboxPathLocker {
-
-    @Override
-    public <T> T executeWithLock(MailboxSession session, MailboxPath path, LockAwareExecution<T> execution) throws MailboxException {
-        return executeWithLock(session, path, execution, true);
-    }
-    
-    @Override
-    public <T> T executeWithLock(MailboxSession session, MailboxPath path, LockAwareExecution<T> execution, boolean writeLock) throws MailboxException {
-        try {
-            lock(session, path, writeLock);
-            return execution.execute();
-        } finally {
-            unlock(session, path, writeLock);
-        }
-    }
-
-    /**
-     * Perform lock
-     */
-    protected abstract void lock(MailboxSession session, MailboxPath path, boolean writeLock) throws MailboxException;
-
-    /**
-     * Release lock
-     */
-    protected abstract void unlock(MailboxSession session, MailboxPath path, boolean writeLock) throws MailboxException;
-
-}
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java
index eadf5f9..b1de0a6 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java
@@ -34,13 +34,25 @@ import org.apache.james.mailbox.model.MailboxPath;
  * same MailboxPath. This is done using one {@link ReentrantReadWriteLock}
  * per {@link MailboxPath} so its only usable in a single JVM.
  */
-public final class JVMMailboxPathLocker extends AbstractMailboxPathLocker {
-
+public final class JVMMailboxPathLocker implements MailboxPathLocker {
     private final ConcurrentHashMap<MailboxPath, ReadWriteLock> paths = new ConcurrentHashMap<>();
 
+    @Override
+    public <T> T executeWithLock(MailboxSession session, MailboxPath path, LockAwareExecution<T> execution) throws MailboxException {
+        return executeWithLock(session, path, execution, true);
+    }
 
     @Override
-    protected void lock(MailboxSession session, MailboxPath path, boolean writeLock) throws MailboxException {
+    public <T> T executeWithLock(MailboxSession session, MailboxPath path, LockAwareExecution<T> execution, boolean writeLock) throws MailboxException {
+        try {
+            lock(path, writeLock);
+            return execution.execute();
+        } finally {
+            unlock(path, writeLock);
+        }
+    }
+
+    private void lock(MailboxPath path, boolean writeLock) {
         ReadWriteLock lock = paths.get(path);
         if (lock == null) {
             lock = new ReentrantReadWriteLock();
@@ -52,9 +64,7 @@ public final class JVMMailboxPathLocker extends AbstractMailboxPathLocker {
         getLock(lock, writeLock).lock();
     }
 
-
-    @Override
-    protected void unlock(MailboxSession session, MailboxPath path, boolean writeLock) throws MailboxException {
+    private void unlock(MailboxPath path, boolean writeLock) {
         ReadWriteLock lock = paths.get(path);
 
         if (lock != null) {
@@ -63,12 +73,10 @@ public final class JVMMailboxPathLocker extends AbstractMailboxPathLocker {
     }
 
     private Lock getLock(ReadWriteLock lock, boolean writeLock) {
-        Lock l;
         if (writeLock) {
-            l = lock.writeLock();
+            return lock.writeLock();
         } else {
-            l = lock.readLock();
+            return lock.readLock();
         }
-        return l;
     }
 }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/NoMailboxPathLocker.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/NoMailboxPathLocker.java
index 7ba29aa..2ef2fe6 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/NoMailboxPathLocker.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/NoMailboxPathLocker.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.store;
 
+import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -28,17 +29,14 @@ import org.apache.james.mailbox.model.MailboxPath;
  *
  * This PathLocker avoid useless locking when these mailboxes are used
  */
-public class NoMailboxPathLocker extends AbstractMailboxPathLocker {
-
+public class NoMailboxPathLocker implements MailboxPathLocker {
     @Override
-    protected void lock(MailboxSession session, MailboxPath path, boolean writeLock) throws MailboxException {
-
+    public <T> T executeWithLock(MailboxSession session, MailboxPath path, LockAwareExecution<T> execution) throws MailboxException {
+        return execution.execute();
     }
 
-
     @Override
-    protected void unlock(MailboxSession session, MailboxPath path, boolean writeLock) throws MailboxException {
-
+    public <T> T executeWithLock(MailboxSession session, MailboxPath path, LockAwareExecution<T> execution, boolean writeLock) throws MailboxException {
+        return execution.execute();
     }
-
 }
\ No newline at end of file


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


[james-project] 07/13: [Refactoring] MailboxPathLocker deprecated executeWithLock method is never used

Posted by bt...@apache.org.
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

View the commit online:
https://github.com/apache/james-project/commit/bfbcb6cbcb86064ab0f3e6975d4336b3c82c8b55

commit bfbcb6cbcb86064ab0f3e6975d4336b3c82c8b55
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 18 17:50:43 2019 +0700

    [Refactoring] MailboxPathLocker deprecated executeWithLock method is never used
---
 .../src/main/java/org/apache/james/mailbox/MailboxPathLocker.java | 8 --------
 .../java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java | 5 -----
 .../java/org/apache/james/mailbox/store/NoMailboxPathLocker.java  | 5 -----
 3 files changed, 18 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxPathLocker.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxPathLocker.java
index ff68c76..8e283fd 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxPathLocker.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxPathLocker.java
@@ -31,14 +31,6 @@ import org.apache.james.mailbox.model.MailboxPath;
  * Implementations that are not able to handle read / write locks in a different way are needed to handle all locks as write lock.
  */
 public interface MailboxPathLocker {
-
-    /**
-     * @deprecated use {@link #executeWithLock(MailboxSession, MailboxPath, LockAwareExecution, boolean)} with argument <code>true</code>
-     */
-    @Deprecated
-    <T> T executeWithLock(MailboxSession session, MailboxPath path, LockAwareExecution<T> execution) throws MailboxException;
-
-    
     /**
      * Execute the {@link LockAwareExecution} while holding a lock on the
      * {@link MailboxPath}. If writeLock is true the implementation need to make sure that no other threads can read and write while the lock
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java
index b1de0a6..c40f18c 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java
@@ -38,11 +38,6 @@ public final class JVMMailboxPathLocker implements MailboxPathLocker {
     private final ConcurrentHashMap<MailboxPath, ReadWriteLock> paths = new ConcurrentHashMap<>();
 
     @Override
-    public <T> T executeWithLock(MailboxSession session, MailboxPath path, LockAwareExecution<T> execution) throws MailboxException {
-        return executeWithLock(session, path, execution, true);
-    }
-
-    @Override
     public <T> T executeWithLock(MailboxSession session, MailboxPath path, LockAwareExecution<T> execution, boolean writeLock) throws MailboxException {
         try {
             lock(path, writeLock);
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/NoMailboxPathLocker.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/NoMailboxPathLocker.java
index 2ef2fe6..279ebbd 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/NoMailboxPathLocker.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/NoMailboxPathLocker.java
@@ -31,11 +31,6 @@ import org.apache.james.mailbox.model.MailboxPath;
  */
 public class NoMailboxPathLocker implements MailboxPathLocker {
     @Override
-    public <T> T executeWithLock(MailboxSession session, MailboxPath path, LockAwareExecution<T> execution) throws MailboxException {
-        return execution.execute();
-    }
-
-    @Override
     public <T> T executeWithLock(MailboxSession session, MailboxPath path, LockAwareExecution<T> execution, boolean writeLock) throws MailboxException {
         return execution.execute();
     }


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


[james-project] 11/13: [Refactoring] Refactor abstract test class MailboxManagerStressTest to interface MailboxManagerStressContract

Posted by bt...@apache.org.
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

View the commit online:
https://github.com/apache/james-project/commit/bd701ad784ffcd9c40c0feaf0c837a01dbc65050

commit bd701ad784ffcd9c40c0feaf0c837a01dbc65050
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Mon Nov 18 16:31:59 2019 +0700

    [Refactoring] Refactor abstract test class MailboxManagerStressTest to interface MailboxManagerStressContract
---
 ...Test.java => MailboxManagerStressContract.java} | 40 +++++++++-------------
 .../CassandraMailboxManagerStressTest.java         | 25 +++++++++-----
 .../mailbox/jpa/JpaMailboxManagerStressTest.java   | 23 ++++++++-----
 .../DomainUserMaildirMailboxManagerStressTest.java | 25 ++++++++------
 .../FullUserMaildirMailboxManagerStressTest.java   | 25 ++++++++------
 .../UserMaildirMailboxManagerStressTest.java       | 25 ++++++++------
 .../inmemory/MemoryMailboxManagerStressTest.java   | 20 +++++++----
 7 files changed, 106 insertions(+), 77 deletions(-)

diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressContract.java
similarity index 78%
rename from mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java
rename to mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressContract.java
index 09e4dc8..0112994 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressContract.java
@@ -41,45 +41,37 @@ import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mime4j.dom.Message;
 import org.apache.james.util.concurrent.NamedThreadFactory;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableSet;
 
-public abstract class MailboxManagerStressTest<T extends MailboxManager> {
+public interface MailboxManagerStressContract<T extends MailboxManager> {
 
-    private static final int APPEND_OPERATIONS = 200;
+    int APPEND_OPERATIONS = 200;
 
-    private T mailboxManager;
+    T getManager();
 
-    protected abstract T provideManager() throws MailboxException;
-
-    protected abstract EventBus retrieveEventBus(T mailboxManager);
-
-    @BeforeEach
-    void setUp() throws Exception {
-        this.mailboxManager = provideManager();
-    }
+    EventBus retrieveEventBus();
 
     @Test
-    void testStressTest() throws InterruptedException, MailboxException {
+    default void testStressTest() throws InterruptedException, MailboxException {
         ThreadFactory threadFactory = NamedThreadFactory.withClassName(getClass());
 
         CountDownLatch latch = new CountDownLatch(APPEND_OPERATIONS);
         ExecutorService pool = Executors.newFixedThreadPool(APPEND_OPERATIONS / 20, threadFactory);
         Collection<MessageUid> uList = new ConcurrentLinkedDeque<>();
         Username username = Username.of("username");
-        MailboxSession session = mailboxManager.createSystemSession(username);
-        mailboxManager.startProcessingRequest(session);
+        MailboxSession session = getManager().createSystemSession(username);
+        getManager().startProcessingRequest(session);
         MailboxPath path = MailboxPath.forUser(username, "INBOX");
-        MailboxId mailboxId = mailboxManager.createMailbox(path, session).get();
-        retrieveEventBus(mailboxManager).register(
+        MailboxId mailboxId = getManager().createMailbox(path, session).get();
+        retrieveEventBus().register(
             event -> {
                 MessageUid u = ((MailboxListener.Added) event).getUids().iterator().next();
                 uList.add(u);
             }, new MailboxIdRegistrationKey(mailboxId));
-        mailboxManager.endProcessingRequest(session);
-        mailboxManager.logout(session, false);
+        getManager().endProcessingRequest(session);
+        getManager().logout(session, false);
 
         final AtomicBoolean fail = new AtomicBoolean(false);
         final ConcurrentHashMap<MessageUid, Object> uids = new ConcurrentHashMap<>();
@@ -93,10 +85,10 @@ public abstract class MailboxManagerStressTest<T extends MailboxManager> {
                 }
 
                 try {
-                    MailboxSession mailboxSession = mailboxManager.createSystemSession(username);
+                    MailboxSession mailboxSession = getManager().createSystemSession(username);
 
-                    mailboxManager.startProcessingRequest(mailboxSession);
-                    MessageManager m = mailboxManager.getMailbox(path, mailboxSession);
+                    getManager().startProcessingRequest(mailboxSession);
+                    MessageManager m = getManager().getMailbox(path, mailboxSession);
                     ComposedMessageId messageId = m.appendMessage(
                         MessageManager.AppendCommand
                             .from(Message.Builder.of()
@@ -107,8 +99,8 @@ public abstract class MailboxManagerStressTest<T extends MailboxManager> {
                     if (uids.put(messageId.getUid(), new Object()) != null) {
                         fail.set(true);
                     }
-                    mailboxManager.endProcessingRequest(mailboxSession);
-                    mailboxManager.logout(mailboxSession, false);
+                    getManager().endProcessingRequest(mailboxSession);
+                    getManager().logout(mailboxSession, false);
                 } catch (Exception e) {
                     e.printStackTrace();
                     fail.set(true);
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
index e53dc07..9d9c9c5 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
@@ -21,28 +21,37 @@ package org.apache.james.mailbox.cassandra;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.CassandraRestartExtension;
-import org.apache.james.mailbox.MailboxManagerStressTest;
+import org.apache.james.mailbox.MailboxManagerStressContract;
 import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.store.PreDeletionHooks;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 @ExtendWith(CassandraRestartExtension.class)
-class CassandraMailboxManagerStressTest extends MailboxManagerStressTest<CassandraMailboxManager> {
+class CassandraMailboxManagerStressTest implements MailboxManagerStressContract<CassandraMailboxManager> {
 
     @RegisterExtension
     static CassandraClusterExtension cassandra = new CassandraClusterExtension(MailboxAggregateModule.MODULE_WITH_QUOTA);
-    
+
+    private CassandraMailboxManager mailboxManager;
+
     @Override
-    protected CassandraMailboxManager provideManager() {
-        return CassandraMailboxManagerProvider.provideMailboxManager(cassandra.getCassandraCluster().getConf(),
-            cassandra.getCassandraCluster().getTypesProvider(),
-            PreDeletionHooks.NO_PRE_DELETION_HOOK);
+    public CassandraMailboxManager getManager() {
+        return mailboxManager;
     }
 
     @Override
-    protected EventBus retrieveEventBus(CassandraMailboxManager mailboxManager) {
+    public EventBus retrieveEventBus() {
         return mailboxManager.getEventBus();
     }
+
+    @BeforeEach
+    void setUp() {
+        this.mailboxManager = CassandraMailboxManagerProvider.provideMailboxManager(
+            cassandra.getCassandraCluster().getConf(),
+            cassandra.getCassandraCluster().getTypesProvider(),
+            PreDeletionHooks.NO_PRE_DELETION_HOOK);
+    }
 }
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerStressTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerStressTest.java
index a55b0b4..da90cfb 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerStressTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerStressTest.java
@@ -22,27 +22,32 @@ package org.apache.james.mailbox.jpa;
 import java.util.Optional;
 
 import org.apache.james.backends.jpa.JpaTestCluster;
-import org.apache.james.mailbox.MailboxManagerStressTest;
+import org.apache.james.mailbox.MailboxManagerStressContract;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager;
 import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
 
-class JpaMailboxManagerStressTest extends MailboxManagerStressTest<OpenJPAMailboxManager> {
+class JpaMailboxManagerStressTest implements MailboxManagerStressContract<OpenJPAMailboxManager> {
 
     private static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(JPAMailboxFixture.MAILBOX_PERSISTANCE_CLASSES);
     private Optional<OpenJPAMailboxManager> openJPAMailboxManager = Optional.empty();
-    
+
     @Override
-    protected OpenJPAMailboxManager provideManager() {
-        if (!openJPAMailboxManager.isPresent()) {
-            openJPAMailboxManager = Optional.of(JpaMailboxManagerProvider.provideMailboxManager(JPA_TEST_CLUSTER));
-        }
+    public OpenJPAMailboxManager getManager() {
         return openJPAMailboxManager.get();
     }
 
     @Override
-    protected EventBus retrieveEventBus(OpenJPAMailboxManager mailboxManager) {
-        return mailboxManager.getEventBus();
+    public EventBus retrieveEventBus() {
+        return getManager().getEventBus();
+    }
+
+    @BeforeEach
+    void setUp() {
+        if (!openJPAMailboxManager.isPresent()) {
+            openJPAMailboxManager = Optional.of(JpaMailboxManagerProvider.provideMailboxManager(JPA_TEST_CLUSTER));
+        }
     }
 
     @AfterEach
diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerStressTest.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerStressTest.java
index c9090b1..3e898ec 100644
--- a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerStressTest.java
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerStressTest.java
@@ -21,26 +21,31 @@ package org.apache.james.mailbox.maildir;
 
 import java.io.File;
 
-import org.apache.james.mailbox.MailboxManagerStressTest;
+import org.apache.james.mailbox.MailboxManagerStressContract;
 import org.apache.james.mailbox.events.EventBus;
+import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.store.StoreMailboxManager;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.io.TempDir;
 
-class DomainUserMaildirMailboxManagerStressTest extends MailboxManagerStressTest<StoreMailboxManager> {
+class DomainUserMaildirMailboxManagerStressTest implements MailboxManagerStressContract<StoreMailboxManager> {
     @TempDir
     File tmpFolder;
-    
+
+    private StoreMailboxManager mailboxManager;
+
     @Override
-    protected StoreMailboxManager provideManager() {
-        try {
-            return MaildirMailboxManagerProvider.createMailboxManager("/%domain/%user", tmpFolder);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
+    public StoreMailboxManager getManager() {
+        return mailboxManager;
     }
 
     @Override
-    protected EventBus retrieveEventBus(StoreMailboxManager mailboxManager) {
+    public EventBus retrieveEventBus() {
         return mailboxManager.getEventBus();
     }
+
+    @BeforeEach
+    void setUp() throws MailboxException {
+        this.mailboxManager = MaildirMailboxManagerProvider.createMailboxManager("/%domain/%user", tmpFolder);
+    }
 }
diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/FullUserMaildirMailboxManagerStressTest.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/FullUserMaildirMailboxManagerStressTest.java
index fd9f284..093546f 100644
--- a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/FullUserMaildirMailboxManagerStressTest.java
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/FullUserMaildirMailboxManagerStressTest.java
@@ -21,26 +21,31 @@ package org.apache.james.mailbox.maildir;
 
 import java.io.File;
 
-import org.apache.james.mailbox.MailboxManagerStressTest;
+import org.apache.james.mailbox.MailboxManagerStressContract;
 import org.apache.james.mailbox.events.EventBus;
+import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.store.StoreMailboxManager;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.io.TempDir;
 
-class FullUserMaildirMailboxManagerStressTest extends MailboxManagerStressTest<StoreMailboxManager> {
+class FullUserMaildirMailboxManagerStressTest implements MailboxManagerStressContract<StoreMailboxManager> {
     @TempDir
     File tmpFolder;
-    
+
+    private StoreMailboxManager mailboxManager;
+
     @Override
-    protected StoreMailboxManager provideManager() {
-        try {
-            return MaildirMailboxManagerProvider.createMailboxManager("/%fulluser", tmpFolder);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
+    public StoreMailboxManager getManager() {
+        return mailboxManager;
     }
 
     @Override
-    protected EventBus retrieveEventBus(StoreMailboxManager mailboxManager) {
+    public EventBus retrieveEventBus() {
         return mailboxManager.getEventBus();
     }
+
+    @BeforeEach
+    void setUp() throws MailboxException {
+        this.mailboxManager = MaildirMailboxManagerProvider.createMailboxManager("/%fulluser", tmpFolder);
+    }
 }
diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/UserMaildirMailboxManagerStressTest.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/UserMaildirMailboxManagerStressTest.java
index d1f518e..083d22d 100644
--- a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/UserMaildirMailboxManagerStressTest.java
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/UserMaildirMailboxManagerStressTest.java
@@ -21,26 +21,31 @@ package org.apache.james.mailbox.maildir;
 
 import java.io.File;
 
-import org.apache.james.mailbox.MailboxManagerStressTest;
+import org.apache.james.mailbox.MailboxManagerStressContract;
 import org.apache.james.mailbox.events.EventBus;
+import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.store.StoreMailboxManager;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.io.TempDir;
 
-class UserMaildirMailboxManagerStressTest extends MailboxManagerStressTest<StoreMailboxManager> {
+class UserMaildirMailboxManagerStressTest implements MailboxManagerStressContract<StoreMailboxManager> {
     @TempDir
     File tmpFolder;
-    
+
+    private StoreMailboxManager mailboxManager;
+
     @Override
-    protected StoreMailboxManager provideManager() {
-        try {
-            return MaildirMailboxManagerProvider.createMailboxManager("/%user", tmpFolder);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
+    public StoreMailboxManager getManager() {
+        return mailboxManager;
     }
 
     @Override
-    protected EventBus retrieveEventBus(StoreMailboxManager mailboxManager) {
+    public EventBus retrieveEventBus() {
         return mailboxManager.getEventBus();
     }
+
+    @BeforeEach
+    void setUp() throws MailboxException {
+        this.mailboxManager = MaildirMailboxManagerProvider.createMailboxManager("/%user", tmpFolder);
+    }
 }
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerStressTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerStressTest.java
index 5416c41..4f7484b 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerStressTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerStressTest.java
@@ -19,19 +19,27 @@
 
 package org.apache.james.mailbox.inmemory;
 
-import org.apache.james.mailbox.MailboxManagerStressTest;
+import org.apache.james.mailbox.MailboxManagerStressContract;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.extension.PreDeletionHook;
+import org.junit.jupiter.api.BeforeEach;
+
+class MemoryMailboxManagerStressTest implements MailboxManagerStressContract<InMemoryMailboxManager> {
+
+    private InMemoryMailboxManager mailboxManager;
 
-class MemoryMailboxManagerStressTest extends MailboxManagerStressTest<InMemoryMailboxManager> {
-    
     @Override
-    protected InMemoryMailboxManager provideManager() {
-        return MemoryMailboxManagerProvider.provideMailboxManager(PreDeletionHook.NO_PRE_DELETION_HOOK);
+    public InMemoryMailboxManager getManager() {
+        return mailboxManager;
     }
 
     @Override
-    protected EventBus retrieveEventBus(InMemoryMailboxManager mailboxManager) {
+    public EventBus retrieveEventBus() {
         return mailboxManager.getEventBus();
     }
+
+    @BeforeEach
+    void setUp() {
+        this.mailboxManager = MemoryMailboxManagerProvider.provideMailboxManager(PreDeletionHook.NO_PRE_DELETION_HOOK);
+    }
 }


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