package org.activiti.kickstart;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.activiti.kickstart.dto.KickstartForm;
import org.activiti.kickstart.dto.KickstartFormProperty;
import org.activiti.kickstart.dto.KickstartTask;
import org.activiti.kickstart.dto.KickstartUserTask;
import org.activiti.kickstart.dto.KickstartWorkflow;
import org.activiti.kickstart.dto.KickstartWorkflowInfo;
import org.activiti.kickstart.service.MetaDataKeys;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.node.ObjectNode;
import org.restlet.data.Status;
import org.restlet.representation.Representation;
import org.restlet.resource.Delete;
import org.restlet.resource.Get;
import org.restlet.resource.Post;
import org.restlet.resource.Put;
public class WorkflowResource extends BaseResource {
private static final Logger LOGGER = Logger.getLogger(WorkflowResource.class.getName());
@Get
public KickstartWorkflowInfo findWorkflowInfo() {
String workflowId = (String) getRequest().getAttributes().get("workflowId");
if (workflowId == null) {
getResponse().setStatus(Status.CLIENT_ERROR_NOT_FOUND);
return null;
}
KickstartWorkflowInfo kickstartWorkflowInfo = getKickstartService().findWorkflowInformation(workflowId, true);
if (kickstartWorkflowInfo == null) {
getResponse().setStatus(Status.CLIENT_ERROR_NOT_FOUND);
}
return kickstartWorkflowInfo;
}
@Delete
public void deleteWorkflow() {
String workflowId = (String) getRequest().getAttributes().get("workflowId");
if (workflowId == null) {
getResponse().setStatus(Status.CLIENT_ERROR_NOT_FOUND);
}
getKickstartService().deleteWorkflow(workflowId);
}
@Post
public ObjectNode deployWorkflow(Representation representation) throws IOException {
String json = convertToJsonFrom(representation);
KickstartWorkflow workflow = convertFrom(json);
// Uniqueness check (post is used for new processes)
if (getKickstartService().findWorkflowInformation(workflow.getId(), false) != null) {
getResponse().setStatus(Status.CLIENT_ERROR_CONFLICT);
return null;
}
// Actually deploy this workflow
return deployWorkflow(workflow, json);
}
@Put
public ObjectNode updateProcess(Representation representation) throws IOException {
String json = convertToJsonFrom(representation);
KickstartWorkflow workflow = convertFrom(json);
return deployWorkflow(workflow, json);
}
// Helpers
// ////////////////////////////////////////////////////////////////////////////
protected ObjectNode deployWorkflow(KickstartWorkflow workflow, String json) {
String workflowId = getKickstartService().deployWorkflow(workflow, Collections.singletonMap(MetaDataKeys.WORKFLOW_JSON_SOURCE, json));
ObjectNode idNode = new ObjectMapper().createObjectNode();
idNode.put("id", workflowId);
return idNode;
}
protected String convertToJsonFrom(Representation representation) {
try {
return representation.getText();
} catch (IOException e) {
LOGGER.log(Level.SEVERE, "Could not convert to json string");
e.printStackTrace();
return null;
}
}
protected KickstartWorkflow convertFrom(String jsonText) {
KickstartWorkflow workflow = new KickstartWorkflow();
try {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
JsonNode json = mapper.readTree(jsonText);
LOGGER.info("Received json:");
LOGGER.info(mapper.writeValueAsString(json));
// Workflow name
String name = json.path("name").getTextValue();
if (name == null) {
throw new RuntimeException("Missing parameter [name] in json body");
}
workflow.setName(name);
workflow.setId(generateBaseName(name));
// Workflow description
String description = json.path("description").getTextValue();
workflow.setDescription(description);
// Workflow tasks
JsonNode taskArray = json.path("tasks");
if (taskArray != null && taskArray.isArray()) {
List<KickstartTask> workflowTasks = new ArrayList<KickstartTask>();
workflow.setTasks(workflowTasks);
Iterator<JsonNode> taskIterator = taskArray.iterator();
while (taskIterator.hasNext()) {
JsonNode taskNode = taskIterator.next();
KickstartUserTask workflowTask = new KickstartUserTask();
workflowTasks.add(workflowTask);
// Task details
workflowTask.setName(taskNode.path("name").getTextValue());
workflowTask.setDescription(taskNode.path("description").getTextValue());
workflowTask.setStartWithPrevious(taskNode.path("startWithPrevious").getBooleanValue());
// Task assignee
String assigneeType = taskNode.path("assigneeType").getTextValue();
if (assigneeType != null) {
if (assigneeType.equals("user")) {
workflowTask.setAssignee(taskNode.path("assignee").getTextValue());
} else if (assigneeType.equals("group")) {
workflowTask.setGroups(taskNode.path("assignee").getTextValue());
} else if (assigneeType.equals("initiator")) {
workflowTask.setAssigneeInitiator(true);
}
}
// Task form
JsonNode formArray = taskNode.path("form");
if (formArray != null && formArray.isArray()) {
KickstartForm kickstartForm = new KickstartForm();
workflowTask.setForm(kickstartForm);
Iterator<JsonNode> formIterator = formArray.iterator();
while (formIterator.hasNext()) {
KickstartFormProperty formProperty = new KickstartFormProperty();
kickstartForm.addFormProperty(formProperty);
JsonNode formEntry = formIterator.next();
formProperty.setProperty(formEntry.path("name").getTextValue());
formProperty.setType(formEntry.path("type").getTextValue());
formProperty.setRequired(formEntry.path("isRequired").getTextValue().equals("true"));
}
}
}
}
return workflow;
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Could not convert json to internal KickStartWorkflow");
e.printStackTrace();
return null;
}
}
protected String generateBaseName(String name) {
return name.toLowerCase().replace(" ", "_");
}
}