diff --git a/source/java/org/alfresco/repo/action/executer/TransitionSimpleWorkflowActionExecuter.java b/source/java/org/alfresco/repo/action/executer/TransitionSimpleWorkflowActionExecuter.java index b4166bffa2..a080474ed3 100644 --- a/source/java/org/alfresco/repo/action/executer/TransitionSimpleWorkflowActionExecuter.java +++ b/source/java/org/alfresco/repo/action/executer/TransitionSimpleWorkflowActionExecuter.java @@ -28,6 +28,7 @@ import org.alfresco.model.ContentModel; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.cmr.action.Action; import org.alfresco.service.cmr.action.ParameterDefinition; +import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.CopyService; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; @@ -144,17 +145,13 @@ public class TransitionSimpleWorkflowActionExecuter extends ActionExecuterAbstra else { // copy the node to the specified folder - String qname = QName.createValidLocalName(name); - NodeRef newNode = copyService.copy( + ChildAssociationRef originalAssoc = nodeService.getPrimaryParent(actionedUponNodeRef); + copyService.copyAndRename( actionedUponNodeRef, destinationFolder, - ContentModel.ASSOC_CONTAINS, - QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, qname), + originalAssoc.getTypeQName(), + originalAssoc.getQName(), true); - - // the copy service does not copy the name of the node so we - // need to update the property on the copied item - nodeService.setProperty(newNode, ContentModel.PROP_NAME, name); } } } diff --git a/source/test-java/org/alfresco/repo/action/executer/TransitionSimpleWorkflowActionExecuterTest.java b/source/test-java/org/alfresco/repo/action/executer/TransitionSimpleWorkflowActionExecuterTest.java index 83ede425d6..b7c9e9e796 100644 --- a/source/test-java/org/alfresco/repo/action/executer/TransitionSimpleWorkflowActionExecuterTest.java +++ b/source/test-java/org/alfresco/repo/action/executer/TransitionSimpleWorkflowActionExecuterTest.java @@ -26,6 +26,7 @@ import org.alfresco.model.ApplicationModel; import org.alfresco.model.ContentModel; import org.alfresco.repo.action.ActionImpl; import org.alfresco.service.cmr.model.FileFolderService; +import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.QName; import org.alfresco.test_category.BaseSpringTestsCategory; @@ -85,24 +86,13 @@ public class TransitionSimpleWorkflowActionExecuterTest extends BaseAlfrescoSpri // Get the executer instance this.acceptExecuter = (TransitionSimpleWorkflowActionExecuter)this.applicationContext.getBean("accept-simpleworkflow"); - this.rejectExecuter = (TransitionSimpleWorkflowActionExecuter)this.applicationContext.getBean("reject-simpleworkflow"); - - // Set up workflow details on the node - Map propertyValues = new HashMap(); - propertyValues.put(ApplicationModel.PROP_APPROVE_STEP, "Approve"); - propertyValues.put(ApplicationModel.PROP_APPROVE_FOLDER, destinationFolder); - propertyValues.put(ApplicationModel.PROP_APPROVE_MOVE, Boolean.TRUE); - propertyValues.put(ApplicationModel.PROP_REJECT_STEP, "Reject"); - propertyValues.put(ApplicationModel.PROP_REJECT_FOLDER, destinationFolder); - propertyValues.put(ApplicationModel.PROP_REJECT_MOVE, Boolean.FALSE); - - // Apply the simple workflow aspect to the node - this.nodeService.addAspect(node, ApplicationModel.ASPECT_SIMPLE_WORKFLOW, propertyValues); - + this.rejectExecuter = (TransitionSimpleWorkflowActionExecuter)this.applicationContext.getBean("reject-simpleworkflow"); } public void testExecutionApprove() { + addWorkflowAspect(node, destinationFolder, Boolean.TRUE, Boolean.FALSE); + assertTrue(nodeService.hasAspect(node, ApplicationModel.ASPECT_SIMPLE_WORKFLOW)); NodeRef pParent = nodeService.getPrimaryParent(node).getParentRef(); assertEquals(sourceFolder, pParent); @@ -117,6 +107,8 @@ public class TransitionSimpleWorkflowActionExecuterTest extends BaseAlfrescoSpri public void testExecutionReject() { + addWorkflowAspect(node, destinationFolder, Boolean.TRUE, Boolean.FALSE); + assertTrue(nodeService.hasAspect(node, ApplicationModel.ASPECT_SIMPLE_WORKFLOW)); NodeRef pParent = nodeService.getPrimaryParent(node).getParentRef(); assertEquals(sourceFolder, pParent); @@ -130,4 +122,65 @@ public class TransitionSimpleWorkflowActionExecuterTest extends BaseAlfrescoSpri assertEquals(sourceFolder, pParent); assertEquals(1, nodeService.getChildAssocs(destinationFolder).size()); } + + /** Test for MNT-14730*/ + public void testExecutionApproveWhenDestinationSameAsSource() + { + addWorkflowAspect(node, sourceFolder, Boolean.FALSE, Boolean.FALSE); + + assertTrue(nodeService.hasAspect(node, ApplicationModel.ASPECT_SIMPLE_WORKFLOW)); + NodeRef pParent = nodeService.getPrimaryParent(node).getParentRef(); + assertEquals(sourceFolder, pParent); + + ActionImpl action = new ActionImpl(null, ID, "accept-simpleworkflow", null); + acceptExecuter.execute(action, node); + + String copyName = QName.createValidLocalName("Copy of my node.txt"); + NodeRef nodeRef = nodeService.getChildByName(sourceFolder, ContentModel.ASSOC_CONTAINS, copyName); + assertNotNull(nodeRef); + } + + /** Test for MNT-14730*/ + public void testExecutionRejectWhenDestinationSameAsSource() + { + addWorkflowAspect(node, sourceFolder, Boolean.FALSE, Boolean.FALSE); + + assertTrue(nodeService.hasAspect(node, ApplicationModel.ASPECT_SIMPLE_WORKFLOW)); + NodeRef pParent = nodeService.getPrimaryParent(node).getParentRef(); + assertEquals(sourceFolder, pParent); + assertEquals(0, nodeService.getChildAssocs(destinationFolder).size()); + + ActionImpl action = new ActionImpl(null, ID, "reject-simpleworkflow", null); + rejectExecuter.execute(action, node); + + assertFalse(nodeService.hasAspect(node, ApplicationModel.ASPECT_SIMPLE_WORKFLOW)); + pParent = nodeService.getPrimaryParent(node).getParentRef(); + assertEquals(sourceFolder, pParent); + assertEquals(0, nodeService.getChildAssocs(destinationFolder).size()); + + String copyName = QName.createValidLocalName("Copy of my node.txt"); + NodeRef nodeRef = nodeService.getChildByName(sourceFolder, ContentModel.ASSOC_CONTAINS, copyName); + assertNotNull(nodeRef); + } + + private void addWorkflowAspect(NodeRef node, NodeRef destinationFolder, Boolean moveOnApprove, Boolean moveOnReject) + { + // Set up workflow details on the node + Map propertyValues = createWorkflowProperties(destinationFolder, moveOnApprove, moveOnReject); + + // Apply the simple workflow aspect to the node + this.nodeService.addAspect(node, ApplicationModel.ASPECT_SIMPLE_WORKFLOW, propertyValues); + } + + private Map createWorkflowProperties(NodeRef destinationFolder, Boolean moveOnApprove, Boolean moveOnReject) + { + Map propertyValues = new HashMap(); + propertyValues.put(ApplicationModel.PROP_APPROVE_STEP, "Approve"); + propertyValues.put(ApplicationModel.PROP_APPROVE_FOLDER, destinationFolder); + propertyValues.put(ApplicationModel.PROP_APPROVE_MOVE, moveOnApprove); + propertyValues.put(ApplicationModel.PROP_REJECT_STEP, "Reject"); + propertyValues.put(ApplicationModel.PROP_REJECT_FOLDER, destinationFolder); + propertyValues.put(ApplicationModel.PROP_REJECT_MOVE, moveOnReject); + return propertyValues; + } }