Start Activiti REST Server in Main
package com.nuke.main; import java.io.FileInputStream; import java.util.HashMap; import java.util.Map; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.identity.User; import org.activiti.rest.service.application.ActivitiRestServicesApplication; import org.restlet.Component; import org.restlet.data.Protocol; import com.nuke.activiti.CustomProcessEngineConfig; public class ExpenseProcessRESTMain { private static final String filename = "/Users/tmichels/Documents/workspace-sts-3.5.0.M21/nucleus-workflow/src/main/resources/diagrams/expense_process.bpmn"; public static void main(String[] args) throws Exception { ProcessEngineConfiguration engineConfig = CustomProcessEngineConfig.createStandaloneInMemProcessEngineConfiguration(); ProcessEngine processEngine = engineConfig.buildProcessEngine(); User newUser = processEngine.getIdentityService().newUser("kermit"); newUser.setPassword("kermit"); processEngine.getIdentityService().saveUser(newUser); processEngine.getRepositoryService().createDeployment() .addInputStream("expense_process.bpmn", new FileInputStream(filename)).deploy(); Map variableMap1 = new HashMap(); variableMap1.put("employee", "Jack"); variableMap1.put("amount", 111); processEngine.getRuntimeService().startProcessInstanceByKey("expenseProcess", variableMap1); Component component = new Component(); component.getServers().add(Protocol.HTTP, 8182); ActivitiRestServicesApplication restApplication = new ActivitiRestServicesApplication(); // Attach the Activiti REST-application and start component.getDefaultHost().attach("/activiti-rest", restApplication); component.start(); } }
Create Activiti REST Server in web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Activiti REST</display-name> <listener> <listener-class>org.activiti.rest.common.servlet.ActivitiServletContextListener</listener-class> </listener> <!-- Restlet adapter --> <servlet> <servlet-name>RestletServlet</servlet-name> <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class> <init-param> <!-- Application class name --> <param-name>org.restlet.application</param-name> <param-value>org.activiti.rest.service.application.ActivitiRestServicesApplication</param-value> </init-param> </servlet> <!-- Catch all requests --> <servlet-mapping> <servlet-name>RestletServlet</servlet-name> <url-pattern>/service/*</url-pattern> </servlet-mapping> </web-app>
Activiti REST Client
package com.nuke.activiti.client; import java.io.IOException; import org.apache.log4j.Logger; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONStringer; import org.restlet.data.ChallengeScheme; import org.restlet.data.MediaType; import org.restlet.representation.Representation; import org.restlet.representation.StringRepresentation; import org.restlet.resource.ClientResource; public class ActivitiRestClient { private static String REST_URI = "http://localhost:8081/activiti-rest-api/service"; private static Logger logger = Logger.getLogger(ActivitiRestClient.class); private static ClientResource getClientResource(String uri) { ClientResource clientResource = new ClientResource(uri); clientResource.setChallengeResponse(ChallengeScheme.HTTP_BASIC, "kermit", "kermit"); return clientResource; } public static String getUnderwritingQueueProcessId() throws IOException, JSONException { String uri = REST_URI + "/repository/process-definitions"; System.out.println("URI: " + uri); Representation response = getClientResource(uri).get( MediaType.APPLICATION_JSON); JSONObject object = new JSONObject(response.getText()); if (object != null) { JSONArray arr = (JSONArray) object.get("data"); for (int i = 0; i < arr.length(); i++) { JSONObject jsonObject = (JSONObject) arr.get(i); if (jsonObject.get("key").equals("underwritingQueue")) { logger.info("Returning processDefinitionId " + jsonObject.get("id")); return (String) jsonObject.get("id"); } } } return null; } public static String addLoanToUnderwritingQueue(String processDefinitionId) throws Exception { String uri = REST_URI + "/runtime/process-instances"; JSONStringer jsRequest = new JSONStringer(); jsRequest.object().key("processDefinitionId") .value(processDefinitionId).key("variables").array().object() .key("name").value("LoanId").key("value").value("132312") .endObject().endArray(); jsRequest.endObject(); Representation rep = new StringRepresentation(jsRequest.toString(), MediaType.APPLICATION_JSON); System.out.println("REP: " + rep.toString()); JSONObject jsObj = new JSONObject(getClientResource(uri).post(rep) .getText()); logger.info("Returning processId " + jsObj.getString("id")); return jsObj.getString("id"); } public static String getQueueTask(String processInstanceId) throws Exception { String uri = REST_URI + "/tasks?candidate=kermit"; Representation response = getClientResource(uri).get( MediaType.APPLICATION_JSON); JSONObject object = new JSONObject(response.getText()); if (object != null) { JSONArray arr = (JSONArray) object.get("data"); for (int i = 0; i < arr.length(); i++) { JSONObject ob = (JSONObject) arr.get(i); if (ob.get("processInstanceId").equals(processInstanceId)) { logger.info("Returning taskId " + ob.get("id")); return (String) ob.get("id"); } } } return null; } public static String claimQueueTask(String taskId) throws Exception { String uri = REST_URI + "/task/" + taskId + "/claim"; Representation response = getClientResource(uri).put("{}", MediaType.APPLICATION_JSON); JSONObject object = new JSONObject(response.getText()); System.out.println("OBJECT: " + object.toString()); logger.info("Claimed task " + taskId + " " + object.get("success")); return object.get("success").toString(); } public static String completeTask(String taskId) throws Exception { String uri = REST_URI + "/task/" + taskId + "/complete"; Representation response = getClientResource(uri).put( "{disposition:complete}", MediaType.APPLICATION_JSON); JSONObject object = new JSONObject(response.getText()); logger.info("Completed task " + taskId + " " + object.getString("success")); return object.getString("success"); } @SuppressWarnings("unused") public static int getTasks(String status, String candidate) throws Exception { String uri = REST_URI + "/tasks?" + status + "=" + candidate; Representation response = getClientResource(uri).get( MediaType.APPLICATION_JSON); JSONObject object = new JSONObject(response.getText()); if (object != null) { JSONArray arr = (JSONArray) object.get("data"); logger.info("Tasklist " + candidate + " " + status + " size " + arr.length()); return arr.length(); } return -1; } }
Activiti REST Client Test
package com.nuke.activiti.client; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import org.junit.Test; import com.nuke.activiti.common.AbstractTest; public class ActivitiRestClientTest extends AbstractTest { @Test public void restAPITest() throws Exception { String underwritingLoanDefinitionId = ActivitiRestClient.getUnderwritingQueueProcessId(); assertNotNull(underwritingLoanDefinitionId); String processInstanceId = ActivitiRestClient.addLoanToUnderwritingQueue(underwritingLoanDefinitionId); assertNotNull(processInstanceId); String taskId = ActivitiRestClient.getQueueTask(processInstanceId); assertNotNull(taskId); assertEquals("true", ActivitiRestClient.claimQueueTask(taskId)); assertEquals(4, ActivitiRestClient.getTasks("candidate","kermit")); assertEquals(6, ActivitiRestClient.getTasks("assignee","kermit")); assertEquals("true", ActivitiRestClient.completeTask(taskId)); assertEquals(0, ActivitiRestClient.getTasks("assignee","kermit")); } }