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 139ffbd577..8dd01c5ac8 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,6 +80,9 @@
+
+
+
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 2b23c08a65..95b668b250 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,7 +112,6 @@
-
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 ae68e87193..b28ff08326 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
@@ -117,9 +117,6 @@ public class DispositionServiceImpl extends ServiceBaseImpl
/** Record Service */
private RecordService recordService;
- /** Freeze Service */
- private FreezeService freezeService;
-
/** Transaction service */
private TransactionService transactionService;
@@ -192,14 +189,6 @@ public class DispositionServiceImpl extends ServiceBaseImpl
this.recordService = recordService;
}
- /**
- * @param freezeService freeze service
- */
- public void setFreezeService(FreezeService freezeService)
- {
- this.freezeService = freezeService;
- }
-
/**
* @param transactionService transaction service
*/
@@ -1191,7 +1180,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl
if (FilePlanComponentKind.RECORD_FOLDER.equals(filePlanService.getFilePlanComponentKind(nodeRef)) ||
FilePlanComponentKind.RECORD.equals(filePlanService.getFilePlanComponentKind(nodeRef)))
{
- if (!isDisposableItemCutoff(nodeRef) && !isFrozenOrHasFrozenChildren(nodeRef))
+ if (!isDisposableItemCutoff(nodeRef))
{
if (recordFolderService.isRecordFolder(nodeRef))
{
@@ -1283,32 +1272,6 @@ public class DispositionServiceImpl extends ServiceBaseImpl
}
}
- /**
- * 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)
- {
- boolean result = false;
-
- if (recordFolderService.isRecordFolder(nodeRef))
- {
- result = freezeService.isFrozen(nodeRef) || freezeService.hasFrozenChildren(nodeRef);
- }
- else if (recordService.isRecord(nodeRef))
- {
- result = freezeService.isFrozen(nodeRef);
- }
- else
- {
- throw new AlfrescoRuntimeException("The nodeRef '" + nodeRef + "' is neither a record nor a record folder.");
- }
-
- return result;
- }
-
/**
* Helper method to apply the cut off
*
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 28eaa24c8d..f450bb9fb5 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
@@ -27,15 +27,18 @@
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.RMDispositionActionExecuterAbstractBase;
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
-import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
+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;
@@ -82,6 +85,15 @@ 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.
*
@@ -121,6 +133,30 @@ 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.
*
@@ -166,56 +202,60 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
/**
* @see org.alfresco.module.org_alfresco_module_rm.job.RecordsManagementJobExecuter#execute()
*/
+ @Override
public void executeImpl()
{
try
{
logger.debug("Job Starting");
- if (dispositionActions != null && !dispositionActions.isEmpty())
+ if (dispositionActions == null || dispositionActions.isEmpty())
{
- boolean hasMore = true;
- int skipCount = 0;
+ logger.debug("Job Finished as disposition action is empty");
+ return;
+ }
- if (batchSize < 1)
+ boolean hasMore = true;
+ int skipCount = 0;
+
+ if (batchSize < 1)
+ {
+ if (logger.isDebugEnabled())
{
- if (logger.isDebugEnabled())
- {
- logger.debug("Invalid value for batch size: " + batchSize + " default value used instead.");
- }
- batchSize = DEFAULT_BATCH_SIZE;
+ logger.debug("Invalid value for batch size: " + batchSize + " default value used instead.");
}
- if (logger.isTraceEnabled())
+ batchSize = DEFAULT_BATCH_SIZE;
+ }
+ if (logger.isTraceEnabled())
+ {
+ logger.trace("Using batch size of " + batchSize);
+ }
+
+ while (hasMore)
+ {
+ SearchParameters params = new SearchParameters();
+ params.addStore(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE);
+ params.setLanguage(SearchService.LANGUAGE_FTS_ALFRESCO);
+ params.setQuery(getQuery());
+ params.setSkipCount(skipCount);
+ params.setMaxItems(batchSize);
+
+ // execute search
+ ResultSet results = searchService.query(params);
+ List resultNodes = results.getNodeRefs();
+ hasMore = results.hasMore();
+ skipCount += resultNodes.size(); // increase by page size
+ results.close();
+
+ if (logger.isDebugEnabled())
{
- logger.trace("Using batch size of " + batchSize);
+ logger.debug("Processing " + resultNodes.size() + " nodes");
}
- while (hasMore)
+ // process search results
+ if (!resultNodes.isEmpty())
{
- SearchParameters params = new SearchParameters();
- params.addStore(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE);
- params.setLanguage(SearchService.LANGUAGE_FTS_ALFRESCO);
- params.setQuery(getQuery());
- params.setSkipCount(skipCount);
- params.setMaxItems(batchSize);
-
- // execute search
- ResultSet results = searchService.query(params);
- List resultNodes = results.getNodeRefs();
- hasMore = results.hasMore();
- skipCount += resultNodes.size(); // increase by page size
- results.close();
-
- if (logger.isDebugEnabled())
- {
- logger.debug("Processing " + resultNodes.size() + " nodes");
- }
-
- // process search results
- if (!resultNodes.isEmpty())
- {
- executeAction(resultNodes);
- }
+ executeAction(resultNodes);
}
}
logger.debug("Job Finished");
@@ -239,39 +279,51 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
RetryingTransactionCallback processTranCB = () -> {
for (NodeRef actionNode : actionNodes)
{
- if (nodeService.exists(actionNode))
+ if (!nodeService.exists(actionNode))
{
- final String dispAction = (String) nodeService
- .getProperty(actionNode, RecordsManagementModel.PROP_DISPOSITION_ACTION);
+ continue;
+ }
- // Run disposition action
- if (dispAction != null && dispositionActions.contains(dispAction))
+ final String dispAction = (String) nodeService.getProperty(actionNode, PROP_DISPOSITION_ACTION);
+
+ // Run disposition action
+ if (dispAction == null || !dispositionActions.contains(dispAction))
+ {
+ continue;
+ }
+
+ ChildAssociationRef parent = nodeService.getPrimaryParent(actionNode);
+ if (!parent.getTypeQName().equals(ASSOC_NEXT_DISPOSITION_ACTION))
+ {
+ continue;
+ }
+ 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
+ recordsManagementActionService
+ .executeRecordsManagementAction(parent.getParentRef(), dispAction, props);
+
+ if (logger.isDebugEnabled())
{
- ChildAssociationRef parent = nodeService.getPrimaryParent(actionNode);
- if (parent.getTypeQName().equals(RecordsManagementModel.ASSOC_NEXT_DISPOSITION_ACTION))
- {
- Map props = new HashMap<>(1);
- props.put(RMDispositionActionExecuterAbstractBase.PARAM_NO_ERROR_CHECK, Boolean.FALSE);
-
- try
- {
- // execute disposition action
- recordsManagementActionService
- .executeRecordsManagementAction(parent.getParentRef(), dispAction, props);
-
- if (logger.isDebugEnabled())
- {
- logger.debug("Processed action: " + dispAction + "on" + parent);
- }
- }
- catch (AlfrescoRuntimeException exception)
- {
- if (logger.isDebugEnabled())
- {
- logger.debug(exception);
- }
- }
- }
+ logger.debug("Processed action: " + dispAction + "on" + parent);
+ }
+ }
+ catch (AlfrescoRuntimeException exception)
+ {
+ if (logger.isDebugEnabled())
+ {
+ logger.debug(exception);
}
}
}
@@ -280,6 +332,25 @@ 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;
diff --git a/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/job/RecordsManagementJobExecuter.java b/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/job/RecordsManagementJobExecuter.java
index 5108bfd86b..6b3158566e 100644
--- a/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/job/RecordsManagementJobExecuter.java
+++ b/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/job/RecordsManagementJobExecuter.java
@@ -69,15 +69,9 @@ public abstract class RecordsManagementJobExecuter implements RecordsManagementM
// jobs not allowed to execute unless bootstrap is complete
if (!repositoryState.isBootstrapping())
{
- retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback()
- {
- @Override
- public Void execute()
- {
- executeImpl();
-
- return null;
- }
+ retryingTransactionHelper.doInTransaction((RetryingTransactionCallback) () -> {
+ executeImpl();
+ return null;
}, false, true);
}
}
diff --git a/amps/ags/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuterUnitTest.java b/amps/ags/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuterUnitTest.java
index 9e2f047e9d..094f26e647 100644
--- a/amps/ags/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuterUnitTest.java
+++ b/amps/ags/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuterUnitTest.java
@@ -235,6 +235,9 @@ public class DispositionLifecycleJobExecuterUnitTest extends BaseUnitTest
doReturn(CUTOFF).when(mockedNodeService).getProperty(node1, RecordsManagementModel.PROP_DISPOSITION_ACTION);
doReturn(RETAIN).when(mockedNodeService).getProperty(node2, RecordsManagementModel.PROP_DISPOSITION_ACTION);
doReturn(parentAssoc).when(mockedNodeService).getPrimaryParent(any(NodeRef.class));
+ doReturn(false).when(mockedRecordFolderService).isRecordFolder(parentAssoc.getParentRef());
+ doReturn(true).when(mockedRecordService).isRecord(parentAssoc.getParentRef());
+ doReturn(false).when(mockedFreezeService).isFrozen(parentAssoc.getParentRef());
when(mockedResultSet.getNodeRefs())
.thenReturn(buildList(node1))