diff --git a/config/alfresco/action-services-context.xml b/config/alfresco/action-services-context.xml
index 60299a77a8..5c88fec8d8 100644
--- a/config/alfresco/action-services-context.xml
+++ b/config/alfresco/action-services-context.xml
@@ -128,6 +128,16 @@
+
+
+
+ actionTrackingService
+
+
+
+
+
diff --git a/source/java/org/alfresco/repo/action/script/ScriptActionTrackingService.java b/source/java/org/alfresco/repo/action/script/ScriptActionTrackingService.java
new file mode 100644
index 0000000000..f084c24af9
--- /dev/null
+++ b/source/java/org/alfresco/repo/action/script/ScriptActionTrackingService.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2005-2010 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ */
+package org.alfresco.repo.action.script;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.alfresco.repo.jscript.BaseScopableProcessorExtension;
+import org.alfresco.repo.jscript.ScriptNode;
+import org.alfresco.service.ServiceRegistry;
+import org.alfresco.service.cmr.action.Action;
+import org.alfresco.service.cmr.action.ActionTrackingService;
+import org.alfresco.service.cmr.action.CancellableAction;
+import org.alfresco.service.cmr.action.ExecutionDetails;
+import org.alfresco.service.cmr.action.ExecutionSummary;
+import org.alfresco.service.cmr.rendition.RenderingEngineDefinition;
+import org.alfresco.service.cmr.rendition.RenditionDefinition;
+import org.alfresco.service.cmr.rendition.RenditionService;
+import org.alfresco.service.cmr.repository.ChildAssociationRef;
+import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.namespace.QName;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Script object representing the action tracking service.
+ *
+ * @author Nick Burch
+ */
+public class ScriptActionTrackingService extends BaseScopableProcessorExtension
+{
+ private static Log logger = LogFactory.getLog(ScriptActionTrackingService.class);
+
+ /** The Services registry */
+ private ServiceRegistry serviceRegistry;
+ private ActionTrackingService actionTrackingService;
+
+ /**
+ * Set the service registry
+ *
+ * @param serviceRegistry the service registry.
+ */
+ public void setServiceRegistry(ServiceRegistry serviceRegistry)
+ {
+ this.serviceRegistry = serviceRegistry;
+ }
+
+ /**
+ * Set the action tracking service.
+ *
+ * @param actionTrackingService the action tracking service
+ */
+ public void setActionTrackingService(ActionTrackingService actionTrackingService)
+ {
+ this.actionTrackingService = actionTrackingService;
+ }
+
+ /**
+ * Requests that the specified Action cancel itself
+ * and aborts execution, as soon as possible.
+ */
+ public void requestActionCancellation(ScriptExecutionDetails action)
+ {
+ actionTrackingService.requestActionCancellation(
+ action.getExecutionDetails().getExecutionSummary()
+ );
+ }
+
+ /**
+ * Retrieve summary details of all the actions
+ * currently executing.
+ */
+ public ScriptExecutionDetails[] getAllExecutingActions()
+ {
+ List running = actionTrackingService.getAllExecutingActions();
+ return toDetails(running);
+ }
+
+ /**
+ * Retrieve summary details of all the actions
+ * of the given type that are currently executing.
+ */
+ public ScriptExecutionDetails[] getExecutingActions(String type)
+ {
+ List running = actionTrackingService.getExecutingActions(type);
+ return toDetails(running);
+ }
+
+ /**
+ * Retrieve summary details of all instances of
+ * the specified action that are currently
+ * executing.
+ */
+ public ScriptExecutionDetails[] getExecutingActions(Action action)
+ {
+ List running = actionTrackingService.getExecutingActions(action);
+ return toDetails(running);
+ }
+
+ private ScriptExecutionDetails[] toDetails(List running)
+ {
+ List details = new ArrayList();
+ for(ExecutionSummary summary : running)
+ {
+ ExecutionDetails detail = actionTrackingService.getExecutionDetails(summary);
+ if(detail != null)
+ {
+ details.add( new ScriptExecutionDetails(detail) );
+ }
+ }
+
+ return details.toArray(new ScriptExecutionDetails[details.size()]);
+ }
+}
diff --git a/source/java/org/alfresco/repo/action/script/ScriptExecutionDetails.java b/source/java/org/alfresco/repo/action/script/ScriptExecutionDetails.java
new file mode 100644
index 0000000000..b05157b8b4
--- /dev/null
+++ b/source/java/org/alfresco/repo/action/script/ScriptExecutionDetails.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2005-2010 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ */
+package org.alfresco.repo.action.script;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import org.alfresco.repo.jscript.Scopeable;
+import org.alfresco.service.cmr.action.ExecutionDetails;
+import org.alfresco.service.cmr.action.ExecutionSummary;
+import org.alfresco.service.cmr.repository.NodeRef;
+import org.mozilla.javascript.Scriptable;
+
+/**
+ * ExecutionDetails JavaScript Object. This class is a JavaScript-friendly wrapper for
+ * the {@link ExecutionDetails} (and embeded {@link ExecutionSummary}) class.
+ *
+ * @author Nick Burch
+ * @see org.alfresco.service.cmr.action.ExecutionDetails
+ */
+public final class ScriptExecutionDetails implements Serializable, Scopeable
+{
+ private static final long serialVersionUID = 3182925511891455490L;
+
+ /** Root scope for this object */
+ private Scriptable scope;
+
+ /** The details we wrap */
+ private ExecutionDetails details;
+
+ public ScriptExecutionDetails(ExecutionDetails details)
+ {
+ this.details = details;
+ }
+
+ protected ExecutionDetails getExecutionDetails()
+ {
+ return details;
+ }
+
+
+ public String getActionType() {
+ return details.getActionType();
+ }
+
+ public String getActionId() {
+ return details.getActionId();
+ }
+
+ public int getExecutionInstance() {
+ return details.getExecutionInstance();
+ }
+
+ public NodeRef getPersistedActionRef() {
+ return details.getPersistedActionRef();
+ }
+
+ public String getRunningOn() {
+ return details.getRunningOn();
+ }
+
+ public Date getStartedAt() {
+ return details.getStartedAt();
+ }
+
+ public boolean isCancelRequested() {
+ return details.isCancelRequested();
+ }
+
+ /**
+ * @see org.alfresco.repo.jscript.Scopeable#setScope(org.mozilla.javascript.Scriptable)
+ */
+ public void setScope(Scriptable scope)
+ {
+ this.scope = scope;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder();
+ builder.append("Executing Action: ");
+ builder.append(details.getActionType()).append(' ');
+ builder.append(details.getActionId()).append(' ');
+ builder.append(details.getExecutionInstance()).append(' ');
+ if(details.getPersistedActionRef() != null)
+ {
+ builder.append(details.getPersistedActionRef());
+ }
+
+ return builder.toString();
+ }
+}