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;
+ }
+
}