package org.jeecg.modules.activiti.controller; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.activiti.engine.ActivitiException; import org.activiti.engine.RepositoryService; 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.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.nio.charset.StandardCharsets; /** * 模型控制 * * @author len * @date 2019/06/13 */ @RestController @RequestMapping("/service") public class ServiceController { @Autowired ObjectMapper objectMapper; @Autowired private RepositoryService repositoryService; /** * stencilset * * @return stencilset.json */ @RequestMapping(value="/editor/stencilset", method = RequestMethod.GET, produces = "application/json;charset=utf-8") public String getStencilset() { InputStream stencilsetStream = this.getClass().getResourceAsStream("/static/stencilset.json"); try { return IOUtils.toString(stencilsetStream, "utf-8"); } catch (Exception e) { throw new ActivitiException("Error while loading stencil set", e); } } /** * 模型详情 * * @param modelId * @return */ @RequestMapping(value="/model/{modelId}/json", method = RequestMethod.GET) public ObjectNode getEditorJson(@PathVariable String modelId) { ObjectNode modelNode = null; Model model = repositoryService.getModel(modelId); if (model != null) { try { if (StringUtils.isNotEmpty(model.getMetaInfo())) { modelNode = (ObjectNode)objectMapper.readTree(model.getMetaInfo()); } else { modelNode = objectMapper.createObjectNode(); modelNode.put("name", model.getName()); } modelNode.put("modelId", model.getId()); ObjectNode editorJsonNode = (ObjectNode)objectMapper .readTree(new String(repositoryService.getModelEditorSource(model.getId()), "utf-8")); modelNode.set("model", editorJsonNode); } catch (Exception e) { throw new ActivitiException("Error creating model JSON", e); } } return modelNode; } /** * 保存 * * @param modelId * @param name * @param jsonXml * @param svgXml * @param description */ @RequestMapping(value = "/model/{modelId}/save", method=RequestMethod.PUT) public void saveModel(@PathVariable String modelId, @RequestParam("name") String name, @RequestParam("json_xml") String jsonXml, @RequestParam("svg_xml") String svgXml, @RequestParam("description") String description,HttpServletRequest req) { try { String tenantId = req.getHeader("tenant-id"); Model model = repositoryService.getModel(modelId); ObjectNode modelJson = (ObjectNode)objectMapper.readTree(model.getMetaInfo()); modelJson.put("name", name); modelJson.put("description", description); model.setMetaInfo(modelJson.toString()); model.setName(name); model.setVersion(model.getVersion()+1); model.setTenantId(tenantId); repositoryService.saveModel(model); repositoryService.addModelEditorSource(model.getId(), jsonXml.getBytes(StandardCharsets.UTF_8)); InputStream svgStream = new ByteArrayInputStream(svgXml.getBytes(StandardCharsets.UTF_8)); TranscoderInput input = new TranscoderInput(svgStream); PNGTranscoder transcoder = new PNGTranscoder(); ByteArrayOutputStream outStream = new ByteArrayOutputStream(); TranscoderOutput output = new TranscoderOutput(outStream); transcoder.transcode(input, output); final byte[] result = outStream.toByteArray(); repositoryService.addModelEditorSourceExtra(model.getId(), result); outStream.close(); } catch (Exception e) { throw new ActivitiException("Error saving model", e); } } }