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