一日散记:
BLOG竟然坏了一天,补贴昨天的。
上午
OCL的研究终于告一段落,至于建立一个用OCL约束的UML工程的完整例子,要等辅导的那个学生学完OCL再进行。因此今天马上投入模型转换的研究。模型转换的伪代码看得多了,始终没有试过一个可以run的工具,那么就从MTF(Model Transformation Framework)开始吧,毕竟是IBM开发的,实力强大。况且阿飞说还不错的。
找到早早就保存的那个MTF主页,http://www.alphaworks.ibm.com/tech/mtf,进入先看了一下介绍:
What is the Model Transformation Framework?
The Model Transformation Framework (MTF) is a set of tools that helps developers make comparisons, check consistency, and implement transformations between Eclipse Modeling Framework (EMF) models. The framework also supports persistence of a record of what was mapped to what by the transformation; this record can be used to support round-tripping, reconciliation of changes, or display of the results to a user.
How does it work?
The framework consists of the following:
- a language for defining mappings between EMF models
- a transformation engine capable of interpreting mapping definitions in order to check or enforce consistency between models
- editor and debugger for mapping definitions
- support for generating text documents from EMF models using templates.
感觉还不错的,虽然MTF主要是基于EMF做模型转换,不过EMF作为目前最著名的开源平台Eclipse的模型框架,前途也是不可限量。下载前要先登陆IBM国际网站,没有ID的必须注册一个,IBM的ID很奇怪,必须是电子邮件格式的,仔细看了说明才注册成功。MTF不大,才1M多,一会就下载完了。
安装也很顺手,就是一个典型的Eclipse插件。注意目前MTF是1.0版本,需要Eclipse3.0或者3.0.1版本,以及EMF2.0和XSD2.0,再加上EclipseUML2.0版本。不过这些东东正好我都已经安装好了。于是不到2分钟顺利搞定。
到处找Readme,在MTF的主目录下面就有一个,介绍了例子程序在哪儿。但是每个例子怎么run就包含在规则文件里面。MTF的主要代码(转换规则)存放在rdl文件(Rule Definition Language)里面。同时每个rdl文件里面有配置运行和代码解释。于是建立了一个EMF工程(java工程也行吧),import了sample1.rdl,看了里面的说明,然后配置,run!
嗯,马上一个模型就被转换(创造?)出来了,可以用EclipseUML显示出来。Rdl文件如下:
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"
// entry rule
relate sample1(ws:IFile file)
{
createTopPackage [1] (match over file.resource.contents, "Sample1")
}
relate createTopPackage(ecore:EPackage pkg, ecore:EString name)
{
equals(pkg.name, name),
createPackage [1] (match over pkg.eSubpackages, "SubPackage1"),
createPackage [1] (match over pkg.eSubpackages, "SubPackage2"),
createPackage [1] (match over pkg.eSubpackages, "SubPackage3"),
createClass [1] (match over pkg.eClassifiers, "Sample1_class"),
createDataType [1] (match over pkg.eClassifiers, "Sample1_datatype"),
createEnum[1] (match over pkg.eClassifiers, "Sample1_enum"),
createClassWithSuper [1] (match over pkg.eClassifiers, "Sample1_class2","Sample1_class")
}
relate createPackage(ecore:EPackage pkg, ecore:EString name)
when equals( pkg.name, name)
relate createClass(ecore:EClass class, ecore:EString name)
when equals( class.name, name)
relate createDataType(ecore:EDataType type, ecore:EString name)
when equals( type.name, name)
relate createEnum(ecore:EEnum enum, ecore:EString name)
when equals( enum.name, name)
relate createClassWithSuper (ecore:EClass class, ecore:EString name, ecore:EString superName)
when equals( class.name, name)
{
ref createClass(match over class.eSuperTypes, superName)
}
简单来说,就是从“字符串”模型到ECORE模型的转换,其实质是用字符串规定模型包、类等等的名字,然后生成一个Ecore模型!在接下来的sample2里面定义了一个简单的转换规则,将这个生成的模型转换为另一个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)
}
去掉了import部分。这个规则的含义是,将源模型的EPackage转换为目标模型中的EPackage,其他元素不管,转换约束是源模型包的名称要等于目标模型包的名称。
尽管理解不难(刚刚看过OCL嘛,哈哈),但是关键字还是很让人模糊的。于是打开MTF的UserGuide(两个地方都有,pdf格式的在MTF的安装目录中;帮助文档格式的已经集成到Eclipse的帮助文档中了),开始研读。
下午
中午草草一饱,便回来午睡,午睡是一个很好的习惯,一个小时的午睡足够保证整个下午和晚上的精神状态良好。
再来看MTF的UserGuide,说实话,这个UserGuide写得并不好,因为它没有指导用户如何开始一个简单的例子,然后由浅入深的讲解。即使这些内容已经包含在rdl文件中,也应该花一章来写一下嘛。不过它还是从整个系统的概念入手,慢慢引入各种关键字的用法,以及MTF中的各种概念。熟悉模型转换技术的人已经很容易看懂吧。UserGuide不长,36页,不过看长了也有点头晕目眩了。
阴天,还有会,每周二的定时篮球活动算是完蛋了。郁闷中去吃了晚饭。
晚上
晚上打开Gmail开始看信,Penggu在米国也和我一样郁闷啊,都是PhD,都是那么难。两年了一篇paper都没有,惨!
无意中找到了penggu的主页,发现了一个链接,如获至宝,呵呵http://www-2.cs.cmu.edu/afs/cs.cmu.edu/user/mleone/web/how-to.html。
这是一个Advice on Research and Writing的站点,集合了很多著名的对于computer science的advice,特别是第一篇文章“How to Organize your Thesis”,被翻译成多国文字,我很感激的看到有人把它翻译为简体中文。
然后就接到了wife的电话,唉。儿女情长,英雄气短。老老实实接受wife的教育改造,好好学习、天天向上、爱护老婆、尊敬师长。