diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/action-service.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/action-service.properties
index 693ff7bd03..5c6a7d4daf 100644
--- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/action-service.properties
+++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/action-service.properties
@@ -35,4 +35,5 @@ rm.action.undo-not-last=The cut off can't be undone, because the last dispositio
rm.action.records_only_undeclared=Only records can be completed.
rm.action.event-not-undone=The event {0} can't be undone, because it's not defined on the disposition lifecycle.
rm.action.node-not-record-category=The disposition schedule could not be created, because the actioned upon node ({0}) was not a record category.
-rm.action.parameter-not-supplied=The parameter ''{0}'' has not been supplied.
\ No newline at end of file
+rm.action.parameter-not-supplied=The parameter ''{0}'' has not been supplied.
+rm.action.delete-not-hold-type=The hold couldn't be deleted, because the node isn't of type {0}. (actionedUponNodeRef={1})
\ No newline at end of file
diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-action-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-action-context.xml
index 09d8bc62e4..ea69d4c9e3 100644
--- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-action-context.xml
+++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-action-context.xml
@@ -139,6 +139,7 @@
+
-
+
-
+
+ parent="rmAction">
@@ -1074,7 +1075,7 @@
-
+
@@ -1085,4 +1086,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction.execute=RM_CAP.0.rma:filePlanComponent.DeleteHoldContainer
+ org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction.*=RM_ALLOW
+ org.alfresco.repo.action.executer.ActionExecuter.*=RM_ALLOW
+
+
+
+
\ No newline at end of file
diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml
index 059535bd90..82ea286697 100644
--- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml
+++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml
@@ -895,4 +895,15 @@
-
+
+
+
+
+
+ HOLD
+
+
+
+
+
\ No newline at end of file
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/RMActionExecuterAbstractBase.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/RMActionExecuterAbstractBase.java
index ab6a4032c1..d5dcde31c0 100644
--- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/RMActionExecuterAbstractBase.java
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/RMActionExecuterAbstractBase.java
@@ -30,6 +30,7 @@ import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService
import org.alfresco.module.org_alfresco_module_rm.event.RecordsManagementEventService;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanComponentKind;
import org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService;
+import org.alfresco.module.org_alfresco_module_rm.hold.HoldService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.model.security.ModelSecurityService;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
@@ -113,6 +114,9 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
/** Record folder service */
protected RecordFolderService recordFolderService;
+ /** Hold service */
+ protected HoldService holdService;
+
/** List of kinds for which this action is applicable */
protected Set applicableKinds = new HashSet();
@@ -204,7 +208,6 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
this.recordsManagementEventService = recordsManagementEventService;
}
-
/**
* Set the ownable service
* @param ownableSerice
@@ -266,6 +269,14 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
this.recordFolderService = recordFolderService;
}
+ /**
+ * @param holdService hold service
+ */
+ public void setHoldService(HoldService holdService)
+ {
+ this.holdService = holdService;
+ }
+
/**
* @param applicableKinds kinds that this action is applicable for
*/
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DeleteHoldAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DeleteHoldAction.java
new file mode 100644
index 0000000000..e8f52ab40b
--- /dev/null
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DeleteHoldAction.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2005-2014 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * 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 .
+ */
+package org.alfresco.module.org_alfresco_module_rm.action.impl;
+
+import org.alfresco.error.AlfrescoRuntimeException;
+import org.alfresco.module.org_alfresco_module_rm.action.RMActionExecuterAbstractBase;
+import org.alfresco.service.cmr.action.Action;
+import org.alfresco.service.cmr.repository.NodeRef;
+
+/**
+ * Delete Hold Action
+ *
+ * @author Tuna Aksoy
+ * @since 2.2
+ * @version 1.0
+ */
+public class DeleteHoldAction extends RMActionExecuterAbstractBase
+{
+ /** I18N */
+ private static final String MSG_DELETE_NOT_HOLD_TYPE = "rm.action.delete-not-hold-type";
+
+ /**
+ * @see org.alfresco.repo.action.executer.ActionExecuterAbstractBase#executeImpl(org.alfresco.service.cmr.action.Action, org.alfresco.service.cmr.repository.NodeRef)
+ */
+ @Override
+ protected void executeImpl(Action action, NodeRef actionedUponNodeRef)
+ {
+ if (holdService.isHold(actionedUponNodeRef))
+ {
+ holdService.deleteHold(actionedUponNodeRef);
+ }
+ else
+ {
+ throw new AlfrescoRuntimeException(MSG_DELETE_NOT_HOLD_TYPE, new Object[]{ TYPE_HOLD.toString(), actionedUponNodeRef.toString() });
+ }
+ }
+}
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java
index a31cad0b54..24f4bf867c 100644
--- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java
@@ -418,6 +418,27 @@ public class HoldServiceImpl extends ServiceBaseImpl
throw new AlfrescoRuntimeException("Can't delete hold, becuase passed node is not a hold. (hold=" + hold.toString() + ")");
}
+ List held = getHeld(hold);
+ List heldNames = new ArrayList();
+ for (NodeRef nodeRef : held)
+ {
+ if (permissionService.hasPermission(hold, RMPermissionModel.FILING) == AccessStatus.ALLOWED)
+ {
+ heldNames.add((String) nodeService.getProperty(nodeRef, ContentModel.PROP_NAME));
+ }
+ }
+
+ if (heldNames.size() > 0)
+ {
+ StringBuilder sb = new StringBuilder();
+ for (String name : heldNames)
+ {
+ sb.append("\n ");
+ sb.append(name);
+ }
+ throw new AlfrescoRuntimeException("Can't delete hold, because filing permissions for the following items are needed: " + sb.toString());
+ }
+
// delete the hold node
nodeService.deleteNode(hold);
}