From 6eb18af6540caa65af2ea03cb2477922ad9276f8 Mon Sep 17 00:00:00 2001 From: Manpreet Oberoi <85350975+moberoi2@users.noreply.github.com> Date: Tue, 20 Jul 2021 18:08:25 +0530 Subject: [PATCH] RM-6941 Changes related to retain frozen Records (#590) * changes related to retain frozen Records * RM-6941 add Log entries [ags][skip repo] * RM-6941 Remove final from the variable declaration Co-authored-by: bdwiwedi --- .../org_alfresco_module_rm/rm-job-context.xml | 3 + .../rm-service-context.xml | 1 - .../disposition/DispositionServiceImpl.java | 39 +--- .../job/DispositionLifecycleJobExecuter.java | 207 ++++++++++++------ .../job/RecordsManagementJobExecuter.java | 12 +- ...spositionLifecycleJobExecuterUnitTest.java | 3 + 6 files changed, 149 insertions(+), 116 deletions(-) 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))