顺便说一下:
var KISBPM = KISBPM || {}; KISBPM.URL = { getModel: function(modelId) { return ACTIVITI.CONFIG.contextRoot + '/model/' + modelId + '/json'; }, getStencilSet: function() { return ACTIVITI.CONFIG.contextRoot + '/editor/stencilset?version=' + Date.now(); }, putModel: function(modelId) { return ACTIVITI.CONFIG.contextRoot + '/model/' + modelId + '/save'; } };
从上面,我们可以看到3个接口getModel、getStencilSet和putModel。
其中ACTIVITI.CONFIG.contextRoot的值,在editor-app/app-cfg.js文件中定义:
'use strict'; var ACTIVITI = ACTIVITI || {}; ACTIVITI.CONFIG = { 'contextRoot' : '/activiti-explorer/service', };
其实有现成的已实现,我们只需要添加activiti-modeler依赖。并将activiti-modeler-5.22.0-sources.jar并解压,将其中的三个类拷到项目中:
pom.xml中添加依赖:
org.activiti activiti-modeler ${activiti.version}
/* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.activiti.rest.editor.model; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import org.activiti.editor.constants.ModelDataJsonConstants; 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.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; /** * @author Tijs Rademakers */ @RestController public class ModelSaveRestResource implements ModelDataJsonConstants { protected static final Logger LOGGER = LoggerFactory.getLogger(ModelSaveRestResource.class); @Autowired private RepositoryService repositoryService; @Autowired private ObjectMapper objectMapper; @RequestMapping(value="/model/{modelId}/save", method = RequestMethod.PUT) @ResponseStatus(value = HttpStatus.OK) public void saveModel(@PathVariable String modelId, @RequestBody MultiValueMap values) { try { Model model = repositoryService.getModel(modelId); ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo()); modelJson.put(MODEL_NAME, values.getFirst("name")); modelJson.put(MODEL_DESCRIPTION, values.getFirst("description")); model.setMetaInfo(modelJson.toString()); model.setName(values.getFirst("name")); repositoryService.saveModel(model); repositoryService.addModelEditorSource(model.getId(), values.getFirst("json_xml").getBytes("utf-8")); InputStream svgStream = new ByteArrayInputStream(values.getFirst("svg_xml").getBytes("utf-8")); TranscoderInput input = new TranscoderInput(svgStream); PNGTranscoder transcoder = new PNGTranscoder(); // Setup output ByteArrayOutputStream outStream = new ByteArrayOutputStream(); TranscoderOutput output = new TranscoderOutput(outStream); // Do the transformation transcoder.transcode(input, output); final byte[] result = outStream.toByteArray(); repositoryService.addModelEditorSourceExtra(model.getId(), result); outStream.close(); } catch (Exception e) { LOGGER.error("Error saving model", e); throw new ActivitiException("Error saving model", e); } } }
/* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.activiti.rest.editor.model; import org.activiti.editor.constants.ModelDataJsonConstants; import org.activiti.engine.ActivitiException; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Model; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; /** * @author Tijs Rademakers */ @RestController public class ModelEditorJsonRestResource implements ModelDataJsonConstants { protected static final Logger LOGGER = LoggerFactory.getLogger(ModelEditorJsonRestResource.class); @Autowired private RepositoryService repositoryService; @Autowired private ObjectMapper objectMapper; @RequestMapping(value="/model/{modelId}/json", method = RequestMethod.GET, produces = "application/json") 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(MODEL_NAME, model.getName()); } modelNode.put(MODEL_ID, model.getId()); ObjectNode editorJsonNode = (ObjectNode) objectMapper.readTree( new String(repositoryService.getModelEditorSource(model.getId()), "utf-8")); modelNode.put("model", editorJsonNode); } catch (Exception e) { LOGGER.error("Error creating model JSON", e); throw new ActivitiException("Error creating model JSON", e); } } return modelNode; } }
/* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.activiti.rest.editor.main; import java.io.InputStream; import org.activiti.engine.ActivitiException; import org.apache.commons.io.IOUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; /** * @author Tijs Rademakers */ @RestController public class StencilsetRestResource { @RequestMapping(value="/editor/stencilset", method = RequestMethod.GET, produces = "application/json;charset=utf-8") public @ResponseBody String getStencilset() { InputStream stencilsetStream = this.getClass().getClassLoader().getResourceAsStream("stencilset.json"); try { return IOUtils.toString(stencilsetStream, "utf-8"); } catch (Exception e) { throw new ActivitiException("Error while loading stencil set", e); } } }
package xpl.study.activiti.controller; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.activiti.editor.constants.ModelDataJsonConstants; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Model; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @RestController @RequestMapping("/model") public class ModelController { @Autowired private RepositoryService repositoryService; @Autowired private ObjectMapper objectMapper; /** * 创建模型后,打开流程设计器 * @param request * @param response */ @GetMapping("/create") public void create(HttpServletRequest request, HttpServletResponse response) { try { //初始化一个空模型 Model model = repositoryService.newModel(); //设置一些默认信息 String name = request.getParameter("name"); String description = request.getParameter("description"); String key = request.getParameter("key"); if (name == null || name == ""){ name = ""; } if (description == null || description == ""){ description = ""; } if (key == null || key == ""){ key = ""; } ObjectNode modelNode = objectMapper.createObjectNode(); modelNode.put(ModelDataJsonConstants.MODEL_NAME, name); modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description); modelNode.put(ModelDataJsonConstants.MODEL_REVISION, 1); model.setName(name); model.setKey(key); model.setMetaInfo(modelNode.toString()); // 保存模型 repositoryService.saveModel(model); String id = model.getId(); //完善ModelEditorSource ObjectNode editorNode = objectMapper.createObjectNode(); editorNode.put("id", "canvas"); editorNode.put("resourceId", "canvas"); // 属性 ObjectNode propertiesNode = objectMapper.createObjectNode(); propertiesNode.put("process_id", model.getKey()); propertiesNode.put("name", model.getName()); editorNode.set("properties", propertiesNode); // 模板 ObjectNode stencilSetNode = objectMapper.createObjectNode(); stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#"); editorNode.put("stencilset", stencilSetNode); //添加模型编辑器资源 act_ge_bytearray表会新增一条数据 repositoryService.addModelEditorSource(id, editorNode.toString().getBytes("utf-8")); // 重定向到设计器界面 response.sendRedirect(request.getContextPath() + "/modeler.html?modelId=" + id); } catch (IOException e) { e.printStackTrace(); } } }
项目启动后,报错[processes/]不存在。
class path resource [processes/] cannot be resolved to URL because it does not exist。两种处理方法
(1)在resource目录下添加processes文件夹,并且文件夹不能为空
(2)在application.properties下家配置
#启动报错class path resource [processes/] cannot be resolved to URL because it does not exist
spring.activiti.check-process-definitions=false
启动时不检查流程文件。我这里添加个one-taskprocess.bpmn20.xml文件。
浏览器输入地址:http://localhost:8080/model/create 访问。结果如下图:
发现创建模型成功了,并重定向了。但是页面一片空白。按F12刷新,查看Network可以看到如下404错误。
一是/activiti-explorer/service这个路径与我们项目不符合,所以需要修改editor-app/app-cfg.js。
ACTIVITI.CONFIG = { //'contextRoot' : '/activiti-explorer/service', 'contextRoot' : '', };
二是这个是由于新增的那3个接口没有扫描加载到spring容器管理,需要在启动类的上添加@ComponentScan注解。
package xpl.study.activiti; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @ComponentScan({"xpl.study.activiti","org.activiti.rest"}) @SpringBootApplication(exclude = { org.activiti.spring.boot.SecurityAutoConfiguration.class, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class }) public class StudyActivitiApplication { public static void main(String[] args) { SpringApplication.run(StudyActivitiApplication.class, args); } }
重启后,再次创建模型访问,发现还是报错:
这个是StencilsetRestResource获取stencilset.json文件失败导致的,这个文件一下忘记在哪里获取的了,目前有一个汉化版本的,将这个文件放入resources下面就可以了:
{ "title" : "流程编辑器", "namespace" : "http://b3mn.org/stencilset/bpmn2.0#", "description" : "BPMN流程编辑器", "propertyPackages" : [ { "name" : "process_idpackage", "properties" : [ { "id" : "process_id", "type" : "String", "title" : "流程标识", "value" : "process", "description" : "Unique identifier of the process definition.", "popular" : true } ] }, { "name" : "overrideidpackage", "properties" : [ { "id" : "overrideid", "type" : "String", "title" : "主键(ID)", "value" : "", "description" : "流程唯一标识.", "popular" : true } ] }, { "name" : "namepackage", "properties" : [ { "id" : "name", "type" : "String", "title" : "名称", "value" : "", "description" : "BPMN元素名称.", "popular" : true, "refToView" : "text_name" } ] }, { "name" : "documentationpackage", "properties" : [ { "id" : "documentation", "type" : "Text", "title" : "描述信息", "value" : "", "description" : "BPMN元素描述.", "popular" : true } ] }, { "name" : "process_authorpackage", "properties" : [ { "id" : "process_author", "type" : "String", "title" : "流程作者", "value" : "", "description" : "流程定义者姓名.", "popular" : true } ] }, { "name" : "process_versionpackage", "properties" : [ { "id" : "process_version", "type" : "String", "title" : "流程版本", "value" : "", "description" : "标识文档版本为目的.", "popular" : true } ] }, { "name" : "process_namespacepackage", "properties" : [ { "id" : "process_namespace", "type" : "String", "title" : "目标名称空间", "value" : "http://www.activiti.org/processdef", "description" : "工作流目标命名空间.", "popular" : true } ] }, { "name" : "asynchronousdefinitionpackage", "properties" : [ { "id" : "asynchronousdefinition", "type" : "Boolean", "title" : "异步", "value" : "false", "description" : "定义为一个异步任务.", "popular" : true } ] }, { "name" : "exclusivedefinitionpackage", "properties" : [ { "id" : "exclusivedefinition", "type" : "Boolean", "title" : "互斥任务", "value" : "false", "description" : "定义为一个互斥任务.", "popular" : true } ] }, { "name" : "executionlistenerspackage", "properties" : [ { "id" : "executionlisteners", "type" : "multiplecomplex", "title" : "执行监听器", "value" : "", "description" : "Listeners for an activity, process, sequence flow, start and end event.", "popular" : true } ] }, { "name" : "tasklistenerspackage", "properties" : [ { "id" : "tasklisteners", "type" : "multiplecomplex", "title" : "任务监听器", "value" : "", "description" : "监听用户任务.", "popular" : true } ] }, { "name" : "eventlistenerspackage", "properties" : [ { "id" : "eventlisteners", "type" : "multiplecomplex", "title" : "事件监听器", "value" : "", "description" : "Listeners for any event happening in the Activiti Engine. It's also possible to rethrow the event as a signal, message or error event", "popular" : true } ] }, { "name" : "usertaskassignmentpackage", "properties" : [ { "id" : "usertaskassignment", "type" : "Complex", "title" : "分配用户", "value" : "", "description" : "分配任务给用户", "popular" : true } ] }, { "name" : "formpropertiespackage", "properties" : [ { "id" : "formproperties", "type" : "Complex", "title" : "表单属性", "value" : "", "description" : "定义表单属性", "popular" : true } ] }, { "name" : "formkeydefinitionpackage", "properties" : [ { "id" : "formkeydefinition", "type" : "String", "title" : "表单编号", "value" : "", "description" : "用户任务表单编号.", "popular" : true } ] }, { "name" : "duedatedefinitionpackage", "properties" : [ { "id" : "duedatedefinition", "type" : "String", "title" : "到期时间", "value" : "", "description" : "用户任务到期时间.", "popular" : true } ] }, { "name" : "prioritydefinitionpackage", "properties" : [ { "id" : "prioritydefinition", "type" : "String", "title" : "优先级", "value" : "", "description" : "用户任务的优先级.", "popular" : true } ] }, { "name" : "servicetaskclasspackage", "properties" : [ { "id" : "servicetaskclass", "type" : "String", "title" : "类", "value" : "", "description" : "Class that implements the service task logic.", "popular" : true } ] }, { "name" : "servicetaskexpressionpackage", "properties" : [ { "id" : "servicetaskexpression", "type" : "String", "title" : "表达式", "value" : "", "description" : "服务任务 logic defined with an expression.", "popular" : true } ] }, { "name" : "servicetaskdelegateexpressionpackage", "properties" : [ { "id" : "servicetaskdelegateexpression", "type" : "String", "title" : "委托表达式", "value" : "", "description" : "服务任务 logic defined with a delegate expression.", "popular" : true } ] }, { "name" : "servicetaskfieldspackage", "properties" : [ { "id" : "servicetaskfields", "type" : "Complex", "title" : "类字段", "value" : "", "description" : "Field extensions", "popular" : true } ] }, { "name" : "servicetaskresultvariablepackage", "properties" : [ { "id" : "servicetaskresultvariable", "type" : "String", "title" : "结果变量名", "value" : "", "description" : "Process variable name to store the service task result.", "popular" : true } ] }, { "name" : "scriptformatpackage", "properties" : [ { "id" : "scriptformat", "type" : "String", "title" : "脚本格式", "value" : "", "description" : "Script format of the script task.", "popular" : true } ] }, { "name" : "scripttextpackage", "properties" : [ { "id" : "scripttext", "type" : "Text", "title" : "脚本", "value" : "", "description" : "Script text of the script task.", "popular" : true } ] }, { "name" : "ruletask_rulespackage", "properties" : [ { "id" : "ruletask_rules", "type" : "String", "title" : "规则", "value" : "", "description" : "Rules of the rule task.", "popular" : true } ] }, { "name" : "ruletask_variables_inputpackage", "properties" : [ { "id" : "ruletask_variables_input", "type" : "String", "title" : "输入变量", "value" : "", "description" : "Input variables of the rule task.", "popular" : true } ] }, { "name" : "ruletask_excludepackage", "properties" : [ { "id" : "ruletask_exclude", "type" : "Boolean", "title" : "排除", "value" : "false", "description" : "Use the rules property as exclusion.", "popular" : true } ] }, { "name" : "ruletask_resultpackage", "properties" : [ { "id" : "ruletask_result", "type" : "String", "title" : "结果变量", "value" : "", "description" : "Result variable of the rule task.", "popular" : true } ] }, { "name" : "mailtasktopackage", "properties" : [ { "id" : "mailtaskto", "type" : "Text", "title" : "至", "value" : "", "description" : "The recipients if the e-mail. Multiple recipients are defined in a comma-separated list.", "popular" : true } ] }, { "name" : "mailtaskfrompackage", "properties" : [ { "id" : "mailtaskfrom", "type" : "Text", "title" : "表单", "value" : "", "description" : "The sender e-mail address. If not provided, the default configured from address is used.", "popular" : true } ] }, { "name" : "mailtasksubjectpackage", "properties" : [ { "id" : "mailtasksubject", "type" : "Text", "title" : "主题", "value" : "", "description" : "The subject of the e-mail.", "popular" : true } ] }, { "name" : "mailtaskccpackage", "properties" : [ { "id" : "mailtaskcc", "type" : "Text", "title" : "抄送", "value" : "", "description" : "The cc's of the e-mail. Multiple recipients are defined in a comma-separated list", "popular" : true } ] }, { "name" : "mailtaskbccpackage", "properties" : [ { "id" : "mailtaskbcc", "type" : "Text", "title" : "隐藏抄送", "value" : "", "description" : "The bcc's of the e-mail. Multiple recipients are defined in a comma-separated list", "popular" : true } ] }, { "name" : "mailtasktextpackage", "properties" : [ { "id" : "mailtasktext", "type" : "Text", "title" : "文本", "value" : "", "description" : "The content of the e-mail, in case one needs to send plain none-rich e-mails. Can be used in combination with html, for e-mail clients that don't support rich content. The client will then fall back to this text-only alternative.", "popular" : true } ] }, { "name" : "mailtaskhtmlpackage", "properties" : [ { "id" : "mailtaskhtml", "type" : "Text", "title" : "Html", "value" : "", "description" : "A piece of HTML that is the content of the e-mail.", "popular" : true } ] }, { "name" : "mailtaskcharsetpackage", "properties" : [ { "id" : "mailtaskcharset", "type" : "String", "title" : "字符集(编码格式)", "value" : "", "description" : "修改邮件字符集,是许多除英语之外的语言所必须的. ", "popular" : true } ] }, { "name" : "callactivitycalledelementpackage", "properties" : [ { "id" : "callactivitycalledelement", "type" : "String", "title" : "调用元素", "value" : "", "description" : "流程引用.", "popular" : true } ] }, { "name" : "callactivityinparameterspackage", "properties" : [ { "id" : "callactivityinparameters", "type" : "Complex", "title" : "输入参数", "value" : "", "description" : "Definition of the input parameters", "popular" : true } ] }, { "name" : "callactivityoutparameterspackage", "properties" : [ { "id" : "callactivityoutparameters", "type" : "Complex", "title" : "输出参数", "value" : "", "description" : "Definition of the output parameters", "popular" : true } ] }, { "name" : "cameltaskcamelcontextpackage", "properties" : [ { "id" : "cameltaskcamelcontext", "type" : "String", "title" : "Camel context", "value" : "", "description" : "An optional camel context definition, if left empty the default is used.", "popular" : true } ] }, { "name" : "muletaskendpointurlpackage", "properties" : [ { "id" : "muletaskendpointurl", "type" : "String", "title" : "Endpoint url", "value" : "", "description" : "A required endpoint url to sent the message to Mule.", "popular" : true } ] }, { "name" : "muletasklanguagepackage", "properties" : [ { "id" : "muletasklanguage", "type" : "String", "title" : "语言", "value" : "", "description" : "A required definition for the language to resolve the payload expression, like juel.", "popular" : true } ] }, { "name" : "muletaskpayloadexpressionpackage", "properties" : [ { "id" : "muletaskpayloadexpression", "type" : "String", "title" : "Payload expression", "value" : "", "description" : "A required definition for the payload of the message sent to Mule.", "popular" : true } ] }, { "name" : "muletaskresultvariablepackage", "properties" : [ { "id" : "muletaskresultvariable", "type" : "String", "title" : "Result variable", "value" : "", "description" : "An optional result variable for the payload returned.", "popular" : true } ] }, { "name" : "conditionsequenceflowpackage", "properties" : [ { "id" : "conditionsequenceflow", "type" : "Complex", "title" : "流条件", "value" : "", "description" : "The condition of the sequence flow", "popular" : true } ] }, { "name" : "defaultflowpackage", "properties" : [ { "id" : "defaultflow", "type" : "Boolean", "title" : "默认流", "value" : "false", "description" : "Define the sequence flow as default", "popular" : true, "refToView" : "default" } ] }, { "name" : "conditionalflowpackage", "properties" : [ { "id" : "conditionalflow", "type" : "Boolean", "title" : "条件流", "value" : "false", "description" : "Define the sequence flow with a condition", "popular" : true } ] }, { "name" : "timercycledefinitionpackage", "properties" : [ { "id" : "timercycledefinition", "type" : "String", "title" : "时间周期(e.g. R3/PT10H)", "value" : "", "description" : "Define the timer with a ISO-8601 cycle.", "popular" : true } ] }, { "name" : "timerdatedefinitionpackage", "properties" : [ { "id" : "timerdatedefinition", "type" : "String", "title" : "采用ISO-8601日期时间", "value" : "", "description" : "Define the timer with a ISO-8601 date definition.", "popular" : true } ] }, { "name" : "timerdurationdefinitionpackage", "properties" : [ { "id" : "timerdurationdefinition", "type" : "String", "title" : "持续时间(e.g. PT5M)", "value" : "", "description" : "Define the timer with a ISO-8601 duration.", "popular" : true } ] }, { "name" : "timerenddatedefinitionpackage", "properties" : [ { "id" : "timerenddatedefinition", "type" : "String", "title" : "Time End Date in ISO-8601", "value" : "", "description" : "Define the timer with a ISO-8601 duration.", "popular" : true } ] }, { "name" : "messagerefpackage", "properties" : [ { "id" : "messageref", "type" : "String", "title" : "消息引用", "value" : "", "description" : "Define the message name.", "popular" : true } ] }, { "name" : "signalrefpackage", "properties" : [ { "id" : "signalref", "type" : "String", "title" : "信号引用", "value" : "", "description" : "定义信号名称.", "popular" : true } ] }, { "name" : "errorrefpackage", "properties" : [ { "id" : "errorref", "type" : "String", "title" : "错误引用", "value" : "", "description" : "定义错误名称.", "popular" : true } ] }, { "name" : "cancelactivitypackage", "properties" : [ { "id" : "cancelactivity", "type" : "Boolean", "title" : "取消任务", "value" : "true", "description" : "Should the activity be cancelled", "popular" : true, "refToView" : [ "frame", "frame2" ] } ] }, { "name" : "initiatorpackage", "properties" : [ { "id" : "initiator", "type" : "String", "title" : "启动器", "value" : "", "description" : "Initiator of the process.", "popular" : true } ] }, { "name" : "textpackage", "properties" : [ { "id" : "text", "type" : "String", "title" : "文本", "value" : "", "description" : "The text of the text annotation.", "popular" : true, "refToView" : "text" } ] }, { "name" : "multiinstance_typepackage", "properties" : [ { "id" : "multiinstance_type", "type" : "kisbpm-multiinstance", "title" : "多实例类型", "value" : "None", "description" : "Repeated activity execution (parallel or sequential) can be displayed through different loop types", "popular" : true, "refToView" : "multiinstance" } ] }, { "name" : "multiinstance_cardinalitypackage", "properties" : [ { "id" : "multiinstance_cardinality", "type" : "String", "title" : "基数(多实例)", "value" : "", "description" : "Define the cardinality of multi instance.", "popular" : true } ] }, { "name" : "multiinstance_collectionpackage", "properties" : [ { "id" : "multiinstance_collection", "type" : "String", "title" : "集合(多实例)", "value" : "", "description" : "Define the collection for the multi instance.", "popular" : true } ] }, { "name" : "multiinstance_variablepackage", "properties" : [ { "id" : "multiinstance_variable", "type" : "String", "title" : "元素变量(多实例)", "value" : "", "description" : "Define the element variable for the multi instance.", "popular" : true } ] }, { "name" : "multiinstance_conditionpackage", "properties" : [ { "id" : "multiinstance_condition", "type" : "String", "title" : "完成条件(多实例)", "value" : "", "description" : "Define the completion condition for the multi instance.", "popular" : true } ] }, { "name" : "isforcompensationpackage", "properties" : [ { "id" : "isforcompensation", "type" : "Boolean", "title" : "是否补偿", "value" : "false", "description" : "A flag that identifies whether this activity is intended for the purposes of compensation.", "popular" : true, "refToView" : "compensation" } ] }, { "name" : "sequencefloworderpackage", "properties" : [ { "id" : "sequencefloworder", "type" : "Complex", "title" : "Flow order", "value" : "", "description" : "Order outgoing sequence flows.", "popular" : true } ] }, { "name" : "signaldefinitionspackage", "properties" : [ { "id" : "signaldefinitions", "type" : "multiplecomplex", "title" : "信号定义", "value" : "", "description" : "Signal definitions", "popular" : true } ] }, { "name" : "messagedefinitionspackage", "properties" : [ { "id" : "messagedefinitions", "type" : "multiplecomplex", "title" : "消息定义", "value" : "", "description" : "Message definitions", "popular" : true } ] }, { "name" : "istransactionpackage", "properties" : [ { "id" : "istransaction", "type" : "Boolean", "title" : "Is a transaction sub process", "value" : "false", "description" : "A flag that identifies whether this sub process is of type transaction.", "popular" : true, "refToView" : "border" } ] } ], "stencils" : [ { "type" : "node", "id" : "BPMNDiagram", "title" : "BPMN-Diagram", "description" : "A BPMN 2.0 diagram.", "view" : "\n", "icon" : "diagram.png", "groups" : [ "Diagram" ], "mayBeRoot" : true, "hide" : true, "propertyPackages" : [ "process_idpackage", "namepackage", "documentationpackage", "process_authorpackage", "process_versionpackage", "process_namespacepackage", "executionlistenerspackage", "eventlistenerspackage", "signaldefinitionspackage", "messagedefinitionspackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ ] }, { "type" : "node", "id" : "StartNoneEvent", "title" : "开始事件", "description" : "A start event without a specific trigger", "view" : "\n", "icon" : "startevent/none.png", "groups" : [ "开始事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "initiatorpackage", "formkeydefinitionpackage", "formpropertiespackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "sequence_start", "Startevents_all", "StartEventsMorph", "all" ] }, { "type" : "node", "id" : "StartTimerEvent", "title" : "定时开始事件", "description" : "有定时任务触发器的开始事件", "view" : "\n", "icon" : "startevent/timer.png", "groups" : [ "开始事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "timercycledefinitionpackage", "timerdatedefinitionpackage", "timerdurationdefinitionpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "sequence_start", "Startevents_all", "StartEventsMorph", "all" ] }, { "type" : "node", "id" : "StartSignalEvent", "title" : "信号开始事件", "description" : "有信号触发器的开始事件.", "view" : "\n", "icon" : "startevent/signal.png", "groups" : [ "开始事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "signalrefpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "sequence_start", "Startevents_all", "StartEventsMorph", "all" ] }, { "type" : "node", "id" : "StartMessageEvent", "title" : "消息开始事件", "description" : "有消息触发器的开始事件.", "view" : "\n", "icon" : "startevent/message.png", "groups" : [ "开始事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "messagerefpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "sequence_start", "Startevents_all", "StartEventsMorph", "all" ] }, { "type" : "node", "id" : "StartErrorEvent", "title" : "错误开始事件", "description" : "捕获抛出BMP错误的开始事件.", "view" : "\n", "icon" : "startevent/error.png", "groups" : [ "开始事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "errorrefpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "sequence_start", "Startevents_all", "StartEventsMorph", "all" ] }, { "type" : "node", "id" : "UserTask", "title" : "用户任务", "description" : "由特定用户完成的任务.", "view" : "\n", "icon" : "activity/list/type.user.png", "groups" : [ "任务" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "usertaskassignmentpackage", "formkeydefinitionpackage", "duedatedefinitionpackage", "prioritydefinitionpackage", "formpropertiespackage", "tasklistenerspackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ] }, { "type" : "node", "id" : "ServiceTask", "title" : "服务任务", "description" : "由服务逻辑自动完成的任务.", "view" : "\n", "icon" : "activity/list/type.service.png", "groups" : [ "任务" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "servicetaskclasspackage", "servicetaskexpressionpackage", "servicetaskdelegateexpressionpackage", "servicetaskfieldspackage", "servicetaskresultvariablepackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ] }, { "type" : "node", "id" : "ScriptTask", "title" : "脚本任务", "description" : "由脚本逻辑自动完成的任务.", "view" : "\n", "icon" : "activity/list/type.script.png", "groups" : [ "任务" ], "propertyPackages" : [ "scriptformatpackage", "scripttextpackage", "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ] }, { "type" : "node", "id" : "BusinessRule", "title" : "业务规则任务", "description" : "由规则逻辑自动完成的任务.", "view" : "\n", "icon" : "activity/list/type.business.rule.png", "groups" : [ "任务" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "ruletask_rulespackage", "ruletask_variables_inputpackage", "ruletask_excludepackage", "ruletask_resultpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ] }, { "type" : "node", "id" : "ReceiveTask", "title" : "接收任务", "description" : "等待接收信号的任务.", "view" : "\n", "icon" : "activity/list/type.receive.png", "groups" : [ "任务" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ] }, { "type" : "node", "id" : "ManualTask", "title" : "人工任务", "description" : "无需逻辑自动完成的任务.", "view" : "\n", "icon" : "activity/list/type.manual.png", "groups" : [ "任务" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ] }, { "type" : "node", "id" : "MailTask", "title" : "邮件任务", "description" : "发送邮件通知的任务.", "view" : "\n", "icon" : "activity/list/type.send.png", "groups" : [ "任务" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "mailtasktopackage", "mailtaskfrompackage", "mailtasksubjectpackage", "mailtaskccpackage", "mailtaskbccpackage", "mailtasktextpackage", "mailtaskhtmlpackage", "mailtaskcharsetpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ] }, { "type" : "node", "id" : "CamelTask", "title" : "骆驼任务", "description" : "An task that sends a message to Camel", "view" : "\n", "icon" : "activity/list/type.camel.png", "groups" : [ "任务" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "cameltaskcamelcontextpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ] }, { "type" : "node", "id" : "MuleTask", "title" : "Mule任务", "description" : "An task that sends a message to Mule", "view" : "\n", "icon" : "activity/list/type.mule.png", "groups" : [ "任务" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "muletaskendpointurlpackage", "muletasklanguagepackage", "muletaskpayloadexpressionpackage", "muletaskresultvariablepackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ] }, { "type" : "node", "id" : "SendTask", "title" : "发送任务", "description" : "An task that sends a message", "view" : "\n", "icon" : "activity/list/type.send.png", "groups" : [ "任务" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ] }, { "type" : "node", "id" : "SubProcess", "title" : "子流程", "description" : "子流程范围", "view" : "\n", "icon" : "activity/expanded.subprocess.png", "groups" : [ "结构" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "Activity", "sequence_start", "sequence_end", "all" ] }, { "type" : "node", "id" : "EventSubProcess", "title" : "事件子流程", "description" : "事件周日子流程范围", "view" : "\n", "icon" : "activity/event.subprocess.png", "groups" : [ "结构" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "Activity", "all" ] }, { "type" : "node", "id" : "CallActivity", "title" : "调用活动", "description" : "A call activity", "view" : "\n", "icon" : "activity/task.png", "groups" : [ "结构" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "callactivitycalledelementpackage", "callactivityinparameterspackage", "callactivityoutparameterspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "Activity", "sequence_start", "sequence_end", "all" ] }, { "type" : "node", "id" : "ExclusiveGateway", "title" : "互斥网关", "description" : "一个选择的网关", "view" : "\n\n", "icon" : "gateway/exclusive.databased.png", "groups" : [ "网关" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "sequencefloworderpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "sequence_start", "GatewaysMorph", "sequence_end", "all" ] }, { "type" : "node", "id" : "ParallelGateway", "title" : "并行网关", "description" : "并行处理的网关", "view" : "\n\n", "icon" : "gateway/parallel.png", "groups" : [ "网关" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "sequencefloworderpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "sequence_start", "GatewaysMorph", "sequence_end", "all" ] }, { "type" : "node", "id" : "InclusiveGateway", "title" : "包容性网关", "description" : "An inclusive gateway", "view" : "\n\n", "icon" : "gateway/inclusive.png", "groups" : [ "网关" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "sequencefloworderpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "sequence_start", "GatewaysMorph", "sequence_end", "all" ] }, { "type" : "node", "id" : "EventGateway", "title" : "事件网关", "description" : "An event gateway", "view" : "\n\n", "icon" : "gateway/eventbased.png", "groups" : [ "网关" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "sequencefloworderpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "sequence_start", "GatewaysMorph", "sequence_end", "all" ] }, { "type" : "node", "id" : "BoundaryErrorEvent", "title" : "边界错误事件", "description" : "A boundary event that catches a BPMN error", "view" : "\n", "icon" : "catching/error.png", "groups" : [ "边界事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "errorrefpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "sequence_start", "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary" ] }, { "type" : "node", "id" : "BoundaryTimerEvent", "title" : "边界定时事件", "description" : "A boundary event with a timer trigger", "view" : "\n", "icon" : "catching/timer.png", "groups" : [ "边界事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "timercycledefinitionpackage", "timerdatedefinitionpackage", "timerdurationdefinitionpackage", "cancelactivitypackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "sequence_start", "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary" ] }, { "type" : "node", "id" : "BoundarySignalEvent", "title" : "边界信号事件", "description" : "A boundary event with a signal trigger", "view" : "\n", "icon" : "catching/signal.png", "groups" : [ "边界事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "signalrefpackage", "cancelactivitypackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "sequence_start", "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary" ] }, { "type" : "node", "id" : "BoundaryMessageEvent", "title" : "边界消息事件", "description" : "A boundary event with a message trigger", "view" : "\n", "icon" : "catching/message.png", "groups" : [ "边界事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "messagerefpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "sequence_start", "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary" ] }, { "type" : "node", "id" : "BoundaryCancelEvent", "title" : "边界取消事件", "description" : "A boundary cancel event", "view" : "\n", "icon" : "catching/cancel.png", "groups" : [ "边界事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "sequence_start", "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary" ] }, { "type" : "node", "id" : "边界补偿事件", "title" : "Boundary compensation event", "description" : "A boundary compensation event", "view" : "\n", "icon" : "catching/compensation.png", "groups" : [ "边界事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary", "all" ] }, { "type" : "node", "id" : "CatchTimerEvent", "title" : "中间定时器捕获事件", "description" : "An intermediate catching event with a timer trigger", "view" : "\n", "icon" : "catching/timer.png", "groups" : [ "中间捕捉事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "timercycledefinitionpackage", "timerdatedefinitionpackage", "timerdurationdefinitionpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "sequence_start", "sequence_end", "CatchEventsMorph", "all" ] }, { "type" : "node", "id" : "CatchSignalEvent", "title" : "中间信号捕捉事件", "description" : "An intermediate catching event with a signal trigger", "view" : "\n", "icon" : "catching/signal.png", "groups" : [ "中间捕捉事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "signalrefpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "sequence_start", "sequence_end", "CatchEventsMorph", "all" ] }, { "type" : "node", "id" : "CatchMessageEvent", "title" : "中间消息捕捉事件", "description" : "An intermediate catching event with a message trigger", "view" : "\n", "icon" : "catching/message.png", "groups" : [ "中间捕捉事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "messagerefpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "sequence_start", "sequence_end", "CatchEventsMorph", "all" ] }, { "type" : "node", "id" : "ThrowNoneEvent", "title" : "中间无抛出事件", "description" : "An intermediate event without a specific trigger", "view" : "\n", "icon" : "throwing/none.png", "groups" : [ "中间抛出事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "ThrowEventsMorph", "sequence_start", "sequence_end", "all" ] }, { "type" : "node", "id" : "ThrowSignalEvent", "title" : "中间信号抛出事件", "description" : "An intermediate event with a signal trigger", "view" : "\n", "icon" : "throwing/signal.png", "groups" : [ "中间抛出事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "signalrefpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "ThrowEventsMorph", "sequence_start", "sequence_end", "all" ] }, { "type" : "node", "id" : "EndNoneEvent", "title" : "结束事件", "description" : "An end event without a specific trigger", "view" : "\n", "icon" : "endevent/none.png", "groups" : [ "结束事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "EndEventsMorph", "sequence_end", "all" ] }, { "type" : "node", "id" : "EndErrorEvent", "title" : "结束错误事件", "description" : "An end event that throws an error event", "view" : "\n", "icon" : "endevent/error.png", "groups" : [ "结束事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "errorrefpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "EndEventsMorph", "sequence_end", "all" ] }, { "type" : "node", "id" : "EndCancelEvent", "title" : "结束取消事件", "description" : "A cancel end event", "view" : "\n", "icon" : "endevent/cancel.png", "groups" : [ "结束事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "EndEventsMorph", "sequence_end", "all" ] }, { "type" : "node", "id" : "EndTerminateEvent", "title" : "结束终止事件", "description" : "A terminate end event", "view" : "\n", "icon" : "endevent/terminate.png", "groups" : [ "结束事件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "EndEventsMorph", "sequence_end", "all" ] }, { "type" : "node", "id" : "Pool", "title" : "池", "description" : "A pool to stucture the process definition", "view" : "\n", "icon" : "swimlane/pool.png", "groups" : [ "泳道" ], "layout" : [ { "type" : "layout.bpmn2_0.pool" } ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "process_idpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "canContainArtifacts", "all" ] }, { "type" : "node", "id" : "Lane", "title" : "道", "description" : "A lane to stucture the process definition", "view" : "\n", "icon" : "swimlane/lane.png", "groups" : [ "泳道" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "PoolChild", "canContainArtifacts", "all" ] }, { "type" : "edge", "id" : "SequenceFlow", "title" : "Sequence flow", "description" : "Sequence flow defines the execution order of activities.", "view" : "\r\n", "icon" : "connector/sequenceflow.png", "groups" : [ "链接对象" ], "layout" : [ { "type" : "layout.bpmn2_0.sequenceflow" } ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "conditionsequenceflowpackage", "executionlistenerspackage", "defaultflowpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "ConnectingObjectsMorph", "all" ] }, { "type" : "edge", "id" : "MessageFlow", "title" : "Message flow", "description" : "Message flow to connect elements in different pools.", "view" : "\r\n", "icon" : "connector/messageflow.png", "groups" : [ "链接对象" ], "layout" : [ { "type" : "layout.bpmn2_0.sequenceflow" } ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "ConnectingObjectsMorph", "all" ] }, { "type" : "edge", "id" : "Association", "title" : "Association", "description" : "Associates a text annotation with an element.", "view" : "\r\n", "icon" : "connector/association.undirected.png", "groups" : [ "链接对象" ], "layout" : [ { "type" : "layout.bpmn2_0.sequenceflow" } ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "ConnectingObjectsMorph", "all" ] }, { "type" : "edge", "id" : "DataAssociation", "title" : "DataAssociation", "description" : "Associates a data element with an activity.", "view" : "\r\n", "icon" : "connector/association.unidirectional.png", "groups" : [ "链接对象" ], "layout" : [ { "type" : "layout.bpmn2_0.sequenceflow" } ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "ConnectingObjectsMorph", "all" ] }, { "type" : "node", "id" : "TextAnnotation", "title" : "文本注释", "description" : "Annotates elements with description text.", "view" : "\n", "icon" : "artifact/text.annotation.png", "groups" : [ "组件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "textpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "all" ] }, { "type" : "node", "id" : "DataStore", "title" : "Data store", "description" : "Reference to a data store.", "view" : "\r\n\r\n", "icon" : "dataobject/data.store.png", "groups" : [ "组件" ], "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ], "hiddenPropertyPackages" : [ ], "roles" : [ "all" ] } ], "rules" : { "cardinalityRules" : [ { "role" : "Startevents_all", "incomingEdges" : [ { "role" : "SequenceFlow", "maximum" : 0 } ] }, { "role" : "Endevents_all", "outgoingEdges" : [ { "role" : "SequenceFlow", "maximum" : 0 } ] } ], "connectionRules" : [ { "role" : "SequenceFlow", "connects" : [ { "from" : "sequence_start", "to" : [ "sequence_end" ] } ] }, { "role" : "Association", "connects" : [ { "from" : "sequence_start", "to" : [ "TextAnnotation" ] }, { "from" : "sequence_end", "to" : [ "TextAnnotation" ] }, { "from" : "TextAnnotation", "to" : [ "sequence_end" ] }, { "from" : "BoundaryCompensationEvent", "to" : [ "sequence_end" ] }, { "from" : "TextAnnotation", "to" : [ "sequence_start" ] }, { "from" : "BoundaryCompensationEvent", "to" : [ "sequence_start" ] } ] }, { "role" : "DataAssociation", "connects" : [ { "from" : "sequence_start", "to" : [ "DataStore" ] }, { "from" : "sequence_end", "to" : [ "DataStore" ] }, { "from" : "DataStore", "to" : [ "sequence_end" ] }, { "from" : "DataStore", "to" : [ "sequence_start" ] } ] }, { "role" : "IntermediateEventOnActivityBoundary", "connects" : [ { "from" : "Activity", "to" : [ "IntermediateEventOnActivityBoundary" ] } ] } ], "containmentRules" : [ { "role" : "BPMNDiagram", "contains" : [ "all" ] }, { "role" : "SubProcess", "contains" : [ "sequence_start", "sequence_end", "from_task_event", "to_task_event", "EventSubProcess", "TextAnnotation", "DataStore" ] }, { "role" : "EventSubProcess", "contains" : [ "sequence_start", "sequence_end", "from_task_event", "to_task_event", "TextAnnotation", "DataStore" ] }, { "role" : "Pool", "contains" : [ "Lane" ] }, { "role" : "Lane", "contains" : [ "sequence_start", "sequence_end", "EventSubProcess", "TextAnnotation", "DataStore" ] } ], "morphingRules" : [ { "role" : "ActivitiesMorph", "baseMorphs" : [ "UserTask" ], "preserveBounds" : true }, { "role" : "GatewaysMorph", "baseMorphs" : [ "ExclusiveGateway" ] }, { "role" : "StartEventsMorph", "baseMorphs" : [ "StartNoneEvent" ] }, { "role" : "EndEventsMorph", "baseMorphs" : [ "StartNoneEvent" ] }, { "role" : "CatchEventsMorph", "baseMorphs" : [ "CatchTimerEvent" ] }, { "role" : "ThrowEventsMorph", "baseMorphs" : [ "ThrowNoneEvent" ] }, { "role" : "BoundaryEventsMorph", "baseMorphs" : [ "ThrowNoneEvent" ] }, { "role" : "BoundaryCompensationEvent", "baseMorphs" : [ "BoundaryCompensationEvent" ] }, { "role" : "TextAnnotation", "baseMorphs" : [ "TextAnnotation" ] }, { "role" : "DataStore", "baseMorphs" : [ "DataStore" ] } ] } }
如下图,左侧汉化成功了。但是保存模型时报异常。
后台日志如下:
2024-08-02 22:54:24.545 WARN 19340 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException:
Required request body is missing: public void org.activiti.rest.editor.model.ModelSaveRestResource.saveModel
(java.lang.String,org.springframework.util.MultiValueMap
)]
用@RequestBody MultiValueMap
重新启动项目后,再次测试,创建模型,编辑模型,保存模型功能都测试通过。打完收工!
总结,与官方的activiti-explorer项目相比,本次集成修改了3个文件: