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.common.util.layui.LayuiUnit; import com.ssm.mapper.activiti.manager.ProcessManagerMapper; import com.ssm.vo.activiti.manager.BaseManagerQueryVo; 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(); } } } } } |