From 39fe03efc8720c671cef495b1f14ffca0dbc7cee Mon Sep 17 00:00:00 2001 From: Ramona Popa Date: Thu, 24 Oct 2019 11:00:29 +0300 Subject: [PATCH 1/9] RM-6860: Add hold service policies - Added HoldServicePolicies interface --- .../hold/HoldServicePolicies.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServicePolicies.java 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 new file mode 100644 index 0000000000..cb32ae4e22 --- /dev/null +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServicePolicies.java @@ -0,0 +1,42 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2019 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm.hold; + +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; + +/** + * Hold Service Policies + * + * @author Ramona Popa + * @since 3.3 + */ + +public interface HoldServicePolicies { + +} From f2f010bc4dfde0d99d8e60e4a322bef8e8374d38 Mon Sep 17 00:00:00 2001 From: Ramona Popa Date: Fri, 25 Oct 2019 12:41:09 +0300 Subject: [PATCH 2/9] 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; + } } From adc39da95a30ca669ae12882e5dff2c523f8d3fd Mon Sep 17 00:00:00 2001 From: Ramona Popa Date: Fri, 25 Oct 2019 15:48:10 +0300 Subject: [PATCH 3/9] RM-7035: Add policies for holds - some minor formating - fix unit test --- .../hold/HoldServiceImpl.java | 84 +++++++++++++++---- .../hold/HoldServicePolicies.java | 14 ++-- .../test/integration/hold/CreateHoldTest.java | 4 +- .../test/integration/hold/DeleteHoldTest.java | 4 +- .../hold/HoldServiceImplUnitTest.java | 10 +++ 5 files changed, 85 insertions(+), 31 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java index 1b989cfdd6..5b09290289 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java @@ -41,16 +41,19 @@ import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; -import org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies; +import org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies.BeforeFileRecord; import org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService; import org.alfresco.module.org_alfresco_module_rm.audit.event.AuditEvent; import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService; import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; +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.record.RecordService; import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService; -import org.alfresco.module.org_alfresco_module_rm.util.PoliciesUtil; import org.alfresco.module.org_alfresco_module_rm.util.ServiceBaseImpl; import org.alfresco.repo.node.NodeServicePolicies; import org.alfresco.repo.node.integrity.IntegrityException; @@ -181,7 +184,7 @@ public class HoldServiceImpl extends ServiceBaseImpl * * @return The policy component instance */ - private PolicyComponent getPolicyComponent() + protected PolicyComponent getPolicyComponent() { return this.policyComponent; } @@ -199,10 +202,10 @@ public class HoldServiceImpl extends ServiceBaseImpl /** * Policy delegates */ - private ClassPolicyDelegate beforeCreateHoldPolicyDelegate; - private ClassPolicyDelegate onCreateHoldPolicyDelegate; - private ClassPolicyDelegate beforeDeleteHoldPolicyDelegate; - private ClassPolicyDelegate onDeleteHoldPolicyDelegate; + private ClassPolicyDelegate beforeCreateHoldPolicyDelegate; + private ClassPolicyDelegate onCreateHoldPolicyDelegate; + private ClassPolicyDelegate beforeDeleteHoldPolicyDelegate; + private ClassPolicyDelegate onDeleteHoldPolicyDelegate; /** * Initialise hold service @@ -221,10 +224,10 @@ public class HoldServiceImpl extends ServiceBaseImpl }); // 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); + beforeCreateHoldPolicyDelegate = getPolicyComponent().registerClassPolicy(BeforeCreateHoldPolicy.class); + onCreateHoldPolicyDelegate = getPolicyComponent().registerClassPolicy(OnCreateHoldPolicy.class); + beforeDeleteHoldPolicyDelegate = getPolicyComponent().registerClassPolicy(BeforeDeleteHoldPolicy.class); + onDeleteHoldPolicyDelegate = getPolicyComponent().registerClassPolicy(OnDeleteHoldPolicy.class); } /** @@ -458,8 +461,7 @@ 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); + invokeBeforeCreateHold(holdContainer, name, reason); // create map of properties Map properties = new HashMap<>(3); @@ -478,8 +480,7 @@ public class HoldServiceImpl extends ServiceBaseImpl NodeRef holdNodeRef = childAssocRef.getChildRef(); - //invoke after hold is created - onCreateHoldPolicyDelegate.get(getTypeAndApsects(holdNodeRef)).onCreateHold(holdNodeRef); + invokeOnCreateHold(holdNodeRef); return holdNodeRef; } @@ -569,12 +570,11 @@ 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); - + invokeBeforeDeleteHold(hold); // delete the hold node nodeService.deleteNode(hold); - onDeleteHoldPolicyDelegate.get(getTypeAndApsects(hold)).onDeleteHold(hold); + invokeOnDeleteHold(hold); } /** @@ -862,4 +862,52 @@ public class HoldServiceImpl extends ServiceBaseImpl removeFromAllHolds(nodeRef); } } + + /** + * Invoke beforeCreateHold policy + * + * @param nodeRef node reference + * @param name hold name + * @param reason hold reason + */ + protected void invokeBeforeCreateHold(NodeRef nodeRef, String name, String reason) + { + // execute policy for node type and aspects + BeforeCreateHoldPolicy policy = beforeCreateHoldPolicyDelegate.get(getTypeAndApsects(nodeRef)); + policy.beforeCreateHold(name, reason); + } + + /** + * Invoke onCreateHold policy + * + * @param nodeRef node reference + */ + protected void invokeOnCreateHold(NodeRef nodeRef) + { + OnCreateHoldPolicy policy = onCreateHoldPolicyDelegate.get(getTypeAndApsects(nodeRef)); + policy.onCreateHold(nodeRef); + } + + /** + * Invoke beforeDeleteHold policy + * + * @param nodeRef node reference + */ + protected void invokeBeforeDeleteHold(NodeRef nodeRef) + { + BeforeDeleteHoldPolicy policy = beforeDeleteHoldPolicyDelegate.get(getTypeAndApsects(nodeRef)); + policy.beforeDeleteHold(nodeRef); + } + + /** + * Invoke onDeleteHold policy + * + * @param nodeRef node reference + */ + protected void invokeOnDeleteHold(NodeRef nodeRef) + { + // execute policy for node type and aspects + OnDeleteHoldPolicy policy = onDeleteHoldPolicyDelegate.get(getTypeAndApsects(nodeRef)); + policy.onDeleteHold(nodeRef); + } } 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 fb5060c1d8..062af9fcc4 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 @@ -41,17 +41,9 @@ import org.alfresco.service.namespace.QName; 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 { + QName BEFORE_CREATE_HOLD = QName.createQName(NamespaceService.ALFRESCO_URI, "beforeCreateHold"); /** * Called before a hold is created. * @@ -63,6 +55,7 @@ public interface HoldServicePolicies interface OnCreateHoldPolicy extends ClassPolicy { + QName ON_CREATE_HOLD = QName.createQName(NamespaceService.ALFRESCO_URI, "onCreateHold"); /** * Called when a hold is created. * @@ -73,6 +66,7 @@ public interface HoldServicePolicies interface BeforeDeleteHoldPolicy extends ClassPolicy { + QName BEFORE_DELETE_HOLD = QName.createQName(NamespaceService.ALFRESCO_URI, "beforeDeleteHold"); /** * Called before a hold is created. * @@ -83,6 +77,8 @@ public interface HoldServicePolicies interface OnDeleteHoldPolicy extends ClassPolicy { + QName ON_DELETE_HOLD = QName.createQName(NamespaceService.ALFRESCO_URI, "onDeleteHold"); + /** * Called when a hold is deleted. * 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 d64c788273..2814c075e4 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 @@ -158,11 +158,11 @@ public class CreateHoldTest extends BaseRMTestCase implements BeforeCreateHoldPo public Void run() { BehaviourDefinition beforeCreateHoldBehaviour = policyComponent.bindClassBehaviour( - HoldServicePolicies.BEFORE_CREATE_HOLD, RecordsManagementModel.TYPE_HOLD_CONTAINER, + HoldServicePolicies.BeforeCreateHoldPolicy.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, + HoldServicePolicies.OnCreateHoldPolicy.ON_CREATE_HOLD, RecordsManagementModel.TYPE_HOLD, new JavaBehaviour(CreateHoldTest.this, "onCreateHold", NotificationFrequency.EVERY_EVENT)); assertFalse(beforeCreateHoldFlag); 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 ac08710403..7ed6345177 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 @@ -258,11 +258,11 @@ public class DeleteHoldTest extends BaseRMTestCase implements BeforeDeleteHoldPo public Void run() { BehaviourDefinition beforeDeleteHoldBehaviour = policyComponent.bindClassBehaviour( - HoldServicePolicies.BEFORE_DELETE_HOLD, RecordsManagementModel.TYPE_HOLD, + HoldServicePolicies.BeforeDeleteHoldPolicy.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, + HoldServicePolicies.OnDeleteHoldPolicy.ON_DELETE_HOLD, RecordsManagementModel.TYPE_HOLD, new JavaBehaviour(DeleteHoldTest.this, "onDeleteHold", NotificationFrequency.EVERY_EVENT)); NodeRef hold = holdService.createHold(filePlan, generate(), generate(), generate()); diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java index 15af11203a..7326bd518a 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java @@ -39,6 +39,7 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; @@ -70,6 +71,7 @@ import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; +import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.Spy; import org.mockito.invocation.InvocationOnMock; @@ -220,6 +222,10 @@ public class HoldServiceImplUnitTest extends BaseUnitTest when(mockedNodeService.createNode(eq(holdContainer), eq(ContentModel.ASSOC_CONTAINS), any(QName.class) , eq(TYPE_HOLD), any(Map.class))) .thenReturn(new ChildAssociationRef(ContentModel.ASSOC_CONTAINS, holdContainer, generateQName(), hold)); + // mocks for policies + doNothing().when(holdService).invokeBeforeCreateHold(any(), anyString(), anyString()); + doNothing().when(holdService).invokeOnCreateHold(any()); + // create hold NodeRef newHold = holdService.createHold(filePlan, HOLD_NAME, HOLD_REASON, HOLD_DESCRIPTION); assertNotNull(newHold); @@ -306,6 +312,10 @@ public class HoldServiceImplUnitTest extends BaseUnitTest @Test public void deleteHold() { + // mocks for policies + doNothing().when(holdService).invokeBeforeDeleteHold(any()); + doNothing().when(holdService).invokeOnDeleteHold(any()); + // delete hold holdService.deleteHold(hold); verify(mockedNodeService).deleteNode(hold); From 5c6c3a395cdd17c64caf6cd085bba035698d475a Mon Sep 17 00:00:00 2001 From: Ramona Popa Date: Fri, 25 Oct 2019 16:20:47 +0300 Subject: [PATCH 4/9] RM-7035: Add policies for holds - fix other tests --- .../module/org_alfresco_module_rm/hold/HoldServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java index 5b09290289..403d9a1c26 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java @@ -574,7 +574,7 @@ public class HoldServiceImpl extends ServiceBaseImpl // delete the hold node nodeService.deleteNode(hold); - invokeOnDeleteHold(hold); + //invokeOnDeleteHold(hold); } /** From 3ff7fb43d07df4e0af41243abfe5be9654145df1 Mon Sep 17 00:00:00 2001 From: Roxana Lucanu Date: Tue, 29 Oct 2019 11:37:18 +0200 Subject: [PATCH 5/9] RM-7034 add policies for held content --- .../hold/HoldServiceImpl.java | 24 ++++++++- .../hold/HoldServicePolicies.java | 53 +++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java index 403d9a1c26..80dfb1c1c2 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java @@ -41,16 +41,19 @@ import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; -import org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies.BeforeFileRecord; import org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService; import org.alfresco.module.org_alfresco_module_rm.audit.event.AuditEvent; import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService; import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.BeforeAddToHoldPolicy; 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.BeforeRemoveFromHoldPolicy; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.OnAddToHoldPolicy; 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.hold.HoldServicePolicies.OnRemoveFromHoldPolicy; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.module.org_alfresco_module_rm.record.RecordService; import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService; @@ -206,6 +209,10 @@ public class HoldServiceImpl extends ServiceBaseImpl private ClassPolicyDelegate onCreateHoldPolicyDelegate; private ClassPolicyDelegate beforeDeleteHoldPolicyDelegate; private ClassPolicyDelegate onDeleteHoldPolicyDelegate; + private ClassPolicyDelegate beforeAddToHoldPolicyDelegate; + private ClassPolicyDelegate onAddToHoldPolicyDelegate; + private ClassPolicyDelegate beforeRemoveFromHoldPolicyDelegate; + private ClassPolicyDelegate onRemoveFromHoldPolicyDelegate; /** * Initialise hold service @@ -228,6 +235,11 @@ public class HoldServiceImpl extends ServiceBaseImpl onCreateHoldPolicyDelegate = getPolicyComponent().registerClassPolicy(OnCreateHoldPolicy.class); beforeDeleteHoldPolicyDelegate = getPolicyComponent().registerClassPolicy(BeforeDeleteHoldPolicy.class); onDeleteHoldPolicyDelegate = getPolicyComponent().registerClassPolicy(OnDeleteHoldPolicy.class); + beforeAddToHoldPolicyDelegate = getPolicyComponent().registerClassPolicy(BeforeAddToHoldPolicy.class); + onAddToHoldPolicyDelegate = getPolicyComponent().registerClassPolicy(OnAddToHoldPolicy.class); + beforeRemoveFromHoldPolicyDelegate = getPolicyComponent().registerClassPolicy(BeforeRemoveFromHoldPolicy.class); + onRemoveFromHoldPolicyDelegate = getPolicyComponent().registerClassPolicy(OnRemoveFromHoldPolicy.class); + } /** @@ -634,6 +646,8 @@ public class HoldServiceImpl extends ServiceBaseImpl // check that the node isn't already in the hold if (!getHeld(hold).contains(nodeRef)) { + // fire before add to hold policy + beforeAddToHoldPolicyDelegate.get(getTypeAndApsects(hold)).beforeAddToHold(hold, nodeRef); // run as system to ensure we have all the appropriate permissions to perform the manipulations we require authenticationUtil.runAsSystem((RunAsWork) () -> { // gather freeze properties @@ -658,6 +672,9 @@ public class HoldServiceImpl extends ServiceBaseImpl records.forEach(record -> addFrozenAspect(record, props)); } + // fire on add to hold policy + onAddToHoldPolicyDelegate.get(getTypeAndApsects(hold)).onAddToHold(hold, nodeRef); + return null; }); } @@ -794,6 +811,8 @@ public class HoldServiceImpl extends ServiceBaseImpl // run as system so we don't run into further permission issues // we already know we have to have the correct capability to get here authenticationUtil.runAsSystem((RunAsWork) () -> { + // fire before remove from hold policy + beforeRemoveFromHoldPolicyDelegate.get(getTypeAndApsects(hold)).beforeRemoveFromHold(hold, nodeRef); // remove from hold //set in transaction cache in order not to trigger update policy when removing the child association transactionalResourceHelper.getSet("frozen").add(nodeRef); @@ -803,6 +822,9 @@ public class HoldServiceImpl extends ServiceBaseImpl // TODO add details of the hold that the node was removed from recordsManagementAuditService.auditEvent(nodeRef, AUDIT_REMOVE_FROM_HOLD); + // fire on remove from hold policy + onRemoveFromHoldPolicyDelegate.get(getTypeAndApsects(hold)).onRemoveFromHold(hold, nodeRef); + return null; }); 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 062af9fcc4..2114297859 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 @@ -36,6 +36,7 @@ import org.alfresco.service.namespace.QName; * Hold Service Policies * * @author Ramona Popa + * @author Roxana Lucanu * @since 3.3 */ @@ -86,4 +87,56 @@ public interface HoldServicePolicies */ void onDeleteHold(NodeRef hold); } + + interface BeforeAddToHoldPolicy extends ClassPolicy + { + QName QNAME = QName.createQName(NamespaceService.ALFRESCO_URI, "beforeAddToHold"); + + /** + * Called before adding content to hold. + * + * @param hold the hold to be added into + * @param contentNodeRef the item to be added to hold + */ + void beforeAddToHold(NodeRef hold, NodeRef contentNodeRef); + } + + interface OnAddToHoldPolicy extends ClassPolicy + { + QName QNAME = QName.createQName(NamespaceService.ALFRESCO_URI, "onAddToHold"); + + /** + * Called when content is added to hold. + * + * @param hold the hold to be added into + * @param contentNodeRef the item to be added to hold + */ + void onAddToHold(NodeRef hold, NodeRef contentNodeRef); + } + + interface BeforeRemoveFromHoldPolicy extends ClassPolicy + { + QName QNAME = QName.createQName(NamespaceService.ALFRESCO_URI, "beforeRemoveFromHold"); + + /** + * Called before removing content from hold. + * + * @param hold the hold to be removed from + * @param contentNodeRef the item to be removed from hold + */ + void beforeRemoveFromHold(NodeRef hold, NodeRef contentNodeRef); + } + + interface OnRemoveFromHoldPolicy extends ClassPolicy + { + QName QNAME = QName.createQName(NamespaceService.ALFRESCO_URI, "onRemoveFromHold"); + + /** + * Called when removing content from hold. + * + * @param hold the hold to be removed from + * @param contentNodeRef the item to be removed from hold + */ + void onRemoveFromHold(NodeRef hold, NodeRef contentNodeRef); + } } From 5b7bf430449c4e688981f31e9baa71c2b9a21983 Mon Sep 17 00:00:00 2001 From: Ramona Popa Date: Tue, 29 Oct 2019 16:02:40 +0200 Subject: [PATCH 6/9] RM-7035: Add policies for holds - fixed tests for deleteHold policies --- .../hold/HoldServiceImpl.java | 20 +++++--- .../hold/HoldServicePolicies.java | 4 +- .../test/integration/hold/CreateHoldTest.java | 49 ++++++++++--------- .../test/integration/hold/DeleteHoldTest.java | 48 ++++++++++-------- .../hold/HoldServiceImplUnitTest.java | 2 +- 5 files changed, 69 insertions(+), 54 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java index 403d9a1c26..15293083b3 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java @@ -28,6 +28,7 @@ package org.alfresco.module.org_alfresco_module_rm.hold; import static org.alfresco.model.ContentModel.ASPECT_LOCKABLE; +import static org.alfresco.model.ContentModel.PROP_NAME; import java.io.Serializable; import java.util.ArrayList; @@ -41,7 +42,6 @@ import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; -import org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies.BeforeFileRecord; import org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService; import org.alfresco.module.org_alfresco_module_rm.audit.event.AuditEvent; import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService; @@ -253,7 +253,6 @@ public class HoldServiceImpl extends ServiceBaseImpl transactionalResourceHelper.getSet("frozen").add(frozenNode); removeFreezeAspect(frozenNode, 1); } - return null; } }; @@ -571,10 +570,14 @@ public class HoldServiceImpl extends ServiceBaseImpl } invokeBeforeDeleteHold(hold); + + String holdName = (String) nodeService.getProperty(hold, PROP_NAME); + Set classQNames = getTypeAndApsects(hold); + // delete the hold node nodeService.deleteNode(hold); - //invokeOnDeleteHold(hold); + invokeOnDeleteHold(holdName, classQNames); } /** @@ -902,12 +905,15 @@ public class HoldServiceImpl extends ServiceBaseImpl /** * Invoke onDeleteHold policy * - * @param nodeRef node reference + * @param holdName name of the hold + * @param classQNames hold types and aspects */ - protected void invokeOnDeleteHold(NodeRef nodeRef) + protected void invokeOnDeleteHold(String holdName, Set classQNames) { // execute policy for node type and aspects - OnDeleteHoldPolicy policy = onDeleteHoldPolicyDelegate.get(getTypeAndApsects(nodeRef)); - policy.onDeleteHold(nodeRef); + OnDeleteHoldPolicy policy = onDeleteHoldPolicyDelegate.get(classQNames); + policy.onDeleteHold(holdName); + } + } 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 062af9fcc4..177419ae4b 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 @@ -82,8 +82,8 @@ public interface HoldServicePolicies /** * Called when a hold is deleted. * - * @param hold node reference + * @param holdname name of the deleted hold */ - void onDeleteHold(NodeRef hold); + void onDeleteHold(String holdname); } } 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 2814c075e4..e0821bbb40 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 @@ -39,9 +39,7 @@ 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; @@ -150,38 +148,43 @@ public class CreateHoldTest extends BaseRMTestCase implements BeforeCreateHoldPo public void testPolicyNotificationForCreateHold() throws Exception { - doTestInTransaction(new Test() + doBehaviourDrivenTest(new BehaviourDrivenTest() { - private NodeRef hold; + BehaviourDefinition beforeCreateHoldBehaviour; + BehaviourDefinition onCreateHoldBehaviour; - @Override - public Void run() + public void given() { - BehaviourDefinition beforeCreateHoldBehaviour = policyComponent.bindClassBehaviour( - HoldServicePolicies.BeforeCreateHoldPolicy.BEFORE_CREATE_HOLD, RecordsManagementModel.TYPE_HOLD_CONTAINER, + beforeCreateHoldBehaviour = policyComponent.bindClassBehaviour(HoldServicePolicies.BeforeCreateHoldPolicy.BEFORE_CREATE_HOLD, + RecordsManagementModel.TYPE_HOLD_CONTAINER, new JavaBehaviour(CreateHoldTest.this, "beforeCreateHold", NotificationFrequency.EVERY_EVENT)); - BehaviourDefinition onCreateHoldBehaviour = policyComponent.bindClassBehaviour( - HoldServicePolicies.OnCreateHoldPolicy.ON_CREATE_HOLD, RecordsManagementModel.TYPE_HOLD, + onCreateHoldBehaviour = policyComponent.bindClassBehaviour(HoldServicePolicies.OnCreateHoldPolicy.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()); + public void when() + { + // Create a hold + NodeRef hold = holdService.createHold(filePlan, generate(), generate(), generate()); + } + + public void then() + { + assertTrue(beforeCreateHoldFlag); + assertTrue(onCreateHoldFlag); + } + + public void after() + { + policyComponent.removeClassDefinition(beforeCreateHoldBehaviour); + policyComponent.removeClassDefinition(onCreateHoldBehaviour); + } + }); } 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 7ed6345177..7fc62fa4cb 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,13 +27,11 @@ 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; @@ -251,39 +249,47 @@ public class DeleteHoldTest extends BaseRMTestCase implements BeforeDeleteHoldPo public void testPolicyNotificationForDeleteHold() throws Exception { - doTestInTransaction(new Test() + doBehaviourDrivenTest(new BehaviourDrivenTest() { + BehaviourDefinition beforeDeleteHoldBehaviour; + BehaviourDefinition onDeleteHoldBehaviour; + NodeRef hold; - @Override - public Void run() + public void given() { - BehaviourDefinition beforeDeleteHoldBehaviour = policyComponent.bindClassBehaviour( - HoldServicePolicies.BeforeDeleteHoldPolicy.BEFORE_DELETE_HOLD, RecordsManagementModel.TYPE_HOLD, + beforeDeleteHoldBehaviour = policyComponent.bindClassBehaviour(BeforeDeleteHoldPolicy.BEFORE_DELETE_HOLD, + RecordsManagementModel.TYPE_HOLD, new JavaBehaviour(DeleteHoldTest.this, "beforeDeleteHold", NotificationFrequency.EVERY_EVENT)); - BehaviourDefinition onDeleteHoldBehaviour = policyComponent.bindClassBehaviour( - HoldServicePolicies.OnDeleteHoldPolicy.ON_DELETE_HOLD, RecordsManagementModel.TYPE_HOLD, + onDeleteHoldBehaviour = policyComponent.bindClassBehaviour(OnDeleteHoldPolicy.ON_DELETE_HOLD, RecordsManagementModel.TYPE_HOLD, new JavaBehaviour(DeleteHoldTest.this, "onDeleteHold", NotificationFrequency.EVERY_EVENT)); - NodeRef hold = holdService.createHold(filePlan, generate(), generate(), generate()); + // Create a hold + hold = holdService.createHold(filePlan, generate(), generate(), generate()); assertFalse(beforeDeleteHoldFlag); - assertFalse(onDeleteHoldFlag); + assertFalse(beforeDeleteHoldFlag); + } + public void when() + { // Delete the hold holdService.deleteHold(hold); - assertTrue(beforeDeleteHoldFlag); - assertTrue(onDeleteHoldFlag); - - //clean up - policyComponent.removeClassDefinition(beforeDeleteHoldBehaviour); - policyComponent.removeClassDefinition(onDeleteHoldBehaviour); - - return null; } - }, getAdminUserName()); + public void then() + { + assertTrue(beforeDeleteHoldFlag); + assertTrue(onDeleteHoldFlag); + } + + public void after() + { + policyComponent.removeClassDefinition(beforeDeleteHoldBehaviour); + policyComponent.removeClassDefinition(onDeleteHoldBehaviour); + } + }); } @@ -294,7 +300,7 @@ public class DeleteHoldTest extends BaseRMTestCase implements BeforeDeleteHoldPo } @Override - public void onDeleteHold(NodeRef hold) + public void onDeleteHold(String holdName) { onDeleteHoldFlag = true; } diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java index 7326bd518a..15cf5f8bd1 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java @@ -314,7 +314,7 @@ public class HoldServiceImplUnitTest extends BaseUnitTest { // mocks for policies doNothing().when(holdService).invokeBeforeDeleteHold(any()); - doNothing().when(holdService).invokeOnDeleteHold(any()); + doNothing().when(holdService).invokeOnDeleteHold(any(), any()); // delete hold holdService.deleteHold(hold); From b998ed9cd948f8d208991127f4f08630c28edacc Mon Sep 17 00:00:00 2001 From: Roxana Lucanu Date: Mon, 4 Nov 2019 12:23:22 +0200 Subject: [PATCH 7/9] RM-7034 Added tests --- .../hold/AddRemoveFromHoldTest.java | 138 +++++++++++++++++- 1 file changed, 137 insertions(+), 1 deletion(-) diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/AddRemoveFromHoldTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/AddRemoveFromHoldTest.java index 0a31e20fa5..5ca7c3bd94 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/AddRemoveFromHoldTest.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/AddRemoveFromHoldTest.java @@ -31,7 +31,16 @@ import java.util.ArrayList; import java.util.List; import org.alfresco.model.ContentModel; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.BeforeAddToHoldPolicy; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.BeforeRemoveFromHoldPolicy; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.OnAddToHoldPolicy; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.OnRemoveFromHoldPolicy; +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; import org.springframework.extensions.webscripts.GUID; @@ -41,10 +50,15 @@ import org.springframework.extensions.webscripts.GUID; * @author Roy Wetherall * @since 2.2 */ -public class AddRemoveFromHoldTest extends BaseRMTestCase +public class AddRemoveFromHoldTest extends BaseRMTestCase implements BeforeAddToHoldPolicy, OnAddToHoldPolicy, BeforeRemoveFromHoldPolicy, OnRemoveFromHoldPolicy { private static final int RECORD_COUNT = 10; + private boolean beforeAddToHoldFlag = false; + private boolean onAddToHoldFlag = false; + private boolean beforeRemoveFromHoldFlag = false; + private boolean onRemoveFromHoldFlag = false; + public void testAddRecordToHold() { doBehaviourDrivenTest(new BehaviourDrivenTest() @@ -421,4 +435,126 @@ public class AddRemoveFromHoldTest extends BaseRMTestCase } }); } + + public void testPolicyNotificationForAddToHold() + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private NodeRef hold; + private NodeRef recordCategory; + private NodeRef recordFolder; + BehaviourDefinition beforeAddToHoldBehaviour; + BehaviourDefinition onAddToHoldBehaviour; + + public void given() + { + // create a hold + hold = holdService.createHold(filePlan, GUID.generate(), GUID.generate(), GUID.generate()); + // create a record category -> record folder + recordCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); + recordFolder = recordFolderService.createRecordFolder(recordCategory, GUID.generate()); + + beforeAddToHoldBehaviour = policyComponent.bindClassBehaviour(BeforeAddToHoldPolicy.QNAME, + RecordsManagementModel.TYPE_HOLD, new JavaBehaviour(AddRemoveFromHoldTest.this, "beforeAddToHold", NotificationFrequency.EVERY_EVENT)); + + onAddToHoldBehaviour = policyComponent.bindClassBehaviour(OnAddToHoldPolicy.QNAME, + RecordsManagementModel.TYPE_HOLD, new JavaBehaviour(AddRemoveFromHoldTest.this, "onAddToHold", NotificationFrequency.EVERY_EVENT)); + + assertFalse(beforeAddToHoldFlag); + assertFalse(onAddToHoldFlag); + } + + public void when() throws Exception + { + // add the record folder to hold + holdService.addToHold(hold, recordFolder); + } + + public void then() + { + assertTrue(beforeAddToHoldFlag); + assertTrue(onAddToHoldFlag); + } + + public void after() + { + policyComponent.removeClassDefinition(beforeAddToHoldBehaviour); + policyComponent.removeClassDefinition(onAddToHoldBehaviour); + } + }); + } + + public void testPolicyNotificationForRemoveFromHold() + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private NodeRef hold; + private NodeRef recordCategory; + private NodeRef recordFolder; + BehaviourDefinition beforeRemoveFromHoldBehaviour; + BehaviourDefinition onRemoveFromHoldBehaviour; + + public void given() + { + // create a hold + hold = holdService.createHold(filePlan, GUID.generate(), GUID.generate(), GUID.generate()); + // create a record category -> record folder + recordCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); + recordFolder = recordFolderService.createRecordFolder(recordCategory, GUID.generate()); + // add the record folder to hold + holdService.addToHold(hold, recordFolder); + + beforeRemoveFromHoldBehaviour = policyComponent.bindClassBehaviour(BeforeRemoveFromHoldPolicy.QNAME, + RecordsManagementModel.TYPE_HOLD, new JavaBehaviour(AddRemoveFromHoldTest.this, "beforeRemoveFromHold", NotificationFrequency.EVERY_EVENT)); + + onRemoveFromHoldBehaviour = policyComponent.bindClassBehaviour(OnRemoveFromHoldPolicy.QNAME, + RecordsManagementModel.TYPE_HOLD, new JavaBehaviour(AddRemoveFromHoldTest.this, "onRemoveFromHold", NotificationFrequency.EVERY_EVENT)); + + assertFalse(beforeRemoveFromHoldFlag); + assertFalse(onRemoveFromHoldFlag); + } + + public void when() throws Exception + { + // remove the record folder from the hold + holdService.removeFromHold(hold, recordFolder); + } + + public void then() + { + assertTrue(beforeRemoveFromHoldFlag); + assertTrue(onRemoveFromHoldFlag); + } + + public void after() + { + policyComponent.removeClassDefinition(beforeRemoveFromHoldBehaviour); + policyComponent.removeClassDefinition(onRemoveFromHoldBehaviour); + } + }); + } + + @Override + public void beforeAddToHold(NodeRef hold, NodeRef contentNodeRef) + { + beforeAddToHoldFlag = true; + } + + @Override + public void onAddToHold(NodeRef hold, NodeRef contentNodeRef) + { + onAddToHoldFlag = true; + } + + @Override + public void beforeRemoveFromHold(NodeRef hold, NodeRef contentNodeRef) + { + beforeRemoveFromHoldFlag = true; + } + + @Override + public void onRemoveFromHold(NodeRef hold, NodeRef contentNodeRef) + { + onRemoveFromHoldFlag = true; + } } From 04a190459a128af473d5efa912fa9108cffa0488 Mon Sep 17 00:00:00 2001 From: Roxana Lucanu Date: Mon, 4 Nov 2019 16:40:18 +0200 Subject: [PATCH 8/9] RM-7034 Fixed unit tests and split class for add/remove from hold tests. --- .../hold/HoldServiceImpl.java | 56 +- .../hold/AddRemoveFromHoldTest.java | 560 ------------------ .../test/integration/hold/AddToHoldTest.java | 315 ++++++++++ .../integration/hold/RemoveFromHoldTest.java | 298 ++++++++++ .../hold/HoldServiceImplUnitTest.java | 32 + 5 files changed, 697 insertions(+), 564 deletions(-) delete mode 100644 rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/AddRemoveFromHoldTest.java create mode 100644 rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/AddToHoldTest.java create mode 100644 rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/RemoveFromHoldTest.java diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java index feacd1bef7..0a57d8b3b4 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java @@ -651,7 +651,7 @@ public class HoldServiceImpl extends ServiceBaseImpl if (!getHeld(hold).contains(nodeRef)) { // fire before add to hold policy - beforeAddToHoldPolicyDelegate.get(getTypeAndApsects(hold)).beforeAddToHold(hold, nodeRef); + invokeBeforeAddToHold(hold, nodeRef); // run as system to ensure we have all the appropriate permissions to perform the manipulations we require authenticationUtil.runAsSystem((RunAsWork) () -> { // gather freeze properties @@ -677,7 +677,7 @@ public class HoldServiceImpl extends ServiceBaseImpl } // fire on add to hold policy - onAddToHoldPolicyDelegate.get(getTypeAndApsects(hold)).onAddToHold(hold, nodeRef); + invokeOnAddToHold(hold, nodeRef); return null; }); @@ -816,7 +816,7 @@ public class HoldServiceImpl extends ServiceBaseImpl // we already know we have to have the correct capability to get here authenticationUtil.runAsSystem((RunAsWork) () -> { // fire before remove from hold policy - beforeRemoveFromHoldPolicyDelegate.get(getTypeAndApsects(hold)).beforeRemoveFromHold(hold, nodeRef); + invokeBeforeRemoveFromHold(hold, nodeRef); // remove from hold //set in transaction cache in order not to trigger update policy when removing the child association transactionalResourceHelper.getSet("frozen").add(nodeRef); @@ -827,7 +827,7 @@ public class HoldServiceImpl extends ServiceBaseImpl recordsManagementAuditService.auditEvent(nodeRef, AUDIT_REMOVE_FROM_HOLD); // fire on remove from hold policy - onRemoveFromHoldPolicyDelegate.get(getTypeAndApsects(hold)).onRemoveFromHold(hold, nodeRef); + invokeOnRemoveFromHold(hold, nodeRef); return null; @@ -939,4 +939,52 @@ public class HoldServiceImpl extends ServiceBaseImpl } + /** + * Invoke beforeAddToHold policy + * + * @param hold hold node reference + * @param contentNodeRef content node reference + */ + protected void invokeBeforeAddToHold(NodeRef hold, NodeRef contentNodeRef) + { + BeforeAddToHoldPolicy policy = beforeAddToHoldPolicyDelegate.get(getTypeAndApsects(hold)); + policy.beforeAddToHold(hold, contentNodeRef); + } + + /** + * Invoke onAddToHold policy + * + *@param hold hold node reference + *@param contentNodeRef content node reference + */ + protected void invokeOnAddToHold(NodeRef hold, NodeRef contentNodeRef) + { + OnAddToHoldPolicy policy = onAddToHoldPolicyDelegate.get(getTypeAndApsects(hold)); + policy.onAddToHold(hold, contentNodeRef); + } + + /** + * Invoke beforeRemoveFromHold policy + * + *@param hold hold node reference + *@param contentNodeRef content node reference + */ + protected void invokeBeforeRemoveFromHold(NodeRef hold, NodeRef contentNodeRef) + { + BeforeRemoveFromHoldPolicy policy = beforeRemoveFromHoldPolicyDelegate.get(getTypeAndApsects(hold)); + policy.beforeRemoveFromHold(hold, contentNodeRef); + } + + /** + * Invoke onRemoveFromHold policy + * + * @param hold hold node reference + * @param contentNodeRef content node reference + */ + protected void invokeOnRemoveFromHold(NodeRef hold, NodeRef contentNodeRef) + { + OnRemoveFromHoldPolicy policy = onRemoveFromHoldPolicyDelegate.get(getTypeAndApsects(hold)); + policy.onRemoveFromHold(hold, contentNodeRef); + + } } diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/AddRemoveFromHoldTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/AddRemoveFromHoldTest.java deleted file mode 100644 index 5ca7c3bd94..0000000000 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/AddRemoveFromHoldTest.java +++ /dev/null @@ -1,560 +0,0 @@ -/* - * #%L - * Alfresco Records Management Module - * %% - * Copyright (C) 2005 - 2019 Alfresco Software Limited - * %% - * This file is part of the Alfresco software. - * - - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - * #L% - */ - -package org.alfresco.module.org_alfresco_module_rm.test.integration.hold; - -import java.util.ArrayList; -import java.util.List; - -import org.alfresco.model.ContentModel; -import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.BeforeAddToHoldPolicy; -import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.BeforeRemoveFromHoldPolicy; -import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.OnAddToHoldPolicy; -import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.OnRemoveFromHoldPolicy; -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; -import org.springframework.extensions.webscripts.GUID; - -/** - * Hold service integration test. - * - * @author Roy Wetherall - * @since 2.2 - */ -public class AddRemoveFromHoldTest extends BaseRMTestCase implements BeforeAddToHoldPolicy, OnAddToHoldPolicy, BeforeRemoveFromHoldPolicy, OnRemoveFromHoldPolicy -{ - private static final int RECORD_COUNT = 10; - - private boolean beforeAddToHoldFlag = false; - private boolean onAddToHoldFlag = false; - private boolean beforeRemoveFromHoldFlag = false; - private boolean onRemoveFromHoldFlag = false; - - public void testAddRecordToHold() - { - doBehaviourDrivenTest(new BehaviourDrivenTest() - { - private NodeRef hold; - private NodeRef recordCategory; - private NodeRef recordFolder; - private NodeRef record; - - public void given() - { - // create a hold - hold = holdService.createHold(filePlan, GUID.generate(), GUID.generate(), GUID.generate()); - - // create a record folder that contains records - recordCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); - recordFolder = recordFolderService.createRecordFolder(recordCategory, GUID.generate()); - record = recordService.createRecordFromContent(recordFolder, GUID.generate(), ContentModel.TYPE_CONTENT, null, null); - - // assert current states - assertFalse(freezeService.isFrozen(recordFolder)); - assertFalse(freezeService.isFrozen(record)); - assertFalse(freezeService.hasFrozenChildren(recordFolder)); - - // additional check for child held caching - assertTrue(nodeService.hasAspect(recordFolder, ASPECT_HELD_CHILDREN)); - assertEquals(0, nodeService.getProperty(recordFolder, PROP_HELD_CHILDREN_COUNT)); - } - - public void when() throws Exception - { - // add the record to hold - holdService.addToHold(hold, record); - } - - public void then() - { - // record is held - assertTrue(freezeService.isFrozen(record)); - - // record folder has frozen children - assertFalse(freezeService.isFrozen(recordFolder)); - assertTrue(freezeService.hasFrozenChildren(recordFolder)); - - // record folder is not held - assertFalse(holdService.getHeld(hold).contains(recordFolder)); - assertFalse(holdService.heldBy(recordFolder, true).contains(hold)); - - // hold contains record - assertTrue(holdService.getHeld(hold).contains(record)); - assertTrue(holdService.heldBy(record, true).contains(hold)); - - // additional check for child held caching - assertTrue(nodeService.hasAspect(recordFolder, ASPECT_HELD_CHILDREN)); - assertEquals(1, nodeService.getProperty(recordFolder, PROP_HELD_CHILDREN_COUNT)); - } - }); - - } - - public void testAddRecordsToHold() - { - doBehaviourDrivenTest(new BehaviourDrivenTest() - { - private NodeRef hold; - private NodeRef recordCategory; - private NodeRef recordFolder; - private List records = new ArrayList<>(RECORD_COUNT); - - public void given() - { - // create a hold - hold = holdService.createHold(filePlan, GUID.generate(), GUID.generate(), GUID.generate()); - - // create a record folder that contains records - recordCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); - recordFolder = recordFolderService.createRecordFolder(recordCategory, GUID.generate()); - for (int i = 0; i < RECORD_COUNT; i++) - { - records.add(recordService.createRecordFromContent(recordFolder, GUID.generate(), ContentModel.TYPE_CONTENT, null, null)); - } - - // assert current states - assertFalse(freezeService.isFrozen(recordFolder)); - assertFalse(freezeService.hasFrozenChildren(recordFolder)); - for (NodeRef record : records) - { - assertFalse(freezeService.isFrozen(record)); - } - - // additional check for child held caching - assertTrue(nodeService.hasAspect(recordFolder, ASPECT_HELD_CHILDREN)); - assertEquals(0, nodeService.getProperty(recordFolder, PROP_HELD_CHILDREN_COUNT)); - } - - public void when() throws Exception - { - // add the record to hold - holdService.addToHold(hold, records); - } - - public void then() - { - // record is held - for (NodeRef record : records) - { - assertTrue(freezeService.isFrozen(record)); - } - - // record folder has frozen children - assertFalse(freezeService.isFrozen(recordFolder)); - assertTrue(freezeService.hasFrozenChildren(recordFolder)); - - // record folder is not held - assertFalse(holdService.getHeld(hold).contains(recordFolder)); - assertFalse(holdService.heldBy(recordFolder, true).contains(hold)); - - for (NodeRef record : records) - { - // hold contains record - assertTrue(holdService.getHeld(hold).contains(record)); - assertTrue(holdService.heldBy(record, true).contains(hold)); - } - - // additional check for child held caching - assertTrue(nodeService.hasAspect(recordFolder, ASPECT_HELD_CHILDREN)); - assertEquals(RECORD_COUNT, nodeService.getProperty(recordFolder, PROP_HELD_CHILDREN_COUNT)); - } - }); - } - - public void testAddRecordFolderToHold() - { - doBehaviourDrivenTest(new BehaviourDrivenTest() - { - private NodeRef hold; - private NodeRef recordCategory; - private NodeRef recordFolder; - private List records = new ArrayList<>(RECORD_COUNT); - - public void given() - { - // create a hold - hold = holdService.createHold(filePlan, GUID.generate(), GUID.generate(), GUID.generate()); - - // create a record folder that contains records - recordCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); - recordFolder = recordFolderService.createRecordFolder(recordCategory, GUID.generate()); - for (int i = 0; i < RECORD_COUNT; i++) - { - records.add(recordService.createRecordFromContent(recordFolder, GUID.generate(), ContentModel.TYPE_CONTENT, null, null)); - } - - // assert current states - assertFalse(freezeService.isFrozen(recordFolder)); - assertFalse(freezeService.hasFrozenChildren(recordFolder)); - for (NodeRef record : records) - { - assertFalse(freezeService.isFrozen(record)); - } - - // additional check for child held caching - assertTrue(nodeService.hasAspect(recordFolder, ASPECT_HELD_CHILDREN)); - assertEquals(0, nodeService.getProperty(recordFolder, PROP_HELD_CHILDREN_COUNT)); - } - - public void when() throws Exception - { - // add the record to hold - holdService.addToHold(hold, recordFolder); - } - - public void then() - { - for (NodeRef record : records) - { - // record is held - assertTrue(freezeService.isFrozen(record)); - assertFalse(holdService.getHeld(hold).contains(record)); - assertTrue(holdService.heldBy(record, true).contains(hold)); - } - - // record folder has frozen children - assertTrue(freezeService.isFrozen(recordFolder)); - assertTrue(freezeService.hasFrozenChildren(recordFolder)); - - // hold contains record folder - assertTrue(holdService.getHeld(hold).contains(recordFolder)); - assertTrue(holdService.heldBy(recordFolder, true).contains(hold)); - - // additional check for child held caching - assertTrue(nodeService.hasAspect(recordFolder, ASPECT_HELD_CHILDREN)); - assertEquals(RECORD_COUNT, nodeService.getProperty(recordFolder, PROP_HELD_CHILDREN_COUNT)); - } - }); - - } - - public void testRemoveRecordsFromHold() - { - doBehaviourDrivenTest(new BehaviourDrivenTest() - { - private NodeRef hold; - private NodeRef recordCategory; - private NodeRef recordFolder; - private List records = new ArrayList<>(RECORD_COUNT); - - public void given() - { - // create a hold - hold = holdService.createHold(filePlan, GUID.generate(), GUID.generate(), GUID.generate()); - - // create a record folder that contains records - recordCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); - recordFolder = recordFolderService.createRecordFolder(recordCategory, GUID.generate()); - for (int i = 0; i < RECORD_COUNT; i++) - { - records.add(recordService.createRecordFromContent(recordFolder, GUID.generate(), ContentModel.TYPE_CONTENT, null, null)); - } - - // add records to hold - holdService.addToHold(hold, records); - } - - public void when() throws Exception - { - // remove *some* of the records - holdService.removeFromHold(hold, records.subList(0, 5)); - } - - public void then() - { - // check record state (no longer held) - for (NodeRef record : records.subList(0, 5)) - { - assertFalse(freezeService.isFrozen(record)); - assertFalse(holdService.getHeld(hold).contains(record)); - assertFalse(holdService.heldBy(record, true).contains(hold)); - } - - // check record state (still held) - for (NodeRef record : records.subList(5, 10)) - { - assertTrue(freezeService.isFrozen(record)); - assertTrue(holdService.getHeld(hold).contains(record)); - assertTrue(holdService.heldBy(record, true).contains(hold)); - } - - // record folder has frozen children - assertFalse(freezeService.isFrozen(recordFolder)); - assertTrue(freezeService.hasFrozenChildren(recordFolder)); - - // record folder is not held - assertFalse(holdService.getHeld(hold).contains(recordFolder)); - assertFalse(holdService.heldBy(recordFolder, true).contains(hold)); - - // additional check for child held caching - assertTrue(nodeService.hasAspect(recordFolder, ASPECT_HELD_CHILDREN)); - assertEquals(5, nodeService.getProperty(recordFolder, PROP_HELD_CHILDREN_COUNT)); - } - }); - } - - public void testRemoveAllRecordsFromHold() - { - doBehaviourDrivenTest(new BehaviourDrivenTest() - { - private NodeRef hold; - private NodeRef recordCategory; - private NodeRef recordFolder; - private List records = new ArrayList<>(RECORD_COUNT); - - public void given() - { - // create a hold - hold = holdService.createHold(filePlan, GUID.generate(), GUID.generate(), GUID.generate()); - - // create a record folder that contains records - recordCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); - recordFolder = recordFolderService.createRecordFolder(recordCategory, GUID.generate()); - for (int i = 0; i < RECORD_COUNT; i++) - { - records.add(recordService.createRecordFromContent(recordFolder, GUID.generate(), ContentModel.TYPE_CONTENT, null, null)); - } - - // add records to hold - holdService.addToHold(hold, records); - } - - public void when() throws Exception - { - // remove all of the records - holdService.removeFromHold(hold, records); - } - - public void then() - { - // check record state (no longer held) - for (NodeRef record : records) - { - assertFalse(freezeService.isFrozen(record)); - assertFalse(holdService.getHeld(hold).contains(record)); - assertFalse(holdService.heldBy(record, true).contains(hold)); - } - - // record folder has frozen children - assertFalse(freezeService.isFrozen(recordFolder)); - assertFalse(freezeService.hasFrozenChildren(recordFolder)); - - // record folder is not held - assertFalse(holdService.getHeld(hold).contains(recordFolder)); - assertFalse(holdService.heldBy(recordFolder, true).contains(hold)); - - // additional check for child held caching - assertTrue(nodeService.hasAspect(recordFolder, ASPECT_HELD_CHILDREN)); - assertEquals(0, nodeService.getProperty(recordFolder, PROP_HELD_CHILDREN_COUNT)); - } - }); - } - - public void testRemoveRecordFolderFromHold() - { - doBehaviourDrivenTest(new BehaviourDrivenTest() - { - private NodeRef hold; - private NodeRef recordCategory; - private NodeRef recordFolder; - private List records = new ArrayList<>(RECORD_COUNT); - - public void given() - { - // create a hold - hold = holdService.createHold(filePlan, GUID.generate(), GUID.generate(), GUID.generate()); - - // create a record folder that contains records - recordCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); - recordFolder = recordFolderService.createRecordFolder(recordCategory, GUID.generate()); - for (int i = 0; i < RECORD_COUNT; i++) - { - records.add(recordService.createRecordFromContent(recordFolder, GUID.generate(), ContentModel.TYPE_CONTENT, null, null)); - } - - // add record folder to hold - holdService.addToHold(hold, recordFolder); - } - - public void when() throws Exception - { - // remove record folder from hold - holdService.removeFromHold(hold, recordFolder); - } - - public void then() - { - // check record states - for (NodeRef record : records) - { - assertFalse(freezeService.isFrozen(record)); - assertFalse(holdService.getHeld(hold).contains(record)); - assertFalse(holdService.heldBy(record, true).contains(hold)); - } - - // record folder has frozen children - assertFalse(freezeService.isFrozen(recordFolder)); - assertFalse(freezeService.hasFrozenChildren(recordFolder)); - - // record folder is not held - assertFalse(holdService.getHeld(hold).contains(recordFolder)); - assertFalse(holdService.heldBy(recordFolder, true).contains(hold)); - - // additional check for child held caching - assertTrue(nodeService.hasAspect(recordFolder, ASPECT_HELD_CHILDREN)); - assertEquals(0, nodeService.getProperty(recordFolder, PROP_HELD_CHILDREN_COUNT)); - } - }); - } - - public void testPolicyNotificationForAddToHold() - { - doBehaviourDrivenTest(new BehaviourDrivenTest() - { - private NodeRef hold; - private NodeRef recordCategory; - private NodeRef recordFolder; - BehaviourDefinition beforeAddToHoldBehaviour; - BehaviourDefinition onAddToHoldBehaviour; - - public void given() - { - // create a hold - hold = holdService.createHold(filePlan, GUID.generate(), GUID.generate(), GUID.generate()); - // create a record category -> record folder - recordCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); - recordFolder = recordFolderService.createRecordFolder(recordCategory, GUID.generate()); - - beforeAddToHoldBehaviour = policyComponent.bindClassBehaviour(BeforeAddToHoldPolicy.QNAME, - RecordsManagementModel.TYPE_HOLD, new JavaBehaviour(AddRemoveFromHoldTest.this, "beforeAddToHold", NotificationFrequency.EVERY_EVENT)); - - onAddToHoldBehaviour = policyComponent.bindClassBehaviour(OnAddToHoldPolicy.QNAME, - RecordsManagementModel.TYPE_HOLD, new JavaBehaviour(AddRemoveFromHoldTest.this, "onAddToHold", NotificationFrequency.EVERY_EVENT)); - - assertFalse(beforeAddToHoldFlag); - assertFalse(onAddToHoldFlag); - } - - public void when() throws Exception - { - // add the record folder to hold - holdService.addToHold(hold, recordFolder); - } - - public void then() - { - assertTrue(beforeAddToHoldFlag); - assertTrue(onAddToHoldFlag); - } - - public void after() - { - policyComponent.removeClassDefinition(beforeAddToHoldBehaviour); - policyComponent.removeClassDefinition(onAddToHoldBehaviour); - } - }); - } - - public void testPolicyNotificationForRemoveFromHold() - { - doBehaviourDrivenTest(new BehaviourDrivenTest() - { - private NodeRef hold; - private NodeRef recordCategory; - private NodeRef recordFolder; - BehaviourDefinition beforeRemoveFromHoldBehaviour; - BehaviourDefinition onRemoveFromHoldBehaviour; - - public void given() - { - // create a hold - hold = holdService.createHold(filePlan, GUID.generate(), GUID.generate(), GUID.generate()); - // create a record category -> record folder - recordCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); - recordFolder = recordFolderService.createRecordFolder(recordCategory, GUID.generate()); - // add the record folder to hold - holdService.addToHold(hold, recordFolder); - - beforeRemoveFromHoldBehaviour = policyComponent.bindClassBehaviour(BeforeRemoveFromHoldPolicy.QNAME, - RecordsManagementModel.TYPE_HOLD, new JavaBehaviour(AddRemoveFromHoldTest.this, "beforeRemoveFromHold", NotificationFrequency.EVERY_EVENT)); - - onRemoveFromHoldBehaviour = policyComponent.bindClassBehaviour(OnRemoveFromHoldPolicy.QNAME, - RecordsManagementModel.TYPE_HOLD, new JavaBehaviour(AddRemoveFromHoldTest.this, "onRemoveFromHold", NotificationFrequency.EVERY_EVENT)); - - assertFalse(beforeRemoveFromHoldFlag); - assertFalse(onRemoveFromHoldFlag); - } - - public void when() throws Exception - { - // remove the record folder from the hold - holdService.removeFromHold(hold, recordFolder); - } - - public void then() - { - assertTrue(beforeRemoveFromHoldFlag); - assertTrue(onRemoveFromHoldFlag); - } - - public void after() - { - policyComponent.removeClassDefinition(beforeRemoveFromHoldBehaviour); - policyComponent.removeClassDefinition(onRemoveFromHoldBehaviour); - } - }); - } - - @Override - public void beforeAddToHold(NodeRef hold, NodeRef contentNodeRef) - { - beforeAddToHoldFlag = true; - } - - @Override - public void onAddToHold(NodeRef hold, NodeRef contentNodeRef) - { - onAddToHoldFlag = true; - } - - @Override - public void beforeRemoveFromHold(NodeRef hold, NodeRef contentNodeRef) - { - beforeRemoveFromHoldFlag = true; - } - - @Override - public void onRemoveFromHold(NodeRef hold, NodeRef contentNodeRef) - { - onRemoveFromHoldFlag = true; - } -} diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/AddToHoldTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/AddToHoldTest.java new file mode 100644 index 0000000000..0f44d5ef0e --- /dev/null +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/AddToHoldTest.java @@ -0,0 +1,315 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2019 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +package org.alfresco.module.org_alfresco_module_rm.test.integration.hold; + +import java.util.ArrayList; +import java.util.List; + +import org.alfresco.model.ContentModel; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.BeforeAddToHoldPolicy; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.OnAddToHoldPolicy; +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; +import org.springframework.extensions.webscripts.GUID; + +/** + * Add To Hold Integration Tests + * + * @author Roy Wetherall + * @since 2.2 + */ + +public class AddToHoldTest extends BaseRMTestCase implements BeforeAddToHoldPolicy, OnAddToHoldPolicy +{ + private static final int RECORD_COUNT = 10; + + private boolean beforeAddToHoldFlag = false; + private boolean onAddToHoldFlag = false; + + public void testAddRecordToHold() + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private NodeRef hold; + private NodeRef recordCategory; + private NodeRef recordFolder; + private NodeRef record; + + public void given() + { + // create a hold + hold = holdService.createHold(filePlan, GUID.generate(), GUID.generate(), GUID.generate()); + + // create a record folder that contains records + recordCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); + recordFolder = recordFolderService.createRecordFolder(recordCategory, GUID.generate()); + record = recordService.createRecordFromContent(recordFolder, GUID.generate(), ContentModel.TYPE_CONTENT, null, null); + + // assert current states + assertFalse(freezeService.isFrozen(recordFolder)); + assertFalse(freezeService.isFrozen(record)); + assertFalse(freezeService.hasFrozenChildren(recordFolder)); + + // additional check for child held caching + assertTrue(nodeService.hasAspect(recordFolder, ASPECT_HELD_CHILDREN)); + assertEquals(0, nodeService.getProperty(recordFolder, PROP_HELD_CHILDREN_COUNT)); + } + + public void when() throws Exception + { + // add the record to hold + holdService.addToHold(hold, record); + } + + public void then() + { + // record is held + assertTrue(freezeService.isFrozen(record)); + + // record folder has frozen children + assertFalse(freezeService.isFrozen(recordFolder)); + assertTrue(freezeService.hasFrozenChildren(recordFolder)); + + // record folder is not held + assertFalse(holdService.getHeld(hold).contains(recordFolder)); + assertFalse(holdService.heldBy(recordFolder, true).contains(hold)); + + // hold contains record + assertTrue(holdService.getHeld(hold).contains(record)); + assertTrue(holdService.heldBy(record, true).contains(hold)); + + // additional check for child held caching + assertTrue(nodeService.hasAspect(recordFolder, ASPECT_HELD_CHILDREN)); + assertEquals(1, nodeService.getProperty(recordFolder, PROP_HELD_CHILDREN_COUNT)); + } + }); + + } + + public void testAddRecordsToHold() + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private NodeRef hold; + private NodeRef recordCategory; + private NodeRef recordFolder; + private List records = new ArrayList<>(RECORD_COUNT); + + public void given() + { + // create a hold + hold = holdService.createHold(filePlan, GUID.generate(), GUID.generate(), GUID.generate()); + + // create a record folder that contains records + recordCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); + recordFolder = recordFolderService.createRecordFolder(recordCategory, GUID.generate()); + for (int i = 0; i < RECORD_COUNT; i++) + { + records.add(recordService.createRecordFromContent(recordFolder, GUID.generate(), ContentModel.TYPE_CONTENT, null, null)); + } + + // assert current states + assertFalse(freezeService.isFrozen(recordFolder)); + assertFalse(freezeService.hasFrozenChildren(recordFolder)); + for (NodeRef record : records) + { + assertFalse(freezeService.isFrozen(record)); + } + + // additional check for child held caching + assertTrue(nodeService.hasAspect(recordFolder, ASPECT_HELD_CHILDREN)); + assertEquals(0, nodeService.getProperty(recordFolder, PROP_HELD_CHILDREN_COUNT)); + } + + public void when() throws Exception + { + // add the record to hold + holdService.addToHold(hold, records); + } + + public void then() + { + // record is held + for (NodeRef record : records) + { + assertTrue(freezeService.isFrozen(record)); + } + + // record folder has frozen children + assertFalse(freezeService.isFrozen(recordFolder)); + assertTrue(freezeService.hasFrozenChildren(recordFolder)); + + // record folder is not held + assertFalse(holdService.getHeld(hold).contains(recordFolder)); + assertFalse(holdService.heldBy(recordFolder, true).contains(hold)); + + for (NodeRef record : records) + { + // hold contains record + assertTrue(holdService.getHeld(hold).contains(record)); + assertTrue(holdService.heldBy(record, true).contains(hold)); + } + + // additional check for child held caching + assertTrue(nodeService.hasAspect(recordFolder, ASPECT_HELD_CHILDREN)); + assertEquals(RECORD_COUNT, nodeService.getProperty(recordFolder, PROP_HELD_CHILDREN_COUNT)); + } + }); + } + + public void testAddRecordFolderToHold() + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private NodeRef hold; + private NodeRef recordCategory; + private NodeRef recordFolder; + private List records = new ArrayList<>(RECORD_COUNT); + + public void given() + { + // create a hold + hold = holdService.createHold(filePlan, GUID.generate(), GUID.generate(), GUID.generate()); + + // create a record folder that contains records + recordCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); + recordFolder = recordFolderService.createRecordFolder(recordCategory, GUID.generate()); + for (int i = 0; i < RECORD_COUNT; i++) + { + records.add(recordService.createRecordFromContent(recordFolder, GUID.generate(), ContentModel.TYPE_CONTENT, null, null)); + } + + // assert current states + assertFalse(freezeService.isFrozen(recordFolder)); + assertFalse(freezeService.hasFrozenChildren(recordFolder)); + for (NodeRef record : records) + { + assertFalse(freezeService.isFrozen(record)); + } + + // additional check for child held caching + assertTrue(nodeService.hasAspect(recordFolder, ASPECT_HELD_CHILDREN)); + assertEquals(0, nodeService.getProperty(recordFolder, PROP_HELD_CHILDREN_COUNT)); + } + + public void when() throws Exception + { + // add the record to hold + holdService.addToHold(hold, recordFolder); + } + + public void then() + { + for (NodeRef record : records) + { + // record is held + assertTrue(freezeService.isFrozen(record)); + assertFalse(holdService.getHeld(hold).contains(record)); + assertTrue(holdService.heldBy(record, true).contains(hold)); + } + + // record folder has frozen children + assertTrue(freezeService.isFrozen(recordFolder)); + assertTrue(freezeService.hasFrozenChildren(recordFolder)); + + // hold contains record folder + assertTrue(holdService.getHeld(hold).contains(recordFolder)); + assertTrue(holdService.heldBy(recordFolder, true).contains(hold)); + + // additional check for child held caching + assertTrue(nodeService.hasAspect(recordFolder, ASPECT_HELD_CHILDREN)); + assertEquals(RECORD_COUNT, nodeService.getProperty(recordFolder, PROP_HELD_CHILDREN_COUNT)); + } + }); + + } + + public void testPolicyNotificationForAddToHold() + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private NodeRef hold; + private NodeRef recordCategory; + private NodeRef recordFolder; + BehaviourDefinition beforeAddToHoldBehaviour; + BehaviourDefinition onAddToHoldBehaviour; + + public void given() + { + // create a hold + hold = holdService.createHold(filePlan, GUID.generate(), GUID.generate(), GUID.generate()); + // create a record category -> record folder + recordCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); + recordFolder = recordFolderService.createRecordFolder(recordCategory, GUID.generate()); + + beforeAddToHoldBehaviour = policyComponent.bindClassBehaviour(BeforeAddToHoldPolicy.QNAME, + RecordsManagementModel.TYPE_HOLD, new JavaBehaviour(AddToHoldTest.this, "beforeAddToHold", NotificationFrequency.EVERY_EVENT)); + + onAddToHoldBehaviour = policyComponent.bindClassBehaviour(OnAddToHoldPolicy.QNAME, + RecordsManagementModel.TYPE_HOLD, new JavaBehaviour(AddToHoldTest.this, "onAddToHold", NotificationFrequency.EVERY_EVENT)); + + assertFalse(beforeAddToHoldFlag); + assertFalse(onAddToHoldFlag); + } + + public void when() throws Exception + { + // add the record folder to hold + holdService.addToHold(hold, recordFolder); + } + + public void then() + { + assertTrue(beforeAddToHoldFlag); + assertTrue(onAddToHoldFlag); + } + + public void after() + { + policyComponent.removeClassDefinition(beforeAddToHoldBehaviour); + policyComponent.removeClassDefinition(onAddToHoldBehaviour); + } + }); + } + + @Override + public void beforeAddToHold(NodeRef hold, NodeRef contentNodeRef) + { + beforeAddToHoldFlag = true; + } + + @Override + public void onAddToHold(NodeRef hold, NodeRef contentNodeRef) + { + onAddToHoldFlag = true; + } +} diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/RemoveFromHoldTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/RemoveFromHoldTest.java new file mode 100644 index 0000000000..ab3106d91c --- /dev/null +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/RemoveFromHoldTest.java @@ -0,0 +1,298 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2019 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm.test.integration.hold; + +import java.util.ArrayList; +import java.util.List; + +import org.alfresco.model.ContentModel; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.BeforeRemoveFromHoldPolicy; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.OnRemoveFromHoldPolicy; +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; +import org.springframework.extensions.webscripts.GUID; + +/** + * Remove From Hold integration tests. + * + * @author Roy Wetherall + * @since 2.2 + */ +public class RemoveFromHoldTest extends BaseRMTestCase implements BeforeRemoveFromHoldPolicy, OnRemoveFromHoldPolicy +{ + private static final int RECORD_COUNT = 10; + + private boolean beforeRemoveFromHoldFlag = false; + private boolean onRemoveFromHoldFlag = false; + + public void testRemoveRecordsFromHold() + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private NodeRef hold; + private NodeRef recordCategory; + private NodeRef recordFolder; + private List records = new ArrayList<>(RECORD_COUNT); + + public void given() + { + // create a hold + hold = holdService.createHold(filePlan, GUID.generate(), GUID.generate(), GUID.generate()); + + // create a record folder that contains records + recordCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); + recordFolder = recordFolderService.createRecordFolder(recordCategory, GUID.generate()); + for (int i = 0; i < RECORD_COUNT; i++) + { + records.add(recordService.createRecordFromContent(recordFolder, GUID.generate(), ContentModel.TYPE_CONTENT, null, null)); + } + + // add records to hold + holdService.addToHold(hold, records); + } + + public void when() throws Exception + { + // remove *some* of the records + holdService.removeFromHold(hold, records.subList(0, 5)); + } + + public void then() + { + // check record state (no longer held) + for (NodeRef record : records.subList(0, 5)) + { + assertFalse(freezeService.isFrozen(record)); + assertFalse(holdService.getHeld(hold).contains(record)); + assertFalse(holdService.heldBy(record, true).contains(hold)); + } + + // check record state (still held) + for (NodeRef record : records.subList(5, 10)) + { + assertTrue(freezeService.isFrozen(record)); + assertTrue(holdService.getHeld(hold).contains(record)); + assertTrue(holdService.heldBy(record, true).contains(hold)); + } + + // record folder has frozen children + assertFalse(freezeService.isFrozen(recordFolder)); + assertTrue(freezeService.hasFrozenChildren(recordFolder)); + + // record folder is not held + assertFalse(holdService.getHeld(hold).contains(recordFolder)); + assertFalse(holdService.heldBy(recordFolder, true).contains(hold)); + + // additional check for child held caching + assertTrue(nodeService.hasAspect(recordFolder, ASPECT_HELD_CHILDREN)); + assertEquals(5, nodeService.getProperty(recordFolder, PROP_HELD_CHILDREN_COUNT)); + } + }); + } + + public void testRemoveAllRecordsFromHold() + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private NodeRef hold; + private NodeRef recordCategory; + private NodeRef recordFolder; + private List records = new ArrayList<>(RECORD_COUNT); + + public void given() + { + // create a hold + hold = holdService.createHold(filePlan, GUID.generate(), GUID.generate(), GUID.generate()); + + // create a record folder that contains records + recordCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); + recordFolder = recordFolderService.createRecordFolder(recordCategory, GUID.generate()); + for (int i = 0; i < RECORD_COUNT; i++) + { + records.add(recordService.createRecordFromContent(recordFolder, GUID.generate(), ContentModel.TYPE_CONTENT, null, null)); + } + + // add records to hold + holdService.addToHold(hold, records); + } + + public void when() throws Exception + { + // remove all of the records + holdService.removeFromHold(hold, records); + } + + public void then() + { + // check record state (no longer held) + for (NodeRef record : records) + { + assertFalse(freezeService.isFrozen(record)); + assertFalse(holdService.getHeld(hold).contains(record)); + assertFalse(holdService.heldBy(record, true).contains(hold)); + } + + // record folder has frozen children + assertFalse(freezeService.isFrozen(recordFolder)); + assertFalse(freezeService.hasFrozenChildren(recordFolder)); + + // record folder is not held + assertFalse(holdService.getHeld(hold).contains(recordFolder)); + assertFalse(holdService.heldBy(recordFolder, true).contains(hold)); + + // additional check for child held caching + assertTrue(nodeService.hasAspect(recordFolder, ASPECT_HELD_CHILDREN)); + assertEquals(0, nodeService.getProperty(recordFolder, PROP_HELD_CHILDREN_COUNT)); + } + }); + } + + public void testRemoveRecordFolderFromHold() + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private NodeRef hold; + private NodeRef recordCategory; + private NodeRef recordFolder; + private List records = new ArrayList<>(RECORD_COUNT); + + public void given() + { + // create a hold + hold = holdService.createHold(filePlan, GUID.generate(), GUID.generate(), GUID.generate()); + + // create a record folder that contains records + recordCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); + recordFolder = recordFolderService.createRecordFolder(recordCategory, GUID.generate()); + for (int i = 0; i < RECORD_COUNT; i++) + { + records.add(recordService.createRecordFromContent(recordFolder, GUID.generate(), ContentModel.TYPE_CONTENT, null, null)); + } + + // add record folder to hold + holdService.addToHold(hold, recordFolder); + } + + public void when() throws Exception + { + // remove record folder from hold + holdService.removeFromHold(hold, recordFolder); + } + + public void then() + { + // check record states + for (NodeRef record : records) + { + assertFalse(freezeService.isFrozen(record)); + assertFalse(holdService.getHeld(hold).contains(record)); + assertFalse(holdService.heldBy(record, true).contains(hold)); + } + + // record folder has frozen children + assertFalse(freezeService.isFrozen(recordFolder)); + assertFalse(freezeService.hasFrozenChildren(recordFolder)); + + // record folder is not held + assertFalse(holdService.getHeld(hold).contains(recordFolder)); + assertFalse(holdService.heldBy(recordFolder, true).contains(hold)); + + // additional check for child held caching + assertTrue(nodeService.hasAspect(recordFolder, ASPECT_HELD_CHILDREN)); + assertEquals(0, nodeService.getProperty(recordFolder, PROP_HELD_CHILDREN_COUNT)); + } + }); + } + + public void testPolicyNotificationForRemoveFromHold() + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private NodeRef hold; + private NodeRef recordCategory; + private NodeRef recordFolder; + BehaviourDefinition beforeRemoveFromHoldBehaviour; + BehaviourDefinition onRemoveFromHoldBehaviour; + + public void given() + { + // create a hold + hold = holdService.createHold(filePlan, GUID.generate(), GUID.generate(), GUID.generate()); + // create a record category -> record folder + recordCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); + recordFolder = recordFolderService.createRecordFolder(recordCategory, GUID.generate()); + // add the record folder to hold + holdService.addToHold(hold, recordFolder); + + beforeRemoveFromHoldBehaviour = policyComponent.bindClassBehaviour(BeforeRemoveFromHoldPolicy.QNAME, + RecordsManagementModel.TYPE_HOLD, new JavaBehaviour(RemoveFromHoldTest.this, "beforeRemoveFromHold", NotificationFrequency.EVERY_EVENT)); + + onRemoveFromHoldBehaviour = policyComponent.bindClassBehaviour(OnRemoveFromHoldPolicy.QNAME, + RecordsManagementModel.TYPE_HOLD, new JavaBehaviour(RemoveFromHoldTest.this, "onRemoveFromHold", NotificationFrequency.EVERY_EVENT)); + + assertFalse(beforeRemoveFromHoldFlag); + assertFalse(onRemoveFromHoldFlag); + } + + public void when() throws Exception + { + // remove the record folder from the hold + holdService.removeFromHold(hold, recordFolder); + } + + public void then() + { + assertTrue(beforeRemoveFromHoldFlag); + assertTrue(onRemoveFromHoldFlag); + } + + public void after() + { + policyComponent.removeClassDefinition(beforeRemoveFromHoldBehaviour); + policyComponent.removeClassDefinition(onRemoveFromHoldBehaviour); + } + }); + } + + @Override + public void beforeRemoveFromHold(NodeRef hold, NodeRef contentNodeRef) + { + beforeRemoveFromHoldFlag = true; + } + + @Override + public void onRemoveFromHold(NodeRef hold, NodeRef contentNodeRef) + { + onRemoveFromHoldFlag = true; + } +} diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java index 15cf5f8bd1..bc9ae7ca41 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java @@ -340,6 +340,8 @@ public class HoldServiceImplUnitTest extends BaseUnitTest @Test public void addToHoldNotInHold() { + mockPoliciesForAddToHold(); + holdService.addToHold(hold, recordFolder); verify(mockedNodeService).addChild(hold, recordFolder, ASSOC_FROZEN_CONTENT, ASSOC_FROZEN_CONTENT); @@ -387,6 +389,8 @@ public class HoldServiceImplUnitTest extends BaseUnitTest doReturn(true).when(mockedNodeService).hasAspect(record, ASPECT_FROZEN); doReturn(true).when(mockedNodeService).hasAspect(activeContent, ASPECT_FROZEN); + mockPoliciesForAddToHold(); + holdService.addToHold(hold, recordFolder); verify(mockedNodeService).addChild(hold, recordFolder, ASSOC_FROZEN_CONTENT, ASSOC_FROZEN_CONTENT); @@ -448,6 +452,8 @@ public class HoldServiceImplUnitTest extends BaseUnitTest }).when(mockedNodeService).addAspect(any(NodeRef.class), eq(ASPECT_FROZEN), any(Map.class)); + mockPoliciesForAddToHold(); + // build a list of holds List holds = new ArrayList<>(2); holds.add(hold); @@ -473,6 +479,8 @@ public class HoldServiceImplUnitTest extends BaseUnitTest @Test public void removeFromHoldNotInHold() { + mockPoliciesForRemoveFromHold(); + holdService.removeFromHold(hold, recordFolder); verify(mockedNodeService, never()).removeChild(hold, recordFolder); @@ -488,6 +496,8 @@ public class HoldServiceImplUnitTest extends BaseUnitTest doReturn(true).when(mockedNodeService).hasAspect(recordFolder, ASPECT_FROZEN); doReturn(true).when(mockedNodeService).hasAspect(record, ASPECT_FROZEN); + mockPoliciesForRemoveFromHold(); + holdService.removeFromHold(hold, recordFolder); verify(mockedNodeService, times(1)).removeChild(hold, recordFolder); @@ -504,6 +514,8 @@ public class HoldServiceImplUnitTest extends BaseUnitTest doReturn(true).when(mockedNodeService).hasAspect(recordFolder, ASPECT_FROZEN); doReturn(true).when(mockedNodeService).hasAspect(record, ASPECT_FROZEN); + mockPoliciesForRemoveFromHold(); + // build a list of holds List holds = new ArrayList<>(2); holds.add(hold); @@ -536,6 +548,8 @@ public class HoldServiceImplUnitTest extends BaseUnitTest }).when(mockedNodeService).removeChild(hold, recordFolder); + mockPoliciesForRemoveFromHold(); + doAnswer(new Answer() { public Void answer(InvocationOnMock invocation) @@ -576,4 +590,22 @@ public class HoldServiceImplUnitTest extends BaseUnitTest holds.add(hold2); holdService.removeFromHolds(holds, activeContent); } + + /** + * mocks policies for add to hold + */ + private void mockPoliciesForAddToHold() + { + doNothing().when(holdService).invokeBeforeAddToHold(any(), any()); + doNothing().when(holdService).invokeOnAddToHold(any(), any()); + } + + /** + * mocks policies for remove from hold + */ + private void mockPoliciesForRemoveFromHold() + { + doNothing().when(holdService).invokeBeforeRemoveFromHold(any(), any()); + doNothing().when(holdService).invokeOnRemoveFromHold(any(), any()); + } } From bf860c89444a29916e4e831c29ffdc2392b1e456 Mon Sep 17 00:00:00 2001 From: Roxana Lucanu Date: Tue, 5 Nov 2019 10:32:16 +0200 Subject: [PATCH 9/9] RM-7034 style changes --- .../org_alfresco_module_rm/hold/HoldServiceImpl.java | 12 ++++++------ .../hold/HoldServiceImplUnitTest.java | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java index 0a57d8b3b4..4b817cabc7 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java @@ -942,7 +942,7 @@ public class HoldServiceImpl extends ServiceBaseImpl /** * Invoke beforeAddToHold policy * - * @param hold hold node reference + * @param hold hold node reference * @param contentNodeRef content node reference */ protected void invokeBeforeAddToHold(NodeRef hold, NodeRef contentNodeRef) @@ -954,8 +954,8 @@ public class HoldServiceImpl extends ServiceBaseImpl /** * Invoke onAddToHold policy * - *@param hold hold node reference - *@param contentNodeRef content node reference + * @param hold hold node reference + * @param contentNodeRef content node reference */ protected void invokeOnAddToHold(NodeRef hold, NodeRef contentNodeRef) { @@ -966,8 +966,8 @@ public class HoldServiceImpl extends ServiceBaseImpl /** * Invoke beforeRemoveFromHold policy * - *@param hold hold node reference - *@param contentNodeRef content node reference + * @param hold hold node reference + * @param contentNodeRef content node reference */ protected void invokeBeforeRemoveFromHold(NodeRef hold, NodeRef contentNodeRef) { @@ -978,7 +978,7 @@ public class HoldServiceImpl extends ServiceBaseImpl /** * Invoke onRemoveFromHold policy * - * @param hold hold node reference + * @param hold hold node reference * @param contentNodeRef content node reference */ protected void invokeOnRemoveFromHold(NodeRef hold, NodeRef contentNodeRef) diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java index bc9ae7ca41..55de14c20d 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java @@ -71,7 +71,6 @@ import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; -import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.Spy; import org.mockito.invocation.InvocationOnMock;