一日散記:
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的教育改造,好好學習、天天向上、愛護老婆、尊敬師長。