This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit b28e07898a7637164974676ef4eb4232623ec133
Author: Rene Cordier <[email protected]>
AuthorDate: Tue Feb 18 17:53:59 2020 +0700

    JAMES-3057 Add MailboxMapper::create with a MailboxPath and a uid as 
parameters
    
    This is a necessary pre-work to make MailboxId immutable in Mailbox object
---
 .../cassandra/mail/CassandraMailboxMapper.java     | 11 ++++++++
 .../james/mailbox/jpa/mail/JPAMailboxMapper.java   | 29 +++++++++++++------
 .../jpa/mail/TransactionalMailboxMapper.java       |  5 ++++
 .../mailbox/maildir/mail/MaildirMailboxMapper.java | 33 ++++++++++++++++++++++
 .../inmemory/mail/InMemoryMailboxMapper.java       | 10 +++++++
 .../james/mailbox/store/mail/MailboxMapper.java    |  5 ++++
 6 files changed, 85 insertions(+), 8 deletions(-)

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 5afbd9c..344a50e 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
@@ -178,6 +178,17 @@ public class CassandraMailboxMapper implements 
MailboxMapper {
         return cassandraId;
     }
 
+    @Override
+    public Mailbox create(MailboxPath mailboxPath, long uidValidity) throws 
MailboxException {
+        CassandraId cassandraId = CassandraId.timeBased();
+        Mailbox mailbox = new Mailbox(mailboxPath, uidValidity, cassandraId);
+
+        if (!tryCreate(mailbox, cassandraId).block()) {
+            throw new 
MailboxExistsException(mailbox.generateAssociatedPath().asString());
+        }
+        return mailbox;
+    }
+
     private Mono<Boolean> tryCreate(Mailbox cassandraMailbox, CassandraId 
cassandraId) {
         return 
mailboxPathV2DAO.save(cassandraMailbox.generateAssociatedPath(), cassandraId)
             .filter(isCreated -> isCreated)
diff --git 
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
 
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
index b30fd51..d8d78ef 100644
--- 
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
+++ 
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
@@ -88,7 +88,7 @@ public class JPAMailboxMapper extends JPATransactionalMapper 
implements MailboxM
         Preconditions.checkArgument(mailbox.getMailboxId() == null, "A mailbox 
we want to create should not have a mailboxId set already");
 
         try {
-            if (isPathAlreadyUsedByAnotherMailbox(mailbox)) {
+            if 
(isPathAlreadyUsedByAnotherMailbox(mailbox.generateAssociatedPath())) {
                 throw new MailboxExistsException(mailbox.getName());
             }
 
@@ -104,13 +104,28 @@ public class JPAMailboxMapper extends 
JPATransactionalMapper implements MailboxM
     }
     
     @Override
+    public Mailbox create(MailboxPath mailboxPath, long uidValidity) throws 
MailboxException {
+        try {
+            if (isPathAlreadyUsedByAnotherMailbox(mailboxPath)) {
+                throw new MailboxExistsException(mailboxPath.getName());
+            }
+
+            this.lastMailboxName = mailboxPath.getName();
+            JPAMailbox persistedMailbox = new JPAMailbox(mailboxPath, 
uidValidity);
+            getEntityManager().persist(persistedMailbox);
+
+            return new Mailbox(mailboxPath, uidValidity, 
persistedMailbox.getMailboxId());
+        } catch (PersistenceException e) {
+            throw new MailboxException("Save of mailbox " + 
mailboxPath.getName() + " failed", e);
+        }
+    }
+
+    @Override
     public MailboxId rename(Mailbox mailbox) throws MailboxException {
         Preconditions.checkNotNull(mailbox.getMailboxId(), "A mailbox we want 
to rename should have a defined mailboxId");
 
         try {
-            begin();
-            if (isPathAlreadyUsedByAnotherMailbox(mailbox)) {
-                rollback();
+            if 
(isPathAlreadyUsedByAnotherMailbox(mailbox.generateAssociatedPath())) {
                 throw new MailboxExistsException(mailbox.getName());
             }
 
@@ -119,10 +134,8 @@ public class JPAMailboxMapper extends 
JPATransactionalMapper implements MailboxM
 
             getEntityManager().persist(persistedMailbox);
             mailbox.setMailboxId(persistedMailbox.getMailboxId());
-            commit();
             return persistedMailbox.getMailboxId();
         } catch (PersistenceException e) {
-            rollback();
             throw new MailboxException("Save of mailbox " + mailbox.getName() 
+ " failed", e);
         } 
     }
@@ -135,9 +148,9 @@ public class JPAMailboxMapper extends 
JPATransactionalMapper implements MailboxM
         return result;
     }
 
-    private boolean isPathAlreadyUsedByAnotherMailbox(Mailbox mailbox) throws 
MailboxException {
+    private boolean isPathAlreadyUsedByAnotherMailbox(MailboxPath mailboxPath) 
throws MailboxException {
         try {
-            findMailboxByPath(mailbox.generateAssociatedPath());
+            findMailboxByPath(mailboxPath);
             return true;
         } catch (MailboxNotFoundException e) {
             return false;
diff --git 
a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java
 
b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java
index c0c3f64..e1f5736 100644
--- 
a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java
+++ 
b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java
@@ -58,6 +58,11 @@ public class TransactionalMailboxMapper implements 
MailboxMapper {
     }
 
     @Override
+    public Mailbox create(MailboxPath mailboxPath, long uidValidity) throws 
MailboxException {
+        return wrapped.execute(() -> wrapped.create(mailboxPath, uidValidity));
+    }
+
+    @Override
     public MailboxId rename(Mailbox mailbox) throws MailboxException {
         return wrapped.execute(() -> wrapped.rename(mailbox));
     }
diff --git 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
index f3c2bbc..0b0e730 100644
--- 
a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
+++ 
b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
@@ -193,6 +193,39 @@ public class MaildirMailboxMapper extends 
NonTransactionalMapper implements Mail
     }
 
     @Override
+    public Mailbox create(MailboxPath mailboxPath, long uidValidity) throws 
MailboxException {
+        MaildirId maildirId = MaildirId.random();
+        Mailbox mailbox = new Mailbox(mailboxPath, uidValidity, maildirId);
+        MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
+
+        if (!folder.exists()) {
+            boolean folderExist = folder.getRootFile().exists();
+            if (!folderExist && !folder.getRootFile().mkdirs()) {
+                throw new MailboxException("Failed to save Mailbox " + 
mailbox);
+            }
+
+            boolean isCreated = folder.getCurFolder().mkdir()
+                && folder.getNewFolder().mkdir()
+                && folder.getTmpFolder().mkdir();
+            if (!isCreated) {
+                throw new MailboxException("Failed to save Mailbox " + 
mailbox, new IOException("Needed folder structure can not be created"));
+            }
+        }
+
+        try {
+            folder.setUidValidity(mailbox.getUidValidity());
+            folder.setMailboxId(maildirId);
+            mailbox.setMailboxId(maildirId);
+        } catch (IOException ioe) {
+            throw new MailboxException("Failed to save Mailbox " + mailbox, 
ioe);
+
+        }
+        folder.setACL(mailbox.getACL());
+
+        return mailbox;
+    }
+
+    @Override
     public MailboxId rename(Mailbox mailbox) throws MailboxException {
         MaildirId maildirId = (MaildirId) mailbox.getMailboxId();
 
diff --git 
a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
 
b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
index 3c368d2..c0cea5b 100644
--- 
a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
+++ 
b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
@@ -105,6 +105,16 @@ public class InMemoryMailboxMapper implements 
MailboxMapper {
     }
 
     @Override
+    public Mailbox create(MailboxPath mailboxPath, long uidValidity) throws 
MailboxException {
+        InMemoryId id = InMemoryId.of(mailboxIdGenerator.incrementAndGet());
+        Mailbox mailbox = new Mailbox(mailboxPath, uidValidity, id);
+
+        saveMailbox(mailbox);
+
+        return mailbox;
+    }
+
+    @Override
     public MailboxId rename(Mailbox mailbox) throws MailboxException {
         Preconditions.checkNotNull(mailbox.getMailboxId(), "A mailbox we want 
to rename should have a defined mailboxId");
 
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
index a005dd2..37d898a 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
@@ -45,6 +45,11 @@ public interface MailboxMapper extends Mapper {
     MailboxId create(Mailbox mailbox) throws MailboxException;
 
     /**
+     * Create a {@link Mailbox} with the given {@link MailboxPath} and uid to 
the underlying storage
+     */
+    Mailbox create(MailboxPath mailboxPath, long uidValidity) throws 
MailboxException;
+
+    /**
      * Rename the given {@link Mailbox} to the underlying storage
      */
     MailboxId rename(Mailbox mailbox) throws MailboxException;


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

Reply via email to