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:37 UTC

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

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