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

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

commit c8f5a8b62a88516cd1de4bb9ee3cf03a877b0d32
Author: Benoit Tellier <[email protected]>
AuthorDate: Thu Apr 4 14:27:13 2019 +0700

    JAMES-2723 Fix JPA MailboxManager::renameMailbox
    
    persist fails when the id is already used. Overwritting an item with 
OpenJPA requires to load it from the DB.
---
 .../james/mailbox/jpa/mail/JPAMailboxMapper.java   | 44 ++++++++++++++++++----
 1 file changed, 37 insertions(+), 7 deletions(-)

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 45a3d3f..d342649 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,16 +88,31 @@ public class JPAMailboxMapper extends 
JPATransactionalMapper implements MailboxM
             }
 
             this.lastMailboxName = mailbox.getName();
-            JPAMailbox persistedMailbox = JPAMailbox.from(mailbox);
+            JPAMailbox persistedMailbox = jpaMailbox(mailbox);
 
             getEntityManager().persist(persistedMailbox);
             mailbox.setMailboxId(persistedMailbox.getMailboxId());
-            return mailbox.getMailboxId();
+            return persistedMailbox.getMailboxId();
         } catch (PersistenceException e) {
             throw new MailboxException("Save of mailbox " + mailbox.getName() 
+ " failed", e);
         } 
     }
 
+    private JPAMailbox jpaMailbox(Mailbox mailbox) {
+        if (mailbox.getMailboxId() == null) {
+            return JPAMailbox.from(mailbox);
+        }
+        try {
+            JPAMailbox result = loadJpaMailbox(mailbox.getMailboxId());
+            result.setNamespace(mailbox.getNamespace());
+            result.setUser(mailbox.getUser());
+            result.setName(mailbox.getName());
+            return result;
+        } catch (MailboxNotFoundException e) {
+            return JPAMailbox.from(mailbox);
+        }
+    }
+
     private boolean isPathAlreadyUsedByAnotherMailbox(Mailbox mailbox) throws 
MailboxException {
         try {
             Mailbox storedMailbox = 
findMailboxByPath(mailbox.generateAssociatedPath());
@@ -133,17 +148,32 @@ public class JPAMailboxMapper extends 
JPATransactionalMapper implements MailboxM
 
     @Override
     public Mailbox findMailboxById(MailboxId id) throws MailboxException, 
MailboxNotFoundException {
+
+        try {
+            return loadJpaMailbox(id).toMailbox();
+        } catch (PersistenceException e) {
+            throw new MailboxException("Search of mailbox " + id.serialize() + 
" failed", e);
+        } 
+    }
+
+    private JPAMailbox loadJpaMailbox(MailboxId id) throws 
MailboxNotFoundException {
         JPAId mailboxId = (JPAId)id;
         try {
             return getEntityManager().createNamedQuery("findMailboxById", 
JPAMailbox.class)
                 .setParameter("idParam", mailboxId.getRawId())
-                .getSingleResult()
-                .toMailbox();
+                .getSingleResult();
         } catch (NoResultException e) {
             throw new MailboxNotFoundException(mailboxId);
-        } catch (PersistenceException e) {
-            throw new MailboxException("Search of mailbox " + 
mailboxId.serialize() + " failed", e);
-        } 
+        }
+    }
+
+    public boolean exists(MailboxId id) throws MailboxException, 
MailboxNotFoundException {
+        try {
+            loadJpaMailbox(id);
+            return true;
+        } catch (MailboxNotFoundException e) {
+            return false;
+        }
     }
 
     @Override


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

Reply via email to