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