From f644f97ebe6ebb2c177bf3056c3ca6757ff2ff5c Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Fri, 2 May 2014 03:31:42 +0000 Subject: [PATCH] Merge from HEAD to BRANCHES/V2.1.0.x * 61170 - RM-1413: DispositionLifecycleJobExecuter does not execute the disposition action git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@68568 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../org_alfresco_module_rm/log4j.properties | 10 +- .../org_alfresco_module_rm/rm-job-context.xml | 19 +- .../job/DispositionLifecycleJobExecuter.java | 167 ++++++++++++------ 3 files changed, 142 insertions(+), 54 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/log4j.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/log4j.properties index b5bdc8f089..7039db6a8f 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/log4j.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/log4j.properties @@ -18,4 +18,12 @@ log4j.logger.org.alfresco.module.org_alfresco_module_rm.patch=info #log4j.logger.org.alfresco.module.org_alfresco_module_rm.record.RecordServiceImpl=debug #log4j.logger.org.springframework.extensions.webscripts.ScriptDebugger=on -#log4j.logger.org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService=debug \ No newline at end of file +# +# RM Audit service debug +# +#log4j.logger.org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService=debug + +# +# Job debug +# +#log4j.logger.org.alfresco.module.org_alfresco_module_rm.job=debug diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml index 21358a322b..aa9d4a9ac9 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml @@ -72,6 +72,15 @@ + + + + + cutoff + retain + + + @@ -85,8 +94,16 @@ + + - 0 0/15 * * * ? + + + + + + 0/30 * * * * ? + diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java index 141be63303..0dc25b859c 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java @@ -40,39 +40,111 @@ import org.apache.commons.logging.LogFactory; /** * The Disposition Lifecycle Job Finds all disposition action nodes which are - * for "retain" or "cutOff" actions Where asOf > now OR - * dispositionEventsEligible = true; - * + * for disposition actions specified Where asOf > now OR + * dispositionEventsEligible = true; + * * Runs the cut off or retain action for - * elligible records. - * + * eligible records. + * * @author mrogers + * @author Roy Wetherall */ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecuter { + /** logger */ private static Log logger = LogFactory.getLog(DispositionLifecycleJobExecuter.class); + + /** list of disposition actions to automatically execute */ + private List dispositionActions; + + /** query string */ + private String query; + /** records management action service */ private RecordsManagementActionService recordsManagementActionService; - + + /** node service */ private NodeService nodeService; - + + /** search service */ private SearchService searchService; + + /** + * List of disposition actions to automatically execute when eligible. + * + * @param dispositionActions disposition actions + */ + public void setDispositionActions(List dispositionActions) + { + this.dispositionActions = dispositionActions; + } + /** + * @param recordsManagementActionService records management action service + */ public void setRecordsManagementActionService(RecordsManagementActionService recordsManagementActionService) { this.recordsManagementActionService = recordsManagementActionService; } - + + /** + * @param nodeService node service + */ public void setNodeService(NodeService nodeService) { this.nodeService = nodeService; } - + + /** + * @param searchService search service + */ public void setSearchService(SearchService searchService) { this.searchService = searchService; } + /** + * Get the search query string. + * + * @return job query string + */ + private String getQuery() + { + if (query == null) + { + StringBuilder sb = new StringBuilder(); + + sb.append("+TYPE:\"rma:dispositionAction\" "); + sb.append("+(@rma\\:dispositionAction:("); + + boolean bFirst = true; + for (String dispositionAction : dispositionActions) + { + if (bFirst) + { + bFirst = false; + } + else + { + sb.append(" OR "); + } + + sb.append("\"").append(dispositionAction).append("\""); + } + + sb.append("))"); + sb.append("+ISNULL:\"rma:dispositionActionCompletedAt\" "); + sb.append("+( "); + sb.append("@rma\\:dispositionEventsEligible:true "); + sb.append("OR @rma\\:dispositionAsOf:[MIN TO NOW] "); + sb.append(") "); + + query = sb.toString(); + } + + return query; + } + /** * @see org.alfresco.module.org_alfresco_module_rm.job.RecordsManagementJobExecuter#execute() */ @@ -81,75 +153,66 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute try { logger.debug("Job Starting"); - - StringBuilder sb = new StringBuilder(); - sb.append("+TYPE:\"rma:dispositionAction\" "); - sb.append("+(@rma\\:dispositionAction:(\"cutoff\" OR \"retain\"))"); - sb.append("+ISNULL:\"rma:dispositionActionCompletedAt\" "); - sb.append("+( "); - sb.append("@rma\\:dispositionEventsEligible:true "); - sb.append("OR @rma\\:dispositionAsOf:[MIN TO NOW] "); - sb.append(") "); - - String query = sb.toString(); - - ResultSet results = searchService.query(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, - SearchService.LANGUAGE_LUCENE, query); - List resultNodes = results.getNodeRefs(); - results.close(); - - - for (NodeRef node : resultNodes) + + if (dispositionActions != null && !dispositionActions.isEmpty()) { - final NodeRef currentNode = node; + // execute search + ResultSet results = searchService.query(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, SearchService.LANGUAGE_LUCENE, getQuery()); + List resultNodes = results.getNodeRefs(); + results.close(); - RetryingTransactionCallback processTranCB = new RetryingTransactionCallback() + if (logger.isDebugEnabled()) { - public Boolean execute() throws Throwable + logger.debug("Processing " + resultNodes.size() + " nodes"); + } + + // process search results + for (NodeRef node : resultNodes) + { + final NodeRef currentNode = node; + + RetryingTransactionCallback processTranCB = new RetryingTransactionCallback() { - final String dispAction = (String) nodeService.getProperty(currentNode, - RecordsManagementModel.PROP_DISPOSITION_ACTION); - - // Run "retain" and "cutoff" actions. - - if (dispAction != null) + public Boolean execute() throws Throwable { - if (dispAction.equalsIgnoreCase("cutoff") || - dispAction.equalsIgnoreCase("retain")) + final String dispAction = (String) nodeService.getProperty(currentNode, RecordsManagementModel.PROP_DISPOSITION_ACTION); + + // Run disposition action + if (dispAction != null && dispositionActions.contains(dispAction)) { ChildAssociationRef parent = nodeService.getPrimaryParent(currentNode); if (parent.getTypeQName().equals(RecordsManagementModel.ASSOC_NEXT_DISPOSITION_ACTION)) { Map props = new HashMap(1); props.put(RMDispositionActionExecuterAbstractBase.PARAM_NO_ERROR_CHECK, Boolean.FALSE); + + // execute disposition action recordsManagementActionService.executeRecordsManagementAction(parent.getParentRef(), dispAction, props); + if (logger.isDebugEnabled()) { logger.debug("Processed action: " + dispAction + "on" + parent); } } - return null; } + + return Boolean.TRUE; } - return Boolean.TRUE; + }; + + // if exists + if (nodeService.exists(currentNode)) + { + retryingTransactionHelper.doInTransaction(processTranCB); } - }; - - /** - * Now do the work, one action in each transaction - */ - - if (nodeService.exists(currentNode) == false) - { - retryingTransactionHelper.doInTransaction(processTranCB); } } - + logger.debug("Job Finished"); } catch (AlfrescoRuntimeException exception) { - if (logger.isDebugEnabled() == true) + if (logger.isDebugEnabled()) { logger.debug(exception); }