package org.activiti.rest.api.process;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.runtime.Execution;
import org.activiti.rest.api.ActivitiUtil;
import org.activiti.rest.api.SecuredResource;
import org.apache.commons.lang.StringUtils;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.node.ObjectNode;
import org.restlet.representation.Representation;
import org.restlet.resource.Post;
public class SignalEventSubscriptionResource extends SecuredResource {
@Post
public ObjectNode signalEventSubscription(Representation entity) {
ObjectNode responseJSON = new ObjectMapper().createObjectNode();
String processInstanceId = (String) getRequest().getAttributes().get("processInstanceId");
String signalName = (String) getRequest().getAttributes().get("signalName");
if (StringUtils.isEmpty(processInstanceId)) {
responseJSON.put("success", false);
responseJSON.put("failureReason", "No process instance is provided");
return responseJSON;
}
if (StringUtils.isEmpty(signalName)) {
responseJSON.put("success", false);
responseJSON.put("failureReason", "No signal name is provided");
return responseJSON;
}
try {
// check authentication
if (authenticate() == false) {
responseJSON.put("success", false);
responseJSON.put("failureReason", "Not authenticated");
return responseJSON;
}
Map<String, Object> variables = new HashMap<String, Object>();
if (entity != null) {
String signalVariables = entity.getText();
if (StringUtils.isNotEmpty(signalVariables)) {
JsonNode startJSON = new ObjectMapper().readTree(signalVariables);
variables.putAll(retrieveVariables(startJSON));
}
}
List<Execution> executionList = ActivitiUtil.getRuntimeService()
.createExecutionQuery()
.signalEventSubscriptionName(signalName)
.list();
for (Execution execution : executionList) {
if (execution.getProcessInstanceId().equals(processInstanceId)) {
if (variables.size() > 0) {
ActivitiUtil.getRuntimeService().signalEventReceived(signalName, execution.getId(), variables);
} else {
ActivitiUtil.getRuntimeService().signalEventReceived(signalName, execution.getId());
}
}
}
// set up and return response message
responseJSON.put("success", true);
return responseJSON;
} catch (Exception e) {
throw new ActivitiException("Failed to signal receive task for process instance id " + processInstanceId, e);
}
}
}