热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ActivitiModelEditor

ActivitiModelEditor组件我的了解ActivitiExplorer及其Vaadin实现方式博文里提到ActivitiExplorer使用的是Vaadin架构

Activiti Model Editor组件


我的了解Activiti Explorer及其Vaadin实现方式博文里提到Activiti Explorer使用的是Vaadin架构,但是Activiti 模型编辑器组件却没用使用Vaadin架构,而是采用Angular.JS的MVC模式。Activiti 模型编辑器组件的客户端代码位于Activiti\modules\activiti-webapp-explorer2\src\main\webapp\editor-app\。



该目录下的editor.html是Activiti Modeler Editor的主界面HTML代码


粗览Activiti <wbr>Modeler操作和源代码


其中palette区是通过Angular.JS使用stencilsets\bpmn2.0\icons下多个子目录内的PNG图像形成的多组列表。其节点层次关系获取相关代码为&#xff1a;


  1. stencil-controller.js
  2. Activiti\modules\activiti-modeler\src\main\java\org\activiti\rest\editor\main\StencilsetRestResource.java
  3. Activiti\modules\activiti-webapp-explorer2\src\main\resources\stencilset.json

粗览Activiti <wbr>Modeler操作和源代码


editor.html中的视图与两个控制器进行了绑定:


  • stencil-controller.js&#xff1a;处理对canvas中BPMN元素的操作&#xff0c;很多处理是通过editor目录下的QRYX库完成的
  • toolbar-controller.js&#xff1a;处理对工具栏的操作&#xff0c;很多处理由configuration\toolbar-default-actions.js完成



保存模型操作


保存模型操作&#xff0c;是通过toolbar-default-actions.js中的SaveModel方法完成的&#xff0c;它需要将三部分信息传给服务器&#xff1a;


  • 模型的元数据&#xff1a;例如模型名称、分类、创建时间、最后一次更新时间等等
  • 模型JSON数据&#xff1a;将canvas内的图像数据转换成JSON数据UTF8字符串

    {"resourceId": 53,"properties": { "process_id": "process", "name": "", "documentation": "", "process_author": "", "process_version": "", "process_namespace": "http://www.activiti.org/processdef", "executionlisteners": "", "eventlisteners": ""},"stencil": { "id": "BPMNDiagram"},"childShapes": [ {  "resourceId": "sid-4F7484B9-11EC-4FCE-8950-FEFFB723D88B",  "properties": {   "overrideid": "",   "name": "",   "documentation": "",   "executionlisteners": "",   "initiator": "",   "formkeydefinition": "",   "formproperties": ""  },  "stencil": {   "id": "StartNoneEvent"  },  "childShapes": [],  "outgoing": [   {    "resourceId": "sid-B589A0D9-FA79-4C12-95B7-253E72480384"   }  ],  "bounds": {   "lowerRight": {    "x": 259,    "y": 139   },   "upperLeft": {    "x": 229,    "y": 109   }  },  "dockers": [] }, {  "resourceId": "sid-1A762474-62B9-4F3D-A81C-1ADD46AF7D2F",  "properties": {   "overrideid": "",   "name": "",   "documentation": "",   "asynchronousdefinition": "false",   "exclusivedefinition": "false",   "executionlisteners": "",   "multiinstance_type": "None",   "multiinstance_cardinality": "",   "multiinstance_collection": "",   "multiinstance_variable": "",   "multiinstance_condition": "",   "isforcompensation": "false",   "usertaskassignment": "",   "formkeydefinition": "",   "duedatedefinition": "",   "prioritydefinition": "",   "formproperties": "",   "tasklisteners": ""  },  "stencil": {   "id": "UserTask"  },  "childShapes": [],  "outgoing": [   {    "resourceId": "sid-4134C10E-B589-42FF-AACC-463D35D52016"   }  ],  "bounds": {   "lowerRight": {    "x": 746,    "y": 172   },   "upperLeft": {    "x": 646,    "y": 92   }  },  "dockers": [] }, {  "resourceId": "sid-B22A5CAB-94D0-419E-BB1E-E8538C6A7283",  "properties": {   "overrideid": "",   "name": "",   "documentation": "",   "executionlisteners": ""  },  "stencil": {   "id": "EndNoneEvent"  },  "childShapes": [],  "outgoing": [],  "bounds": {   "lowerRight": {    "x": 1089,    "y": 138   },   "upperLeft": {    "x": 1061,    "y": 110   }  },  "dockers": [] }, {  "resourceId": "sid-B589A0D9-FA79-4C12-95B7-253E72480384",  "properties": {   "overrideid": "",   "name": "",   "documentation": "",   "conditionsequenceflow": "",   "executionlisteners": "",   "defaultflow": "false"  },  "stencil": {   "id": "SequenceFlow"  },  "childShapes": [],  "outgoing": [   {    "resourceId": "sid-1A762474-62B9-4F3D-A81C-1ADD46AF7D2F"   }  ],  "bounds": {   "lowerRight": {    "x": 645.5626565925471,    "y": 131.10730365650525   },   "upperLeft": {    "x": 259.12484340745283,    "y": 124.26769634349473   }  },  "dockers": [   {    "x": 15,    "y": 15   },   {    "x": 50,    "y": 40   }  ],  "target": {   "resourceId": "sid-1A762474-62B9-4F3D-A81C-1ADD46AF7D2F"  } }, {  "resourceId": "sid-4134C10E-B589-42FF-AACC-463D35D52016",  "properties": {   "overrideid": "",   "name": "",   "documentation": "",   "conditionsequenceflow": "",   "executionlisteners": "",   "defaultflow": "false"  },  "stencil": {   "id": "SequenceFlow"  },  "childShapes": [],  "outgoing": [   {    "resourceId": "sid-B22A5CAB-94D0-419E-BB1E-E8538C6A7283"   }  ],  "bounds": {   "lowerRight": {    "x": 1060.676003953202,    "y": 130.93202152143962   },   "upperLeft": {    "x": 746.595480421798,    "y": 124.30235347856038   }  },  "dockers": [   {    "x": 50,    "y": 40   },   {    "x": 14,    "y": 14   }  ],  "target": {   "resourceId": "sid-B22A5CAB-94D0-419E-BB1E-E8538C6A7283"  } }],"bounds": { "lowerRight": {  "x": 1200,  "y": 1050 }, "upperLeft": {  "x": 0,  "y": 0 }},"stencilset": { "url": "stencilsets/bpmn2.0/bpmn2.0.json", "namespace": "http://b3mn.org/stencilset/bpmn2.0#"},"ssextensions": []
    }

  • 模型的SVG图像数据&#xff1a;将canvas中的SVG图像数据经过过滤处理而得

服务器侧保存模型的代码位于Activiti\modules\activiti-modeler\src\main\java\org\activiti\rest\editor\model\ModelSaveRestResource.java。
  • 通过RepositoryService的saveModel方法将模型的元数据存入数据库的ACT_RE_MODEL表
  • 通过RepositoryService的addModelEditorSource方法将模型JSON数据UTF8字符串存入数据库的ACT_GE_BYTEARRAY表
  • 通过Apache™ Batik SVG Toolkit将模型的SVG图像数据转换成PNG格式&#xff0c;通过RepositoryService的addModelEditorSourceExtra方法将PNG图像存入数据库的ACT_GE_BYTEARRAY表

Activiti Explorer操作已保存模型


对模型的编辑操作是在Activiti Model Editor组件里实现的&#xff0c;对已保存模型的其他操作还是在Activiti Explorer里基于Vaadin架构实现的。


客户端代码位于&#xff1a;Activiti\modules\activiti-explorer\src\main\java\org\activiti\editor\ui\。


下图的HTML界面由EditorProcessDefinitionD

etailPanel.java实现。 
粗览Activiti <wbr>Modeler操作和源代码


显示已保存模型




  1. 选择模型&#xff0c;会调用EditorProcessDefinitionPage类的showProcessDefinitionDetail方法
  2. EditorProcessDefinitionDetailPanel类的initUI方法调用initProcessDefinitionInfo方法&#xff0c;它会加入EditorProcessDefinitionInfoComponent实例
  3. 在构造EditorProcessDefinitionInfoComponent实例时&#xff0c;其initImage方法会被调用&#xff0c;通过RepositoryService的getModelEditorSourceExtra方法获得PNG格式图像&#xff0c;最终被显示到浏览器界面上。



部署已保存模型




EditorProcessDefinitionD

etailPanel类的deployModel方法处理部署已保存模型的操作。


  1. 通过RepositoryService的getModelEditorSource方法获得模型JSON数据的UTF8字符串
  2. 通过FasterXML/jackson-databind转换成Java对象树
  3. 通过Activiti\modules\activiti-json-converter\src\main\java\org\activiti\editor\language\json\converter\BpmnJsonConverter.java将模型JSON数据的Java对象树转换成BpmnModel实例
  4. 通过Activiti\modules\activiti-bpmn-converter\src\main\java\org\activiti\bpmn\converter\BpmnXMLConverter.java 将BpmnModel实例转成BPMN XML数据
  5. 通过RepositoryService的createDeployment方法将BPMN XML数据进行部署



导出已保存模型




EditorProcessDefinitionD

etailPanel类的exportModel方法处理导出已保存模型的操作。


  1. 通过RepositoryService的getModelEditorSource方法获得模型数据的JSON字符串
  2. 通过FasterXML/jackson-databind转换成Java对象树
  3. 通过Activiti\modules\activiti-json-converter\src\main\java\org\activiti\editor\language\json\converter\BpmnJsonConverter.java将模型JSON数据的Java对象树转换成BpmnModel实例
  4. 通过Activiti\modules\activiti-bpmn-converter\src\main\java\org\activiti\bpmn\converter\BpmnXMLConverter.java 将BpmnModel实例转成BPMN XML数据



编辑已保存模型




EditorProcessDefinitionD

etailPanel类内注册了EditModelClickListener监听器用于处理导入BPMN模型操作。


EditModelClickListener的showModeler会生成访问模型编辑器组件的URL地址&#xff0c;打开指定的模型。


  1. Activiti\modules\activiti-webapp-explorer2\src\main\webapp\editor-app\app.js中的监听器处理$includeContentLoaded事件&#xff0c;调用了fetchModel方法
  2. Activiti\modules\activiti-modeler\src\main\java\org\activiti\rest\editor\model\ModelEditorJsonRestResource.java处理该REST请求&#xff0c;返回由RepositoryService的getModel和getModelEditorSource方法获得Activiti模型元数据和JSON数据



导入BPMN模型




EditorProcessDefinitionD

etailPanel类内注册了ImportModelClickListener

监听器用于处理导入BPMN模型操作。


ImportPopupWindow界面完成BPMN模型操作后&#xff0c;ImportUploadReceiver类的deployUploadedFile方法处理上传的BPMN XML数据。


  1. 通过Activiti\modules\activiti-bpmn-converter\src\main\java\org\activiti\bpmn\converter\BpmnXMLConverter.java 将BPMN XML数据转换成BpmnModel实例
  2. 通过BpmnModel实例生成模型的元数据&#xff0c;通过RepositoryService的saveModel方法将模型的元数据存入数据库的ACT_RE_MODEL表
  3. 通过Activiti\modules\activiti-json-converter\src\main\java\org\activiti\editor\language\json\converter\BpmnJsonConverter.java将BpmnModel实例转换成模型JSON数据的Java对象树&#xff0c;通过RepositoryService的addModelEditorSource方法将模型JSON数据UTF8字符串存入数据库的ACT_GE_BYTEARRAY表







一些疑惑和想法&#xff1a;


  • 这里BpmnXMLConverter和BpmnJsonConverter用的比较频繁&#xff0c;而且成对出现。为什么不跳过中间的BpmnModel&#xff1f;
  • 导入BPMN模型为什么不生成PNG图像&#xff1f;
  • 数据库存储的模型数据不采用BPMN XML格式而是采用JSON格式&#xff0c;很灵活&#xff0c;可以随意添加Activiti扩展内容。但是如果没有现成的JSON schema&#xff0c;分析起来够麻烦。

推荐阅读
  • Django + Ansible 主机管理(有源码)
    本文给大家介绍如何利用DjangoAnsible进行Web项目管理。Django介绍一个可以使Web开发工作愉快并且高效的Web开发框架,能够以最小的代价构建和维护高 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了ASP.NET Core MVC的入门及基础使用教程,根据微软的文档学习,建议阅读英文文档以便更好理解,微软的工具化使用方便且开发速度快。通过vs2017新建项目,可以创建一个基础的ASP.NET网站,也可以实现动态网站开发。ASP.NET MVC框架及其工具简化了开发过程,包括建立业务的数据模型和控制器等步骤。 ... [详细]
  • SpringMVC工作流程概述
    SpringMVC工作流程概述 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
    本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
  • wpf+mvvm代码组织结构及实现方式
    本文介绍了wpf+mvvm代码组织结构的由来和实现方式。作者回顾了自己大学时期接触wpf开发和mvvm模式的经历,认为mvvm模式使得开发更加专注于业务且高效。与此同时,作者指出mvvm模式相较于mvc模式的优势。文章还提到了当没有mvvm时处理数据和UI交互的例子,以及前后端分离和组件化的概念。作者希望能够只关注原始数据结构,将数据交给UI自行改变,从而解放劳动力,避免加班。 ... [详细]
  • 本文讨论了在ASP中创建RazorFunctions.cshtml文件时出现的问题,即ASP.global_asax不存在于命名空间ASP中。文章提供了解决该问题的代码示例,并详细解释了代码中涉及的关键概念,如HttpContext、Request和RouteData等。通过阅读本文,读者可以了解如何解决该问题并理解相关的ASP概念。 ... [详细]
  • ps:写的第一个,不足之处,欢迎拍砖---只是想用自己的方法一步步去实现一些框架看似高大上的小功能(比如说模型中的toArraytoJsonsetAtt ... [详细]
  • packagetzy.template.controller;importorg.apache.shiro.authc.ExpiredCredentialsException;im ... [详细]
  • 本文介绍了一种处理AJAX操作授权过期的全局方式,以解决Asp.net MVC中Session过期异常的问题。同时还介绍了基于WebImage的图片上传工具类。详细内容请参考链接:https://www.cnblogs.com/starluck/p/8284949.html ... [详细]
  • SpringBoot简单日志配置
     在生产环境中,只打印error级别的错误,在测试环境中,可以调成debugapplication.properties文件##默认使用logbacklogging.level.r ... [详细]
author-avatar
菌挥发油
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有