CN108228158A - 一种基于本体的架构行为模式识别方法 - Google Patents
一种基于本体的架构行为模式识别方法 Download PDFInfo
- Publication number
- CN108228158A CN108228158A CN201810050272.0A CN201810050272A CN108228158A CN 108228158 A CN108228158 A CN 108228158A CN 201810050272 A CN201810050272 A CN 201810050272A CN 108228158 A CN108228158 A CN 108228158A
- Authority
- CN
- China
- Prior art keywords
- ontology
- behavior pattern
- event
- individual
- behavior
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种基于本体的架构行为模式识别方法,先对目标软件系统进行信息抽象并形成系统描述本体;然后对架构模式进行定义,进行行为建模、构建行为模式描述本体并编写行为模式模板;再运行目标软件系统并获取运行日志,根据构建的行为模式描述本体中包含的词汇,对获取的运行日志进行解析,将解析出的动态信息加入系统描述本体,形成动态信息描述本体;最后将动态信息描述本体作为输入,使用Jena ARQ查询引擎作为行为模式模板的执行引擎,进行行为模式匹配,得到行为模式实例。本发明将动态信息引入架构模式的识别,弥补了现有的基于静态结构分析的模式识别方法的不足,对行为模式的分析提高了模式识别的准确性。
Description
技术领域
本发明涉及一种基于本体的架构行为模式识别方法,属于软件工程中的逆向工程领域。
背景技术
软件架构描述了系统的功能元素及其相互关系,是软件开发过程中系统设计阶段的主要产物。软件架构所使用的模式是软件架构的重要组成部分。架构模式为系统环境中重复出现的设计问题提供了经过验证的解决方案,在软件系统的开发、演进和维护过程中起着至关重要的作用。使用逆向工程识别架构模式的主要原因包括:文档管理不完善造成设计文档不全或丢失;文档无法获取或丢失更新;反向验证系统实施是否与设计相符等。
架构模式识别的一般过程为,首先对系统进行抽象,然后将抽象后的信息与模式模板进行匹配,进而获取模式实例。在自动化或半自动化架构模式识别方法中,通常不直接以源码本身作为识别过程的输入,因为过多的细节会造成效率问题,同时模式作为一种高层抽象不完全对应于源码。系统信息及模式的表示形式大体上可分为形式化和非形式化两类。典型的形式化表示包括DSL(Domain Specific Language)、FCA(Formal ConceptAnalysis)以及ADL(Architectural Description Language)等。典型的非形式化表示包括图、UML等。非形式化表示方式的优点是易于掌握、适用性强,但描述不精确、推理能力差或不支持推理。
在现有的识别方法中,信息抽象过程往往是对静态结构信息的提炼,然而动态行为信息也是架构模式的一个重要方面。特别是在动态绑定、消息机制等技术环境下,程序实体间的关系变得异常复杂,仅通过静态结构信息无法对架构模式的交互方面进行分析。
发明内容
发明目的:本发明提供了一种基于本体的,使用描述逻辑作为架构模式建模的途径,使用本体作为系统信息抽象的载体,将静态信息和动态信息结合起来用于架构行为模式识别的方法。
技术方案:本发明的基于本体的架构模式建模方法,包括如下步骤:
(1)对目标软件系统进行信息抽象,形成系统描述本体;
(2)定义架构模式,参照此定义进行行为建模:添加新的词汇对架构模式的行为方面进行刻画,构建行为模式描述本体,并编写行为模式模板;
(3)运行步骤(1)中的目标软件系统并获取运行日志,根据步骤(2)中构建的行为模式描述本体中包含的词汇,对获取的运行日志进行解析,将解析出的动态信息加入步骤(1)中形成的系统描述本体,形成动态信息描述本体;
(4)将步骤(3)中形成的动态信息描述本体作为输入,使用Jena ARQ查询引擎作为步骤(2)中编写的行为模式模板的执行引擎,进行行为模式匹配,得到行为模式实例。
进一步的,所述步骤(1)中信息抽象的具体步骤如下:
(1.1)获取目标软件系统源码中的代码元素集合E={E1,E2,...,Ei,...}(i为正整数,表示集合中元素的下标),遍历E中的每个元素,生成命名个体集合I={I1,I2,...,Ii,...},设置每个个体所属的本体类(rdf:type),并将所有个体添加进系统描述本体O;
(1.2)对于本体属性集合P={P1,P2,...,Pi,...}中的每个元素,根据其定义域Di在个体集合I中遍历属于Di的所有个体,对于遍历的个体Ii,执行步骤(1.3);
(1.3)在对应于当前遍历的个体Ii的代码元素Ei中,查找所有关于Pi的代码元素E′,将个体集合I中所有对应于E'的个体设置为当前遍历的个体Ii的Pi属性,并将每条属性记录添加进系统描述本体O。
进一步的,所述步骤(1)中形成的系统描述本体存储在Jena三元组数据库TDB(Triple Database)中。
进一步的,所述步骤(2)中进行行为建模的具体步骤如下:
(2.1)建立基本词汇,对包括行为在内的动态信息进行描述;
(2.2)引入架构描述语言ACME(Garlan,Monroe,Wile,2000)对行为模式进行建模,构建行为模式描述本体;
(2.3)根据步骤(2.2)中构建的行为模式描述本体,使用SPARQL更新语言(UpdateLanguage)编写行为模式模板。
进一步的,所述步骤(2.1)中基本词汇包括:表示事件的本体类Event、表示实体状态的本体类State、将实体关联到实体状态的对象属性boundTo、将实体状态关联到时间点的数据属性atTimepoint以及将时间上相邻的状态链接起来的对象属性preState和nextState,其中在具体行为建模时,本体类Event为所使用的所有事件类的父类,本体类State为所使用的所有状态类的父类。
进一步的,所述步骤(3)中日志记录为多行的文本文件,每行记录了多个键-值对,具体的格式为:
event_name:entityE[_name:entityP]
其中event_name为事件名,param_name为参数名,entityE和entityP为对应实体,符号表示空格,[]表示可选字段。在一行记录中,event_name:entityE为必有字段,param_name:entityP字段可能有多个。
进一步的,所述步骤(3)中对获取的运行日志进行解析的具体步骤如下:
(3.1)初始时将时间点tp(正整数)置为1,对于日志中的每一行Lj(j为行号),执行步骤(3.2)至(3.6);
(3.2)对于行Lj,如果系统描述本体O中存在对应于event_name的Event的某个子类SubEvent,则在如果系统描述本体O中使用entityE创建属于SubEvent的个体IE;
(3.3)对于行Lj,如果系统描述本体O中存在对应于event_name的State的某个子类SubState,则在系统描述本体O中创建属于SubState的个体IES,并使用boundTo将IE关联到IES,使用atTimepoint将IES关联到tp;
(3.4)若对于行Lj-1存在相应的状态I′E,且当前行存在状态IE,则使用preState将IE关联到I′E,使用nextState将I′E关联到IE;
(3.5)将行Lj中所有的param_name:entityP键值对解析为键的集合K={K1,K2,...,Ki,...}和值的集合V={V1,V2,...,Vi,...},对于集合K中的每个值Ki,若系统描述本体O中存在对应于Ki的属性Pp,则使用Vi创建个体Ip,并使用Pp将IE关联到Ip;
(3.6)时间点tp自增1。
有益效果:本发明基于本体,将架构模式的动态模型与静态模型结合起来,共同用于架构的行为模式识别。与现有技术相比,本发明的优点在于:
(1)与系统信息抽象的其他表示形式相比,本发明中的本体具有较强的表达能力和可复用性。推理引擎为本体中隐含知识的获取提供了强大的支持。本体具有丰富和广泛的开发工具及编程框架支持,使得本体的开发工作易于进行;
(2)系统程序中的很多特性,诸如条件分支、动态绑定、消息机制、远程过程调用等,使得系统程序实体间的关联关系难以确定,仅通过静态代码分析无法从源码中提取用于行为分析的有效信息。对行为模式的分析拓展了逆向工程领域中模式识别方法的能力。行为模式揭示了交互元素间潜在的动态关联关系,提供了静态结构信息无法覆盖的分析能力。动态行为信息消除了静态分析中实质上不存在的关联,同时将看似不相关的潜在关联确定下来,提高了模式识别方法的准确性。
附图说明
图1为本发明的总体流程图;
图2为实施例中HelloWorld类的本体描述;
图3为实施例中对变量不同状态的描述;
图4为实施例中日志解析生成的动态信息描述;
图5为使用JDT和Jena进行静态结构信息抽取;
图6为MVC模式的行为模型。
具体实施方式
下面结合附图和具体实施方式,进一步阐明本发明。
本发明以本体为载体,在静态结构信息的基础上,从系统运行日志中抽取动态信息,将两者融合起来对系统进行刻画,用于行为模式的识别,强调本体的表达能力和可复用性,以及对动态信息的处理能力。
一、体系结构
图1给出了基于本体的架构行为模式识别方法的整体流程,下面对几个主要部分进行具体说明。
1、信息抽象
信息抽象过程的功能是从需要进行模式识别的系统程序源码中抽取信息,将抽取出的信息保存在本体中。该过程是对系统源码中包含的静态结构信息的解析和转换,本体是转换后的符号信息的载体。后续的其他各过程均依赖于系统的静态结构信息,因此信息抽象过程产生的系统描述本体是后续过程的基础。
系统描述本体是对源码中的实体(Entity)的直接表达,在形式上采用命名个体(Named Individual)表示实体,采用本体类(Class)表示源码中同类实体的集合,采用对象属性(Object Property)关联个体和个体,采用数据属性(Data Property)关联个体和数值。下面以Java语言的HelloWorld程序为例,讲解源码实体在本体中的表达:
在本体中表示上述Java类以及成员变量、成员函数等实体,首先定义以下本体类,并生成相关个体:
这些实体之间有各种不同的关系,为了对本体间的关系进行表达,定义如下对象属性:
个体间以及个体与数值的关系可以用一个三元组表示:
(主语谓语宾语)
这样的一条三元组称为一个事实。其中主语为个体,谓语为对象属性或数据属性,宾语为个体或数值。关于上述对象属性,其定义域指明了主语所属的本体类,值域指明了宾语所属的本体类或数据类型。如图2所示,通过上述定义,本体表达了源码中有哪些类(JClass),它们属于(inPackage)哪个包(Package),继承(extends)了哪个类或接口,包含(hasMethod)了哪些成员函数(Method)等等。
值得指出的是,上述本体并不包含HelloWorld类的全部细节,主要有两方面的原因。首先,信息抽象的本意是将源码中的相关实体转换为便于处理的形式,且仅处理后续过程关心的部分。因此在本例中,如果不关心main函数的修饰符(public),就不必在本体中创建对应元素,或者在信息提取时忽略。其次,本例并没有尝试列举所有可能获取的信息,例如java.lang.String类继承了哪个类,它在哪个包中。
本体解决了抽象信息如何表示的问题,如何抽象即抽象的具体过程将在下文“具体过程”一节详细叙述。另一方面,本体表示方式允许多种形式的复用和扩展:(1)直接使用已有本体。网络中存在大量本体资源可供使用;(2)综合利用多个本体。可以导入多个不同来源的本体,选择性的复用感兴趣的部分;(3)基于已有本体进行开发。可以对已有个体重新分类,也可以对个体间的关系重新表述,还可以修正、删除已有事实,增加新的事实。已有本体中可利用的资源也是多样的,既可以是与源码中的实体直接对应的元素,也可以是抽象概念,例如对架构模式的抽象描述。能够对不同抽象层次、不同粒度的元素进行再利用,也是本体复用和扩展的一个有利特点。
信息抽象过程通常是自动化进行的,现有工具及编程框架对静态代码分析提供了丰富和广泛的支持,系统程序的静态结构信息易于获取。
2、行为建模
行为建模的目的是对系统的行为模式进行刻画,其产出是行为模式描述本体及行为模式模板。在对静态结构信息建模时,其描述的对象是时间无关的实体,例如类包含成员方法、函数具有参数等。为了对时间相关的信息进行描述,需要使用新的词汇进行建模。对时间的表示一般可分为基于时间段的(interval-based)和基于时间点的(point-based)。后者在处理运行日志时更为直接和简便,因此在本发明中采用后者。新增的词汇如下表所示:
其中Event表示事件,即实体发出的动作,本发明中行为的表达是基于事件的。State表示实体的状态,即实体在不同时间点上的变化。实体或事件在不同时间点上可具有不同的状态,使用boundTo将实体或事件关联到不同的状态,以此表示实体的变化。而每一个State都具有不同的时间点,即将State使用atTimepoint关联到一个整型的字面量,该字面量表示顺序的时刻。另外两个属性preState和nextState将时间上相邻的状态链接起来,形成类似于双向链表的结构,便于本体推理和查询。在日志解析过程中,对这两个属性的处理是可选的。这样以来,实体的变化可以通过不同的状态进行描述。以图3为例,它描述了一个变量在不同时刻的值。
在图3中,变量v属于本体类Variable,它是java.lang.Integer的一个实例。v绑定(boundTo)到了三个不同的状态s001、s002、s003,三个不同状态分别对应于不同的时间点,数据属性hasValue将每个状态分别关联到一个整型字面量,表示出v在相应时间点的值。
本例体现出几个关键点。首先,动态信息在静态信息的基础之上进行表达,这与现实中的情形吻合。例如,可执行程序一般存储在磁盘上,可视为一组静态数据,操作系统的加载进程将其加载进内存后才能运行;又如,Java类是对象的模板,可以实例化出不同的对象。在本例中,java.lang.Integer属于JClass,这一事实可通过静态信息提取获得,而变量v是它的一个实例(instanceOf),v的值仅能从动态信息中获取。这样以来,动态信息增量的融合进静态结构信息之中。其次,hasValue属性将状态与一个字面量关联起来,进而表示变量与时间相关的值。除此之外,状态还允许使用多个属性与其他个体或数据进行关联,这种关联是可选的、灵活的,这也属于本体可扩展性的一个体现。
图3展示了使用状态描述实体的变化,实际中常见的状态包括MethodEnter、MethodExit等,均以State作为父类。另一类动态信息为行为,常见的Event包括MethodCall、RemoteProcedureCall等,均以Event作为父类。上述基础词汇为包括行为在内的动态信息的描述提供了一种解决方案,在此基础上,为了对行为模式进行刻画,引入架构描述语言ACME(Garlan,Monroe,Wile,2000)。它是卡耐基·梅隆大学的Garlan等人创建的。ACME支持将架构抽象成风格或模式,通过七种核心类型实体来定义架构:组件(Component)、连接件(Connector)、系统(System)、端口(Port)、角色(Role)、表述(Representation)和表述映射(Representation Map)。因此它支持架构的组件和连接件视图。系统的额外结构以注释属性的形式进行描述,即具有可选类型的名称-值对。设计约束(Constrain)是ACME的一种特殊属性,它将基于一阶谓词逻辑的设计元素关联起来。在七种核心类型中,连接件表示组件交互的接口。一个组件可以有多个端口,每个端口表示组件与外界环境的一个交互点。可以简单的将一个过程调用表示为端口,也可以将一系列必须顺次执行的过程调用表示为端口。连接件中参与交互的接口称为角色,将端口连接(attach)到角色以通过角色所属的连接件表示组件间的交互。使用ACME进行模式建模的实例参见下文“实施实例”一节。
行为建模过程的另一输出是行为模式模板,它的作用有两个:(1)用于下述“行为模式匹配”过程,从本体数据库中匹配出行为模式所描述的相关实体;(2)将匹配结果更新至数据库,作为行为模式的实例便于直接查询。编写行为模式模板使用的语言为SPARQL更新语言(Update Language),它是SPARQL查询语言(Query Language)的配套语言,与后者协同使用。
3、日志解析
日志解析过程的功能是:基于系统描述本体和行为模式描述本体,将运行日志转换为本体形式的动态信息描述。具体而言,即将多行的日志文本转换为对应的命名个体并设置相关属性。例如,以下两行日志记录了main函数的启动执行和结束:
method_entry:cn.edu.seu.HelloWorld.main
method_exit:cn.edu.seu.HelloWorld.main
图4示意了日志解析生成的动态信息描述,其中Event的子类MethodCall表示方法调用事件,State的两个子类MethodEnter和MethodExit分别表示方法的进入和结束状态。对于第一行,生成MethodCall的个体mc,它调用的方法(callsMethod)为cn.edu.seu.HelloWorld.main。同时生成MethodEnter的个体s001,时间点(atTimepoint)为1,并将mc绑定(boundTo)到s001。对于第二行,生成个体s002,时间点为2。同时将mc绑定到s002,并关联前后两个状态(preState、nextState)。
本发明方法明确了运行日志的格式,对于运行日志的获取,可通过多种途径完成,通常包括三种:(1)通过插桩收集程序的动态信息;(2)内建日志收集功能模块;(3)通过监控接口访问程序的运行状态。三种方法均有较强的可行性。在下文“实施实例”一节,使用的方法为第三种,编程接口为JVMTI(JVM Tool Interface)。
4、行为模式匹配
行为模式匹配过程使用行为模式模板(SPARQL更新语言),通过ARQ查询引擎,从TDB数据库中匹配出行为模式实例并更新数据库。TDB不仅提供了从RDF三元组到磁盘块的多级缓存,还提供了多种策略对查询进行优化,满足了查询的性能需求。
二、具体过程
本发明方法使用描述逻辑作为架构模式建模的途径,使用本体作为系统信息抽象的载体,将静态信息和动态信息结合起来用以识别架构的行为模式,以下为具体过程。
步骤1)信息抽象。抽取软件系统T的静态结构信息,形成系统描述本体O,存储在Jena三元组数据库TDB中,具体步骤为:
(a)生成各本体类的个体。对于T的代码元素集合E={E1,E2,...,Ei,...}(i为正整数,表示集合中元素的下标)中的每个元素,在本体O中生成命名个体集合I={I1,I2,...,Ii,...},并设置每个个体所属的本体类(rdf:type);
(b)遍历各本体属性的定义域。对于本体属性集合P={P1,P2,...,Pi,...}中的每个元素,根据其定义域Di在个体集合I中遍历属于Di的所有个体,对于遍历的个体Ii,执行步骤(c);
(c)使用属性Pi关联个体。在对应于Ii的代码元素Ei中,查找所有关于Pi的代码元素E′,在本体O中将集合I中所有对应于E'的个体设置为个体Ii的Pi属性。
系统描述本体是动态信息描述本体的基础,后续日志解析步骤将动态信息增量的融合到系统描述本体之中。
步骤2)行为建模。具体步骤为:
(a)建立动态信息描述的基本词汇。所建立的基本词汇有:表示事件的本体类Event、表示实体状态的本体类State、将实体关联到实体状态的对象属性boundTo、将实体状态关联到时间点的数据属性atTimepoint以及将时间上相邻的状态链接起来的对象属性preState和nextState;
(b)行为模式建模。引入架构描述语言ACME对行为模式进行建模;
(c)编写行为模式模板。使用SPARQL更新语言(Update Language)编写行为模式模板。
步骤3)日志解析。获取并解析系统T的运行日志,形成动态信息描述本体。日志行的具体格式为:
event_name:entityE[_name:entityP]
日志解析的具体步骤为:
(a)初始时将时间点tp置为1,对于日志中的每一行Lj(j为行号),执行下述步骤(b)至(f);
(b)对于行Lj,若本体O中存在对应于event_name的Event的某个子类SubEvent,则在本体O中使用entityE创建属于SubEvent的个体IE;
(c)对于行Lj,若本体O中存在对应于event_name的State的某个子类SubState,则在本体O中创建属于SubState的个体IES,并使用boundTo将IE关联到IES,使用atTimepoint将IES关联到tp;
(d)若对于行Lj-1存在相应的状态I'E,且当前行存在状态IE,则使用preState将IE关联到I′E,使用nextState将I′E关联到IE;
(e)将行Lj中所有的param_name:entityP键值对解析为键的集合K={K1,K2,...,Ki,...}和值的集合V={V1,V2,...,Vi,...},对于集合K中的每个值,若本体O中存在对应于Ki的属性Pp,则使用Vi创建个体Ip,并使用Pp将IE关联到Ip;
(f)时间点tp自增1。
步骤4)执行行为模式匹配。ARQ查询引擎执行行为模式模板,获取行为模式实例并更新动态信息描述本体。
三、实施实例
本节以开源软件FreeCol 0.11.6为例,详述本发明方法的各步骤。FreeCol是一款回合制的策略游戏,开发语言为Java。其用户界面使用Java Swing进行开发,使用了MVC(ModelViewController)架构模式。为了识别MVC的行为模式,首先使用JDT(JavaDevelopmentTools)自动化的进行静态结构信息提取,然后对MVC的行为方面进行分析,建立行为模式模型,随后通过JVMTI获取FreeCol的运行日志,并解析为动态信息描述本体,最终对行为模式进行匹配,获取行为模式实例。
(1)信息抽象
使用JDT和Jena进行静态结构信息抽取的过程如图5所示。JDT从源码建立抽象语法树,对源码中的实体进行解析。本实例对JDT进行了进一步封装,使用一种图数据结构将实体信息及实体间的关联包含在其中。该数据结构提供了一种延迟解析的特性,初始时不对源码中所有实体进行解析。当Jena OntologyAPI从中获取信息时,根据需要递归的构建图的必要部分。该结构同时作为一种缓存机制,多次获取相同信息时能够快速响应。完成抽取后,将系统描述本体保存在三元组数据库TDB中。
对静态结构信息进行描述时,使用的词汇除在上文用于描述HelloWorld类的本体类、本体属性之外,还包括下表中列出的词汇。
其中本体类AbstractJClass和NormalJClass分别表示抽象类和非抽象类,AbstractMethod和NormalMethod分别表示抽象方法和非抽象方法,LocalPackage和RemotePackage分别表示当前系统命名的包和引用的依赖包;本体属性containsDeclaration表示方法中声明的类或接口,implements表示类实现的接口,returns表示方法的返回类型,isConstructor表示方法是否是构造函数。
(2)行为建模
本实例使用ACME的四种核心类型,即组件、连接件、端口及角色进行架构模式建模。将组件定义为具有端口的实体,将连接件定义为具有角色的实体,将角色定义为连接到端口的实体,将MVC定义为包含Model、View及Controller三种组件的架构模式,对应的描述逻辑如下:
ACME端口标识组件与其环境之间的交互点,连接件表示组件间的交互。连接件中参与交互的接口称为角色,将端口连接到角色以表示组件间的交互。行为建模即通过端口、连接件以及角色对行为模式进行描述。
在MVC架构模式中,模型(Model)代表核心数据和功能,它通常包含通知机制以便在数据更新时通知关联的视图(View)和控制器(Controller)。视图和控制器如果需要接收这种通知,则需向模型注册。视图一般表现为用户界面,负责向用户展示数据,其数据的来源是通过访问模型获得的。而控制器通常包含了用户操作的处理过程,当用户发出操作时,视图请求控制器的处理。控制器通过解析视图的处理请求,访问模型获取相应的数据,以便更新视图的显式状态。
考察MVC模式中组件之间的交互:更新传播机制允许视图和控制器将自己(ViewAttachCallerPort,ControllerAttachCallerPort)注册到模型(AttachCalleePort)。模型将在更新过程中通知(NotifierPort)每个注册的视图和控制器。作为响应,注册的视图(ViewUpdaterPort)请求来自模型(DataProviderPort)的更新数据重绘自身(ViewDataConsumerPort),而注册的控制器(ControllerDataConsumerPort)从模型中检索数据以同步相关视图的显示状态(ControllerSynchronizerPort)。
在视图的初始化过程中,它创建一个相应的控制器(ControllerCreatorPort),用于响应用户的操作。与视图关联的控制器通过专用的过程(EventHandlerPort)处理用户事件。在这个专用的处理过程中,控制器解释事件(ServiceCallerPort),并激活模型的服务程序(ServiceCalleePort)。
图6展示了MVC的上述行为模型,简洁起见没有标记相关的角色。需要指出的是,该模型是对MVC行为模式的一种标准的、理想化的描述,它的意义在于提供了对MVC模式的行为方面的一般性刻画。在现实系统中,架构师对模式的理解有所差异,需要解决的现实问题复杂多变,组件间的交互行为也是多样的、可变的。既不是对该模型的完全复制,也不必完全遵循已有的定义。因此,行为模式的识别常需要借助领域知识。以EventConnector、ControllerCreatorPort、EventHandlerPort、ControllerCreatorRole及EventHandlerRole为例,它们刻画了视图创建控制器、由控制器响应用户操作这一行为模式。在Java Swing中,响应动作事件的类通常会实现java.awt.event.ActionListener接口,可视化组件通过addActionListener方法将该类的对象进行注册,事件发生时ActionListener接口的下列方法将会被调用:
void actionPerformed(ActionEvent e)
利用这一领域知识,编写下述行为模式模板:
其中where子句为条件匹配子句,它将匹配的三元组中相应的位置绑定到以问号(?)开头的变量。insert子句为插入子句,将where子句匹配得到的三元组插入本体。开头的@prefix子句定义了本体URI的缩写,本实例中构建了一系列本体,它们之间具有层次及导入关系,实现了本体的有效复用。insert子句的每一行表示一个事实,将识别出的连接件、端口及角色添加进本体,并通过属性将它们关联起来。以下是对where子句的简要释义:
Java类?nc具有成员函数?ap,该函数名称为actionPerformed,且具有参数java.awt.event.ActionEvent。MethodCall事件?mc调用了(callsMethod)?nc的构造函数?cns,而该事件发生在对?clm函数的调用中(callingMethod)。?clm函数所在的类为?cls。filter一句排除了构造函数调用同一类的其他构造函数的情况。bind一句使用?clm和?ap的URI构造了一个以“ec.”开头的命名个体,并绑定到变量?ec。
(3)日志解析
本实例使用JVMTI编写代理(Agent)程序,获取运行日志。JVMTI是一套供开发及监视工具使用的编程接口,它能够检查在Java虚拟机(VM)中运行的应用程序的状态,并控制其执行。代理程序注册了感兴趣的虚拟机事件,当事件发生时,相应的处理过程被调用。利用这种机制,可以在不修改程序源码的情况下获取运行日志。常用的事件包括:ClassLoad、Field Access、Field Modification、Method Entry、Method Exit、Object Free等。
代理程序使用C++编写,并编译为TraceAgent.dll,然后使用下述命令运行FreeCol并加载代理程序:
java-Xmx512M-Dsun.java2d.d3d=false"-agentpath:F:\Workspace\JVMTI\TraceAgent\x64\Release\TraceAgent.dll=method=net/sf/freecol/(client/control|client/gui/action|common/model)&!\$&!TerrainCursor;"-jarFreeCol.jar%*
其中-agentpath参数指定了代理程序的路径,“TraceAgent.dll=”后的部分为传入代理程序的参数,-jar指定了FreeCol程序的可执行jar包。传入代理程序的参数格式是本实例中自定义的,具体为:
event_type=[[!]regex][&[!]regex][#event_type=[[!]regex][&[!]regex]]
其中event_type为记录的事件类型,regex为正则表达式,以!起始表示取否,#号用于连接多个事件。仅当使用&连接的所有正则表达式均匹配时,将事件信息写入运行日志。因此上述参数仅处理与方法相关的事件,将监控范围限制在若干个包中,且剔除了内部类(!\$)及处理光标的相关事件(!TerrainCursor;)。具体的操作步骤为:
1)运行上述命令;
2)点击“Load Game”按钮,选择一个此前的存档并确定;
3)使用菜单栏退出游戏。
上述步骤试探性的触发控制器的事件处理过程,需要人工进行。除此之外,日志记录及解析过程均自动化进行。
(4)行为模式匹配
动态信息描述本体融合了系统描述本体以及行为模式的一系列本体,行为模式匹配使用ARQ引擎执行行为模式模板,即SPARQL更新语言脚本,将组件的端口映射为满足筛选条件的过程调用,并将交互的组件端口通过连接件关联起来。执行模式匹配后获取了73个EventConnector的实例。这些实例均为net.sf.freecol.client.gui.action包中的类,其中所有的ControllerCreatorPort均指向ActionManager类。通过人工分析进行验证,发现FreeCol中处理用户事件的相关类均是在ActionManager类的initializeActions函数中进行实例化的。ActionManager将这些类的实例保存在一个映射表(HashMap)中,对这些实例进行统一管理。映射表的键为事件的ID,其他过程通过事件ID对这些实例进行访问。由此可见,虽然FreeCol的MVC实现不同于MVC模式的典型实现,但动态行为分析超越了具体的实现细节,识别结果准确。
上述实施例仅是本发明的优选实施方式,应当指出:对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和等同替换,这些对本发明权利要求进行改进和等同替换后的技术方案,均落入本发明的保护范围。
Claims (7)
1.一种基于本体的架构行为模式识别方法,其特征在于,包括如下步骤:
(1)对目标软件系统进行信息抽象,形成系统描述本体;
(2)定义架构模式,参照此定义进行行为建模:添加新的词汇对架构模式的行为方面进行刻画,构建行为模式描述本体,并编写行为模式模板;
(3)运行步骤(1)中的目标软件系统并获取运行日志,根据步骤(2)中构建的行为模式描述本体中包含的词汇,对获取的运行日志进行解析,将解析出的动态信息加入步骤(1)中形成的系统描述本体,形成动态信息描述本体;
(4)将步骤(3)中形成的动态信息描述本体作为输入,使用Jena ARQ查询引擎作为步骤(2)中编写的行为模式模板的执行引擎,进行行为模式匹配,得到行为模式实例。
2.根据权利要求1所述的一种基于本体的架构行为模式识别方法,其特征在于,所述步骤(1)中信息抽象的具体步骤如下:
(1.1)获取目标软件系统源码中的代码元素集合E={E1,E2,...,Ei,...},其中i为正整数,表示集合中元素的下标,遍历E中的每个元素,生成命名个体集合I={I1,I2,...,Ii,...},设置每个个体所属的本体类(rdf:type),并将所有个体添加进系统描述本体O;
(1.2)对于本体属性集合P={P1,P2,...,Pi,...}中的每个元素,根据其定义域Di在个体集合I中遍历属于Di的所有个体,对于遍历的个体Ii,执行步骤(1.3);
(1.3)在对应于当前遍历的个体Ii的代码元素Ei中,查找所有关于Pi的代码元素E′,将个体集合I中所有对应于E′的个体设置为当前遍历的个体Ii的Pi属性,并将每条属性记录添加进系统描述本体O。
3.根据权利要求1所述的一种基于本体的架构行为模式识别方法,其特征在于,所述步骤(1)中形成的系统描述本体存储在Jena三元组数据库TDB中。
4.根据权利要求1所述的一种基于本体的架构行为模式识别方法,其特征在于,所述步骤(2)中进行行为建模的具体步骤如下:
(2.1)建立基本词汇,对包括行为在内的动态信息进行描述;
(2.2)引入架构描述语言ACME对行为模式进行建模,构建行为模式描述本体;
(2.3)根据步骤(2.2)中构建的行为模式描述本体,使用SPARQL更新语言编写行为模式模板。
5.根据权利要求4所述的一种基于本体的架构行为模式识别方法,其特征在于,所述步骤(2.1)中基本词汇包括:表示事件的本体类Event、表示实体状态的本体类State、将实体关联到实体状态的对象属性boundTo、将实体状态关联到时间点的数据属性atTimepoint以及将时间上相邻的状态链接起来的对象属性preState和nextState,其中在具体行为建模时,本体类Event为所使用的所有事件类的父类,本体类State为所使用的所有状态类的父类。
6.根据权利要求1所述的一种基于本体的架构行为模式识别方法,其特征在于,所述步骤(3)中日志记录为多行的文本文件,每行记录了多个键-值对,具体的格式为:
其中event_name为事件名,param_name为参数名,entityE和entityP为对应实体,符号表示空格,[]表示可选字段,event_name:entityE为必有字段。
7.根据权利要求1所述的一种基于本体的架构行为模式识别方法,其特征在于,所述步骤(3)中对获取的运行日志进行解析的具体步骤如下:
(3.1)初始时将时间点tp置为1,tp为正整数,对于日志中的每一行Lj,j为行号,执行步骤(3.2)至(3.6);
(3.2)对于行Lj,如果系统描述本体O中存在对应于event_name的Event的某个子类SubEvent,则在如果系统描述本体O中使用entityE创建属于SubEvent的个体IE;
(3.3)对于行Lj,如果系统描述本体O中存在对应于event_name的State的某个子类SubState,则在系统描述本体O中创建属于SubState的个体IES,并使用boundTo将IE关联到IES,使用atTimepoint将IES关联到tp;
(3.4)若对于行Lj-1存在相应的状态I′E,且当前行存在状态IE,则使用preState将IE关联到I′E,使用nextState将I′E关联到IE;
(3.5)将行Lj中所有的param_name:entityP键值对解析为键的集合K={K1,K2,...,Ki,...}和值的集合V={V1,V2,...,Vi,...},对于集合K中的每个值Ki,若系统描述本体O中存在对应于Ki的属性Pp,则使用Vi创建个体Ip,并使用Pp将IE关联到Ip;
(3.6)时间点tp自增1。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810050272.0A CN108228158B (zh) | 2018-01-18 | 2018-01-18 | 一种基于本体的架构行为模式识别方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810050272.0A CN108228158B (zh) | 2018-01-18 | 2018-01-18 | 一种基于本体的架构行为模式识别方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108228158A true CN108228158A (zh) | 2018-06-29 |
CN108228158B CN108228158B (zh) | 2021-03-19 |
Family
ID=62667983
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810050272.0A Active CN108228158B (zh) | 2018-01-18 | 2018-01-18 | 一种基于本体的架构行为模式识别方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108228158B (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109918646A (zh) * | 2019-01-30 | 2019-06-21 | 中国科学院自动化研究所 | 篇章因果关系判断方法、系统、装置 |
CN109976727A (zh) * | 2019-03-31 | 2019-07-05 | 东南大学 | 一种基于设计模式的mvc架构模式识别方法 |
CN109992271A (zh) * | 2019-03-31 | 2019-07-09 | 东南大学 | 一种基于代码词汇和结构依赖的分层架构识别方法 |
CN111984311A (zh) * | 2020-07-03 | 2020-11-24 | 华南理工大学 | 一种基于运行日志的软件结构复现的方法 |
CN113672206A (zh) * | 2021-09-02 | 2021-11-19 | 北京航空航天大学 | 一种x语言混合建模平台及建模方法 |
CN114579712A (zh) * | 2022-05-05 | 2022-06-03 | 中科雨辰科技有限公司 | 基于动态模型的文本属性提取匹配方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101211262A (zh) * | 2007-12-25 | 2008-07-02 | 覃征 | 一种软件体系结构描述语言的快速构建和支持的方法 |
WO2012027772A1 (en) * | 2010-09-01 | 2012-03-08 | White Flame Pty Ltd | A method of preparing a list of entity data and computer readable code, computers and systems adapted for displaying a list of entity data in a dynamic information pane |
CN104615437A (zh) * | 2015-02-12 | 2015-05-13 | 浪潮电子信息产业股份有限公司 | 一种基于gpu的软件体系架构及uml和adl结合描述的方法 |
CN107368302A (zh) * | 2017-06-28 | 2017-11-21 | 东南大学 | 一种基于本体的设计模式识别方法 |
-
2018
- 2018-01-18 CN CN201810050272.0A patent/CN108228158B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101211262A (zh) * | 2007-12-25 | 2008-07-02 | 覃征 | 一种软件体系结构描述语言的快速构建和支持的方法 |
WO2012027772A1 (en) * | 2010-09-01 | 2012-03-08 | White Flame Pty Ltd | A method of preparing a list of entity data and computer readable code, computers and systems adapted for displaying a list of entity data in a dynamic information pane |
CN104615437A (zh) * | 2015-02-12 | 2015-05-13 | 浪潮电子信息产业股份有限公司 | 一种基于gpu的软件体系架构及uml和adl结合描述的方法 |
CN107368302A (zh) * | 2017-06-28 | 2017-11-21 | 东南大学 | 一种基于本体的设计模式识别方法 |
Non-Patent Citations (2)
Title |
---|
LI BIXIN: "A Verification-Based Approach to Evaluate", 《CHINESE JOURNAL OF ELECTRONICS》 * |
刘宁 等: "MVC体系架构从模式到框架的持续抽象进化", 《计算机工程》 * |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109918646A (zh) * | 2019-01-30 | 2019-06-21 | 中国科学院自动化研究所 | 篇章因果关系判断方法、系统、装置 |
CN109918646B (zh) * | 2019-01-30 | 2020-08-11 | 中国科学院自动化研究所 | 篇章因果关系判断方法、系统、装置 |
CN109976727A (zh) * | 2019-03-31 | 2019-07-05 | 东南大学 | 一种基于设计模式的mvc架构模式识别方法 |
CN109992271A (zh) * | 2019-03-31 | 2019-07-09 | 东南大学 | 一种基于代码词汇和结构依赖的分层架构识别方法 |
CN109992271B (zh) * | 2019-03-31 | 2022-05-13 | 东南大学 | 一种基于代码词汇和结构依赖的分层架构识别方法 |
CN109976727B (zh) * | 2019-03-31 | 2022-07-08 | 东南大学 | 一种基于设计模式的mvc架构模式识别方法 |
CN111984311A (zh) * | 2020-07-03 | 2020-11-24 | 华南理工大学 | 一种基于运行日志的软件结构复现的方法 |
CN111984311B (zh) * | 2020-07-03 | 2022-04-22 | 华南理工大学 | 一种基于运行日志的软件结构复现的方法 |
CN113672206A (zh) * | 2021-09-02 | 2021-11-19 | 北京航空航天大学 | 一种x语言混合建模平台及建模方法 |
CN113672206B (zh) * | 2021-09-02 | 2024-04-02 | 北京航空航天大学 | 一种x语言混合建模平台及建模方法 |
CN114579712A (zh) * | 2022-05-05 | 2022-06-03 | 中科雨辰科技有限公司 | 基于动态模型的文本属性提取匹配方法 |
CN114579712B (zh) * | 2022-05-05 | 2022-07-15 | 中科雨辰科技有限公司 | 基于动态模型的文本属性提取匹配方法 |
Also Published As
Publication number | Publication date |
---|---|
CN108228158B (zh) | 2021-03-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108228158A (zh) | 一种基于本体的架构行为模式识别方法 | |
Ostermann et al. | Expressive pointcuts for increased modularity | |
US8479149B2 (en) | Concept-oriented software engineering system and method for identifying, extracting, organizing, inferring and querying software system facts | |
Di Lucca et al. | Reverse engineering Web applications: the WARE approach | |
Rivera et al. | Analyzing rule-based behavioral semantics of visual modeling languages with Maude | |
Schneider | Components, Scripts, and Glue: A conceptual framework for software composition | |
Al-Obeidallah et al. | A survey on design pattern detection approaches | |
Zanoni | Data mining techniques for design pattern detection. | |
Rouhi et al. | Towards a formal model of patterns and pattern languages | |
Mülle et al. | A practical data-flow verification scheme for business processes | |
Streekmann | Clustering-Based Support for Software Architecture Restructuring | |
Uifălean et al. | From BPMN models to labelled property graphs | |
Favre | MDA-based reverse engineering | |
Maggioni | Design pattern detection and software architecture reconstruction: an integrated approach based on software micro-structures | |
Al-Obeidallah | A Multiple Level Detection Approach for design patterns recovery from object-oriented programs | |
Clarke | A taxonomy of classes to support integration testing and the mapping of implementation-based testing techniques to classes | |
Kung | The object-oriented paradigm | |
Al-Baity | Design Pattern Detection for UML Integrated Meta-Model | |
Meurice | Visualizing SQL execution traces for program comprehension | |
Abdurazik | Coupling-based analysis of object-oriented software | |
Matsumoto et al. | An Architectural Model for Adapting Domain-Specific AOM Applications | |
Szymborska | 3 Domain Analysis and Abstract Syntax | |
Laitila et al. | Symbolic Reductionist Model for Program Comprehension | |
Kiwelekar et al. | Ontological interpretation of object-oriented programming abstractions | |
Matragkas | Establishing and Maintaining Semantically Rich Traceability: A Metamodelling Approach |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |