CN113553062A - 一种基于模板技术的状态机代码生成方法 - Google Patents
一种基于模板技术的状态机代码生成方法 Download PDFInfo
- Publication number
- CN113553062A CN113553062A CN202110836131.3A CN202110836131A CN113553062A CN 113553062 A CN113553062 A CN 113553062A CN 202110836131 A CN202110836131 A CN 202110836131A CN 113553062 A CN113553062 A CN 113553062A
- Authority
- CN
- China
- Prior art keywords
- state
- composite
- class
- template
- transfer
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/51—Source to source
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/35—Creation or generation of source code model driven
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明提出了一种基于模板技术的状态机代码生成方法,包括:建立具有完整功能的状态机图并保存为XML文件;解析状态机XML信息;建立状态机到JAVA代码的映射规则;基于映射规则构建模板文件;启动模板引擎并上传目标代码。本发明使用Eclipse的Papyrus插件进行状态机建模并保存为XML文件;基于Dom4j解析并提取状态机XML文件信息,将更为完整的状态机元素映射到JAVA代码,以提高生成代码的完整性,并通过模板引擎自动生成代码,以提高代码生成效率和准确率。
Description
技术领域
本发明涉及计算机软件工程领域,具体涉及一种基于模板技术的状态机代码生成方法。
背景技术
SysML(Systems Modeling Language,系统建模语言)状态机图是系统的一种动态视图,关注的是系统中的结构如何根据事件的发生而改变状态。状态机图包括的模型元素有:状态机、简单状态、复合状态、转换和伪状态。尽管状态机及其可视化可以有效地对事件驱动的体系结构的行为进行建模,并且在模型驱动过程的背景下可以将状态机自动转换成代码,但是现有研究和工具在生成代码的完整性和效率方面存在一些问题。现有方法要么只支持状态机模型的子集,要么通过将复合状态分解为简单状态导致组合爆炸问题。
因此,本发明针对现有的状态机代码生成方法进行研究改进以产生本案。
发明内容
发明目的:为解决现有研究和工具在生成代码的完整性和效率方面存在一些问题,本发明提供了一种基于模板技术的状态机代码生成方法。
技术方案:本发明提供了一种基于模板技术的状态机代码生成方法包括以下步骤:
步骤1:建立具有完整功能的状态机图并保存为XML(Extensible MarkupLanguage,可扩展标记语言)文件;
步骤2:解析状态机XML文件,获得状态机信息数据;
步骤3:建立状态机图到JAVA代码的映射规则;
步骤4:基于映射规则构建模板文件;
步骤5:启动模板引擎并生成目标代码。
进一步地,所述步骤1建立具有完整功能的状态机图,在Eclipse的UML(UnifiedModeling Language,统一建模语言)插件Papyrus插件中完成,所述完整功能的状态机图包括:简单状态,顺序复合状态,正交复合状态,虚拟并发复合状态,最终状态,转换,事件,历史伪状态、汇合伪状态、分支伪状态、选择伪状态;其中,通过XML文件的标签属性type能够区分状态、转移和伪状态;对于状态,通过标签属性isSimple和isComposite能够区分简单状态和复合状态,通过计算复合状态的region数量能够区分顺序复合状态和正交复合状态;虚拟并发复合状态是由一对分支伪状态和汇合伪状态及中间的状态组合成的;对于伪状态,通过kind属性能够区分历史伪状态、分支伪状态、汇合伪状态和选择伪状态。
进一步地,所述的步骤2解析状态机XML文件包括:
步骤2-1,通过步骤1中XML文件的标签属性来识别不同类型的状态,所述不同类型的状态包括简单状态、顺序复合状态、正交复合状态和虚拟并发复合状态;
步骤2-2,使用Dom4j按照上述标签属性解析XML文件,获得状态机信息数据;所述状态机信息数据包括公共信息、简单状态信息、顺序复合状态信息、正交复合状态信息和虚拟并发复合状态。
进一步地,所述步骤2-2中所述公共信息,包括转移目标状态类型,转移目标状态名称,转移目标状态层数,转移目标为复合状态时每一层的初始状态,转移目标为分支状态时分支状态信息;
对于所述的简单状态信息,包括简单状态名称,进入动作名称,退出动作名称,是否是初始状态的下一个目标状态,转移事件名称,转移动作名称,转移条件,转移目标状态是否是复合状态的子状态;
对于所述的顺序复合状态信息,包括顺序复合状态名称,是否是初始状态的下一个目标状态,是否含有历史状态,转移事件的名称,转移动作的名称,转移条件,该复合状态包含的简单子状态,该复合状态包含的顺序复合子状态,改复合状态包含的并发复合子状态;
对于所述的正交复合状态信息,包括正交复合状态名称,是否是初始状态的下一个目标状态,是否含有最终状态,是否含有历史状态,转移事件的名称,转移动作的名称,转移条件,该状态是否转移到汇合状态,该复合状态包含的简单子状态,该复合状态包含的顺序复合子状态,改复合状态包含的并发复合子状态;
对于所述的虚拟并发复合状态信息,包括提取虚拟并发复合状态名称VirState,转移事件的名称,转移动作的名称,转移条件,该虚拟状态里的简单子状态。
进一步地,步骤3建立状态机到JAVA代码的映射规则,包括状态机的基本映射规则,简单状态到JAVA代码的映射规则,顺序复合状态到JAVA代码的映射规则,正交复合状态到JAVA代码的映射规则,虚拟并发复合状态到JAVA代码的映射规则,转移到JAVA代码的映射规则。
进一步地,所述状态机的基本映射规则包括:
状态机对应为一个上下文类和抽象状态类:上下文类用于状态管理;抽象状态类是所有状态类的基类,定义了每一个状态的行为集合;
对于所述的简单状态到JAVA代码的映射规则,具体如下:
1)简单状态对应为一个简单状态类,该类继承了抽象状态类;
2)简单状态的进入/退出活动对应类中的函数。
进一步地,对于所述的顺序复合状态到JAVA代码的映射规则,具体如下:
1)顺序复合状态对应为一个复合状态类和一个辅助类,该复合状态类继承了抽象状态类;
2)顺序复合状态的子状态对应为一个子状态类,并继承辅助类;
3)上下文类中包含一个类型为抽象状态类的变量subState,用于记录活动状态;
4)复合状态类中包含一个整型变量hist,用于指示是否第一次到达该状态;
5)复合状态类中包含一个布尔变量isneedHist,用于指示是否使用历史状态;
6)复合状态类中包含一个布尔变量isEntry,用于指示是否调用entry函数;
7)复合状态类中包含一个函数resetOrigin,用于重置复合状态内部的初始状态;
8)复合状态类中包含一个函数setSubState,用于改变当前的子状态;
9)复合状态类中重写该状态类对应的事件函数。
进一步地,对于所述的正交复合状态到JAVA代码的映射规则,具体如下:
1)正交复合状态对应为一个复合状态类,该复合状态类继承了抽象状态类;
2)正交复合状态的每一个并发层都要生成一个辅助类;
3)每一层的子状态生成代码规则参考顺序复合状态。
进一步地,对于所述的虚拟并发复合状态到JAVA代码的映射规则,具体如下:
1)将虚拟并发复合状态看作一个正交复合状态,生成一个复合状态类;
2)每一个分支看作一个并发层,每个并发层构造一个辅助类
3)每一个分支的子状态生成代码规则参考顺序复合状态。
进一步地,对于所述的转移到JAVA代码的映射规则,包括转移源状态为虚拟并发复合状态时到JAVA代码的映射规则,转移源状态为顺序复合状态的子状态时到JAVA代码的映射规则,转移源状态为正交复合状态连接汇合状态时到JAVA代码的映射规则,转移目标状态为分支状态时到JAVA代码的映射规则,转移目标状态为顺序复合状态时到JAVA代码的映射规则,转移目标状态为顺序复合状态的子状态时到JAVA代码的映射规则,转移目标状态为正交复合状态连接分支状态时到JAVA代码的映射规则;
进一步地,对于所述的转移源状态为虚拟并发复合状态时到JAVA代码的映射规则,具体如下:
1)在虚拟并发复合状态内,转移目标状态为汇合伪状态的子状态类内,生成转移事件函数;
2)执行源状态的退出活动;
3)执行转移动作;
4)调用上下文类的状态改变函数,将当前活动状态更新为转移目标状态;
进一步地,对于所述的转移源状态为顺序复合状态的子状态时到JAVA代码的映射规则,具体如下:
1)在源状态的父状态类中生成转移事件函数,函数内调用subState的转移函数;
2)在其父状态对应的复合状态抽象类中进行转移事件函数的声明;
3)生成转移事件函数;
4)若目标状态是同一个域内的简单状态,则函数内首先调用父状态的exit函数,然后通过根上下文类调用转移活动函数,再更新复合状态抽象类的子状态为目标状态;
5)若目标状态是不同域的状态,则函数内首先调用源状态的exit函数,再调用其父状态的exit函数,然后通过根上下文类调用转移活动函数;
进一步地,对于所述的转移源状态为正交复合状态连接汇合状态时到JAVA代码的映射规则,具体如下:
1)在正交复合状态类中重写转移事件函数;
2)转移事件函数首先执行源状态的exit活动;
3)执行转移事件的活动;
进一步地,对于所述的转移目标状态为分支状态时到JAVA代码的映射规则,具体如下:
1)在源状态类中生成转移事件函数;
2)转移事件函数首先执行源状态的exit活动;
3)执行转移事件的活动;
4)定义int变量a,初始化为0,读入用户输入的值并赋予a;
5)遍历choice状态的各个转移,生成if子句,判断条件是转移的守卫条件,判断成功的操作根据转移目标状态类型参考前列的转换规则;
进一步地,对于所述的转移目标状态为顺序复合状态时到JAVA代码的映射规则,具体如下:
1)在源状态类中生成转移事件函数;
2)转移事件函数首先执行源状态的exit活动;
3)执行转移事件的活动;
4)将目标状态的isneedHist属性设为false;
5)调用上下文类的状态改变函数,状态改变为目标状态;
进一步地,对于所述的转移目标状态为顺序复合状态的子状态时到JAVA代码的映射规则,具体如下:
1)在源状态类中生成转移事件函数;
2)转移事件函数首先执行源状态的exit活动;
3)执行转移事件的活动;
4)将目标状态的isneedHist属性设为false;
5)调用上下文类的状态改变函数,状态改变为目标状态;
进一步地,对于所述的转移目标状态为正交复合状态连接分支状态时到JAVA代码的映射规则,具体如下:
1)在源状态类中生成转移事件函数;
2)转移事件函数首先执行源状态的exit活动;
3)执行转移事件的活动;
4)遍历fork状态的分支转移,若目标是历史状态,则将该正交域的isneedHist设为true;
5)否则,将目标状态的isneedHist属性设为false,isEntry属性设为false;
6)调用上下文类的状态改变函数,状态改变为目标状态;
7)调用目标状态父状态的resetOrigin重置目标状态内部的初始状态为目标状态;
8)将目标状态的isEntry属性设为true;
进一步地,步骤4所述的基于映射规则构建模板文件,是使用开源工具Acceleo模型转换语言描述状态机图到JAVA代码的映射规则,保存为模板文件;所述模板文件包括:上下文类模板文件,抽象状态类模板文件,简单状态模板文件,顺序复合状态模板文件,正交复合状态模板文件,虚拟并发复合状态模板文件;
进一步地,步骤5所述的启动模板引擎并生成目标代码,模板引擎输入状态机信息数据和模板文件,根据模板文件中的占位符,替换为对应的数据,输出JAVA代码文件。所述模板引擎使用开源工具Acceleo的模板引擎。
有益效果:
1、本发明使用了基于模板技术的代码生成方法,更加适合于模型驱动架构开发;
2、本发明提出一套较为完整的状态机元素映射规则,使得生成的代码更加完善;
3、本发明使用Acceleo模型转换语言描述状态机模型到JAVA代码的转换规则,使用Acceleo转换引擎完成了模型的自动转换,减少了模型转换的人工成本,提升了模型的转换效率,提高了体系设计模型的可重用性。
附图说明
下面结合附图和具体实施方式对本发明做更进一步的具体说明,本发明的上述和/或其他方面的优点将会变得更加清楚。
图1是本申请实施例的代码生成框架图
图2是本申请实施例的流程示意图;
图3是本申请实施例的状态机模型;
图4是本申请实施例的生成文件;
具体实施方式
下面将结合附图,对本发明的实施例进行描述。
本文使用的术语“Acceleo”是一个代码生成工具。
本文使用的术语“Papyrus”是一个基于Eclipse平台的UML建模插件。
本实施例所述的基于模板技术的状态机代码生成方法,代码生成框架图如图1所示,流程示意图如图2所示,包括以下步骤:
S1建立具有完整功能的状态机图并保存为XML文件;
S2解析状态机XML文件,获得状态机信息数据;
S3建立状态机到JAVA代码的映射规则;
S4基于映射规则构建模板文件;
S5启动模板引擎并生成目标代码。
本实施例中,步骤S1建立具有完整功能的状态机图并保存为XML文件,在Eclipse的UML插件Papyrus插件中完成,所述完整功能的状态机图包括:简单状态,顺序复合状态,正交复合状态,虚拟并发复合状态,最终状态,转换,事件,历史伪状态、汇合伪状态、分支伪状态和选择伪状态;其中,通过XML文件的标签属性type能够区分状态、转移和伪状态;对于状态,通过标签属性isSimple和isComposite能够区分简单状态和复合状态,通过计算复合状态的region数量能够区分顺序复合状态和正交复合状态;虚拟并发复合状态是由一对分支伪状态和汇合伪状态及中间的状态组合成的;对于伪状态,通过kind属性能够区分历史伪状态、分支伪状态、汇合伪状态和选择伪状态。
本实施例中,步骤S2解析状态机XML文件,包括:
通过步骤1中XML文件的标签属性来识别不同类型的状态,所述不同类型的状态包括简单状态、顺序复合状态、正交复合状态和虚拟并发复合状态;
使用Dom4j按照上述标签属性解析XML文件,提取公共信息,提取简单状态信息,提取顺序复合状态信息,提取正交复合状态信息,提取虚拟并发复合状态信息;
本实施例中,所述的提取公共信息具体如下:提取转移目标状态类型,转移目标状态名称,转移目标状态层数,转移目标为复合状态时每一层的初始状态,转移目标为分支状态时分支状态信息;
所述的提取简单状态信息具体如下:提取简单状态名称,进入动作名称,退出动作名称,是否是初始状态的下一个目标状态,转移事件名称,转移动作名称,转移条件,转移目标状态是否是复合状态的子状态;
所述的提取顺序复合状态信息具体如下:提取顺序复合状态名称,是否是初始状态的下一个目标状态,是否含有历史状态,转移事件的名称,转移动作的名称,转移条件,该复合状态包含的简单子状态,该复合状态包含的顺序复合子状态,改复合状态包含的并发复合子状态;
所述的提取正交复合状态信息具体如下:提取正交复合状态名称,是否是初始状态的下一个目标状态,是否含有最终状态,是否含有历史状态,转移事件的名称,转移动作的名称,转移条件,该状态是否转移到汇合状态,该复合状态包含的简单子状态,该复合状态包含的顺序复合子状态,改复合状态包含的并发复合子状态;
所述的提取虚拟并发复合状态信息具体如下:提取虚拟并发复合状态名称VirState,转移事件的名称,转移动作的名称,转移条件,该虚拟状态里的简单子状态。
本实施例中,步骤S3建立状态机到JAVA代码的映射规则,包括状态机的基本映射规则,简单状态到JAVA代码的映射规则,顺序复合状态到JAVA代码的映射规则,正交复合状态到JAVA代码的映射规则,虚拟并发复合状态到JAVA代码的映射规则,转移到JAVA代码的映射规则;
所述状态机的基本映射规则包括:
状态机对应为一个上下文类和抽象状态类:上下文类用于状态管理;抽象状态类是所有状态类的基类,定义了每一个状态的行为集合;
所述简单状态到JAVA代码的映射规则包括:
1)简单状态对应为一个简单状态类,该类继承了抽象状态类;
2)简单状态的进入/退出活动对应类中的函数。
所述顺序复合状态到JAVA代码的映射规则包括:
1)顺序复合状态对应为一个复合状态类和一个辅助类,该复合状态类继承了抽象状态类;
2)顺序复合状态的子状态对应为一个子状态类,并继承辅助类;
3)上下文类中包含一个类型为抽象状态类的变量subState,用于记录活动状态;
4)复合状态类中包含一个整型变量hist,用于指示是否第一次到达该状态;
5)复合状态类中包含一个布尔变量isneedHist,用于指示是否使用历史状态;
6)复合状态类中包含一个布尔变量isEntry,用于指示是否调用entry函数;
7)复合状态类中包含一个函数resetOrigin,用于重置复合状态内部的初始状态;
8)复合状态类中包含一个函数setSubState,用于改变当前的子状态;
9)复合状态类中重写该状态类对应的事件函数。
所述正交复合状态到JAVA代码的映射规则包括:
1)正交复合状态对应为一个复合状态类,该复合状态类继承了抽象状态类;
2)正交复合状态的每一个并发层都要生成一个辅助类;
3)每一层的子状态生成代码规则参考顺序复合状态。
所述虚拟并发复合状态到JAVA代码的映射规则包括:
1)将虚拟并发复合状态看作一个正交复合状态,生成一个复合状态类;
2)每一个分支看作一个并发层,每个并发层构造一个辅助类
3)每一个分支的子状态生成代码规则参考顺序复合状态。
对于所述的转移到JAVA代码的映射规则,包括转移源状态为虚拟并发复合状态时到JAVA代码的映射规则,转移源状态为顺序复合状态的子状态时到JAVA代码的映射规则,转移源状态为正交复合状态连接汇合状态时到JAVA代码的映射规则,转移目标状态为分支状态时到JAVA代码的映射规则,转移目标状态为顺序复合状态时到JAVA代码的映射规则,转移目标状态为顺序复合状态的子状态时到JAVA代码的映射规则,转移目标状态为正交复合状态连接分支状态时到JAVA代码的映射规则;
对于所述的转移源状态为虚拟并发复合状态时到JAVA代码的映射规则,具体如下:
1)在虚拟并发复合状态内,转移目标状态为汇合伪状态的子状态类内,生成转移事件函数;
2)执行源状态的退出活动;
3)执行转移动作;
4)调用上下文类的状态改变函数,将当前活动状态更新为转移目标状态;
对于所述的转移源状态为顺序复合状态的子状态时到JAVA代码的映射规则,具体如下:
1)在源状态的父状态类中生成转移事件函数,函数内调用subState的转移函数;
2)在其父状态对应的复合状态抽象类中进行转移事件函数的声明;
3)生成转移事件函数;
4)若目标状态是同一个域内的简单状态,则函数内首先调用父状态的exit函数,然后通过根上下文类调用转移活动函数,再更新复合状态抽象类的子状态为目标状态;
5)若目标状态是不同域的状态,则函数内首先调用源状态的exit函数,再调用其父状态的exit函数,然后通过根上下文类调用转移活动函数;
对于所述的转移源状态为正交复合状态连接汇合状态时到JAVA代码的映射规则,具体如下:
1)在正交复合状态类中重写转移事件函数;
2)转移事件函数首先执行源状态的exit活动;
3)执行转移事件的活动;
对于所述的转移目标状态为分支状态时到JAVA代码的映射规则,具体如下:
1)在源状态类中生成转移事件函数;
2)转移事件函数首先执行源状态的exit活动;
3)执行转移事件的活动;
4)定义int变量a,初始化为0,读入用户输入的值并赋予a;
5)遍历choice状态的各个转移,生成if子句,判断条件是转移的守卫条件,判断成功的操作根据转移目标状态类型参考前列的转换规则;
对于所述的转移目标状态为顺序复合状态时到JAVA代码的映射规则,具体如下:
1)在源状态类中生成转移事件函数;
2)转移事件函数首先执行源状态的exit活动;
3)执行转移事件的活动;
4)将目标状态的isneedHist属性设为false;
5)调用上下文类的状态改变函数,状态改变为目标状态;
对于所述的转移目标状态为顺序复合状态的子状态时到JAVA代码的映射规则,具体如下:
1)在源状态类中生成转移事件函数;
2)转移事件函数首先执行源状态的exit活动;
3)执行转移事件的活动;
4)将目标状态的isneedHist属性设为false;
5)调用上下文类的状态改变函数,状态改变为目标状态;
对于所述的转移目标状态为正交复合状态连接分支状态时到JAVA代码的映射规则,具体如下:
1)在源状态类中生成转移事件函数;
2)转移事件函数首先执行源状态的exit活动;
3)执行转移事件的活动;
4)遍历fork状态的分支转移,若目标是历史状态,则将该正交域的isneedHist设为true;
5)否则,将目标状态的isneedHist属性设为false,isEntry属性设为false;
6)调用上下文类的状态改变函数,状态改变为目标状态;
7)调用目标状态父状态的resetOrigin重置目标状态内部的初始状态为目标状态;
8)将目标状态的isEntry属性设为true;
本实施例中,步骤S4的基于映射规则构建模板文件,是使用开源工具Acceleo模型转换语言描述状态机图到JAVA代码的映射规则,保存为模板文件;所述模板文件包括:上下文类模板文件,抽象状态类模板文件,简单状态模板文件,顺序复合状态模板文件,正交复合状态模板文件,虚拟并发复合状态模板文件;
所述的上下文类模板具体如下:
所述的抽象状态类模板具体如下:
所述的简单状态模板具体如下:
所述的顺序复合状态模板具体如下:
所述的正交复合状态模板具体如下:
所述的虚拟并发复合状态模板具体如下:
本实施例中,步骤S5启动模板引擎并生成目标代码,模板引擎输入状态机信息数据和模板文件,根据模板文件中的占位符,替换为对应的数据,输出JAVA代码文件。所述模板引擎使用开源工具Acceleo的模板引擎。
本实施例中,基于该状态机代码生成方法对空调机AirConditioner控制系统进行建模和代码生成。
空调机AirConditioner控制系统包括两个简单状态“关闭”状态Off和“暂停”状态Pause,一个顺序复合状态“开机”状态On,一个正交复合状态“加湿净化”状态Cleanse,一个虚拟状态“维护清洗”状态。“开机”状态On具有两个简单子状态和一个浅历史状态,分别是“制冷”状态Cooler和“制热”状态Heater。“加湿净化”状态Cleanse有两个并发域:第一个并发域有一个浅历史状态,“选择湿度”状态selectHumidity和“启动加湿”状态Wet;“净化”域有“选择净化度”状态selectScent和“启动净化”状态Whiff。虚拟状态具有“拆除”状态Dismantle、“维护”状态Maintain、“打开”状态Open和“清洗”状态Depurate。空调机AirConditioner最初处于“关闭”状态Off,按下按钮1进入“打开”状态On,按下按钮2进入“维护清洗”虚拟状态。在“维护清洗”虚拟状态下,最初处于“拆除”状态Dismantle和“打开”状态Open,通过“维修”事件repair可以由“拆除”状态Dismantle转换为“维护”状态Maintain,通过“清理”事件clear可以由“打开”状态Open转换为“清洗”状态Depurate。在“开机”状态On下,最初处于“制冷”状态Cooler,按下模式按钮modeButH,转换为“制热”状态Heater。通过“按下清洁按钮”事件cleaning,系统进入“加湿净化”状态Cleanse。在空调机AirConditioner处于“开机”状态On时,可以通过“暂停开机”事件onTop进入“暂停”状态Pause,并且可以通过“恢复”事件resume以及恢复条件“a==0”恢复到“开机”状态On。在空调机AirConditioner处于“加湿净化”状态Cleanse时,可以通过“暂停加湿净化”事件cleanseTop进入“暂停”状态Pause,并且可以通过“恢复”事件resume以及恢复条件“a==1”恢复到“加湿净化”状态Cleanse。使用Papyrus建立上述空调机AirConditioner控制系统并存储为XML文件,如图3所示。
解析空调机AirConditioner控制系统的XML文件,并将解析后的信息数据作为模板引擎的输入数据,模板引擎根据模板文件中的占位符,替换为对应的数据,生成JAVA代码文件,如图4所示。
本发明提供了一种基于模板技术的状态机代码生成方法,具体实现该技术方案的方法和途径很多,以上所述仅是本发明的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技术加以实现。
Claims (8)
1.一种基于模板技术的状态机代码生成方法,其特征在于,包括以下步骤:
步骤1:建立具有完整功能的状态机图并保存为XML文件;
步骤2:解析状态机图XML文件,获得状态机信息数据;
步骤3:建立状态机图到JAVA代码的映射规则;
步骤4:基于映射规则构建模板文件;
步骤5:启动模板引擎并生成目标代码。
2.根据权利要求1所述的一种基于模板技术的状态机代码生成方法,其特征在于,所述步骤1建立具有完整功能的状态机图并保存为XML文件,在Eclipse的UML插件Papyrus插件中完成,所述完整功能的状态机图包括:简单状态,顺序复合状态,正交复合状态,虚拟并发复合状态,最终状态,转换,事件,历史伪状态、汇合伪状态、分支伪状态和选择伪状态;其中,通过XML文件的标签属性type能够区分状态、转移和伪状态;对于状态,通过标签属性isSimple和isComposite能够区分简单状态和复合状态,通过计算复合状态的region数量能够区分顺序复合状态和正交复合状态;虚拟并发复合状态是由一对分支伪状态和汇合伪状态及中间的状态组合成的;对于伪状态,通过kind属性能够区分历史伪状态、分支伪状态、汇合伪状态和选择伪状态。
3.根据权利要求1所述的一种基于模板技术的状态机代码生成方法,其特征在于,所述步骤2解析状态机图XML文件,包括:
步骤2-1,通过步骤1中XML文件的标签属性来识别不同类型的状态,所述不同类型的状态包括简单状态、顺序复合状态、正交复合状态和虚拟并发复合状态;
步骤2-2,使用Dom4j按照上述标签属性解析XML文件,获得状态机信息数据;所述状态机信息数据包括公共信息、简单状态信息、顺序复合状态信息、正交复合状态信息和虚拟并发复合状态。
4.根据权利要求3所述的一种基于模板技术的状态机代码生成方法,其特征在于,所述步骤2-2中所述公共信息包括转移目标状态类型,转移目标状态名称,转移目标状态层数,转移目标为复合状态时每一层的初始状态,转移目标为分支状态时分支状态信息;
所述简单状态信息包括简单状态名称,进入动作名称,退出动作名称,是否是初始状态的下一个目标状态,转移事件名称,转移动作名称,转移条件,转移目标状态是否是复合状态的子状态;
所述顺序复合状态信息包括顺序复合状态名称,是否是初始状态的下一个目标状态,是否含有历史状态,转移事件的名称,转移动作的名称,转移条件,该复合状态包含的简单子状态,该复合状态包含的顺序复合子状态,该复合状态包含的并发复合子状态;
所述正交复合状态信息包括正交复合状态状态名称,是否是初始状态的下一个目标状态,是否含有最终状态,是否含有历史状态,转移事件的名称,转移动作的名称,转移条件,该状态是否转移到汇合状态,该复合状态包含的简单子状态,该复合状态包含的顺序复合子状态,该复合状态包含的并发复合子状态;
所述虚拟并发复合状态包括虚拟并发复合状态的名称,转移事件的名称,转移动作的名称,转移条件,该虚拟状态里的简单子状态。
5.根据权利要求1所述的一种基于模板技术的状态机代码生成方法,其特征在于,所述步骤3建立状态机图到JAVA代码的映射规则,描述具有完整功能的状态机图与JAVA代码的映射关系,包括状态机的基本映射规则,简单状态到JAVA代码的映射规则,顺序复合状态到JAVA代码的映射规则,正交复合状态到JAVA代码的映射规则,虚拟并发复合状态到JAVA代码的映射规则,转移到JAVA代码的映射规则。
6.根据权利要求5所述的一种基于模板技术的状态机代码生成方法,其特征在于,所述步骤3中,所述状态机的基本映射规则包括:
状态机对应为一个上下文类和抽象状态类:上下文类用于状态管理;抽象状态类是所有状态类的基类,定义了每一个状态的行为集合;
所述简单状态到JAVA代码的映射规则包括:
1)简单状态对应为一个简单状态类,该类继承了抽象状态类;
2)简单状态的进入/退出活动对应类中的函数;
所述顺序复合状态到JAVA代码的映射规则包括:
1)顺序复合状态对应为一个复合状态类和一个辅助类,该复合状态类继承了抽象状态类;
2)顺序复合状态的子状态对应为一个子状态类,并继承辅助类;
3)上下文类中包含一个类型为抽象状态类的变量subState,用于记录活动状态;
4)复合状态类中包含一个整型变量hist,用于指示是否第一次到达该状态;
5)复合状态类中包含一个布尔变量isneedHist,用于指示是否使用历史状态;
6)复合状态类中包含一个布尔变量isEntry,用于指示是否调用entry函数;
7)复合状态类中包含一个函数resetOrigin,用于重置复合状态内部的初始状态;
8)复合状态类中包含一个函数setSubState,用于改变当前的子状态;
9)复合状态类中重写该状态类对应的事件函数;
所述正交复合状态到JAVA代码的映射规则包括:
1)正交复合状态对应为一个复合状态类,该复合状态类继承了抽象状态类;
2)正交复合状态的每一个并发层都要生成一个辅助类;
3)每一层的子状态生成代码规则参考顺序复合状态;
所述虚拟并发复合状态到JAVA代码的映射规则包括:
1)将虚拟并发复合状态看作一个正交复合状态,生成一个复合状态类;
2)每一个分支看作一个并发层,每个并发层构造一个辅助类
3)每一个分支的子状态生成代码规则参考顺序复合状态;
所述转移到JAVA代码的映射规则包括转移源状态为虚拟并发复合状态时到JAVA代码的映射规则,转移源状态为顺序复合状态的子状态时到JAVA代码的映射规则,转移源状态为正交复合状态连接汇合状态时到JAVA代码的映射规则,转移目标状态为分支状态时到JAVA代码的映射规则,转移目标状态为顺序复合状态时到JAVA代码的映射规则,转移目标状态为顺序复合状态的子状态时到JAVA代码的映射规则,转移目标状态为正交复合状态连接分支状态时到JAVA代码的映射规则。
7.根据权利要求1所述的一种基于模板技术的状态机代码生成方法,其特征在于,所述步骤4基于映射规则构建模板文件,是使用开源工具Acceleo模型转换语言描述状态机图到JAVA代码的映射规则,保存为模板文件;所述模板文件包括上下文类模板文件、抽象状态类模板文件、简单状态到JAVA代码的模板文件、顺序复合状态到JAVA代码的模板文件、正交复合状态到JAVA代码的模板文件、虚拟并发复合状态到JAVA代码的模板文件。
8.根据权利要求1所述的一种基于模板技术的状态机代码生成方法,其特征在于,所述步骤5启动模板引擎并上传生成目标代码,模板引擎输入状态机信息数据和模板文件,根据模板文件中的占位符,替换为对应的数据,输出JAVA代码文件;所述模板引擎使用开源工具Acceleo的模板引擎。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110836131.3A CN113553062A (zh) | 2021-07-23 | 2021-07-23 | 一种基于模板技术的状态机代码生成方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110836131.3A CN113553062A (zh) | 2021-07-23 | 2021-07-23 | 一种基于模板技术的状态机代码生成方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113553062A true CN113553062A (zh) | 2021-10-26 |
Family
ID=78104248
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110836131.3A Pending CN113553062A (zh) | 2021-07-23 | 2021-07-23 | 一种基于模板技术的状态机代码生成方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113553062A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114780071A (zh) * | 2022-03-30 | 2022-07-22 | 大连理工大学 | 基于epf的java代码生成工具 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103049264A (zh) * | 2012-12-17 | 2013-04-17 | 国电南京自动化股份有限公司 | 一种通过状态机动态建模实现对业务系统控制的方法 |
US20130212054A1 (en) * | 2012-02-15 | 2013-08-15 | The Mathworks, Inc. | Generating a state diagram |
CN103294462A (zh) * | 2012-03-05 | 2013-09-11 | 阿里巴巴集团控股有限公司 | 对象映射处理方法、映射处理器和对象映射处理系统 |
CN111176639A (zh) * | 2019-12-30 | 2020-05-19 | 南京航空航天大学 | 一种从SysML到AltaRica的自动化模型转换方法 |
CN111596915A (zh) * | 2020-05-19 | 2020-08-28 | 西安电子科技大学 | 基于状态机图的无人机飞行模式的c++代码生成方法 |
-
2021
- 2021-07-23 CN CN202110836131.3A patent/CN113553062A/zh active Pending
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20130212054A1 (en) * | 2012-02-15 | 2013-08-15 | The Mathworks, Inc. | Generating a state diagram |
CN103294462A (zh) * | 2012-03-05 | 2013-09-11 | 阿里巴巴集团控股有限公司 | 对象映射处理方法、映射处理器和对象映射处理系统 |
CN103049264A (zh) * | 2012-12-17 | 2013-04-17 | 国电南京自动化股份有限公司 | 一种通过状态机动态建模实现对业务系统控制的方法 |
CN111176639A (zh) * | 2019-12-30 | 2020-05-19 | 南京航空航天大学 | 一种从SysML到AltaRica的自动化模型转换方法 |
CN111596915A (zh) * | 2020-05-19 | 2020-08-28 | 西安电子科技大学 | 基于状态机图的无人机飞行模式的c++代码生成方法 |
Non-Patent Citations (1)
Title |
---|
郭冬阳: ""基于模板技术的UML状态图代码框架生成"", 《中国优秀硕士学位论文全文数据库信息科技辑》, pages 14 - 18 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114780071A (zh) * | 2022-03-30 | 2022-07-22 | 大连理工大学 | 基于epf的java代码生成工具 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Bouyer et al. | Quantitative analysis of real-time systems using priced timed automata | |
CN112416337B (zh) | 一种面向航天嵌入式系统的软件架构开发系统 | |
Baldassari et al. | PROTOB: An object oriented methodology for developing discrete event dynamic systems | |
Cengic et al. | On formal analysis of IEC 61499 applications, Part A: Modeling | |
CN106095404A (zh) | 一种业务过程模型至服务组成模型的自动模型转换方法 | |
CN101673198A (zh) | 一种验证uml模型中动态行为与时序契约的一致性的方法 | |
CN110262794A (zh) | 一种基于规范与描述语言的aadl功能行为拓展方法及工具 | |
CN108664241A (zh) | 一种将SysML模型进行仿真验证的方法 | |
CN110532167A (zh) | 一种基于模型转换的状态机模型时序性质验证方法 | |
CN113553062A (zh) | 一种基于模板技术的状态机代码生成方法 | |
Wiśniewski et al. | Analysis and design automation of cyber-physical system with hippo and IOPT-tools | |
CN114201397A (zh) | 一种接口测试建模方法、装置、电子设备和存储介质 | |
Li et al. | Recursive modeling of stateflow as input/output-extended automaton | |
Lindsay | Behavior trees: from systems engineering to software engineering | |
Alshareef et al. | An an approach for activity-based DEVS model specification | |
Seow | Integrating temporal logic as a state-based specification language for discrete-event control design in finite automata | |
Spanoudakis et al. | Gaia agents implementation through models transformation | |
JP2005222221A (ja) | 組込コントローラ開発ツール、組込コントローラ、及び組込コントローラ開発プロセス | |
CN118556215A (zh) | 工作流控制方法、装置、系统、介质及程序产品 | |
Sultana et al. | Computational conversion via translation rules for transforming C++ code into UPPAAL’s automata | |
JP2002055717A (ja) | 故障診断システム | |
Zboril Jr et al. | Simulation for Wireless Sensor Networks with Intelligent Nodes | |
Billington et al. | Plausible logic facilitates engineering the behavior of autonomous robots | |
CN114357763B (zh) | 基于双流图的Safety_SysML错误模型分析方法 | |
Abdelmalek et al. | A Bimodal Approach for the Discovery of a View of the Implementation Platform of Legacy Object-Oriented Systems under Modernization Process. |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |