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

Reply via email to