diff --git a/source/java/org/alfresco/repo/action/executer/MoveActionExecuter.java b/source/java/org/alfresco/repo/action/executer/MoveActionExecuter.java index 7742118565..9884177d10 100644 --- a/source/java/org/alfresco/repo/action/executer/MoveActionExecuter.java +++ b/source/java/org/alfresco/repo/action/executer/MoveActionExecuter.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -19,6 +19,7 @@ package org.alfresco.repo.action.executer; import java.util.List; +import java.util.Set; import org.alfresco.model.ContentModel; import org.alfresco.repo.action.ParameterDefinitionImpl; @@ -29,6 +30,7 @@ import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.model.FileNotFoundException; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.namespace.QName; /** * Move action executor. @@ -81,6 +83,15 @@ public class MoveActionExecuter extends ActionExecuterAbstractBase && !this.nodeService.hasAspect(actionedUponNodeRef, ContentModel.ASPECT_WORKING_COPY)) { NodeRef destinationParent = (NodeRef) ruleAction.getParameterValue(PARAM_DESTINATION_FOLDER); + + // Check the destination not to be in a pending delete list + // MNT-11695 + Set destinationAspects = nodeService.getAspects(destinationParent); + if (destinationAspects.contains(ContentModel.ASPECT_PENDING_DELETE)) + { + return; + } + try { fileFolderService.move(actionedUponNodeRef, destinationParent, null); diff --git a/source/test-java/org/alfresco/repo/rule/RuleServiceImplTest.java b/source/test-java/org/alfresco/repo/rule/RuleServiceImplTest.java index 4821e68a78..4a1b8c326c 100644 --- a/source/test-java/org/alfresco/repo/rule/RuleServiceImplTest.java +++ b/source/test-java/org/alfresco/repo/rule/RuleServiceImplTest.java @@ -32,6 +32,7 @@ import org.alfresco.repo.action.evaluator.ComparePropertyValueEvaluator; import org.alfresco.repo.action.executer.AddFeaturesActionExecuter; import org.alfresco.repo.action.executer.CopyActionExecuter; import org.alfresco.repo.action.executer.ImageTransformActionExecuter; +import org.alfresco.repo.action.executer.MoveActionExecuter; import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.content.transform.AbstractContentTransformerTest; import org.alfresco.repo.security.authentication.AuthenticationUtil; @@ -1289,5 +1290,54 @@ public class RuleServiceImplTest extends BaseRuleTest txn.begin(); assertFalse("The folder should be deleted.", nodeService.exists(parentFolderNodeRef)); txn.commit(); + + // Now test move action + txn = transactionService.getUserTransaction(); + txn.begin(); + // Create 1 folder with 2 folders inside + parentFolderNodeRef = this.nodeService.createNode(rootNodeRef, ContentModel.ASSOC_CHILDREN, QName.createQName("parentnode" + GUID.generate()), + ContentModel.TYPE_FOLDER).getChildRef(); + folder1NodeRef = this.nodeService.createNode(parentFolderNodeRef, ContentModel.ASSOC_CHILDREN, QName.createQName("parentnode" + GUID.generate()), + ContentModel.TYPE_FOLDER).getChildRef(); + folder2NodeRef = this.nodeService.createNode(parentFolderNodeRef, ContentModel.ASSOC_CHILDREN, QName.createQName("parentnode" + GUID.generate()), + ContentModel.TYPE_FOLDER).getChildRef(); + + // Create rule for folder1 + testRule = new Rule(); + testRule.setRuleTypes(Collections.singletonList(RuleType.OUTBOUND)); + testRule.setTitle("RuleServiceTest" + GUID.generate()); + testRule.setDescription(DESCRIPTION); + testRule.applyToChildren(true); + action = this.actionService.createAction(MoveActionExecuter.NAME); + action.setParameterValue(CopyActionExecuter.PARAM_DESTINATION_FOLDER, folder2NodeRef); + testRule.setAction(action); + this.ruleService.saveRule(folder1NodeRef, testRule); + assertNotNull("Rule was not saved", testRule.getNodeRef()); + + actionedQName = QName.createQName("actioneduponnode" + GUID.generate()); + // New node + actionedUponNodeRef = this.nodeService.createNode(folder1NodeRef, ContentModel.ASSOC_CHILDREN, actionedQName, ContentModel.TYPE_CONTENT).getChildRef(); + writer = this.contentService.getWriter(actionedUponNodeRef, ContentModel.PROP_CONTENT, true); + writer.setMimetype("text/plain"); + writer.putContent("TestContent"); + txn.commit(); + + // Remove the parent folder + txn = transactionService.getUserTransaction(); + txn.begin(); + try + { + nodeService.deleteNode(parentFolderNodeRef); + } + catch (Exception e) + { + fail("The nodes should be deleted without errors, but exception was thrown: " + e); + } + txn.commit(); + + txn = transactionService.getUserTransaction(); + txn.begin(); + assertFalse("The folder should be deleted.", nodeService.exists(parentFolderNodeRef)); + txn.commit(); } }