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]
