JAMES-1925 Solve mailboxRenames by reading oldPath first

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

Branch: refs/heads/master
Commit: 0063d303c12931fe62b64651fb3c96419790c619
Parents: 3176d37
Author: Benoit Tellier <[email protected]>
Authored: Tue Feb 14 16:19:52 2017 +0700
Committer: Antoine Duprat <[email protected]>
Committed: Wed Feb 15 13:12:39 2017 +0100

----------------------------------------------------------------------
 .../cassandra/mail/CassandraMailboxMapper.java  | 21 ++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/0063d303/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
index 959bacf..1f1e163 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
@@ -121,10 +121,15 @@ public class CassandraMailboxMapper implements 
MailboxMapper {
     public void save(Mailbox mailbox) throws MailboxException {
         Preconditions.checkArgument(mailbox instanceof SimpleMailbox);
         SimpleMailbox cassandraMailbox = (SimpleMailbox) mailbox;
-        if (cassandraMailbox.getMailboxId() == null) {
-            cassandraMailbox.setMailboxId(CassandraId.timeBased());
-        }
-        boolean applied = 
mailboxPathDAO.save(mailbox.generateAssociatedPath(), (CassandraId) 
cassandraMailbox.getMailboxId())
+
+        CassandraId cassandraId = retrieveId(cassandraMailbox);
+        cassandraMailbox.setMailboxId(cassandraId);
+
+        boolean applied = mailboxDAO.retrieveMailbox(cassandraId)
+            .thenCompose(optional -> optional
+                .map(storedMailbox -> 
mailboxPathDAO.delete(storedMailbox.generateAssociatedPath()))
+                .orElse(CompletableFuture.completedFuture(null)))
+            .thenCompose(any -> 
mailboxPathDAO.save(mailbox.generateAssociatedPath(), cassandraId))
             .thenCompose(result -> {
                 if (result) {
                     return mailboxDAO.save(cassandraMailbox).thenApply(any -> 
result);
@@ -136,6 +141,14 @@ public class CassandraMailboxMapper implements 
MailboxMapper {
         }
     }
 
+    private CassandraId retrieveId(SimpleMailbox cassandraMailbox) {
+        if (cassandraMailbox.getMailboxId() == null) {
+            return CassandraId.timeBased();
+        } else {
+            return (CassandraId) cassandraMailbox.getMailboxId();
+        }
+    }
+
     @Override
     public boolean hasChildren(Mailbox mailbox, char delimiter) {
         return mailboxPathDAO.listUserMailboxes(mailbox.getNamespace(), 
mailbox.getUser())


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to