具体实施方式
下面结合具体实施例对本发明进一步加以描述。
对象约束描述语言(Object Constraint Language,OCL)是专门用于描述对象约束规则的语言,已成为业界的标准。OCL是一种形式化语言,没有二义性,通过开发编译器,可以将OCL翻译成JAVA、SQL和C++等代码。
本发明公开了一种基于OCL的配置重用方法,如图1所示,为本发明基于OCL的配置重用方法实施例一的流程图,包括以下步骤:
S101、根据对象模型建立OCL文本;
S102、设置对象模型的访问接口,将OCL文本转换为目标代码;
S103、目标代码通过预设的访问接口访问对象模型数据,并根据对象模型数据调用及检查配置条件,进行配置。
由于OCL是面向对象的,使用OCL的一个前提条件是需要对配置数据进行对象化建模,在3GPP中对建模后形成的模型称为网络资源模型(NetworkResource Model,NRM),每个对象称为被管理对象(Managed Object,MO)。其中,NRM是用于描述被管理网络实体的信息服务,如NodeB(B节点)和无线网络控制器(Radio Network Controller,RNC),其是管理信息模型的一个子集。以下将使用管理信息库(Management Information Base,MIB)来表述实例化的对象模型。
由上所述,应用本发明基于OCL的配置重用方法,关键在于三个方面:
1、OCL文本的编译;
利用标准化的OCL语法规则,将OCL文本解析成OCL抽象语法树,在此基础上将其转换成目标代码。其具体算法并非本发明的必要技术特征所在,故在此不加以赘述。后述本发明基于OCL的配置重用方法实施例二中将提供OCL文本编译的一个简单实现步骤,以示其可行性。
2、目标代码与系统集成;
具体要解决访问接口标准化和对象不变式的调用检查两个问题,以下将分别加以详述:
(1)定义目标代码的对象元数据和对象模型数据访问的接口
首先,有些OCL元素转换成目标代码需要访问对象模型的元数据,作为检查对象数据的一个判断条件。
如下面一段OCL语句,
context Person inv:gender=Gender::male
其中Gender::male是OCL中的Enumeration类型元素。在翻译成目标代码时,就需要能获取Gender::male的取值,从而和gender属性的取值进行比较。图2为本实施例中目标代码的OCL集合数据类型示意图一,如图所示,在对象模型元数据接口ModelItf的定义中,需要一个GetEnumValue的方法,该方法的统一建模语言(Unified Modeling Language,UML)表示原型如下:
GetEnumValue(enumType:String,enumValue:String):OclInteger
这样,OCL的表达式Gender::male翻译成目标代码就是:
ModelItf::GetEnumValue(“Gender”,“male”)
其次,规则检查毕竟是对对象模型的数据进行检查,因此需要根据OCL的元素类型,设置对应的对象数据访问接口。
配置规则需要访问MIB数据,归纳起来访问方式有三种:
A、从MIB中查找符合条件的某种类型的对象集合
如图2所示,ModelItf中的AllInstances就是获取指定类型的所有对象,对应OCL中的allInstances关键字;ModelItf中的Select获取指定类型满足条件的对象集合,和OCL中的select关键字对应;ObjectItf中的GetAssoObject和GetAssoObiects是获取指定对象的关联对象,分别与OCL中的getassoObject和getassoObjects对应,即关联对象的导航。
B、遍历对象集合
遍历对象集合的接口和方法由集合数据类型提供。图3为本实施例中目标代码的OCL集合数据类型示意图二,如图所示,CollectionItf对应OCL中基本的集合类型Collection,支持Collection的Select、Collect、Union等方法。
C、从对象中获取对象的属性
继续参照图2所示,ObjectItf中的GetAttrValue就是用于获取指定对象的某个属性值。
(2)对象不变式检查的调用时机及实现方法
用OCL描述的配置条件可分成三种:配置操作的前置条件(Precondition)、配置操作的后置条件(Postcondition)和对象的不变式(Invariant)。对于前后置条件,调用的时机和位置很明确,分别在对象执行指定的操作前和操作后进行。而对于不变式,则应用以下方式进行调用:
A、在对象的增删改配置操作执行后调用,如果检查不通过,则回退配置操作,保证MIB符合不变式规则;
B、执行某个对象的配置操作后,对每个和该对象之间有直接关系(包括包含关系、关联关系和依赖关系)的对象调用其不变式进行检查,如果有任何一个返回失败,则回退数据配置操作。
3、运行的性能和效率问题。
在实施本发明基于OCL的配置重用方法时,还需要考虑运行性能和效率的问题。如下面一些规则:
A、inv:self.employee->forAll(p|p.forename=′Jack ′)
//所有员工的名字都叫Jack
B、inv:self.employee->select(p|p.age>50)->notEmpty()
//员工中至少有一人大于50岁
C、context Person inv:
Person.allInstances->forAll(p1,p2|p1<>p2implies p1.name<>p2.name)
//任意两个人的姓名不能有重复
都牵涉到对大批量数据的遍历,这种遍历如果靠简单的MIB对象遍历,则效率很低。因此需要考虑利用索引机制,比如数据库的索引机制。对类似上述第三条规则那样需要对集合内对象进行两两比较的,需要在写OCL规则时避免使用,考虑采用其他可以替代的写法。比如对规则C,如果换成下面这样的写法:
context Person::Create Pre:
Person.allInstances->select(p|p.name=self.name)->isEmpty()
//当前不存在和本人相同名字的人
这种检查效率要高很多,首先是无须在该对象的每个操作和相关联对象的每个操作都被触发,另外也不需要对一个集合的对象进行两两比较。
结合上述内容,本发明基于OCL的配置重用方法可通过下述实施例二加以实施,如图4所示,包括以下步骤:
S401、对配置数据进行对象化建模,得到对象模型;
S402、根据对象模型建立OCL文本;
接续将进行OCL文本的编译,具体包括步骤S403~S406。
S403、设置目标代码的OCL数据类型;
图5为本实施例中目标代码的OCL基本数据类型示意图,本实施例中以将OCL翻译成C++为例,如图所示,OCL设置该些数据类型和针对某数据类型支持的操作,需要在目标代码中设置这些数据类型对应的类型。其中OclBoolean对应OCL中的基本数据类型Boolean,是C++的一个类的定义,支持Boolean类型的所有方法,包括bool、==、!=、 & & 、|、~和xor;OclInteger对应OCL中的基本数据类型Integer,支持Integer类型的所有方法,包括*、+、/和abs(取整);OclString对应OCL中的基本数据类型String,支持String类型的所有方法,包括toUpper和contact。
S404、设置对象模型元数据及对象模型数据的访问接口,具体实现方法在上文中有详细描述,此处不再加以赘述;
S405、根据OCL文本获得OCL抽象语法树;
此步骤可通过OCL解释器来实现,OCL解释器为现有技术提供,可以从互联网下载,如Dresden OCL Toolkit。在使用OCL解释器时可以检查出其语法错误,如果语法没有错误,可以生成一棵抽象语法树。
S406、将OCL抽象语法树转换成目标代码;
使用递归下降分析算法,对抽象语法树中的每个语法元素节点,根据其元素类型,找到对应的目标代码表示方法,最终将抽象语法树翻译成目标代码。
S407、目标代码通过预先设置的访问接口访问对象模型数据;其中,访问接口则由上述步骤S404完成预设置的过程。
S408、根据对象模型数据调用及检查配置条件,其调用时机及实现方法已在上文有所详述,此处不再加以赘述。
本发明还公开了一种基于OCL的配置重用系统,如图6所示,为本发明基于OCL的配置重用系统一个实施例图。该系统包括OCL建立单元61、OCL转换单元62及配置单元63。其中,OCL建立单元61用于根据对象模型建立OCL文本;OCL转换单元62与OCL建立单元61连接,用于设置对象模型的访问接口,并将OCL文本转换为目标代码;配置单元63与OCL转换单元62连接,用于利用目标代码访问配置数据,进行配置。
OCL转换单元62进一步包括相互连接的数据类型设置子单元621、接口设置子单元622、OCL编译子单元623和目标代码转换子单元624。其中,数据类型设置子单元621用于设置目标代码的OCL数据类型;接口设置子单元622用于设置对象模型元数据及对象模型数据的访问接口;OCL编译子单元623用于根据OCL文本获得OCL抽象语法树;目标代码转换子单元624用于将OCL抽象语法树转换成目标代码。
以上公开的仅为本发明的几个具体实施例,但是,本发明并非局限于此,任何本领域的技术人员能思之的变化都应落入本发明的保护范围。