diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow-instance.delete.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow-instance.delete.desc.xml
new file mode 100644
index 0000000000..ea38626642
--- /dev/null
+++ b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow-instance.delete.desc.xml
@@ -0,0 +1,8 @@
+
+ Delete Workflow Instance
+ Either cancels or deletes the specified workflow instance.
+ /api/workflow-instances/{workflow_instance_id}?forced={forced?}
+
+ user
+ required
+
\ No newline at end of file
diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow-instance.delete.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow-instance.delete.json.ftl
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/config/alfresco/web-scripts-application-context.xml b/config/alfresco/web-scripts-application-context.xml
index 349c7d13f6..feb3a3b18a 100644
--- a/config/alfresco/web-scripts-application-context.xml
+++ b/config/alfresco/web-scripts-application-context.xml
@@ -821,6 +821,11 @@
class="org.alfresco.repo.web.scripts.workflow.WorkflowInstancesGet"
parent="abstractWorkflowWebScript">
+
+
+
diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowInstanceDelete.java b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowInstanceDelete.java
new file mode 100644
index 0000000000..8c41c84d02
--- /dev/null
+++ b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowInstanceDelete.java
@@ -0,0 +1,80 @@
+/*
+ * 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.web.scripts.workflow;
+
+import java.util.Map;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.extensions.webscripts.Cache;
+import org.springframework.extensions.webscripts.Status;
+import org.springframework.extensions.webscripts.WebScriptRequest;
+
+/**
+ * @author unknown
+ * @since 3.4
+ *
+ */
+public class WorkflowInstanceDelete extends AbstractWorkflowWebscript
+{
+
+ public static final String PARAM_FORCED = "forced";
+
+ @Override
+ protected Map buildModel(WorkflowModelBuilder modelBuilder, WebScriptRequest req, Status status, Cache cache)
+ {
+ Map params = req.getServiceMatch().getTemplateVars();
+
+ // getting workflow instance id from request parameters
+ String workflowInstanceId = params.get("workflow_instance_id");
+
+ boolean forced = getForced(req);
+
+ if (forced)
+ {
+ workflowService.deleteWorkflow(workflowInstanceId);
+ }
+ else
+ {
+ workflowService.cancelWorkflow(workflowInstanceId);
+ }
+
+ status.setCode(HttpServletResponse.SC_NO_CONTENT);
+ return null;
+ }
+
+ private boolean getForced(WebScriptRequest req)
+ {
+ String forced = req.getParameter(PARAM_FORCED);
+ if (forced != null)
+ {
+ try
+ {
+ return Boolean.valueOf(forced);
+ }
+ catch (Exception e)
+ {
+ // do nothing, false will be returned
+ }
+ }
+
+ // Defaults to false.
+ return false;
+ }
+}
diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowRestApiTest.java b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowRestApiTest.java
index 7636edd47c..759efa5946 100644
--- a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowRestApiTest.java
+++ b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowRestApiTest.java
@@ -53,6 +53,7 @@ import org.springframework.extensions.surf.util.ISO8601DateFormat;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.TestWebScriptServer.GetRequest;
import org.springframework.extensions.webscripts.TestWebScriptServer.PutRequest;
+import org.springframework.extensions.webscripts.TestWebScriptServer.DeleteRequest;
import org.springframework.extensions.webscripts.TestWebScriptServer.Response;
/**
@@ -487,6 +488,31 @@ public class WorkflowRestApiTest extends BaseWebScriptTest
assertTrue(stateFilteredResult.length() > 1);
}
+ public void testWorkflowInstanceDelete() throws Exception
+ {
+ //Start workflow as USER1 and assign task to USER2.
+ personManager.setUser(USER1);
+ WorkflowDefinition adhocDef = workflowService.getDefinitionByName("jbpm$wf:adhoc");
+ Map params = new HashMap();
+ params.put(WorkflowModel.ASSOC_ASSIGNEE, personManager.get(USER2));
+ Date dueDate = new Date();
+ params.put(WorkflowModel.PROP_DUE_DATE, dueDate);
+ params.put(WorkflowModel.PROP_PRIORITY, 1);
+ params.put(WorkflowModel.ASSOC_PACKAGE, packageRef);
+ params.put(WorkflowModel.PROP_CONTEXT, packageRef);
+
+ WorkflowPath adhocPath = workflowService.startWorkflow(adhocDef.getId(), params);
+ WorkflowTask startTask = workflowService.getTasksForWorkflowPath(adhocPath.getId()).get(0);
+ startTask = workflowService.endTask(startTask.getId(), null);
+
+ WorkflowInstance adhocInstance = startTask.getPath().getInstance();
+
+ Response response = sendRequest(new DeleteRequest(URL_WORKFLOW_INSTANCES + "/" + adhocInstance.getId()), 204);
+ assertEquals(Status.STATUS_NO_CONTENT, response.getStatus());
+
+ assertNull(workflowService.getWorkflowById(adhocInstance.getId()));
+ }
+
@Override
protected void setUp() throws Exception
{