package process.service;
|
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.io.OutputStream;
|
import java.util.List;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import org.activiti.bpmn.model.BpmnModel;
|
import org.activiti.engine.ProcessEngineConfiguration;
|
import org.activiti.engine.repository.ProcessDefinition;
|
import org.activiti.engine.runtime.ProcessInstance;
|
import org.activiti.engine.runtime.ProcessInstanceQuery;
|
import org.activiti.image.ProcessDiagramGenerator;
|
|
import process.EngineLoader;
|
import process.service.writer.ProcessInstanceWriter;
|
import foundation.callable.Callable;
|
|
|
public class RuntimeService extends Service {
|
|
private org.activiti.engine.RuntimeService service;
|
private org.activiti.engine.RepositoryService repositoryService;
|
private HttpServletRequest request;
|
|
public RuntimeService(Callable context) throws Exception {
|
super(context);
|
request = context.getRequest();
|
service = processEngine.getRuntimeService();
|
repositoryService = processEngine.getRepositoryService();
|
}
|
|
@Override
|
public void call(String operator) throws Exception {
|
if ("getList".equalsIgnoreCase(operator)) {
|
getList();
|
}
|
else if ("startProcess".equalsIgnoreCase(operator)) {
|
startProcess();
|
}
|
else if ("suspendProcess".equalsIgnoreCase(operator)) {
|
suspendProcess();
|
}
|
else if ("activateProcess".equalsIgnoreCase(operator)) {
|
activateProcess();
|
}
|
else if ("getDiagram".equalsIgnoreCase(operator)) {
|
getDiagram();
|
}
|
}
|
|
private void getList() {
|
ProcessInstanceQuery query = service.createProcessInstanceQuery();
|
List<ProcessInstance> instanceList = query.list();
|
resultPool.addValue(null, instanceList, new ProcessInstanceWriter());
|
}
|
|
private void startProcess() {
|
String processId = getProcessId();
|
ProcessInstance process = service.startProcessInstanceById(processId);
|
}
|
|
private void suspendProcess() {
|
String processId = getProcessId();
|
service.suspendProcessInstanceById(processId);
|
}
|
|
private void activateProcess() {
|
String processId = getProcessId();
|
service.activateProcessInstanceById(processId);
|
}
|
|
private void getDiagram() throws IOException {
|
String executionId = request.getParameter("executionId");
|
ProcessInstance processInstance = service.createProcessInstanceQuery().processInstanceId(executionId).singleResult();
|
ProcessDefinition processDefination = repositoryService.createProcessDefinitionQuery().latestVersion().processDefinitionId(processInstance.getProcessDefinitionId()).singleResult();
|
ProcessDefinition processDefination = repositoryService.getProcessDefinition(processInstance.getProcessDefinitionId());
|
|
if (processDefination == null) {
|
error("execution not exists: " + executionId);
|
return;
|
}
|
List<String> activeActivityIds = service.getActiveActivityIds(executionId);
|
ProcessEngineConfiguration engineConfiguration = EngineLoader.engineConfiguration;
|
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefination.getId());
|
|
ProcessDiagramGenerator diagramGenerator = engineConfiguration.getProcessDiagramGenerator();
|
InputStream resource = diagramGenerator.generateDiagram(bpmnModel, "png",activeActivityIds,activeActivityIds, "宋体","宋体" ,null, 0);
|
try {
|
response.setHeader("Content-Type", "image/png");
|
OutputStream outputStream = response.getOutputStream();
|
byte[] b = new byte[1024];
|
int len;
|
while ((len = resource.read(b, 0, 1024)) != -1) {
|
outputStream.write(b, 0, len);
|
}
|
}
|
finally {
|
resource.close();
|
}
|
}
|
|
private ProcessInstance getProcessInstance(String id) {
|
ProcessInstanceQuery query = service.createProcessInstanceQuery();
|
ProcessInstance processInstance = query.processInstanceId(id).singleResult();
|
return processInstance;
|
}
|
|
}
|