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]
