MDA之路

MDA,UML,XML,Eclipse及Java相关的Blog
posts - 53, comments - 494, trackbacks - 0, articles - 2
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

MTF初体验

Posted on 2005-04-17 22:32 wxb_nudt 阅读(2044) 评论(0)  编辑  收藏 所属分类: 技术杂谈

MTF释疑

MTFIBM开发的一个模型转换工具。它是一个Eclipse插件,可以直接在Eclipse平台上使用,也可以以Java包的形式在Java语言中使用。它的大部分功能要基于EMFUML2这两个Eclipse插件。

MTF是模型转换工具,主要用来在模型之间进行转换,例如从UML模型到EMF模型的转换,或者从UMLXSD之间的转换。因为代码生成也算是一种模型转换,所以MTF也可以用于一些代码的生成,例如从EMFHtml的生成,或者从JDTJava development tool)模型到UML模型的反向工程。

MTF中的映射(Mapping

MTF中最重要的两个概念就是映射(Mapping)和和解(Reconciliation),它们是整个MTF的基础。

关于映射,MTF的帮助文档中是这么写的:An MTF rule – a mapping rule – defines a set of constraints to be checked across one or more objects. If the constraints hold, then the objects comply with the rule and don't need to be changed. Rules are checked within a mapping session, which tracks which rules should hold for which objects. It does this by creating objects called mappings; each mapping records that a rule has been applied to some particular objects, and if any of the rule constraints are violated.

一个MTF规则――或者叫映射规则,定义了一组约束,用来约束一个或者更多的对象。如果约束能够保持,那么遵守这些约束的的对象就不需要被改变。规则在映射组中被检测,映射组能够跟踪哪条规则应该被哪些对象遵守。映射组通过创建叫做映射的对象来完成这件事。每个映射对象记录了一条规则被应用于一些特殊的对象,以及是否有规则的约束被违背了。

为了理解这些冠冕堂皇的话语,还是让我们来看看一个简单的例子吧,例子来源于MTF自带的tutorialexample2

import ecore "http://www.eclipse.org/emf/2002/Ecore"

import emf "http:///com/ibm/mtf/model/emf.ecore"

import ws "http:///com/ibm/mtf/model/workspace.ecore"

relate sample2(ws:IFile file1, ws:IFile file2)

{

    mapPackages(over file1.resource.contents, over file2.resource.contents)

}

relate mapPackages(ecore:EPackage pkg1, ecore:EPackage pkg2 )

{

    equals(pkg1.name, pkg2.name ),

    ordered mapPackages( over pkg1.eSubpackages, over pkg2.eSubpackages)

}

上面例子的作用是,定义从一个EMF模型文件file1到另一个EMF模型文件file2之间的转换规则。我们先看其中的两条语句:

relate sample2(ws:IFile file1, ws:IFile file2)

relate mapPackages(ecore:EPackage pkg1, ecore:EPackage pkg2 )

这两条语句分别定义了一个MTF的规则,规则语句以relate关键字作为开头,包含一个规则名称和参数列表。目前我们只知道,sample2这条规则定义了file1file2之间的约束。参考上面的规则定义,我们知道:sample2是一条MTF规则,它定义了一组约束,用来约束file1file2这两个对象。如果约束被满足,则file1file2就不需要改变。

但是约束是怎么表现的呢?可以看看mapPackages规则中的一个约束:

    equals(pkg1.name, pkg2.name ),

这是一个典型的MTF规则约束,equals是一个关键字,它的含义是它的两个参数必须相同,否则约束就被违背了。这里“equals”的含义等于java语言中的Object.equals()

至此,我们已经明白了规则、映射和约束的含义。但是映射组具体是什么?它如何产生映射?以及约束如果被违背了怎么办?目前都不知道。

MTF中的和解(Reconciliation

MTF的第二个重要的概念就是和解(Reconciliation),也许还能够翻译为调解、调停等,不过姑且先称之为和解吧,并不妨碍理解。

MTF对于和解是这样定义的:Reconciliation is the process of modifying mapped model objects in order to fix constraint violations. Reconciliation is carried out by a transformation engine – which in MTF happens to be the same thing as the mapping engine.

和解是一个通过修改参与映射的模型元素来修复被破坏的规则的过程。和解是被转换引擎执行的――它在MTF中常常就是映射引擎。

直观的来讲,和解就是决定了这么一件事:如果前面定义的转换规则的约束被打破了,那么怎么办?

和解的意思就是,如果约束被打破,那么我就修改模型元素,直到约束再一次被遵守为止。举例说明,上面的一个约束:

    equals(pkg1.name, pkg2.name ),

它规定了EMF中的包pkg1pkg2的名称必须相同,如果file1file2中相应的包名称不同,那么约束就被破坏了。此时需要和解,和解在执行时修改了file2(或者是file1,根据配置的映射方向来决定)的pkg2的包名称,那么这个约束就被修复了。

如果有的约束无法修复怎么办?那么就会报错,转换无法执行。

至此基本明白了MTF的转换原理:

l         先定义两个模型之间的转换规则,每条规则包含一些转换约束;

l         然后导入实际的模型,执行转换规则;

l         如果所有规则的约束都被满足,则说明源模型和目标模型符合转换规则;

l         如果有一些规则的约束被打破了,则启动和解,和解会修改目标模型(或者源模型,要根据配置的映射方向来决定)的某些模型元素,来修复约束;

l         如果所有的约束都被修复了,则说明转换成功,此时源模型和目标模型符合转换规则;

l         如果有些约束无法修复,则报错退出,说明源模型不能正确转换为目标模型。

再来看看我注释过的sample2

import ecore "http://www.eclipse.org/emf/2002/Ecore" //导入ECORE模型

import emf "http:///com/ibm/mtf/model/emf.ecore"     //导入EMF模型

import ws "http:///com/ibm/mtf/model/workspace.ecore"//导入Eclipse的workspace

//定义规则sample2,它是转换的入口规则,参数file1是源模型所在的文件,file2是目标模型所在的文件

relate sample2(ws:IFile file1, ws:IFile file2)      

{

    //包含子规则mapPackages,over关键字的含义是对集合中的元素依次执行规则

    //file1.resource.contents的结果是一个EPackage的集合

    mapPackages(over file1.resource.contents, over file2.resource.contents)

}

//定义子规则mapPackages,参数是源模型和目标模型的EPackage

relate mapPackages(ecore:EPackage pkg1, ecore:EPackage pkg2 )

{

    //约束:pkg1和pkg2的名称必须相同

    equals(pkg1.name, pkg2.name ),

    //递归执行规则mapPackages,参数是pkg1和pkg2的子包

    //ordered关键字的含义是规则必须按照顺序来执行,两个集合中的元素必须一一对应

    ordered mapPackages( over pkg1.eSubpackages, over pkg2.eSubpackages)

}

小结

MTF的设计比较巧妙,通过规则――约束――破坏――和解,来达到执行模型转换的目的。而且规则可以双向执行,这是QVT规范要求的一个特性。不过双向执行的规则约束要更严格,功能也弱一些。

另外,我认为MTF的一些缺点是:

规则语言需要太多学习时间,目前没有等效的数学描述;

约束的表达能力太弱,比起OCL远远不如。至少我目前感觉如此,也许是很多实用的util包没有接触到吧。OCL作为UML约束语言的规范,应该是比较有前途的,但是MTF没有使用OCL,而是自己开发了一套规则约束的表达方式。

不过,MTF作为一个模型转换工具的代表作,其作用也是巨大的。模型转换的研究也有好几年了,QVT规范还没有出台。很多研究人员只是停留在理论阶段,没有实践,也缺少实践的工具。MTF提供了一个较好的模型转换工具,可以用来验证各种模型转换的理论。更重要的是,它提供了扩展机制,用户可以扩展目前的MTF,来实现自己的转换工具。最后,MTF是基于Ecilpse开发的,搭乘Eclipse的春风,应该能够飞得远一些吧。

此篇仅仅是一个简介,待更熟悉MTF后,再写心得吧。

Blog好久没有更新,连老婆都骂我懒,唉。。。


只有注册用户登录后才能发表评论。


网站导航: