From 549257843e80199c3467d858b97a8dfb691c01b7 Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Sat, 31 Jan 2015 11:01:39 +0000 Subject: [PATCH] Merged HEAD-BUG-FIX (5.1/Cloud) to HEAD (5.1/Cloud) 90779: Merged V4.2-BUG-FIX (4.2.5) to HEAD-BUG-FIX (5.0/Cloud) 90654: Merged DEV to V4.2-BUG-FIX (4.2.4) 88809: MNT-12502: Updating parent node (folder) fails using CMIS, if any of contained children is locked Check if HiddenAspect and IndexControlAspect exist on folder items before actually remove aspects. Apply cascade of the (un-)hide to children even if a child is locked. Add unit test for case. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@94717 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../model-specific-services-context.xml | 1 + .../repo/model/filefolder/HiddenAspect.java | 47 +++++++++++++-- .../model/filefolder/HiddenAspectTest.java | 58 ++++++++++++++++++- 3 files changed, 100 insertions(+), 6 deletions(-) diff --git a/config/alfresco/model-specific-services-context.xml b/config/alfresco/model-specific-services-context.xml index 68c128939e..4bd9c0c32e 100644 --- a/config/alfresco/model-specific-services-context.xml +++ b/config/alfresco/model-specific-services-context.xml @@ -15,6 +15,7 @@ + diff --git a/source/java/org/alfresco/repo/model/filefolder/HiddenAspect.java b/source/java/org/alfresco/repo/model/filefolder/HiddenAspect.java index 653fd2f578..0789ac23e1 100644 --- a/source/java/org/alfresco/repo/model/filefolder/HiddenAspect.java +++ b/source/java/org/alfresco/repo/model/filefolder/HiddenAspect.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2012 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -33,6 +33,7 @@ import org.alfresco.api.AlfrescoPublicApi; import org.alfresco.model.ContentModel; import org.alfresco.query.PagingRequest; import org.alfresco.query.PagingResults; +import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.repo.policy.PolicyComponent; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.cmr.model.FileFolderService; @@ -129,11 +130,17 @@ public class HiddenAspect private FileFolderService fileFolderService; private SearchService searchService; private PolicyComponent policyComponent; + private BehaviourFilter behaviourFilter; public HiddenAspect() { } + public void setBehaviourFilter(BehaviourFilter behaviourFilter) + { + this.behaviourFilter = behaviourFilter; + } + public void setPolicyComponent(PolicyComponent policyComponent) { this.policyComponent = policyComponent; @@ -409,7 +416,15 @@ public class HiddenAspect // already has the hidden aspect applied (it may have been applied for a different pattern). for(FileInfo file : files) { - applyHidden(file, filter); + behaviourFilter.disableBehaviour(file.getNodeRef(), ContentModel.ASPECT_LOCKABLE); + try + { + applyHidden(file, filter); + } + finally + { + behaviourFilter.enableBehaviour(file.getNodeRef(), ContentModel.ASPECT_LOCKABLE); + } } } } @@ -445,7 +460,15 @@ public class HiddenAspect // already has the hidden aspect applied (it may have been applied for a different pattern). for(FileInfo file : files) { - applyHidden(file, filter); + behaviourFilter.disableBehaviour(file.getNodeRef(), ContentModel.ASPECT_LOCKABLE); + try + { + applyHidden(file, filter); + } + finally + { + behaviourFilter.enableBehaviour(file.getNodeRef(), ContentModel.ASPECT_LOCKABLE); + } } } } @@ -466,8 +489,22 @@ public class HiddenAspect // remove hidden aspect only if it doesn't match a hidden pattern if(isHidden(name) == null) { - removeHiddenAspect(file.getNodeRef()); - removeIndexControlAspect(file.getNodeRef()); + behaviourFilter.disableBehaviour(file.getNodeRef(), ContentModel.ASPECT_LOCKABLE); + try + { + if (hasHiddenAspect(file.getNodeRef())) + { + removeHiddenAspect(file.getNodeRef()); + } + if (hasIndexControlAspect(file.getNodeRef())) + { + removeIndexControlAspect(file.getNodeRef()); + } + } + finally + { + behaviourFilter.enableBehaviour(file.getNodeRef(), ContentModel.ASPECT_LOCKABLE); + } if(file.isFolder()) { diff --git a/source/test-java/org/alfresco/repo/model/filefolder/HiddenAspectTest.java b/source/test-java/org/alfresco/repo/model/filefolder/HiddenAspectTest.java index 2ef833fce4..bdc6f48acf 100644 --- a/source/test-java/org/alfresco/repo/model/filefolder/HiddenAspectTest.java +++ b/source/test-java/org/alfresco/repo/model/filefolder/HiddenAspectTest.java @@ -2,6 +2,7 @@ package org.alfresco.repo.model.filefolder; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -30,13 +31,14 @@ import org.alfresco.repo.model.filefolder.HiddenAspect.Visibility; import org.alfresco.repo.search.impl.lucene.LuceneQueryParser; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.ServiceRegistry; +import org.alfresco.service.cmr.coci.CheckOutCheckInService; +import org.alfresco.service.cmr.lock.NodeLockedException; import org.alfresco.service.cmr.model.FileExistsException; import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.model.FileNotFoundException; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.DuplicateChildNodeNameException; -import org.alfresco.service.cmr.repository.MLText; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; @@ -76,6 +78,7 @@ public class HiddenAspectTest private FileFolderService fileFolderService; private MutableAuthenticationService authenticationService; private PermissionService permissionService; + private CheckOutCheckInService cociService; private UserTransaction txn; private SearchService searchService; @@ -106,6 +109,7 @@ public class HiddenAspectTest hiddenAspect = (HiddenAspect) ctx.getBean("hiddenAspect"); interceptor = (FilenameFilteringInterceptor) ctx.getBean("filenameFilteringInterceptor"); namespacePrefixResolver = (DictionaryNamespaceComponent) ctx.getBean("namespaceService"); + cociService = (CheckOutCheckInService) ctx.getBean("checkOutCheckInService"); imapService = serviceRegistry.getImapService(); personService = serviceRegistry.getPersonService(); searchService = serviceRegistry.getSearchService(); @@ -574,6 +578,58 @@ public class HiddenAspectTest } } + @Test + public void testFolderRename() + { + FileFilterMode.setClient(Client.cmis); + NodeRef workingCopyNodeRef = null; + + try + { + String guid = GUID.generate(); + String nodeName = "MyFolder" + guid; + String newName = "AnotherFolder" + guid; + NodeRef node = fileFolderService.create(topNodeRef, nodeName, ContentModel.TYPE_FOLDER).getNodeRef(); + NodeRef checkedOutNode = fileFolderService.create(node, guid + ".lockedchild", ContentModel.TYPE_CONTENT).getNodeRef(); + + ResultSet results = searchForName(nodeName); + assertEquals("", 1, results.length()); + + workingCopyNodeRef = cociService.checkout(checkedOutNode); + assertNotNull(workingCopyNodeRef); + assertTrue(nodeService.hasAspect(checkedOutNode, ContentModel.ASPECT_CHECKED_OUT)); + assertTrue(nodeService.hasAspect(checkedOutNode, ContentModel.ASPECT_LOCKABLE)); + + try + { + fileFolderService.rename(node, newName); + } + catch (NodeLockedException e) + { + fail("It should be possible to rename folder with locked items"); + } + catch (FileExistsException e) + { + fail(); + } + catch (FileNotFoundException e) + { + fail(); + } + + results = searchForName(nodeName); + assertEquals("File with old name should not be found", 0, results.length()); + + results = searchForName(newName); + assertEquals("File with new name should be found", 1, results.length()); + } + finally + { + cociService.cancelCheckout(workingCopyNodeRef); + FileFilterMode.clearClient(); + } + } + @Test public void testHiddenFilesBasicClient() {