一种面向业务过程的软件代码生成方法

2015-08-07 12:11陈正鸣
微处理机 2015年5期
关键词:代码生成数据模型视图

徐 欢,陈正鸣,王 冲,2

(1.河海大学物联网工程学院,常州213022;2.河海大学计算机与信息学院,南京211100)

·微机软件·

一种面向业务过程的软件代码生成方法

徐 欢1,陈正鸣1,王 冲1,2

(1.河海大学物联网工程学院,常州213022;2.河海大学计算机与信息学院,南京211100)

为了提高业务流程软件的开发效率,提出了一种面向业务过程的软件代码生成方法。通过使用基于模板的代码生成引擎FreeMarker和建立描述业务过程的工作流模型,设计了一种代码生成方法。方法按照MVC的软件体系结构设计模板,对建立的工作流模型和数据模型进行转换,生成模型层Java代码和视图层extjs代码,并结合流程生成相应的控制层代码,完成了自动生成面向业务过程的模型层、视图层和控制层代码的功能。应用实例的实现验证了该方法的可行性和有效性。

工作流;代码生成;模板引擎FreeMarker;业务过程;模型驱动架构;模型

1 引 言

各种业务过程软件有很多相似之处,尽管这些软件的具体业务功能和业务过程不尽相同,但是从软件工程的角度看来,它们的软件结构是大致相同的[1],因此,在开发这类系统时,软件复用和软件自动化思想得到了很大发展。传统的业务过程软件开发方式存在很多不足之处,主要表现为[2]:效率低、开发周期长、大量的重复代码。由底层设计和编码驱动的传统软件开发技术已经越来越无法满足企业业务过程的不断变化以及及时变更的需求。代码生成技术可大幅提高软件开发质量和生产率,降低软件开发风险。现有的代码生成器一般针对特定的框架生成代码,无法体现业务过程,使用不够灵活等。现代业务过程软件的设计更多的是对软件框架和业务过程的综合设计与实现。

综合考虑软件业务过程和软件框架进行软件设计,先建立描述业务过程的工作流模型,再结合代码生成器将该模型进行转化,生成为Java代码。使用XML流程语言描述业务过程模型,通过JBPM流程引擎建立工作流模型,它可以提供图形化流程设计工具,并自动生成XML格式的描述。而在代码生成器的选择上,选用FreeMarker模板引擎,这是一个基于模板生成文本输出的通用工具,使用纯Java编写,可用来生成HTMLWeb页面、XML、Java源代码等各种文本。

2 代码生成方法整体介绍

设计思路借鉴了MDA模型驱动架构的思想,首先进行业务过程模型和数据模型设计,确定平台独立模型;然后设计平台相关模型的模板,将平台独立模型转换为平台相关模型;最后设计目标代码模板,按照MVC的框架设计,包括模型层模板(model)、视图层模板(view)、控制层模板(controller),将平台相关模型转化为相应的代码模块,实现整个目标平台代码。

此方法的难点在于:模型的确定、模板文件的编写、对工作流模型的解析,配合模型的模板数据结构建立等几个方面。

3 模型设计

模型驱动是一种以建模和模型转换为主要途径的软件开发方法,建模指平台独立模型的构建,还要确定平台相关模型设计,这一节将先从这两个方面进行描述。

3.1 平台独立模型

平台独立模型包括基于事务流程的工作流模型设计和与数据相关的数据模型设计。

3.1.1 工作流模型

工作流(Workflow)就是工作流程的计算模型,工作流对流程有较强的描述能力。对业务过程进行建模,也就是建立工作流模型的过程。可以自己定义流程描述语言的规则,也可以用现有的描述语言。选用JPDL(JBoss JBPM Proeess Dnefinition Language)描述流程,它提供多种流转控制节点:Task(人工任务)节点、State(状态)节点、Decision(判断)节点、Fork-Join(分支-聚合)节点和Custom(自定义)节点等,还提供自动活动,如Java(程序活动)、script(脚本活动)、hql(Hibernate查询语言活动)和SQL(结构化查询语言)等。使用流程建模软件jBPM绘制图形化流程,它能同时生成XML格式的流程描述语言。

业务过程建模是整个软件设计的最开始部分,要将流程描述语言生成为目标平台的运行程序,业务过程描述中要包含当前业务准确的需求定义,且要兼备业务过程和程序过程这两个特征。程序过程即在模型里表示出这段业务在程序中调用的界面或调用的方法或限定条件。另外,每个节点的<name>属性要确保唯一性,即命名时不重复,避免解析时发生混乱。连接线的名称一般为操作名,若连接线无对应操作(如判断节点后的连接线),则命名为条件Yes或No等。工作流模型建立完成后保存为.XML格式,它是一种平台无关的模型。

3.1.2 数据模型

数据模型是数据特征的抽象,是数据库系统中用以提供信息表示和操作手段的形式构架。部分必须的数据模型如图1所示,其中sysRole为角色表;users为用户表;Event为事件表;Event_State为事务状态列表;Event_Operator为事件可进行的操作列表;Organisa_tion为权限表;Partition_Operate_Log为流程日志。这些表是所有事务的通用数据,当然针对各个不同的业务还需要构建其他相应的数据模型。

图1 数据模型结构图示例

将业务过程中所涉及到的数据以表的形式保存在数据库中,数据库作为业务过程系统的支撑,在流程运转中起记录和存储的作用。

3.2 平台相关模型

3.2.1 流程模型

流程中的连接线是决定控制层的关键,其节点又涉及模型层相关的业务逻辑,因此需建立流程模型,并建立对象,为生成控制层做准备。将一条连接线以及与这条连接线相关联的两个节点作为一个模型块,代表着一段流程信息,图2显示了一个模型块结构。

如图2所示,一个模型块由名称、节点实体和节点的逻辑行为三个部分组成。名称是模型的唯一标示,由起始节点名和连接线名共同组成;节点实体对应该节点的名称、类型等所有信息;逻辑行为指该节点的此条连线对应的操作行为,调用增、删、改等基础操作完成。

图2 流程模型块结构图

对流程节点建立WorkflowModel和Workflow Item类,WorkflowModel类的属性有:Type(节点类型),Size(节点数量),<list>Node(节点对象列表);而Workflow Item是对model中一个节点的具体化,按不同节点分为Task、Decision等,除了公共属性Name和<list>Transition外,每种item都有其各自的属性。

3.2.2 数据类模型

建立数据类模型Bean和数据访问对象类Dao,来对数据库进行操作,即建立数据的模型层模型,包括模型的名称、逻辑行为和操作实体三个部分。名称是模型的唯一标示;逻辑行为指对数据的操作行为,比如增、删、改、查等;操作实体主要指的是对数据库操作的表的实体或者是一个视图,主要包含了表元信息,即表名称、表中各个数据字段名称和类型等信息。模型结构如图3所示。

图3 数据类模型的结构图

此处平台相关的数据模型,由代码生成器实现,采用全自动方式进行构建。只需提供数据库中对应的表名,代码生成器就会实现该数据模型的建立。

3.2.3 视图层设计

视图层设计采用了大多数管理系统的传统设计,如图4所示。

图4 视图层布局设计

在整个页面布局中,采用了边缘布局,将整个Web页面分为上下左右中五个部分。主要用到了上、左、中、右四个部分。上部是系统标题,左部是导航菜单,中间显示对应操作的表格信息和操作按钮,右边为流程图实例。

除了视图层的基本框架设计,对视图中显示的内容以及按钮功能等细节部分,在解析流程后完成。

4 模板设计

模型到代码的转换,离不开模板的支撑作用,同时还需要模板引擎在转化过程中起主导作用。使用FreeMarker模板引擎作为代码生成器的核心技术。

根据模型驱动的思想,使用模板将平台独立模型转化为平台相关模型。模板的功能主要是对平台相关模型的定义,通过FreeMarker模板引擎,将平台独立的模型填充到模板中,生成平台相关的模型。在目标代码的生成中,模板主要应用在平台相关模型到目标代码转化,最后稍加修改,实现完整需求。

4.1 FreeMarker模板引擎

代码生成器FreeMarker的使用可以归结为:模板+数据模型=输出,基本原理模型如图5所示。

图5 FreeMarker原理模型

其中,“模板/模式”指的是代码自动生成中的不变关系或模式,作为模板使用。“元数据”是描述数据的数据,能完整描述输入文件的信息,元数据即数据模型和工作流模型。

FreeMarker负责提取底层数据生成文本并输出,不过它的以下一些特性使得它在Web程序中应用比较广泛,如通用数据模型(Java对象通过插件式对象封装,以变量方式在模板中显示,可使用抽象(接口)方式表示);强大的模板语言(有自己的指令,模板控制能力强,还有自己的命名空间避免名字的冲突);简单的Web显示(分离可视化设计和应用程序逻辑,分离页面设计员和程序员);强大的XML处理能力。XML是业务过程的描述语言,因此用FreeMarker模板有较大优势。

4.2 平台相关模型的模板设计

4.2.1 流程类模型的模板

第一步:解析流程

XML语言的特点是它的树状结构,如图6所示,显示了一个工作流程的部分业务过程的XML树状结构,Process是一个根节点,start、task、end是它的子节点。

图6 流程XML的树状结构

FreeMarker解析流程XML的方法:首先,FreeMarker中的parse方法将把用来描述业务过程的XML文件处理成map树状结构的模型;然后FreeMarker提供了recurse指令,按XML的层定义为宏,宏名即节点名,如<#macro task>定义了Task节点的宏;再用recurse循环调用处理子节点的宏,处理函数。

为了解析和存储业务流程,针对不同的流程节点需建立不同的平台无关类。如对Task节点建立Task类,针对Decision节点建立Decision类等。以常用的Task节点为例,图7为其平台无关模型的类结构图,其中Transition为节点间的连接。

图7 流程节点的平台无关类结构图

如图7所示,一个Task节点有四个变量:name为节点名;type为类型;expression为类型的具体描述;transition为转移到下一个节点的连线,用<list>保存。

第二步:组织建模

组织建模又叫权限管理,即任务的分配者。组织建模的目的是为了明确完成每个任务的对象。如果没有在建立数据模型时建立权限表,就需要在业务流程中读出这些信息,并保存到数据库中。在jPDL流程定义语言中,task一般用来处理涉及人机交互的活动,因此通过分析流程描述中的Task节点,就能得到任务的分配或候选人。Task有Type和Expression,Type表示类型,有四个值可选:assignee表示指定到用户,candidate-groups指定到用户组列表,candidate-users指定到用户列表和swimlane任务泳道,Expression表示该类型对应的描述。

在对Task命名时,需保证Task的名称是唯一的,且为这一步的操作名。在第一步解析流程的操作中已将所有Task内容保存,第二步只需取出数据,建立对应权限表并将数据持久化到数据库中即可。

第三步:生成平台相关模型

平台相关的流程模型以模型块为单位,用WorkflowModel保存所有节点信息。节点的具体化item由对应不同的Task类、Decision类等类完成。将每一个节点保存为对应的类,再将所有节点的节点名和对应类型及数量保存到WorkflowModel中。下面以Task节点为例说明建立Task类对象的方法。

由模型块的定义可知,模型块的数量与流程连接线的数量相等。遍历各个节点的所有连线,将该节点、连线以及下一节点信息保存到一个模块中,就完成了平台相关模型的构建。

4.2.2 数据类模型模板

数据类模型也可以称为模型层,它包含了最基础的业务逻辑和数据访问操作。数据类模型主要包括对应表的操作实体和逻辑行为CRUD。建立模型的步骤如下:

(1)使用JDBC连接数据库,通过所提供的表名找到对应的表,通过函数getMetaData()得到结果集(rs)的结构,比如字段数、字段名、数据类型等信息,并依次存入ArrayList类型的columnList中;

(2)创建模板,包括表对应的实体模板、逻辑行为模板,模板见下文;

(3)往模板中填充数据,保存为文件。

实体模板是对数据库中的表建立实例对象,模板名为tableBean.ftl,代码如下:

对每一张表建立逻辑行为CRUD,以Dao命名。下列代码以增加一条记录的方法为例,说明逻辑行为Create方法的模板:

4.3 目标代码模板设计

目标平台的代码主要分为三个部分,分别是前台视图层和后台模型层,以及负责连接的中间控制层。视图层用ExtJS实现,控制层模板的主要工作除了对Struts2框架中的Action进行抽象建模,还要对调用数据库访问和处理数据Dao类的流程Dao类进行建立。而模型层完成业务逻辑和数据访问操作,该模板在上一节中数据类模型的模板已经介绍过,本节就不重复叙述。

4.3.1 视图层

视图层的实现技术众多,选择使用ExtJS构建视图层,使用FreeMarker模板引擎中Macro宏函数对模板进行定义,使得模板更具有模块性。由于篇幅限制,且视图层的构建非描述重点,不做详细描述,只阐述视图层在面向业务流程设计中特殊的地方。

Task是负责人工交互的部分,在视图层中,要对Task节点中体现流程的细节进行特别处理。权限决定了页面相关的表及要显示的内容,而Task的Transition连接线属性决定了可以执行的操作,体现在图层即页面上的按钮。根据Task连接线的数量决定按钮的数量;连接线的name属性决定了按钮上的内容。对应于Button模型的三个属性分别是:Text代表按钮上的文字,即连接线属性name的值;url属性是要请求的地址,指一个对请求处理的action,命名格式为“节点名_连接线名”。

分别完成单个节点的分页面,将要显示的表格页面与按钮结合即可成为完整模块。

4.3.2 控制层

控制层用来捕获请求并根据业务流程的流转信息控制请求的转发,调用相应的方法,由业务过程决定,对业务过程有着最好的表现力。选择使用Struts2实现,设计重点在Struts2配置文件的模板,对前台请求处理的Action类的模板以及调用数据库访问和处理Dao类的流程Dao—WorkFlowServer类模板。模板调用关系如下图8所示。

图8 目标平台服务器端的模板调用关系图

图8中,Struts模板完成配置文件;对前台请求处理的Action类调用流程Dao类,即WorkFlowServer,并由WorkFlowServer调用底层数据库的访问和处理方法;TableBean为数据传递和存储类的模板;TableDao为数据库访问和处理类的模板。下面详细介绍前三种模板。

(1)Struts2配置文件模板

这里给出与流程相关配置的模板,其他的基础配置及模板省略。

(2)Action类模板

Action类的作用:Struts2对Servlet请求进行拦截,根据配置文件把请求派发到相应的Action类中行执行,执行Action类中的execute函数,完成控制。Execute函数返回的结果,决定了要跳转的视图和视图中用到的值栈、OGNL表达式的值完成视图的实现。上述过程的核心内容是对Struts2进行配置和部分POJO类的编写,利用模板自动在服务器端生成请求处理Action模型。

(3)WorkFlowServer模板

WorkFlowServer是流程类Dao方法,由Action类调用。WorkFlowServer根据流程需求完成节点任务,通过调用底层的数据操作类Dao方法进行数据信息的记录和维护。流程的相关模型对每一个节点进行了实例化,此时WorkFlowServer的模板需要对不同类型的节点进行相应处理,使其完成流程功能,生成对应的Dao代码。

每次Action的调用为一段流程条,每段流程条经过的节点数为步长,步长大于等于1。由于Decision为后台处理节点,不是人工处理,因此由计算机程序控制业务流转;而运行到其他类型的节点时,这一段流程条操作结束。那么一段流程条的开始节点为Task或状态节点State,终点为Task、State或结束节点End。图9显示了流程条判断及每步流程所需操作。

图9 流程条判断示意图

每步流程都要进行业务处理和底层数据操作的调用。不同流程操作的共同点:在数据库的Log表更新流程记录,在State表更新事件状态。不同点:该步流程为Decision时,在相应的数据库表中获取所需变量的值,判断流程使用哪一条连接线Transition,并判断该连接线所指向的终点是否能作为这条程序条的终点,若能,该程序条结束,不能则继续跳转到下一节点。

另外,JPDL流程定义语言还支持使用自动活动,如Java(程序活动)、script(脚本活动)、hql(Hibernate查询语言活动)、sql(结构化查询语言活动),在生成代码时可手工直接引用,作为模型层操作。

通过程序生成器对流程的梳理就能得到大部分的控制层操作代码,对生成的代码稍加整理就能得到完整的控制层代码。

5 应用实例

以《某公司工单系统》为例,验证此方法的有效性。应用实例在myeclipse10环境下进行,使用jBPM插件建立工作流模型,并添加了FreeMarker的jar包,数据库使用SQL Server 2008,添加sqljdbc4.jar包作为jdbc的连接。

实例的构建包括五个方面,它们是数据建模、流程建模、视图层构建、模型层构建和控制层构建,完成了这5个步骤也就基本完成了应用实例。

5.1 数据准备

数据准备包括数据建模和流程建模,数据建模基于SQL Server数据库完成,建立流程所需用到的各种数据类型表,包括各个用户的用户名、密码、权限,工单名称、状态等。使用Java的插件jBPM完成流程建模,保存对应的XML文件,用于后续步骤。

5.2 代码生成

代码生成包括生成视图层、模型层、控制层代码。先使用FreeMarker解析描述业务过程的XML代码,得到权限信息,利用模板生成部分视图层代码,将过程流转信息和操作名保存在控制层代码中,然后对数据库中的表生成基于单表操作的视图层和模型层代码,整合修改部分模型层代码,将操作的实现方法保存在模型层中。最后经过少量修改,即可运行该系统。具体操作如图10所示。

6 结束语

提出了一种面向业务过程的软件代码生成方法,通过《某公司工单系统》案例证明了此方法是切实可行并能有效提高软件开发效率的。当然此方法也存在一定的局限性,如考虑不够充分,一些复杂的业务过程无法使用程序生成器自动生成对应代码,需要手工改写代码等。下一步工作的重点是充分考虑各种业务过程,进一步完善此方法。

图10 目标代码生成流程图

[1] 周春燕.基于MDA的元模型软件生成方法研究[D].南京:南京航空航天大学,2011-01.

Zhou Chun-yan.A Software Generation Method Based on MDA[D].Nanjing:Nanjing University of Aeronautics and Astronautic,2011-01.

[2] 鲍志云.解析MDA[M].北京:人民邮电出版社,2004-2.

Bao Zhi-yun.MDA Explained[M].Beijing:Posts&Telecom Press,2004-2.

[3] 胡俊.用XML与Java创建程序生成器[M].北京:科学出版社,2003.

Hu Jun.Program Generators with XML and Java[M].Beijing:Pearson Education,2003.

[4] 徐世莲.基于软件体系结构的WEB_MIS应用平台设计[J].计算机科学,2006,33(9):105-106,151.

Xu Shi-lian.Design of theWEB_MISPlatform Based on Architechture[J].Computer Science,2006,33(9):105-106,151.

[5] 王勇.业务构件生成技术研究[D].哈尔滨:哈尔滨工业大学,2007.

Wang Yong.Research on Business Component Generation Technique[D].Harbin:Harbin Institute of Technology,2007.

[6] 张立勇,陈平.基于代码生成的Web信息系统工程化开发方法[J].计算机科学,2008(5):284-287.

Zhang Li-yong,Chen Ping.Web Information System Construction Based on Code Generation[J].Computer Science,2008(5):284-287.

[7] 余俊新,孙涌.J2EE中对象关系映射的研究与实现[J].计算机技术与发展,2007(3):88-94.

Yu Jun-xin,Sun Yong.Research and Implementation of Object Relation Mapping in J2EE[J].Computer Technology and Development,2007(3):88-94.

[8] Krzysztof Czarnecki,Ulrich Eisencker.Generative Programing:Methods,Tools,and Applications[M].Addision-Wesly,2000.

[9] H.Maruyama,K.Tamura,N.Uramoto.XML and Java,Developing Web applications[M].Addision-Wesley,1999.

[10] 王正方,朱云龙.基于J2EE和业务定制功能的企业信息系统开发平台[J].信息与控制,2008,37(1):93-98.

Wang Zheng-fang,Zhu Yun-long.A Development Platform of Enterprise Information System Based On J2EE and Business Customization Function[J].Information and Control,2008,37(1):93-98.

[11] 李英军,马晓星,蔡敏.设计模式:可复用面向对象软件的基础(第2版)[M].北京:机械工业出版社,2001.

Li Ying-Jun,Ma Xiao-Xing,Cai Min.Design Patterns:Elements of Reusable Object-Oriented software(second edition)[M].Beijing:Machinery Industry Press,2001.

[12] 张锦.基于EJB组件的代码自动生成平台的研究-代码生成器及模板库的设计[D].杭州:浙江工业大学,2004.

Zhang Jin.Research of Code Auto-Generation Platform Based On EJB-Design of Code Generator and Template Library[D].Hangzhou:Zhejiang University of Technology,2004.

A Code Generation Method for Business Process

Xu Huan1,Chen Zhengming1,Wang Chong1,2
(1.College of Internet of Things Engineering,Hohai University,Changzhou 213022,China;2.College of Computer and Information,Hohai University,Nanjing 211100,China)

In order to improve the development efficiency of business process software,a code generation method for business process,using the"template engine"FreeMarker to generate text output based on templates and the establishing the workflow model of business process,is proposed in this paper.According to the software architecture of MVC,the templates is designed to transform theworkflow model and datamodel for generating Java code ofmodel layer,extjs code of view layer and control layer with process.The function of auto codes generation inmodel layer,view layer and control are completed for business process.The application example proves that themethod is feasible and effective.

Work flow;Code Generation;FreeMarker;Business process;MDA;Model

10.3969/j.issn.1002-2279.2015.05.010

TP311

A

1002-2279(2015)05-0035-08

徐欢(1989-),女,江苏省南通市人,硕士研究生,主研方向:计算机应用。

2015-03-04

猜你喜欢
代码生成数据模型视图
Lustre语言可信代码生成器研究进展
一种基于模型和模板融合的自动代码生成方法
面板数据模型截面相关检验方法综述
5.3 视图与投影
视图
基于Web应用界面的代码自动生成软件设计
Y—20重型运输机多视图
SA2型76毫米车载高炮多视图
代码生成技术在软件开发中的应用
财政支出效率与产业结构:要素积累与流动——基于DEA 和省级面板数据模型的实证研究