From cfc5d1ac748f8e0b71b147ae213ebce18bd50f51 Mon Sep 17 00:00:00 2001 From: Eva Vasques Date: Mon, 14 Dec 2020 09:56:54 +0000 Subject: [PATCH] Revert "Revert "Merge pull request #1291 from Alfresco/hotfix-3.2.0.11/MNT-22062_diplay_cat_retention_poor_performance"" This reverts commit e7b3724d44a7d768bce3a6dada5426e123e7265d. --- .../disposition/DispositionServiceImpl.java | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index 5502aed5ba..0abdf64dd6 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -503,7 +503,52 @@ public class DispositionServiceImpl extends ServiceBaseImpl @Override public boolean hasDisposableItems(DispositionSchedule dispositionSchdule) { - return !getDisposableItems(dispositionSchdule).isEmpty(); + ParameterCheck.mandatory("dispositionSchedule", dispositionSchdule); + + // Get the associated container + NodeRef rmContainer = getAssociatedRecordsManagementContainer(dispositionSchdule); + + return hasDisposableItemsImpl(dispositionSchdule.isRecordLevelDisposition(), rmContainer); + } + + /** + * Method that provides a boolean if given Records Management Container has disposable items. + * This method is similar to getDisposableItemsImpl(boolean isRecordLevelDisposition, NodeRef rmContainer) but with improved performance: + * For RecordLevelDisposition it will limit Record retrieval to 1. + * Early returns once the first occurrence is found. + * @param isRecordLevelDisposition + * @param rmContainer + * @return + */ + private boolean hasDisposableItemsImpl(boolean isRecordLevelDisposition, NodeRef rmContainer) + { + List items = filePlanService.getAllContained(rmContainer); + for (NodeRef item : items) + { + if (recordFolderService.isRecordFolder(item)) + { + if (isRecordLevelDisposition) + { + List assocs = nodeService.getChildAssocs(item, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL, 1, true); + if (!assocs.isEmpty()) + { + return true; + } + } + else + { + return true; + } + } + else if (filePlanService.isRecordCategory(item) && getAssociatedDispositionScheduleImpl(item) == null) + { + if (hasDisposableItemsImpl(isRecordLevelDisposition, item)); + { + return true; + } + } + } + return false; } /**