Repository: james-project
Updated Branches:
  refs/heads/master c4e25df08 -> 985ab8647


JAMES-2094 Move and Copy message should not save message again


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/985ab864
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/985ab864
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/985ab864

Branch: refs/heads/master
Commit: 985ab8647cea28959ac1ce64322578f6c6eb6fa8
Parents: c4e25df
Author: quynhn <qngu...@linagora.com>
Authored: Fri Jul 7 12:16:15 2017 +0700
Committer: Antoine Duprat <adup...@linagora.com>
Committed: Thu Jul 13 13:29:45 2017 +0200

----------------------------------------------------------------------
 .../mail/CassandraMessageIdMapper.java          | 17 +++++++
 .../cassandra/mail/CassandraMessageMapper.java  | 23 ++++++++--
 .../mailbox/store/StoreMessageIdManager.java    |  2 +-
 .../mailbox/store/mail/MessageIdMapper.java     |  2 +
 .../store/TestMailboxSessionMapperFactory.java  |  6 +++
 .../store/mail/model/MessageIdMapperTest.java   | 48 ++++++++++++++++++++
 6 files changed, 92 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/985ab864/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
index 0f88959..0af8c74 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
@@ -166,6 +166,23 @@ public class CassandraMessageIdMapper implements 
MessageIdMapper {
     }
 
     @Override
+    public void copyInMailbox(MailboxMessage mailboxMessage) throws 
MailboxException {
+        CassandraId mailboxId = (CassandraId) mailboxMessage.getMailboxId();
+        mailboxMapper.findMailboxById(mailboxId);
+        CassandraMessageId messageId = (CassandraMessageId) 
mailboxMessage.getMessageId();
+        ComposedMessageIdWithMetaData composedMessageIdWithMetaData = 
ComposedMessageIdWithMetaData.builder()
+                .composedMessageId(new ComposedMessageId(mailboxId, messageId, 
mailboxMessage.getUid()))
+                .flags(mailboxMessage.createFlags())
+                .modSeq(mailboxMessage.getModSeq())
+                .build();
+        CompletableFuture.allOf(
+                        imapUidDAO.insert(composedMessageIdWithMetaData),
+                        messageIdDAO.insert(composedMessageIdWithMetaData))
+                .thenCompose(voidValue -> 
indexTableHandler.updateIndexOnAdd(mailboxMessage, mailboxId))
+                .join();
+    }
+
+    @Override
     public void delete(MessageId messageId, List<MailboxId> mailboxIds) {
         CassandraMessageId cassandraMessageId = (CassandraMessageId) messageId;
         mailboxIds.stream()

http://git-wip-us.apache.org/repos/asf/james-project/blob/985ab864/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
index b34f03c..e782127 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
@@ -267,6 +267,13 @@ public class CassandraMessageMapper implements 
MessageMapper {
     public MessageMetaData add(Mailbox mailbox, MailboxMessage message) throws 
MailboxException {
         CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
 
+        save(mailbox, addUidAndModseq(message, mailboxId))
+            .thenCompose(voidValue -> 
indexTableHandler.updateIndexOnAdd(message, mailboxId))
+            .join();
+        return new SimpleMessageMetaData(message);
+    }
+
+    private MailboxMessage addUidAndModseq(MailboxMessage message, CassandraId 
mailboxId) throws MailboxException {
         CompletableFuture<Optional<MessageUid>> uidFuture = 
uidProvider.nextUid(mailboxId);
         CompletableFuture<Optional<Long>> modseqFuture = 
modSeqProvider.nextModSeq(mailboxId);
         CompletableFuture.allOf(uidFuture, modseqFuture).join();
@@ -276,10 +283,7 @@ public class CassandraMessageMapper implements 
MessageMapper {
         message.setModSeq(modseqFuture.join()
             .orElseThrow(() -> new MailboxException("Can not find a MODSEQ to 
save " + message.getMessageId() + " in " + mailboxId)));
 
-        save(mailbox, message)
-            .thenCompose(voidValue -> 
indexTableHandler.updateIndexOnAdd(message, mailboxId))
-            .join();
-        return new SimpleMessageMetaData(message);
+        return message;
     }
 
     @Override
@@ -354,7 +358,7 @@ public class CassandraMessageMapper implements 
MessageMapper {
     @Override
     public MessageMetaData copy(Mailbox mailbox, MailboxMessage original) 
throws MailboxException {
         original.setFlags(new 
FlagsBuilder().add(original.createFlags()).add(Flag.RECENT).build());
-        return add(mailbox, original);
+        return setInMailbox(mailbox, original);
     }
 
     @Override
@@ -371,6 +375,15 @@ public class CassandraMessageMapper implements 
MessageMapper {
             .build();
     }
 
+    private MessageMetaData setInMailbox(Mailbox mailbox, MailboxMessage 
message) throws MailboxException {
+        CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
+
+        insertIds(addUidAndModseq(message, mailboxId), mailboxId)
+                .thenCompose(voidValue -> 
indexTableHandler.updateIndexOnAdd(message, mailboxId))
+                .join();
+        return new SimpleMessageMetaData(message);
+    }
+
     private CompletableFuture<Void> save(Mailbox mailbox, MailboxMessage 
message) throws MailboxException {
         CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
         return messageDAOV2.save(message)

http://git-wip-us.apache.org/repos/asf/james-project/blob/985ab864/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
index 7c883bb..e44c2c9 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
@@ -239,7 +239,7 @@ public class StoreMessageIdManager implements 
MessageIdManager {
         MessageUid uid = 
mailboxSessionMapperFactory.getUidProvider().nextUid(mailboxSession, 
mailboxMessage.getMailboxId());
         mailboxMessage.setModSeq(modSeq);
         mailboxMessage.setUid(uid);
-        messageIdMapper.save(mailboxMessage);
+        messageIdMapper.copyInMailbox(mailboxMessage);
     }
 
     private Function<MailboxMessage, MessageResult> 
messageResultConverter(final MessageResult.FetchGroup fetchGroup) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/985ab864/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageIdMapper.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageIdMapper.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageIdMapper.java
index 495a2cc..e517e99 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageIdMapper.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageIdMapper.java
@@ -40,6 +40,8 @@ public interface MessageIdMapper {
 
     void save(MailboxMessage mailboxMessage) throws MailboxNotFoundException, 
MailboxException;
 
+    void copyInMailbox(MailboxMessage mailboxMessage) throws 
MailboxNotFoundException, MailboxException;
+
     void delete(MessageId messageId);
 
     void delete(MessageId messageId, List<MailboxId> mailboxIds);

http://git-wip-us.apache.org/repos/asf/james-project/blob/985ab864/mailbox/store/src/test/java/org/apache/james/mailbox/store/TestMailboxSessionMapperFactory.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/TestMailboxSessionMapperFactory.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/TestMailboxSessionMapperFactory.java
index d7e70bd..0c048b5 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/TestMailboxSessionMapperFactory.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/TestMailboxSessionMapperFactory.java
@@ -35,6 +35,7 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.exception.SubscriptionException;
 import org.apache.james.mailbox.manager.MailboxManagerFixture;
 import org.apache.james.mailbox.model.MailboxACL;
@@ -180,6 +181,11 @@ public class TestMailboxSessionMapperFactory extends 
MailboxSessionMapperFactory
             }
 
             @Override
+            public void copyInMailbox(MailboxMessage mailboxMessage) throws 
MailboxNotFoundException, MailboxException {
+                messages.add(mailboxMessage);
+            }
+
+            @Override
             public void delete(final MessageId messageId) {
                 messages.removeAll(
                     FluentIterable.from(messages)

http://git-wip-us.apache.org/repos/asf/james-project/blob/985ab864/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
index 308baa4..cb3ba8b 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
@@ -210,6 +210,54 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
+    public void copyInMailboxShouldThrowWhenMailboxDoesntExist() throws 
Exception {
+        message1.setUid(mapperProvider.generateMessageUid());
+        message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
+        sut.save(message1);
+
+        SimpleMailbox notPersistedMailbox = new SimpleMailbox(new 
MailboxPath("#private", "benwa", "mybox"), UID_VALIDITY);
+        notPersistedMailbox.setMailboxId(mapperProvider.generateId());
+
+        SimpleMailboxMessage message1InOtherMailbox = 
SimpleMailboxMessage.copy(notPersistedMailbox.getMailboxId(), message1);
+        message1InOtherMailbox.setUid(mapperProvider.generateMessageUid());
+        
message1InOtherMailbox.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox));
+
+        expectedException.expect(MailboxNotFoundException.class);
+        sut.copyInMailbox(message1InOtherMailbox);
+    }
+
+    @Test
+    public void copyInMailboxShouldSaveMessageInAnotherMailbox() throws 
Exception {
+        message1.setUid(mapperProvider.generateMessageUid());
+        message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
+        sut.save(message1);
+
+        SimpleMailboxMessage message1InOtherMailbox = 
SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1);
+        message1InOtherMailbox.setUid(mapperProvider.generateMessageUid());
+        
message1InOtherMailbox.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox));
+        sut.copyInMailbox(message1InOtherMailbox);
+
+        List<MailboxId> mailboxes = sut.findMailboxes(message1.getMessageId());
+        assertThat(mailboxes).containsOnly(benwaInboxMailbox.getMailboxId(), 
benwaWorkMailbox.getMailboxId());
+    }
+
+    @Test
+    public void 
copyInMailboxShouldWorkWhenSavingTwoTimesWithSameMessageIdAndSameMailboxId() 
throws Exception {
+        message1.setUid(mapperProvider.generateMessageUid());
+        message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
+        sut.save(message1);
+        SimpleMailboxMessage copiedMessage = 
SimpleMailboxMessage.copy(message1.getMailboxId(), message1);
+        copiedMessage.setUid(mapperProvider.generateMessageUid());
+        
copiedMessage.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
+
+        sut.copyInMailbox(copiedMessage);
+        sut.copyInMailbox(copiedMessage);
+
+        List<MailboxId> mailboxes = sut.findMailboxes(message1.getMessageId());
+        
assertThat(mailboxes).isEqualTo(ImmutableList.of(benwaInboxMailbox.getMailboxId(),
 benwaInboxMailbox.getMailboxId()));
+    }
+
+    @Test
     public void deleteShouldNotThrowWhenUnknownMessage() {
         sut.delete(message1.getMessageId());
     }


---------------------------------------------------------------------
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