提交 ea46e5ed 编写于 作者: F Frederik Heremans

Including suspension/activation with delay and cascade in REST-resource

上级 73849b93
......@@ -13,7 +13,6 @@
package org.activiti.rest.api;
/**
* Generic class that represents an action to be performed on a resource. Should be subclasses
* if additional action-parameters are required.
......@@ -27,7 +26,6 @@ public class RestActionRequest {
public void setAction(String action) {
this.action = action;
}
public String getAction() {
return action;
}
......
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.rest.api.repository;
import java.util.Date;
import org.activiti.rest.api.RestActionRequest;
/**
* @author Frederik Heremans
*/
public class ProcessDefinitionActionRequest extends RestActionRequest {
private boolean includeProcessInstances = false;
private Date date;
public void setIncludeProcessInstances(boolean includeProcessInstances) {
this.includeProcessInstances = includeProcessInstances;
}
public boolean isIncludeProcessInstances() {
return includeProcessInstances;
}
public void setDate(Date date) {
this.date = date;
}
public Date getDate() {
return date;
}
}
......@@ -13,11 +13,12 @@
package org.activiti.rest.api.repository;
import java.util.Date;
import org.activiti.engine.ActivitiIllegalArgumentException;
import org.activiti.engine.ActivitiObjectNotFoundException;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.rest.api.ActivitiUtil;
import org.activiti.rest.api.RestActionRequest;
import org.activiti.rest.api.SecuredResource;
import org.activiti.rest.application.ActivitiRestServicesApplication;
import org.restlet.data.Status;
......@@ -41,7 +42,7 @@ public class ProcessDefinitionResource extends SecuredResource {
}
@Put
public ProcessDefinitionResponse executeProcessDefinitionAction(RestActionRequest actionRequest) {
public ProcessDefinitionResponse executeProcessDefinitionAction(ProcessDefinitionActionRequest actionRequest) {
if(authenticate() == false) return null;
if(actionRequest == null) {
......@@ -52,20 +53,20 @@ public class ProcessDefinitionResource extends SecuredResource {
if(actionRequest.getAction() != null) {
if("suspend".equals(actionRequest.getAction())) {
return suspendProcessDefinition(processDefinition);
return suspendProcessDefinition(processDefinition, actionRequest.isIncludeProcessInstances(), actionRequest.getDate());
} else if("activate".equals(actionRequest.getAction())) {
return activateProcessDefinition(processDefinition);
return activateProcessDefinition(processDefinition, actionRequest.isIncludeProcessInstances(), actionRequest.getDate());
}
}
throw new ActivitiIllegalArgumentException("Invalid action: '" + actionRequest.getAction() + "', use 'suspend' or 'activate'.");
}
protected ProcessDefinitionResponse activateProcessDefinition(ProcessDefinition processDefinition) {
protected ProcessDefinitionResponse activateProcessDefinition(ProcessDefinition processDefinition, boolean suspendInstances, Date date) {
if(!processDefinition.isSuspended()) {
throw new ResourceException(Status.CLIENT_ERROR_CONFLICT, "Process definition with id '" + processDefinition.getId() + "'is already active");
}
ActivitiUtil.getRepositoryService().activateProcessDefinitionById(processDefinition.getId());
ActivitiUtil.getRepositoryService().activateProcessDefinitionById(processDefinition.getId(), suspendInstances, date);
ProcessDefinitionResponse response = getApplication(ActivitiRestServicesApplication.class).getRestResponseFactory()
.createProcessDefinitionResponse(this, processDefinition);
......@@ -75,11 +76,11 @@ public class ProcessDefinitionResource extends SecuredResource {
return response;
}
protected ProcessDefinitionResponse suspendProcessDefinition(ProcessDefinition processDefinition) {
protected ProcessDefinitionResponse suspendProcessDefinition(ProcessDefinition processDefinition, boolean suspendInstances, Date date) {
if(processDefinition.isSuspended()) {
throw new ResourceException(Status.CLIENT_ERROR_CONFLICT, "Process definition with id '" + processDefinition.getId() + "'is already suspended");
}
ActivitiUtil.getRepositoryService().suspendProcessDefinitionById(processDefinition.getId());
ActivitiUtil.getRepositoryService().suspendProcessDefinitionById(processDefinition.getId(), suspendInstances, date);
ProcessDefinitionResponse response = getApplication(ActivitiRestServicesApplication.class).getRestResponseFactory()
.createProcessDefinitionResponse(this, processDefinition);
......
package org.activiti.rest.api.repository;
import java.net.URLDecoder;
import java.util.Calendar;
import org.activiti.engine.impl.util.ClockUtil;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.test.Deployment;
import org.activiti.rest.BaseRestTestCase;
import org.activiti.rest.api.RestUrls;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.node.ObjectNode;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;
import org.restlet.data.Status;
import org.restlet.representation.Representation;
import org.restlet.resource.ClientResource;
......@@ -125,6 +129,49 @@ public class ProcessDefinitionResourceTest extends BaseRestTestCase {
assertTrue(processDefinition.isSuspended());
}
/**
* Test suspending a process definition on a certain date.
* POST repository/process-definitions/{processDefinitionId}
*/
@Deployment(resources={"org/activiti/rest/api/repository/oneTaskProcess.bpmn20.xml"})
public void testSuspendProcessDefinitionDelayed() throws Exception {
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().singleResult();
assertFalse(processDefinition.isSuspended());
ClientResource client = getAuthenticatedClient(RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_DEFINITION, processDefinition.getId()));
ObjectNode requestNode = objectMapper.createObjectNode();
Calendar cal = Calendar.getInstance();
cal.add(Calendar.HOUR, 2);
// Format the date using ISO date format
DateTimeFormatter formatter = ISODateTimeFormat.dateTime();
String dateString = formatter.print(cal.getTimeInMillis());
requestNode.put("action", "suspend");
requestNode.put("date", dateString);
Representation response = client.put(requestNode);
// Check "OK" status
assertEquals(Status.SUCCESS_OK, client.getResponse().getStatus());
JsonNode responseNode = objectMapper.readTree(response.getStream());
assertTrue(responseNode.get("suspended").getBooleanValue());
// Check if process-definition is not yet suspended
processDefinition = repositoryService.createProcessDefinitionQuery().singleResult();
assertFalse(processDefinition.isSuspended());
// Force suspension by altering time
cal.add(Calendar.HOUR, 1);
ClockUtil.setCurrentTime(cal.getTime());
waitForJobExecutorToProcessAllJobs(5000, 100);
// Check if process-definition is suspended
processDefinition = repositoryService.createProcessDefinitionQuery().singleResult();
assertTrue(processDefinition.isSuspended());
}
/**
* Test suspending already suspended process definition.
* POST repository/process-definitions/{processDefinitionId}
......@@ -178,6 +225,52 @@ public class ProcessDefinitionResourceTest extends BaseRestTestCase {
assertFalse(processDefinition.isSuspended());
}
/**
* Test activating a suspended process definition delayed.
* POST repository/process-definitions/{processDefinitionId}
*/
@Deployment(resources={"org/activiti/rest/api/repository/oneTaskProcess.bpmn20.xml"})
public void testActivateProcessDefinitionDelayed() throws Exception {
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().singleResult();
repositoryService.suspendProcessDefinitionById(processDefinition.getId());
processDefinition = repositoryService.createProcessDefinitionQuery().singleResult();
assertTrue(processDefinition.isSuspended());
ClientResource client = getAuthenticatedClient(RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_DEFINITION, processDefinition.getId()));
ObjectNode requestNode = objectMapper.createObjectNode();
Calendar cal = Calendar.getInstance();
cal.add(Calendar.HOUR, 2);
// Format the date using ISO date format
DateTimeFormatter formatter = ISODateTimeFormat.dateTime();
String dateString = formatter.print(cal.getTimeInMillis());
requestNode.put("action", "activate");
requestNode.put("date", dateString);
Representation response = client.put(requestNode);
// Check "OK" status
assertEquals(Status.SUCCESS_OK, client.getResponse().getStatus());
JsonNode responseNode = objectMapper.readTree(response.getStream());
assertFalse(responseNode.get("suspended").getBooleanValue());
// Check if process-definition is not yet active
processDefinition = repositoryService.createProcessDefinitionQuery().singleResult();
assertTrue(processDefinition.isSuspended());
// Force activation by altering time
cal.add(Calendar.HOUR, 1);
ClockUtil.setCurrentTime(cal.getTime());
waitForJobExecutorToProcessAllJobs(5000, 100);
// Check if process-definition is activated
processDefinition = repositoryService.createProcessDefinitionQuery().singleResult();
assertFalse(processDefinition.isSuspended());
}
/**
* Test activating already active process definition.
* POST repository/process-definitions/{processDefinitionId}
......
......@@ -937,8 +937,39 @@
<emphasis role="bold">Body JSON:</emphasis>
<programlisting>
{
"action" : "suspend"
"action" : "suspend",
"includeProcessInstances" : "false",
"date" : "2013-04-15T00:42:12Z"
}</programlisting>
<table id="processDefinitionActionBodyParameters">
<title>JSON Body parameters</title>
<tgroup cols='2'>
<thead>
<row>
<entry>Parameter</entry>
<entry>Description</entry>
<entry>Required</entry>
</row>
</thead>
<tbody>
<row>
<entry>action</entry>
<entry>Action to perform. Either <literal>activate</literal> or <literal>suspend</literal>.</entry>
<entry>Yes</entry>
</row>
<row>
<entry>includeProcessInstances</entry>
<entry>Wether or not to suspend/activate running process-instances for this process-definition. If omitted, the process-instances are left in the state they are.</entry>
<entry>No</entry>
</row>
<row>
<entry>date</entry>
<entry>Date (ISO-8601) when the suspension/activation should be executed. If omitted, the suspend/activation is effective immediatly.</entry>
<entry>No</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>
<table>
......@@ -980,8 +1011,12 @@
<emphasis role="bold">Body JSON:</emphasis>
<programlisting>
{
"action" : "activate"
"action" : "activate",
"includeProcessInstances" : "true",
"date" : "2013-04-15T00:42:12Z"
}</programlisting>
See suspend process definition <link linkend="processDefinitionActionBodyParameters">JSON Body parameters</link>.
</para>
<para>
<table>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册