RM-7035: Add policies for holds

- implementation for policies
   - integration tests
This commit is contained in:
Ramona Popa
2019-10-25 12:41:09 +03:00
parent 39fe03efc8
commit f2f010bc4d
5 changed files with 237 additions and 6 deletions

View File

@@ -1534,6 +1534,7 @@
<property name="permissionService" ref="PermissionService"/>
<property name="recordsManagementAuditService" ref="RecordsManagementAuditService" />
<property name="capabilityService" ref="CapabilityService"/>
<property name="policyComponent" ref="policyComponent"/>
</bean>
<bean id="HoldService"

View File

@@ -41,6 +41,7 @@ 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.audit.RecordsManagementAuditService;
import org.alfresco.module.org_alfresco_module_rm.audit.event.AuditEvent;
import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService;
@@ -49,10 +50,13 @@ import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
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;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
import org.alfresco.repo.policy.ClassPolicyDelegate;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.repo.policy.annotation.Behaviour;
import org.alfresco.repo.policy.annotation.BehaviourBean;
import org.alfresco.repo.policy.annotation.BehaviourKind;
@@ -113,6 +117,9 @@ public class HoldServiceImpl extends ServiceBaseImpl
/** Capability service */
private CapabilityService capabilityService;
/** Policy component */
private PolicyComponent policyComponent;
/**
* Set the file plan service
*
@@ -169,6 +176,34 @@ public class HoldServiceImpl extends ServiceBaseImpl
this.capabilityService = capabilityService;
}
/**
* Gets the policy component instance
*
* @return The policy component instance
*/
private PolicyComponent getPolicyComponent()
{
return this.policyComponent;
}
/**
* Sets the policy component instance
*
* @param policyComponent The policy component instance
*/
public void setPolicyComponent(PolicyComponent policyComponent)
{
this.policyComponent = policyComponent;
}
/**
* Policy delegates
*/
private ClassPolicyDelegate<HoldServicePolicies.BeforeCreateHoldPolicy> beforeCreateHoldPolicyDelegate;
private ClassPolicyDelegate<HoldServicePolicies.OnCreateHoldPolicy> onCreateHoldPolicyDelegate;
private ClassPolicyDelegate<HoldServicePolicies.BeforeDeleteHoldPolicy> beforeDeleteHoldPolicyDelegate;
private ClassPolicyDelegate<HoldServicePolicies.OnDeleteHoldPolicy> 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<QName, Serializable> 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);
}
/**

View File

@@ -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);
}
}

View File

@@ -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<Void>()
{
private NodeRef hold;
@Override
public Void run()
{
BehaviourDefinition<ClassBehaviourBinding> beforeCreateHoldBehaviour = policyComponent.bindClassBehaviour(
HoldServicePolicies.BEFORE_CREATE_HOLD, RecordsManagementModel.TYPE_HOLD_CONTAINER,
new JavaBehaviour(CreateHoldTest.this, "beforeCreateHold", NotificationFrequency.EVERY_EVENT));
BehaviourDefinition<ClassBehaviourBinding> 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;
}
}

View File

@@ -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<Void>()
{
@Override
public Void run()
{
BehaviourDefinition<ClassBehaviourBinding> beforeDeleteHoldBehaviour = policyComponent.bindClassBehaviour(
HoldServicePolicies.BEFORE_DELETE_HOLD, RecordsManagementModel.TYPE_HOLD,
new JavaBehaviour(DeleteHoldTest.this, "beforeDeleteHold", NotificationFrequency.EVERY_EVENT));
BehaviourDefinition<ClassBehaviourBinding> 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;
}
}