david-PC\david
2018-06-12 f240ac3ccd37c541cab2c21cfc433d3510999a3c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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();
        repositoryService.createProcessDefinitionQuery().latestVersion().processDefinitionId(processInstance.getProcessDefinitionId()).singleResult();
 
        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;
    }
 
}