徐 歡,陳正鳴,王 沖,2
(1.河海大學物聯網工程學院,常州213022;2.河海大學計算機與信息學院,南京211100)
·微機軟件·
一種面向業務過程的軟件代碼生成方法
徐 歡1,陳正鳴1,王 沖1,2
(1.河海大學物聯網工程學院,常州213022;2.河海大學計算機與信息學院,南京211100)
為了提高業務流程軟件的開發效率,提出了一種面向業務過程的軟件代碼生成方法。通過使用基于模板的代碼生成引擎FreeMarker和建立描述業務過程的工作流模型,設計了一種代碼生成方法。方法按照MVC的軟件體系結構設計模板,對建立的工作流模型和數據模型進行轉換,生成模型層Java代碼和視圖層extjs代碼,并結合流程生成相應的控制層代碼,完成了自動生成面向業務過程的模型層、視圖層和控制層代碼的功能。應用實例的實現驗證了該方法的可行性和有效性。
工作流;代碼生成;模板引擎FreeMarker;業務過程;模型驅動架構;模型
各種業務過程軟件有很多相似之處,盡管這些軟件的具體業務功能和業務過程不盡相同,但是從軟件工程的角度看來,它們的軟件結構是大致相同的[1],因此,在開發這類系統時,軟件復用和軟件自動化思想得到了很大發展。傳統的業務過程軟件開發方式存在很多不足之處,主要表現為[2]:效率低、開發周期長、大量的重復代碼。由底層設計和編碼驅動的傳統軟件開發技術已經越來越無法滿足企業業務過程的不斷變化以及及時變更的需求。代碼生成技術可大幅提高軟件開發質量和生產率,降低軟件開發風險。現有的代碼生成器一般針對特定的框架生成代碼,無法體現業務過程,使用不夠靈活等。現代業務過程軟件的設計更多的是對軟件框架和業務過程的綜合設計與實現。
綜合考慮軟件業務過程和軟件框架進行軟件設計,先建立描述業務過程的工作流模型,再結合代碼生成器將該模型進行轉化,生成為Java代碼。使用XML流程語言描述業務過程模型,通過JBPM流程引擎建立工作流模型,它可以提供圖形化流程設計工具,并自動生成XML格式的描述。而在代碼生成器的選擇上,選用FreeMarker模板引擎,這是一個基于模板生成文本輸出的通用工具,使用純Java編寫,可用來生成HTMLWeb頁面、XML、Java源代碼等各種文本。
設計思路借鑒了MDA模型驅動架構的思想,首先進行業務過程模型和數據模型設計,確定平臺獨立模型;然后設計平臺相關模型的模板,將平臺獨立模型轉換為平臺相關模型;最后設計目標代碼模板,按照MVC的框架設計,包括模型層模板(model)、視圖層模板(view)、控制層模板(controller),將平臺相關模型轉化為相應的代碼模塊,實現整個目標平臺代碼。
此方法的難點在于:模型的確定、模板文件的編寫、對工作流模型的解析,配合模型的模板數據結構建立等幾個方面。
模型驅動是一種以建模和模型轉換為主要途徑的軟件開發方法,建模指平臺獨立模型的構建,還要確定平臺相關模型設計,這一節將先從這兩個方面進行描述。
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頁面分為上下左右中五個部分。主要用到了上、左、中、右四個部分。上部是系統標題,左部是導航菜單,中間顯示對應操作的表格信息和操作按鈕,右邊為流程圖實例。
除了視圖層的基本框架設計,對視圖中顯示的內容以及按鈕功能等細節部分,在解析流程后完成。
模型到代碼的轉換,離不開模板的支撐作用,同時還需要模板引擎在轉化過程中起主導作用。使用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(結構化查詢語言活動),在生成代碼時可手工直接引用,作為模型層操作。
通過程序生成器對流程的梳理就能得到大部分的控制層操作代碼,對生成的代碼稍加整理就能得到完整的控制層代碼。
以《某公司工單系統》為例,驗證此方法的有效性。應用實例在myeclipse10環境下進行,使用jBPM插件建立工作流模型,并添加了FreeMarker的jar包,數據庫使用SQL Server 2008,添加sqljdbc4.jar包作為jdbc的連接。
實例的構建包括五個方面,它們是數據建模、流程建模、視圖層構建、模型層構建和控制層構建,完成了這5個步驟也就基本完成了應用實例。
5.1 數據準備
數據準備包括數據建模和流程建模,數據建模基于SQL Server數據庫完成,建立流程所需用到的各種數據類型表,包括各個用戶的用戶名、密碼、權限,工單名稱、狀態等。使用Java的插件jBPM完成流程建模,保存對應的XML文件,用于后續步驟。
5.2 代碼生成
代碼生成包括生成視圖層、模型層、控制層代碼。先使用FreeMarker解析描述業務過程的XML代碼,得到權限信息,利用模板生成部分視圖層代碼,將過程流轉信息和操作名保存在控制層代碼中,然后對數據庫中的表生成基于單表操作的視圖層和模型層代碼,整合修改部分模型層代碼,將操作的實現方法保存在模型層中。最后經過少量修改,即可運行該系統。具體操作如圖10所示。
提出了一種面向業務過程的軟件代碼生成方法,通過《某公司工單系統》案例證明了此方法是切實可行并能有效提高軟件開發效率的。當然此方法也存在一定的局限性,如考慮不夠充分,一些復雜的業務過程無法使用程序生成器自動生成對應代碼,需要手工改寫代碼等。下一步工作的重點是充分考慮各種業務過程,進一步完善此方法。

圖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