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;
+ }
}