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