package com.highdatas.mdm.service.act.impl; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.highdatas.mdm.process.canvas.ProcessDiagramGenerator; import lombok.extern.slf4j.Slf4j; import org.activiti.bpmn.converter.BpmnXMLConverter; import org.activiti.bpmn.model.BpmnModel; import org.activiti.editor.constants.ModelDataJsonConstants; import org.activiti.editor.language.json.converter.BpmnJsonConverter; import org.activiti.engine.ActivitiException; import org.activiti.engine.HistoryService; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.Model; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.image.PNGTranscoder; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import java.io.*; import java.util.HashMap; import java.util.Map; import java.util.Set; @Slf4j @Service public class RepositoryServiceImpl extends BaseServiceImpl implements com.highdatas.mdm.service.act.RepositoryService{ private static final String MODEL_NAME = "name"; private static final String MODEL_REVISION = "revision"; private static final String MODEL_DESCRIPTION = "description"; @Autowired RepositoryService service; @Autowired HistoryService historyService; @Autowired ObjectMapper objectMapper; @Value("${img.url}") String basePath; //download /** * * @description: 通过model获取流程图片 * @param modelId model的id * @return: 图片的流 * */ @Override public InputStream getModelImg(String modelId) { InputStream resource = null; try{ Model model = service.createModelQuery().modelId(modelId).singleResult(); JsonNode editorNode = new ObjectMapper().readTree(service.getModelEditorSource(model.getId())); BpmnJsonConverter jsonConverter = new BpmnJsonConverter(); BpmnModel bpmnModel = jsonConverter.convertToBpmnModel(editorNode); ProcessDiagramGenerator diagramGenerator = new ProcessDiagramGenerator(); resource = diagramGenerator.generateDiagram(bpmnModel, "png",null,null, "宋体","宋体" ,null, null,0); return resource; } catch (Exception e) { e.printStackTrace(); return null; } finally { if (resource != null) { try { resource.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * * @description: 删除model * @param modelId model的id * @return: 是否删除 * */ @Override public boolean deleteModel(String modelId) { try { Model model = service.getModel(modelId); String deploymentId = model.getDeploymentId(); if (deploymentId != null) { //TODO service.deleteDeployment(deploymentId,true); } service.deleteModel(modelId); return true; //resultPool.addValue("delete model successful"); } catch (Exception e) { e.printStackTrace(); log.debug("delete model failed"); return false; } } /** * * @description: 通过id获取model * @param modelId model的id * @return: model 对象 * */ public Model getModel(String modelId) { Model model = service.getModel(modelId); ObjectNode modelNode; if (model != null) { try { if (StringUtils.isNotEmpty(model.getMetaInfo())) { modelNode = (ObjectNode) objectMapper.readTree(model.getMetaInfo()); } else { modelNode = objectMapper.createObjectNode(); modelNode.put(ModelDataJsonConstants.MODEL_NAME, model.getName()); } modelNode.put(ModelDataJsonConstants.MODEL_ID, model.getId()); ObjectNode editorJsonNode = (ObjectNode) objectMapper.readTree(new String(service.getModelEditorSource(model.getId()), "utf-8")); modelNode.put("model", editorJsonNode); // resultPool.addValue("name",model.getName()); // resultPool.addValue("description", model.getMetaInfo()); // resultPool.addValue("modelId", modelId); // resultPool.addJson("model", editorJsonNode.toString()); } catch (Exception e) { log.error("Error creating model JSON", e); throw new ActivitiException("Error creating model JSON", e); } } return model; } /** * * @description: 保存/更新model对象 * @param modelId model的id * @param request 请求对象 * @return: 是否保存成功 * */ public boolean saveModel(String modelId, HttpServletRequest request) { HashMap hashMap = new HashMap(); StringBuilder builder = new StringBuilder(); FileOutputStream fileOutputStream2 = null; ByteArrayOutputStream outStream = null; FileOutputStream fileOutputStream = null; try { //1.1 request.setCharacterEncoding("utf-8"); Map parameterMap = request.getParameterMap(); Set keys = parameterMap.keySet(); for (String key : keys) { String[] strings = parameterMap.get(key); for (String string : strings) { builder.append(string); } hashMap.put(key, builder.toString()); builder.setLength(0); } String jsonXmlString = hashMap.get("json_xml"); jsonXmlString = jsonXmlString.replaceAll("\\+\\+", "&&"); hashMap.put("json_xml", jsonXmlString); Model model = service.getModel(modelId); Integer version = model.getVersion(); String key = model.getKey(); //1.2 add new model version++ Model newModel = service.newModel(); ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo()); modelJson.put(MODEL_NAME, hashMap.get("name")); modelJson.put(MODEL_DESCRIPTION, hashMap.get("description")); modelJson.put(MODEL_REVISION, (version + 1)); newModel.setMetaInfo(modelJson.toString()); newModel.setVersion((version + 1)); newModel.setName(hashMap.get("name")); newModel.setKey(key); //1.3 ObjectNode modelNode = (ObjectNode) new ObjectMapper().readTree(hashMap.get("json_xml").getBytes("utf-8")); BpmnModel bpmnModel = new BpmnJsonConverter().convertToBpmnModel(modelNode); if (bpmnModel.getProcesses().size() == 0) { return false; } byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(bpmnModel); String processName = newModel.getName()+ ".bpmn20.xml"; Deployment deployment = service.createDeployment().name(newModel.getName()).addString(processName,new String(bpmnBytes,"UTF-8")).deploy(); newModel.setDeploymentId(deployment.getId()); newModel.setCategory(deployment.getId()); service.saveModel(newModel); //1.4 service.addModelEditorSource(newModel.getId(), hashMap.get("json_xml").getBytes("utf-8")); InputStream svgStream = new ByteArrayInputStream(hashMap.get("svg_xml").getBytes("utf-8")); TranscoderInput input = new TranscoderInput(svgStream); PNGTranscoder transcoder = new PNGTranscoder(); outStream = new ByteArrayOutputStream(); TranscoderOutput output = new TranscoderOutput(outStream); transcoder.transcode(input, output); final byte[] result = outStream.toByteArray(); service.addModelEditorSourceExtra(newModel.getId(), result); String newModelId = newModel.getId(); //TODO dir 2. String path = basePath + newModelId; File dir = new File(path); if (!dir.exists()) { dir.mkdirs(); } //2.1 save model xml to server File file = new File(path,newModelId + ".bpmn20.xml"); if (file.exists()) { file.delete(); } log.info(file.getAbsolutePath()); file.createNewFile(); fileOutputStream2 = new FileOutputStream(file); fileOutputStream2.write(bpmnBytes); //2.2 save model png to server fileOutputStream = new FileOutputStream(new File(path,newModelId + ".png")); InputStream svgs = new ByteArrayInputStream(hashMap.get("svg_xml").getBytes("utf-8")); TranscoderInput inputs = new TranscoderInput(svgs); TranscoderOutput outputs = new TranscoderOutput(fileOutputStream); transcoder.transcode(inputs, outputs); fileOutputStream.flush(); return true; } catch (Exception e) { log.error("Error saving model", e); return false; } finally { try { if (fileOutputStream != null) { fileOutputStream.close(); } if (fileOutputStream2 != null) { fileOutputStream2.close(); } if (outStream != null) { outStream.close(); } } catch (IOException e) { log.error("Error close ioStream ", e); e.printStackTrace(); return false; } } } }