JAMES-2008 Add additional Mapper test on duplicated mailbox name
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/4f5118af Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/4f5118af Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/4f5118af Branch: refs/heads/master Commit: 4f5118af85a72d89136abe2f479527b2d6a15a3f Parents: 1d2d331 Author: benwa <[email protected]> Authored: Fri Apr 21 14:25:15 2017 +0700 Committer: Antoine Duprat <[email protected]> Committed: Wed Apr 26 13:50:12 2017 +0200 ---------------------------------------------------------------------- .../james/mailbox/jpa/mail/JPAMailboxMapper.java | 16 ++++++++++++++++ .../inmemory/mail/InMemoryMailboxMapper.java | 13 +++++++++++++ .../mailbox/store/mail/model/MailboxMapperTest.java | 13 +++++++++++++ 3 files changed, 42 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/4f5118af/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java ---------------------------------------------------------------------- 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 4a120d2..a6a7abe 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 @@ -39,6 +39,8 @@ import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.store.mail.MailboxMapper; import org.apache.james.mailbox.store.mail.model.Mailbox; +import com.google.common.base.Objects; + /** * Data access management for mailbox. */ @@ -76,8 +78,13 @@ public class JPAMailboxMapper extends JPATransactionalMapper implements MailboxM */ public MailboxId save(Mailbox mailbox) throws MailboxException { try { + if (isPathAlreadyUsedByAnotherMailbox(mailbox)) { + throw new MailboxExistsException(mailbox.getName()); + } + this.lastMailboxName = mailbox.getName(); JPAMailbox persistedMailbox = JPAMailbox.from(mailbox); + getEntityManager().persist(persistedMailbox); if (!(mailbox instanceof JPAMailbox)) { mailbox.setMailboxId(persistedMailbox.getMailboxId()); @@ -88,6 +95,15 @@ public class JPAMailboxMapper extends JPATransactionalMapper implements MailboxM } } + private boolean isPathAlreadyUsedByAnotherMailbox(Mailbox mailbox) throws MailboxException { + try { + Mailbox storedMailbox = findMailboxByPath(mailbox.generateAssociatedPath()); + return !Objects.equal(storedMailbox.getMailboxId(), mailbox.getMailboxId()); + } catch (MailboxNotFoundException e) { + return false; + } + } + /** * @see org.apache.james.mailbox.store.mail.MailboxMapper#findMailboxByPath(MailboxPath) */ http://git-wip-us.apache.org/repos/asf/james-project/blob/4f5118af/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java ---------------------------------------------------------------------- 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 7372975..8f42eed 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 @@ -25,6 +25,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.exception.MailboxExistsException; import org.apache.james.mailbox.exception.MailboxNotFoundException; import org.apache.james.mailbox.inmemory.InMemoryId; import org.apache.james.mailbox.model.MailboxACL; @@ -115,10 +116,22 @@ public class InMemoryMailboxMapper implements MailboxMapper { id = InMemoryId.of(mailboxIdGenerator.incrementAndGet()); ((SimpleMailbox) mailbox).setMailboxId(id); } + if (isPathAlreadyUsedByAnotherMailbox(mailbox)) { + throw new MailboxExistsException(mailbox.getName()); + } mailboxesById.put(id, mailbox); return mailbox.getMailboxId(); } + private boolean isPathAlreadyUsedByAnotherMailbox(Mailbox mailbox) throws MailboxException { + try { + Mailbox storedMailbox = findMailboxByPath(mailbox.generateAssociatedPath()); + return !Objects.equal(storedMailbox.getMailboxId(), mailbox.getMailboxId()); + } catch (MailboxNotFoundException e) { + return false; + } + } + /** * Do nothing */ http://git-wip-us.apache.org/repos/asf/james-project/blob/4f5118af/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java index 6b0b14f..8b36d37 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java @@ -26,6 +26,7 @@ import static org.assertj.core.api.Assertions.fail; import java.util.List; import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.exception.MailboxExistsException; import org.apache.james.mailbox.exception.MailboxNotFoundException; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MailboxPath; @@ -113,6 +114,18 @@ public abstract class MailboxMapperTest { } @Test + public void saveShouldThrowWhenMailboxAlreadyExist() throws MailboxException{ + expected.expect(MailboxExistsException.class); + + mailboxMapper.save(benwaInboxMailbox); + + SimpleMailbox mailbox = new SimpleMailbox(benwaInboxMailbox); + mailbox.setMailboxId(null); + + mailboxMapper.save(mailbox); + } + + @Test public void saveWithNullUserShouldPersistTheMailbox() throws MailboxException{ mailboxMapper.save(esnDevGroupInboxMailbox); MailboxAssert.assertThat(mailboxMapper.findMailboxByPath(esnDevGroupInboxPath)).isEqualTo(esnDevGroupInboxMailbox); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
