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]

Reply via email to