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() {