diff --git a/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/hold/PreventActionsOnFrozenContentTests.java b/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/hold/PreventActionsOnFrozenContentTests.java
index 62926a3930..f36627241e 100644
--- a/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/hold/PreventActionsOnFrozenContentTests.java
+++ b/amps/ags/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/hold/PreventActionsOnFrozenContentTests.java
@@ -67,7 +67,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
-
+import static org.apache.commons.httpclient.HttpStatus.SC_INTERNAL_SERVER_ERROR;
/**
* API tests to check actions on frozen content
*
@@ -309,11 +309,11 @@ public class PreventActionsOnFrozenContentTests extends BaseRMRestTest
STEP("Execute the retain action");
rmRolesAndActionsAPI.executeAction(getAdminUser().getUsername(), getAdminUser().getPassword(), record.getName(),
- RM_ACTIONS.END_RETENTION);
+ RM_ACTIONS.END_RETENTION, null, SC_INTERNAL_SERVER_ERROR);
STEP("Check the record search disposition properties");
Record recordUpdated = getRestAPIFactory().getRecordsAPI().getRecord(record.getId());
- assertTrue(recordUpdated.getProperties().getRecordSearchDispositionActionName().contains(RM_ACTIONS.DESTROY.getAction()));
+ assertTrue(recordUpdated.getProperties().getRecordSearchDispositionActionName().contains(RM_ACTIONS.END_RETENTION.getAction()));
assertTrue(recordUpdated.getProperties().getRecordSearchDispositionPeriod().contains("immediately"));
}
diff --git a/amps/ags/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/messages/action-service.properties b/amps/ags/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/messages/action-service.properties
index eeac19f2e6..0a1f596e61 100644
--- a/amps/ags/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/messages/action-service.properties
+++ b/amps/ags/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/messages/action-service.properties
@@ -45,4 +45,4 @@ rm.action.create.transfer.container.child-error-message=You can't create items i
rm.action.create.transfer.child-error-message=You can't create items in Transfer Folders.
rm.action.create.record.folder.child-error-message=You can only create records in record folders and this was a {0}.
rm.action.transfer-non-editable=You can't edit transfer folder or container metadata.
-
+rm.action.node.frozen.error-message=unable to perform action {0} because node is frozen or has frozen children
diff --git a/amps/ags/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml b/amps/ags/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml
index 8dd01c5ac8..139ffbd577 100644
--- a/amps/ags/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml
+++ b/amps/ags/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml
@@ -80,9 +80,6 @@
-
-
-
diff --git a/amps/ags/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/amps/ags/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml
index 95b668b250..3a3fd5c77a 100644
--- a/amps/ags/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml
+++ b/amps/ags/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml
@@ -112,6 +112,7 @@
+
@@ -695,6 +696,13 @@
init-method="init" depends-on="org_alfresco_module_rm_resourceBundles">
+
+
+
+ cutoff
+ retain
+
+
diff --git a/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/RecordsManagementActionServiceImpl.java b/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/RecordsManagementActionServiceImpl.java
index 69ecc6585d..01ad9e2570 100644
--- a/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/RecordsManagementActionServiceImpl.java
+++ b/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/RecordsManagementActionServiceImpl.java
@@ -39,6 +39,7 @@ import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies.BeforeRMActionExecution;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies.OnRMActionExecution;
import org.alfresco.module.org_alfresco_module_rm.util.PoliciesUtil;
+import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
import org.alfresco.repo.policy.ClassPolicyDelegate;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.service.cmr.repository.NodeRef;
@@ -47,6 +48,7 @@ import org.alfresco.service.namespace.QName;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.surf.util.I18NUtil;
+import org.springframework.beans.factory.annotation.Autowired;
/**
* Records Management Action Service Implementation
@@ -58,9 +60,9 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
/** I18N */
private static final String MSG_NOT_DEFINED = "rm.action.not-defined";
private static final String MSG_NO_IMPLICIT_NODEREF = "rm.action.no-implicit-noderef";
-
+ private static final String MSG_NODE_FROZEN = "rm.action.node.frozen.error-message";
/** Logger */
- private static Log logger = LogFactory.getLog(RecordsManagementActionServiceImpl.class);
+ private static final Log logger = LogFactory.getLog(RecordsManagementActionServiceImpl.class);
/** Registered records management actions */
private Map rmActions = new HashMap<>(13);
@@ -78,6 +80,16 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
private ClassPolicyDelegate beforeRMActionExecutionDelegate;
private ClassPolicyDelegate onRMActionExecutionDelegate;
+ @Autowired
+ private DispositionService dispositionService;
+
+ /** list of disposition actions to automatically execute */
+ private List retentionActions;
+
+ public void setRetentionActions(List retentionActions) {
+ this.retentionActions = retentionActions;
+ }
+
/**
* @return Policy component
*/
@@ -285,6 +297,16 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
throw new AlfrescoRuntimeException(msg);
}
+ if (dispositionService.isFrozenOrHasFrozenChildren(nodeRef) && retentionActions.contains(name.toLowerCase())) {
+ String msg = I18NUtil.getMessage(MSG_NODE_FROZEN, rmAction.getName());
+
+ if (logger.isDebugEnabled())
+ {
+ logger.debug(msg);
+ }
+ throw new AlfrescoRuntimeException(msg);
+ }
+
// Execute action
invokeBeforeRMActionExecution(nodeRef, name, parameters);
RecordsManagementActionResult result = rmAction.execute(nodeRef, parameters);
diff --git a/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionService.java b/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionService.java
index ce5ff5bc7d..f307a62927 100644
--- a/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionService.java
+++ b/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionService.java
@@ -288,4 +288,12 @@ public interface DispositionService
* @param record
*/
void recalculateNextDispositionStep(NodeRef record);
+
+ /**
+ * Check given node or its children are frozen
+ * The node should be record or record folder for retention schedule
+ *
+ * @param nodeRef
+ */
+ boolean isFrozenOrHasFrozenChildren(NodeRef nodeRef);
}
diff --git a/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java
index b28ff08326..b4684e4869 100644
--- a/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java
+++ b/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java
@@ -59,7 +59,6 @@ import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
import org.alfresco.repo.transaction.AlfrescoTransactionSupport.TxnReadState;
-import org.alfresco.repo.transaction.RetryingTransactionHelper;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
@@ -117,6 +116,9 @@ public class DispositionServiceImpl extends ServiceBaseImpl
/** Record Service */
private RecordService recordService;
+ /** Freeze Service */
+ private FreezeService freezeService;
+
/** Transaction service */
private TransactionService transactionService;
@@ -189,6 +191,14 @@ public class DispositionServiceImpl extends ServiceBaseImpl
this.recordService = recordService;
}
+ /**
+ * @param freezeService freeze service
+ */
+ public void setFreezeService(FreezeService freezeService)
+ {
+ this.freezeService = freezeService;
+ }
+
/**
* @param transactionService transaction service
*/
@@ -1458,4 +1468,24 @@ public class DispositionServiceImpl extends ServiceBaseImpl
return new NextActionFromDisposition(dispositionNodeRef, newAction,
newDispositionActionName, newDispositionActionDateAsOf, WriteMode.DATE_AND_NAME);
}
+
+ /**
+ * Helper method to determine if a node is frozen or has frozen children
+ *
+ * @param nodeRef Node to be checked
+ * @return true
if the node is frozen or has frozen children, false
otherwise
+ */
+ @Override
+ public boolean isFrozenOrHasFrozenChildren(NodeRef nodeRef)
+ {
+ if (recordFolderService.isRecordFolder(nodeRef))
+ {
+ return freezeService.isFrozen(nodeRef) || freezeService.hasFrozenChildren(nodeRef);
+ }
+ else if (recordService.isRecord(nodeRef))
+ {
+ return freezeService.isFrozen(nodeRef);
+ }
+ return Boolean.FALSE;
+ }
}
diff --git a/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java b/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java
index f450bb9fb5..49f8fe5272 100644
--- a/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java
+++ b/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java
@@ -30,15 +30,11 @@ package org.alfresco.module.org_alfresco_module_rm.job;
import static org.alfresco.module.org_alfresco_module_rm.action.RMDispositionActionExecuterAbstractBase.PARAM_NO_ERROR_CHECK;
import java.io.Serializable;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
-import org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService;
-import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
-import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
@@ -61,7 +57,7 @@ import org.apache.commons.logging.LogFactory;
public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecuter
{
/** logger */
- private static Log logger = LogFactory.getLog(DispositionLifecycleJobExecuter.class);
+ private static final Log logger = LogFactory.getLog(DispositionLifecycleJobExecuter.class);
/** batching properties */
private int batchSize;
@@ -85,15 +81,6 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
/** person service */
private PersonService personService;
- /** freeze service */
- private FreezeService freezeService;
-
- /** record service */
- private RecordService recordService;
-
- /** record folder service */
- private RecordFolderService recordFolderService;
-
/**
* List of disposition actions to automatically execute when eligible.
*
@@ -133,30 +120,6 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
this.searchService = searchService;
}
- /**
- * @param freezeService freeze service
- */
- public void setFreezeService(FreezeService freezeService)
- {
- this.freezeService = freezeService;
- }
-
- /**
- * @param recordService record service
- */
- public void setRecordService(RecordService recordService)
- {
- this.recordService = recordService;
- }
-
- /**
- * @param recordFolderService record folder service
- */
- public void setRecordFolderService(RecordFolderService recordFolderService)
- {
- this.recordFolderService = recordFolderService;
- }
-
/**
* Get the search query string.
*
@@ -299,15 +262,6 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
}
Map props = Map.of(PARAM_NO_ERROR_CHECK, false);
- if (isFrozenOrHasFrozenChildren(parent.getParentRef()))
- {
- if (logger.isDebugEnabled()) {
- logger.debug("unable to perform action " + dispAction +
- " because node is frozen or has frozen children");
- }
- continue;
- }
-
try
{
// execute disposition action
@@ -332,25 +286,6 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
retryingTransactionHelper.doInTransaction(processTranCB, false, true);
}
- /**
- * Helper method to determine if a node is frozen or has frozen children
- *
- * @param nodeRef Node to be checked
- * @return true
if the node is frozen or has frozen children, false
otherwise
- */
- private boolean isFrozenOrHasFrozenChildren(NodeRef nodeRef)
- {
- if (recordFolderService.isRecordFolder(nodeRef))
- {
- return freezeService.isFrozen(nodeRef) || freezeService.hasFrozenChildren(nodeRef);
- }
- if (recordService.isRecord(nodeRef))
- {
- return freezeService.isFrozen(nodeRef);
- }
- throw new AlfrescoRuntimeException("The nodeRef '" + nodeRef + "' is neither a record nor a record folder.");
- }
-
public PersonService getPersonService()
{
return personService;