diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/query/rm-common-SqlMap.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/query/rm-common-SqlMap.xml index 2845b537fa..201b68d956 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/query/rm-common-SqlMap.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/query/rm-common-SqlMap.xml @@ -8,7 +8,20 @@ + + + + + + + + + + + + + @@ -29,23 +42,36 @@ + + diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionService.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionService.java index 4da6fde0dd..2ba7dbcc0e 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionService.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionService.java @@ -237,6 +237,14 @@ public interface DispositionService */ void updateNextDispositionAction(NodeRef nodeRef); + /** + * Updates the next disposition action + * + * @param nodeRef node reference + * @param DispositionSchedule the schedule to be applied + */ + void updateNextDispositionAction(NodeRef nodeRef, DispositionSchedule dispositionSchedule); + /** * Refreshes the disposition action details of the given node. * 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 32f68c1bb5..78087ffffd 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 @@ -954,6 +954,34 @@ public class DispositionServiceImpl extends ServiceBaseImpl { // Get this disposition instructions for the node DispositionSchedule di = getDispositionSchedule(nodeRef); + + updateNextDispositionAction(nodeRef, di); + + return null; + } + + }; + + AuthenticationUtil.runAsSystem(runAsWork); + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService#updateNextDispositionAction(NodeRef) + */ + @Override + public void updateNextDispositionAction(final NodeRef nodeRef, final DispositionSchedule di) + { + + + RunAsWork runAsWork = new RunAsWork() + { + /** + * @see org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork#doWork() + */ + @Override + public Void doWork() + { + if (di != null) { // Get the current action node diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v24/RMv24DispositionInheritancePatch.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v24/RMv24DispositionInheritancePatch.java index dffff5a9a4..b1fe090b1b 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v24/RMv24DispositionInheritancePatch.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v24/RMv24DispositionInheritancePatch.java @@ -31,11 +31,13 @@ import static org.alfresco.module.org_alfresco_module_rm.model.RecordsManagement import java.util.List; +import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition; import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule; import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService; import org.alfresco.module.org_alfresco_module_rm.patch.AbstractModulePatch; import org.alfresco.module.org_alfresco_module_rm.query.RecordsManagementQueryDAO; import org.alfresco.module.org_alfresco_module_rm.record.RecordService; +import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.apache.commons.logging.Log; @@ -52,7 +54,9 @@ import org.apache.commons.logging.LogFactory; */ public class RMv24DispositionInheritancePatch extends AbstractModulePatch { - private static Log logger = LogFactory.getLog(RMv24DispositionInheritancePatch.class); + private static final Log logger = LogFactory.getLog(RMv24DispositionInheritancePatch.class); + + private static final long BATCH_SIZE = 5L; private DispositionService dispositionService; @@ -90,30 +94,51 @@ public class RMv24DispositionInheritancePatch extends AbstractModulePatch @Override public void applyInternal() { - logger.info("***********************recordsManagementQueryDAO.getNodeRefs()***************************"); - logger.info(recordsManagementQueryDAO.getRecordFoldersWithSchedules()); - logger.info("***********************RMv24DispositionInheritancePatch***************************"); + logger.info("********************Patch start********************"); + int maxNode = recordsManagementQueryDAO.getRecordFoldersWithSchedulesCount(); + logger.info("nodes to update: "+ maxNode); - - List folders = recordsManagementQueryDAO.getRecordFoldersWithSchedules(); - logger.info("folders: " + folders); - for (NodeRef folder : folders) + for (Long i = 0L; i < maxNode; i += BATCH_SIZE) { - DispositionSchedule schedule = dispositionService.getDispositionSchedule(folder); - logger.info("schedule: " + schedule); - if (schedule.isRecordLevelDisposition()) - { - List records = recordService.getRecords(folder); - logger.info("records: " + records); - for (NodeRef record : records) + final Long finali = i; + int updatedRecords = transactionService.getRetryingTransactionHelper() + .doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() { - if (!nodeService.hasAspect(record, ASPECT_DISPOSITION_LIFECYCLE)) + public Integer execute() throws Throwable { - logger.info("updating record: " + record); - dispositionService.updateNextDispositionAction(record); + int recordCount = 0; + logger.info("********************Patch start********************"); + logger.info("********************Query start********************"); + logger.info(finali); + logger.info(finali + BATCH_SIZE); + logger.info(recordsManagementQueryDAO.getRecordFoldersWithSchedules(finali, finali + BATCH_SIZE)); + List folders = recordsManagementQueryDAO.getRecordFoldersWithSchedules(finali, finali + BATCH_SIZE); + logger.info("********************Query end********************"); + for (NodeRef folder : folders) + + { + + DispositionSchedule schedule = dispositionService.getDispositionSchedule(folder); + if (schedule.isRecordLevelDisposition()) + { + List records = recordService.getRecords(folder); + for (NodeRef record : records) + { + if (!nodeService.hasAspect(record, ASPECT_DISPOSITION_LIFECYCLE)) + { + logger.info("updating record: " + record); + dispositionService.updateNextDispositionAction(record, schedule); + recordCount ++; + } + } + } + } + logger.info("********************Patch end********************"); + return recordCount; } - } - } + }, false, true); + + logger.info("....completed: "+ updatedRecords); } } } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/NodeRefEntity.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/NodeRefEntity.java index e61e526763..203a186e45 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/NodeRefEntity.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/NodeRefEntity.java @@ -34,6 +34,7 @@ package org.alfresco.module.org_alfresco_module_rm.query; */ public class NodeRefEntity { + private Long num; private String protocol; private String identifier; private String uuid; @@ -45,6 +46,16 @@ public class NodeRefEntity { } + public Long getNum() + { + return num; + } + + public void setNum(Long num) + { + this.num = num; + } + public String getProtocol() { return protocol; diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/RecordsManagementQueryDAO.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/RecordsManagementQueryDAO.java index f68ce3723a..0c6af0d6f2 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/RecordsManagementQueryDAO.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/RecordsManagementQueryDAO.java @@ -52,9 +52,18 @@ public interface RecordsManagementQueryDAO int getCountRmaIdentifier(String identifierValue); /** - * Returns a list of nodeRef for all record folders in the system + * Returns a number of nodeRefs for record folders in the system * that have the property recordSearchHasDispositionSchedule:true - * @return List of nodeRefs + * (used for MNT-20864) + * @param start long - the first result row to return + * @param end long - the last result row to return + * @return list of node refs */ - public List getRecordFoldersWithSchedules(); + public List getRecordFoldersWithSchedules(Long start, Long end); + + /** + * Returns the count of record folders with a schedule applied (used for MNT-20864) + * @return the number of record folders with a disposition schedule + */ + public int getRecordFoldersWithSchedulesCount(); } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/RecordsManagementQueryDAOImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/RecordsManagementQueryDAOImpl.java index 0432e13612..b761d0bd3b 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/RecordsManagementQueryDAOImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/RecordsManagementQueryDAOImpl.java @@ -49,7 +49,8 @@ public class RecordsManagementQueryDAOImpl implements RecordsManagementQueryDAO, { private static final String COUNT_IDENTIFIER = "alfresco.query.rm.select_CountRMIndentifier"; private static final String SCHEDULED_FOLDERS = "alfresco.query.rm.select_RecordFoldersWithSchedules"; - + private static final String SCHEDULED_FOLDERS_COUNT = "alfresco.query.rm.select_RecordFoldersWithSchedulesCount"; + /** SQL session template */ protected SqlSessionTemplate template; @@ -105,9 +106,16 @@ public class RecordsManagementQueryDAOImpl implements RecordsManagementQueryDAO, * @see org.alfresco.module.org_alfresco_module_rm.query.RecordsManagementQueryDAO#getRecordFoldersWithSchedules() */ @Override - public List getRecordFoldersWithSchedules() + public List getRecordFoldersWithSchedules(Long start, Long end) { - List entities = template.selectList(SCHEDULED_FOLDERS); + Map params = new HashMap(2); + params.put("dispositionQnameId", qnameDAO.getQName(PROP_RS_HAS_DISPOITION_SCHEDULE) + .getFirst()); + params.put("folderQnameId",qnameDAO.getQName(TYPE_RECORD_FOLDER).getFirst()); + params.put("start", start); + params.put("end", end); + + List entities = template.selectList(SCHEDULED_FOLDERS, params); List results = new ArrayList<>(); @@ -120,4 +128,24 @@ public class RecordsManagementQueryDAOImpl implements RecordsManagementQueryDAO, return results; } + public int getRecordFoldersWithSchedulesCount() + { + int result = 0; + + Map params = new HashMap(2); + params.put("dispositionQnameId", qnameDAO.getQName(PROP_RS_HAS_DISPOITION_SCHEDULE) + .getFirst()); + params.put("folderQnameId", qnameDAO.getQName(TYPE_RECORD_FOLDER) + .getFirst()); + + Integer count = template.selectOne(SCHEDULED_FOLDERS_COUNT, params); + + if (count != null) + { + result = count; + } + + return result; + } + }