1. 背景
Activiti Modeler有个功能可以将已经部署的流程重新转化为可编辑模型,感觉这个功能还是很有实用价值的,百度后发现没有人整合过,所以自己看了源码,做了整合,下面分享给大家。
2. 代码分享
package com.ssm.service.manager;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.ssm.common.ImpoerModelUtil;
import com.ssm.mapper.activiti.manager.ProcessManagerMapper;
import com.ssm.vo.activiti.manager.ProcessDefineModel;
import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Model;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.InputStream;
import java.util.List;
@Service
public class ProcessManagerService {
@Resource
private ProcessManagerMapper processManagerMapper;
@Resource
private RepositoryService repositoryService;
@Resource
private ProcessEngine processEngine;
@Resource
private ObjectMapper objectMapper;
@Resource
private ImpoerModelUtil impoerModelUtil;
/**
* 流程转化为可编辑模型
*
* @param processDefineModel
*/
public String changeProcessToModel(ProcessDefineModel processDefineModel) {
Model modelData = repositoryService.newModel();
// 初始化Model
ObjectNode modelObjectNode = objectMapper.createObjectNode();
modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME, processDefineModel.getName());
modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);
modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, processDefineModel.getDescription());
modelData.setMetaInfo(modelObjectNode.toString());
modelData.setName(processDefineModel.getName());
modelData.setKey(processDefineModel.getKey());
// 保存模型
repositoryService.saveModel(modelData);
String deploymentId = processDefineModel.getDeploymentId();
String processDefineResourceName = null;
// 通过deploymentId取得某个部署的资源的名称
List<String> resourceNames = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId);
if (resourceNames != null && resourceNames.size() > 0) {
for (String temp : resourceNames) {
if (temp.indexOf(".xml") > 0) {
processDefineResourceName = temp;
}
}
}
/*
* 读取资源
* deploymentId:部署的id
* resourceName:资源的文件名
*/
InputStream bpmnStream = processEngine.getRepositoryService()
.getResourceAsStream(deploymentId, processDefineResourceName);
impoerModelUtil.creatModelByImpoutStream(bpmnStream, modelData.getId());
return modelData.getId();
}
/**
* 删除部署流程(单个删除与批量删除)
*
* @param deploymentIds :被删除部署流程ID
* @param deleteFlag : 是否级联删除,1.true级联删除;2.false非级联删除
*/
public void deleteProcessDeployments(String deploymentIds, boolean deleteFlag) {
String[] deploymentIdArray = deploymentIds.split(",");
for (String deploymentId : deploymentIdArray) {
if (StringUtils.isNotEmpty(deploymentId)) {
processEngine.getRepositoryService().deleteDeployment(deploymentId, deleteFlag);
}
}
}
}
package com.ssm.common;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.editor.language.json.converter.BpmnJsonConverter;
import org.activiti.engine.RepositoryService;
import org.activiti.explorer.util.XmlUtil;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
@Component
public class ImpoerModelUtil {
@Resource
private RepositoryService repositoryService;
/**
* 创建Model二进制信息
*
* @param bpmnStream
* @param ModelID
*/
public void creatModelByImpoutStream(InputStream bpmnStream, String ModelID) {
XMLInputFactory xif;
InputStreamReader in = null;
XMLStreamReader xtr = null;
try {
xif = XmlUtil.createSafeXmlInputFactory();
in = new InputStreamReader(bpmnStream, "UTF-8");
xtr = xif.createXMLStreamReader(in);
BpmnModel bpmnModel = (new BpmnXMLConverter()).convertToBpmnModel(xtr);
ObjectNode modelNode = new BpmnJsonConverter().convertToJson(bpmnModel);
repositoryService.addModelEditorSource(ModelID, modelNode.toString().getBytes("utf-8"));
} catch (XMLStreamException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} finally {
if (xtr != null) {
try {
xtr.close();
} catch (XMLStreamException e) {
e.printStackTrace();
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bpmnStream != null) {
try {
bpmnStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3. 效果展示