diff --git a/source/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java b/source/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java index efebe6ce69..403ad1a048 100644 --- a/source/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java +++ b/source/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java @@ -1069,7 +1069,8 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO throw new DuplicateChildNodeNameException( newParentNode.getNodeRef(), assocTypeQName, - childNodeName); + childNodeName, + e); } } }; @@ -2245,17 +2246,22 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO { public Long execute() throws Throwable { + Savepoint savepoint = controlDAO.createSavepoint("DuplicateChildNodeNameException"); try { - return insertChildAssoc(assoc); + Long id = insertChildAssoc(assoc); + controlDAO.releaseSavepoint(savepoint); + return id; } catch (Throwable e) { + controlDAO.rollbackToSavepoint(savepoint); // We assume that this is from the child cm:name constraint violation throw new DuplicateChildNodeNameException( parentNode.getNodeRef(), assocTypeQName, - childNodeName); + childNodeName, + e); } } }; @@ -2335,14 +2341,18 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO { public Integer execute() throws Throwable { + Savepoint savepoint = controlDAO.createSavepoint("DuplicateChildNodeNameException"); try { - return updateChildAssocsUniqueName(childNodeId, childName); + Integer count = updateChildAssocsUniqueName(childNodeId, childName); + controlDAO.releaseSavepoint(savepoint); + return count; } catch (Throwable e) { + controlDAO.rollbackToSavepoint(savepoint); // We assume that this is from the child cm:name constraint violation - throw new DuplicateChildNodeNameException(null, null, childName); + throw new DuplicateChildNodeNameException(null, null, childName, e); } } }; diff --git a/source/java/org/alfresco/service/cmr/repository/DuplicateChildNodeNameException.java b/source/java/org/alfresco/service/cmr/repository/DuplicateChildNodeNameException.java index e49e1ffc9f..b50feeada8 100644 --- a/source/java/org/alfresco/service/cmr/repository/DuplicateChildNodeNameException.java +++ b/source/java/org/alfresco/service/cmr/repository/DuplicateChildNodeNameException.java @@ -38,9 +38,9 @@ public class DuplicateChildNodeNameException extends RuntimeException private QName assocTypeQName; private String name; - public DuplicateChildNodeNameException(NodeRef parentNodeRef, QName assocTypeQName, String name) + public DuplicateChildNodeNameException(NodeRef parentNodeRef, QName assocTypeQName, String name, Throwable e) { - super(I18NUtil.getMessage(ERR_DUPLICATE_NAME, name)); + super(I18NUtil.getMessage(ERR_DUPLICATE_NAME, name), e); this.parentNodeRef = parentNodeRef; this.assocTypeQName = assocTypeQName; this.name = name;