From 6c896c899700264cc0fd3910e21708b1d11a2eea Mon Sep 17 00:00:00 2001 From: Derek Hulley Date: Tue, 29 Aug 2006 09:03:34 +0000 Subject: [PATCH] Name duplicate detection is not done at the end of the transaction, so late setting of cm:name has to be avoided. This fix makes the CopyService use the auto-assigned cm:name before doing the copy. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@3621 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../alfresco/repo/copy/CopyServiceImpl.java | 19 +++++++++++++++++ .../filefolder/FileFolderServiceImpl.java | 21 ++++++++++++------- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/source/java/org/alfresco/repo/copy/CopyServiceImpl.java b/source/java/org/alfresco/repo/copy/CopyServiceImpl.java index f0e1b7be09..8172f86235 100644 --- a/source/java/org/alfresco/repo/copy/CopyServiceImpl.java +++ b/source/java/org/alfresco/repo/copy/CopyServiceImpl.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; import org.alfresco.repo.policy.ClassPolicyDelegate; import org.alfresco.repo.policy.JavaBehaviour; @@ -31,6 +32,7 @@ import org.alfresco.repo.policy.PolicyComponent; import org.alfresco.repo.policy.PolicyScope; import org.alfresco.service.cmr.dictionary.AspectDefinition; import org.alfresco.service.cmr.dictionary.AssociationDefinition; +import org.alfresco.service.cmr.dictionary.ChildAssociationDefinition; import org.alfresco.service.cmr.dictionary.ClassDefinition; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.dictionary.DictionaryService; @@ -401,6 +403,23 @@ public class CopyServiceImpl implements CopyService } } + // if the parent node is the same, then remove the name property - it will have to + // be changed by the client code + AssociationDefinition assocDef = dictionaryService.getAssociation(destinationAssocTypeQName); + if (!assocDef.isChild()) + { + throw new AlfrescoRuntimeException("Association is not a child association: " + destinationAssocTypeQName); + } + else + { + ChildAssociationDefinition childAssocDef = (ChildAssociationDefinition) assocDef; + if (!childAssocDef.getDuplicateChildNamesAllowed()) + { + // duplicate children are not allowed. + properties.remove(ContentModel.PROP_NAME); + } + } + // Create the new node ChildAssociationRef destinationChildAssocRef = this.nodeService.createNode( destinationParent, diff --git a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java index 18b1922b4e..4fe89d582b 100644 --- a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java +++ b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java @@ -586,13 +586,20 @@ public class FileFolderServiceImpl implements FileFolderService } else { - // copy the node - targetNodeRef = copyService.copy( - sourceNodeRef, - targetParentRef, - assocRef.getTypeQName(), - qname, - true); + try + { + // copy the node + targetNodeRef = copyService.copy( + sourceNodeRef, + targetParentRef, + assocRef.getTypeQName(), + qname, + true); + } + catch (DuplicateChildNodeNameException e) + { + throw new FileExistsException(targetParentRef, newName); + } } // Only update the name if it has changed