JAMES-1849 StoreManagers should handle transactions for annotations
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/1aeb43ba Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/1aeb43ba Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/1aeb43ba Branch: refs/heads/master Commit: 1aeb43ba654ea239ad487f2134d680216be6d4d3 Parents: cc069d6 Author: Benoit Tellier <btell...@linagora.com> Authored: Tue Oct 25 13:40:29 2016 +0200 Committer: Benoit Tellier <btell...@linagora.com> Committed: Thu Nov 3 15:26:07 2016 +0100 ---------------------------------------------------------------------- .../mailbox/store/StoreMailboxManager.java | 78 +++++++++++++------- .../StoreMailboxManagerAnnotationTest.java | 10 +++ 2 files changed, 62 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/1aeb43ba/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java ---------------------------------------------------------------------- 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 1a54ee4..cc2cf1b 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 @@ -786,33 +786,49 @@ public class StoreMailboxManager implements MailboxManager { @Override public List<MailboxAnnotation> getAllAnnotations(MailboxPath mailboxPath, MailboxSession session) throws MailboxException { - AnnotationMapper annotationMapper = mailboxSessionMapperFactory.getAnnotationMapper(session); - MailboxId mailboxId = getMailbox(mailboxPath, session).getId(); + final AnnotationMapper annotationMapper = mailboxSessionMapperFactory.getAnnotationMapper(session); + final MailboxId mailboxId = getMailbox(mailboxPath, session).getId(); - return annotationMapper.getAllAnnotations(mailboxId); + return annotationMapper.execute(new Mapper.Transaction<List<MailboxAnnotation>>() { + @Override + public List<MailboxAnnotation> run() throws MailboxException { + return annotationMapper.getAllAnnotations(mailboxId); + } + }); } @Override - public List<MailboxAnnotation> getAnnotationsByKeys(MailboxPath mailboxPath, MailboxSession session, Set<MailboxAnnotationKey> keys) + public List<MailboxAnnotation> getAnnotationsByKeys(MailboxPath mailboxPath, MailboxSession session, final Set<MailboxAnnotationKey> keys) throws MailboxException { - AnnotationMapper annotationMapper = mailboxSessionMapperFactory.getAnnotationMapper(session); - MailboxId mailboxId = getMailbox(mailboxPath, session).getId(); + final AnnotationMapper annotationMapper = mailboxSessionMapperFactory.getAnnotationMapper(session); + final MailboxId mailboxId = getMailbox(mailboxPath, session).getId(); - return annotationMapper.getAnnotationsByKeys(mailboxId, keys); + return annotationMapper.execute(new Mapper.Transaction<List<MailboxAnnotation>>() { + @Override + public List<MailboxAnnotation> run() throws MailboxException { + return annotationMapper.getAnnotationsByKeys(mailboxId, keys); + } + }); } @Override - public void updateAnnotations(MailboxPath mailboxPath, MailboxSession session, List<MailboxAnnotation> mailboxAnnotations) + public void updateAnnotations(MailboxPath mailboxPath, MailboxSession session, final List<MailboxAnnotation> mailboxAnnotations) throws MailboxException { - AnnotationMapper annotationMapper = mailboxSessionMapperFactory.getAnnotationMapper(session); - MailboxId mailboxId = getMailbox(mailboxPath, session).getId(); - for (MailboxAnnotation annotation : mailboxAnnotations) { - if (annotation.isNil()) { - annotationMapper.deleteAnnotation(mailboxId, annotation.getKey()); - } else { - annotationMapper.insertAnnotation(mailboxId, annotation); + final AnnotationMapper annotationMapper = mailboxSessionMapperFactory.getAnnotationMapper(session); + final MailboxId mailboxId = getMailbox(mailboxPath, session).getId(); + + annotationMapper.execute(new Mapper.VoidTransaction() { + @Override + public void runVoid() throws MailboxException { + for (MailboxAnnotation annotation : mailboxAnnotations) { + if (annotation.isNil()) { + annotationMapper.deleteAnnotation(mailboxId, annotation.getKey()); + } else { + annotationMapper.insertAnnotation(mailboxId, annotation); + } + } } - } + }); } @Override @@ -822,20 +838,30 @@ public class StoreMailboxManager implements MailboxManager { @Override public List<MailboxAnnotation> getAnnotationsByKeysWithOneDepth(MailboxPath mailboxPath, MailboxSession session, - Set<MailboxAnnotationKey> keys) throws MailboxException { - AnnotationMapper annotationMapper = mailboxSessionMapperFactory.getAnnotationMapper(session); - MailboxId mailboxId = getMailbox(mailboxPath, session).getId(); - - return annotationMapper.getAnnotationsByKeysWithOneDepth(mailboxId, keys); + final Set<MailboxAnnotationKey> keys) throws MailboxException { + final AnnotationMapper annotationMapper = mailboxSessionMapperFactory.getAnnotationMapper(session); + final MailboxId mailboxId = getMailbox(mailboxPath, session).getId(); + + return annotationMapper.execute(new Mapper.Transaction<List<MailboxAnnotation>>() { + @Override + public List<MailboxAnnotation> run() throws MailboxException { + return annotationMapper.getAnnotationsByKeysWithOneDepth(mailboxId, keys); + } + }); } @Override public List<MailboxAnnotation> getAnnotationsByKeysWithAllDepth(MailboxPath mailboxPath, MailboxSession session, - Set<MailboxAnnotationKey> keys) throws MailboxException { - AnnotationMapper annotationMapper = mailboxSessionMapperFactory.getAnnotationMapper(session); - MailboxId mailboxId = getMailbox(mailboxPath, session).getId(); - - return annotationMapper.getAnnotationsByKeysWithAllDepth(mailboxId, keys); + final Set<MailboxAnnotationKey> keys) throws MailboxException { + final AnnotationMapper annotationMapper = mailboxSessionMapperFactory.getAnnotationMapper(session); + final MailboxId mailboxId = getMailbox(mailboxPath, session).getId(); + + return annotationMapper.execute(new Mapper.Transaction<List<MailboxAnnotation>>() { + @Override + public List<MailboxAnnotation> run() throws MailboxException { + return annotationMapper.getAnnotationsByKeysWithAllDepth(mailboxId, keys); + } + }); } @Override http://git-wip-us.apache.org/repos/asf/james-project/blob/1aeb43ba/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java index a38c762..9fe822c 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java @@ -46,11 +46,14 @@ import org.apache.james.mailbox.store.mail.AnnotationMapper; import org.apache.james.mailbox.store.mail.MailboxMapper; import org.apache.james.mailbox.store.mail.model.Mailbox; import org.apache.james.mailbox.store.mail.model.impl.MessageParser; +import org.apache.james.mailbox.store.transaction.Mapper; import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -91,6 +94,13 @@ public class StoreMailboxManagerAnnotationTest { when(mailboxSessionMapperFactory.getAnnotationMapper(eq(session))).thenReturn(annotationMapper); when(mailbox.getMailboxId()).thenReturn(mailboxId); when(mailboxMapper.findMailboxByPath(eq(mailboxPath))).thenReturn(mailbox); + when(annotationMapper.execute(any(Mapper.Transaction.class))).thenAnswer(new Answer<Object>() { + @Override + public Object answer(InvocationOnMock invocationOnMock) throws Throwable { + Mapper.Transaction transaction = (Mapper.Transaction) invocationOnMock.getArguments()[0]; + return transaction.run(); + } + }); storeMailboxManager = spy(new StoreMailboxManager(mailboxSessionMapperFactory, authenticator, aclResolver, groupMembershipResolver, messageParser, messageIdFactory)); storeMailboxManager.init(); --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org