From f2f010bc4dfde0d99d8e60e4a322bef8e8374d38 Mon Sep 17 00:00:00 2001 From: Ramona Popa Date: Fri, 25 Oct 2019 12:41:09 +0300 Subject: [PATCH] RM-7035: Add policies for holds - implementation for policies - integration tests --- .../rm-service-context.xml | 1 + .../hold/HoldServiceImpl.java | 55 +++++++++++++++- .../hold/HoldServicePolicies.java | 55 +++++++++++++++- .../test/integration/hold/CreateHoldTest.java | 66 ++++++++++++++++++- .../test/integration/hold/DeleteHoldTest.java | 66 ++++++++++++++++++- 5 files changed, 237 insertions(+), 6 deletions(-) diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index 00e1ccddaf..a6bb75c2c1 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -1534,6 +1534,7 @@ + beforeCreateHoldPolicyDelegate; + private ClassPolicyDelegate onCreateHoldPolicyDelegate; + private ClassPolicyDelegate beforeDeleteHoldPolicyDelegate; + private ClassPolicyDelegate onDeleteHoldPolicyDelegate; + /** * Initialise hold service */ @@ -184,6 +219,12 @@ public class HoldServiceImpl extends ServiceBaseImpl return null; } }); + + // Register the policies + beforeCreateHoldPolicyDelegate = getPolicyComponent().registerClassPolicy(HoldServicePolicies.BeforeCreateHoldPolicy.class); + onCreateHoldPolicyDelegate = getPolicyComponent().registerClassPolicy(HoldServicePolicies.OnCreateHoldPolicy.class); + beforeDeleteHoldPolicyDelegate = getPolicyComponent().registerClassPolicy(HoldServicePolicies.BeforeDeleteHoldPolicy.class); + onDeleteHoldPolicyDelegate = getPolicyComponent().registerClassPolicy(HoldServicePolicies.OnDeleteHoldPolicy.class); } /** @@ -417,6 +458,9 @@ public class HoldServiceImpl extends ServiceBaseImpl // get the root hold container NodeRef holdContainer = filePlanService.getHoldContainer(filePlan); + //invoke before create hold + beforeCreateHoldPolicyDelegate.get(getTypeAndApsects(holdContainer)).beforeCreateHold(name, reason); + // create map of properties Map properties = new HashMap<>(3); properties.put(ContentModel.PROP_NAME, name); @@ -432,7 +476,12 @@ public class HoldServiceImpl extends ServiceBaseImpl // create hold ChildAssociationRef childAssocRef = nodeService.createNode(holdContainer, ContentModel.ASSOC_CONTAINS, assocName, TYPE_HOLD, properties); - return childAssocRef.getChildRef(); + NodeRef holdNodeRef = childAssocRef.getChildRef(); + + //invoke after hold is created + onCreateHoldPolicyDelegate.get(getTypeAndApsects(holdNodeRef)).onCreateHold(holdNodeRef); + + return holdNodeRef; } /** @@ -520,8 +569,12 @@ public class HoldServiceImpl extends ServiceBaseImpl throw new AlfrescoRuntimeException("Can't delete hold, because filing permissions for the following items are needed: " + sb.toString()); } + beforeDeleteHoldPolicyDelegate.get(getTypeAndApsects(hold)).beforeDeleteHold(hold); + // delete the hold node nodeService.deleteNode(hold); + + onDeleteHoldPolicyDelegate.get(getTypeAndApsects(hold)).onDeleteHold(hold); } /** diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServicePolicies.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServicePolicies.java index cb32ae4e22..fb5060c1d8 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServicePolicies.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServicePolicies.java @@ -27,6 +27,8 @@ package org.alfresco.module.org_alfresco_module_rm.hold; +import org.alfresco.repo.policy.ClassPolicy; +import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; @@ -37,6 +39,55 @@ import org.alfresco.service.namespace.QName; * @since 3.3 */ -public interface HoldServicePolicies { - +public interface HoldServicePolicies +{ + + /** + * Policy names + */ + public static final QName BEFORE_CREATE_HOLD = QName.createQName(NamespaceService.ALFRESCO_URI, "beforeCreateHold"); + public static final QName ON_CREATE_HOLD = QName.createQName(NamespaceService.ALFRESCO_URI, "onCreateHold"); + public static final QName BEFORE_DELETE_HOLD = QName.createQName(NamespaceService.ALFRESCO_URI, "beforeDeleteHold"); + public static final QName ON_DELETE_HOLD = QName.createQName(NamespaceService.ALFRESCO_URI, "onDeleteHold"); + + interface BeforeCreateHoldPolicy extends ClassPolicy + { + /** + * Called before a hold is created. + * + * @param name name of the hold to be created + * @param reason reason for the hold to be created + */ + void beforeCreateHold(String name, String reason); + } + + interface OnCreateHoldPolicy extends ClassPolicy + { + /** + * Called when a hold is created. + * + * @param hold node reference + */ + void onCreateHold(NodeRef hold); + } + + interface BeforeDeleteHoldPolicy extends ClassPolicy + { + /** + * Called before a hold is created. + * + * @param hold node reference + */ + void beforeDeleteHold(NodeRef hold); + } + + interface OnDeleteHoldPolicy extends ClassPolicy + { + /** + * Called when a hold is deleted. + * + * @param hold node reference + */ + void onDeleteHold(NodeRef hold); + } } diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/CreateHoldTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/CreateHoldTest.java index 61e49b676c..d64c788273 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/CreateHoldTest.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/CreateHoldTest.java @@ -37,8 +37,18 @@ import java.util.HashSet; import java.util.Set; import org.alfresco.module.org_alfresco_module_rm.capability.Capability; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.BeforeCreateHoldPolicy; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.BeforeDeleteHoldPolicy; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.OnCreateHoldPolicy; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.OnDeleteHoldPolicy; +import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.module.org_alfresco_module_rm.role.Role; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; +import org.alfresco.repo.policy.Behaviour.NotificationFrequency; +import org.alfresco.repo.policy.BehaviourDefinition; +import org.alfresco.repo.policy.ClassBehaviourBinding; +import org.alfresco.repo.policy.JavaBehaviour; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.service.cmr.repository.NodeRef; @@ -48,11 +58,14 @@ import org.alfresco.service.cmr.repository.NodeRef; * @author Tuna Aksoy * @since 2.3 */ -public class CreateHoldTest extends BaseRMTestCase +public class CreateHoldTest extends BaseRMTestCase implements BeforeCreateHoldPolicy, OnCreateHoldPolicy { // Test user private String testUser = null; + private boolean beforeCreateHoldFlag = false; + private boolean onCreateHoldFlag = false; + /** * @see org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase#isUserTest() */ @@ -107,7 +120,7 @@ public class CreateHoldTest extends BaseRMTestCase { // ensure the user has the correct permission to create the hold filePlanPermissionService.setPermission(holdsContainer, testUser, FILING); - + return null; } }, getAdminUserName()); @@ -134,4 +147,53 @@ public class CreateHoldTest extends BaseRMTestCase } }); } + + public void testPolicyNotificationForCreateHold() throws Exception + { + doTestInTransaction(new Test() + { + private NodeRef hold; + + @Override + public Void run() + { + BehaviourDefinition beforeCreateHoldBehaviour = policyComponent.bindClassBehaviour( + HoldServicePolicies.BEFORE_CREATE_HOLD, RecordsManagementModel.TYPE_HOLD_CONTAINER, + new JavaBehaviour(CreateHoldTest.this, "beforeCreateHold", NotificationFrequency.EVERY_EVENT)); + + BehaviourDefinition onCreateHoldBehaviour = policyComponent.bindClassBehaviour( + HoldServicePolicies.ON_CREATE_HOLD, RecordsManagementModel.TYPE_HOLD, + new JavaBehaviour(CreateHoldTest.this, "onCreateHold", NotificationFrequency.EVERY_EVENT)); + + assertFalse(beforeCreateHoldFlag); + assertFalse(onCreateHoldFlag); + + // Create a hold + hold = holdService.createHold(filePlan, generate(), generate(), generate()); + + assertTrue(beforeCreateHoldFlag); + assertTrue(onCreateHoldFlag); + + //clean up + policyComponent.removeClassDefinition(beforeCreateHoldBehaviour); + policyComponent.removeClassDefinition(onCreateHoldBehaviour); + + return null; + } + + }, getAdminUserName()); + + } + + @Override + public void beforeCreateHold(String name, String reason) + { + beforeCreateHoldFlag = true; + } + + @Override + public void onCreateHold(NodeRef hold) + { + onCreateHoldFlag = true; + } } diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/DeleteHoldTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/DeleteHoldTest.java index 8396032d5d..ac08710403 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/DeleteHoldTest.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/DeleteHoldTest.java @@ -27,10 +27,21 @@ package org.alfresco.module.org_alfresco_module_rm.test.integration.hold; +import static org.alfresco.repo.security.authentication.AuthenticationUtil.getAdminUserName; +import static org.alfresco.util.GUID.generate; + import java.util.ArrayList; import java.util.List; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.BeforeDeleteHoldPolicy; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.OnDeleteHoldPolicy; +import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; +import org.alfresco.repo.policy.Behaviour.NotificationFrequency; +import org.alfresco.repo.policy.BehaviourDefinition; +import org.alfresco.repo.policy.ClassBehaviourBinding; +import org.alfresco.repo.policy.JavaBehaviour; import org.alfresco.service.cmr.repository.NodeRef; /** @@ -39,7 +50,7 @@ import org.alfresco.service.cmr.repository.NodeRef; * @author Roy Wetherall * @since 2.2 */ -public class DeleteHoldTest extends BaseRMTestCase +public class DeleteHoldTest extends BaseRMTestCase implements BeforeDeleteHoldPolicy, OnDeleteHoldPolicy { /** Constants for the holds */ protected static final String HOLD1_NAME = "hold one"; @@ -49,6 +60,9 @@ public class DeleteHoldTest extends BaseRMTestCase protected static final String HOLD1_DESC = "but I'll not describe them here!"; protected static final String HOLD2_DESC = "no then! that's just not on!"; + private boolean beforeDeleteHoldFlag = false; + private boolean onDeleteHoldFlag = false; + @Override protected boolean isRecordTest() { @@ -234,4 +248,54 @@ public class DeleteHoldTest extends BaseRMTestCase } }); } + + public void testPolicyNotificationForDeleteHold() throws Exception + { + doTestInTransaction(new Test() + { + + @Override + public Void run() + { + BehaviourDefinition beforeDeleteHoldBehaviour = policyComponent.bindClassBehaviour( + HoldServicePolicies.BEFORE_DELETE_HOLD, RecordsManagementModel.TYPE_HOLD, + new JavaBehaviour(DeleteHoldTest.this, "beforeDeleteHold", NotificationFrequency.EVERY_EVENT)); + + BehaviourDefinition onDeleteHoldBehaviour = policyComponent.bindClassBehaviour( + HoldServicePolicies.ON_DELETE_HOLD, RecordsManagementModel.TYPE_HOLD, + new JavaBehaviour(DeleteHoldTest.this, "onDeleteHold", NotificationFrequency.EVERY_EVENT)); + + NodeRef hold = holdService.createHold(filePlan, generate(), generate(), generate()); + + assertFalse(beforeDeleteHoldFlag); + assertFalse(onDeleteHoldFlag); + + // Delete the hold + holdService.deleteHold(hold); + + assertTrue(beforeDeleteHoldFlag); + assertTrue(onDeleteHoldFlag); + + //clean up + policyComponent.removeClassDefinition(beforeDeleteHoldBehaviour); + policyComponent.removeClassDefinition(onDeleteHoldBehaviour); + + return null; + } + + }, getAdminUserName()); + + } + + @Override + public void beforeDeleteHold(NodeRef hold) + { + beforeDeleteHoldFlag = true; + } + + @Override + public void onDeleteHold(NodeRef hold) + { + onDeleteHoldFlag = true; + } }