摘 要:針對面向方面的PIM到面向方面的PSM的轉換,提出了一種面向方面的模型轉換語言AOMTL。首先建立方面模型的轉換框架;然后根據此框架建立AOMTL的元模型,設計AOMTL的具體語法;最后使用AOMTL完成方面模型轉換。該方法為形式化及自動化方面模型轉換的描述與實現提供了一種有效的解決辦法。
關鍵詞:面向方面軟件開發; 模型驅動架構; 平臺無關模型; 平臺相關模型; 模型轉換
中圖分類號:TP311.5文獻標志碼:A
文章編號:1001-3695(2010)06-2150-03
doi:10.3969/j.issn.1001-3695.2010.06.044
Aspectoriented model transformation language AOMTL
FANG Yiqiua, HE Leia, GE Junweib
(a. College of Computer, b. College of Software, Chongqing University of Posts Telecommunications, Chongqing 400065, China)
Abstract:Through the transformation of aspectoriented PIM to PSM, this paper presentd a model for aspectoriented transformation language AOMTL. Firstly, built the transformation framework of aspect model, based on which built AOMTL metamodel and designed AOMTL concrete syntax. Finally, fulfilled the transformation of aspect model by using of AOMTL. This method provided an effective solution for the description and implementation of aspect model transformation with formalization and automation.
Key words:aspectoriented software development; model driven architecture; platform independent model; platform specific model; model transformation
隨著軟件開發過程的復雜化,軟件開發的方法越來越受到重視,近年來提出了將AOSD和MDA的融合及相互支持作為研究課題[1]。而方面模型轉換是這個研究領域發展的核心環節,直接影響到軟件開發的結果。方面PIM到方面PSM的轉換方法的研究,其有效性和準確性能夠提高軟件的開發效率。目前,PIM到PSM的模型轉換方法雖然都有自己的特點,但是這些模型轉換方法普遍都存在較復雜、不直觀、轉換效率不高的問題,而且缺乏形式化的定義,也很少在實踐中得到檢驗。
ATL(atlas transformation language)是一種混合語言,語法簡單易懂,操作方便,對于編程人員來說很容易理解和應用[2],而OCL是一種聲明式語言[3],具有定義簡潔、抽象層次高等特點。以ATL與OCL結合為基礎,本文提出了一種模型轉換語言AOMTL來進行方面模型轉換。該方法結合了ATL和OCL的特點和長處,用OCL對方面模型進行約束和補充定義,用 ATL來實現方面模型的轉換,既能彌補ATL不能體現系統動態特性和保證數據一致性的不足,又能彌補OCL轉換效率低下的不足,因此是實現方面PIM到方面PSM轉換的一種有效方法。
1 面向方面模型轉換框架
1.1 基于MDA模型轉換過程
一個模型生成另一個模型,必須把源模型中的每個元素同目標模型中的一個或多個元素建立聯系。這樣做的最直接方式是把源模型元素的元類與目標模型元素的元類建立聯系。因為模型元素與元類之間有實例—類型關系,元類在元模型中的每個實例都必須遵從對元類設置的規則。轉換過程如圖1所示。根據圖1可以得知模型轉換是用轉換定義來描述的,轉換定義包含一組轉換規則,這些規則由轉換工具來執行;轉換規則應當具有可調性、可追溯性和增量一致性[4]。
1.2 面向方面的模型轉換框架
根據模型轉換過程,結合AOSD的思想,可以得出面向方面的模型轉換是將面向方面PIM元模型中所定義的元類轉換到面向方面PSM元模型中定義的元類上,可以通過定義面向方面的模型轉換語言來形式化定義轉換。一個語言的元模型,也被稱為該語言的抽象語法,描述了所有能夠在該語言中使用到的概念及其之間的聯系。由此建立方面模型轉換框架如圖2所示。
2 方面模型轉換語言AOMTL
2.1 AOMTL分析
使用自然語言書寫變換規則,對人類讀者而言比較好理解,但對自動系統而言卻并非如此。因此,需要一個可以插入轉換工具的轉換定義,這個轉換定義能夠自動執行變換。模型轉換的形式化定義[5]:假定一個模型m是一個系統的形式化描述,用s表示系統,用f表示描述系統的形式化語言,那么這個系統s的模型就為m(s),就可以用m(s)/f來表示領域模型,而模型之間映射的通用表達式就是:m1(s)/f1,m2(s)/f2。f1和f2是元—元模型的實例,模型轉換可用表達式m(f)/MOF表達式來處理。所以為了實現AOPIM到AOPSM的模型轉換,定義一種新的模型轉換語言AOMTL來形式化方面模型的轉換。
AOMTL采用基于ATL與OCL結合的方式描述變換規則,實現模型轉換。在ATL中的轉換規則可以使用完全聲明的、混合的,或者是完全可執行的,但ATL功能單一,不能對模型進行精確的轉換,也沒有數據類型的驗證功能,不能保證模型轉換前后數據的一致性[2]。而OCL有前驗、后驗表達式和不變式的概念,這些則可以描述系統的動態特性,它還能對模型進行補充定義,保證模型在轉換前后數據的一致性,因此用OCL一定程度上可以消除模型的二義性問題[6]。根據以上分析,分別吸收ATL和OCL各自的優點,建立模型轉換語言AOMTL。
2.2 AOMTL的元模型
在統一的MOF元模型構架下,根據上節所述建立的方面模型轉換框架,定義了AOMTL的元模型,使得AOMTL能夠得以實現。因為方面模型轉換是定義在方面元模型級(M2)上的,它可以被應用在任何由此元模型定義的方面模型(M1)上。又因為方面元模型是由MOF所定,方面模型轉換所涉及的參數,也就是方面元模型中的元素,都是由MOF元—元模型所定義好的,適用于方面元模型的模型轉換語言AOMTL也就能夠得以實現。圖3為AOMTL的元模型。
2.3 面向方面模型轉換語言AOMTL的設計
2.3.1 AOMTL的數據類型
AOMTL是基于MOF的,其類型的實例結構的根元素是抽象的oclany類型,所有其他的各種類型數據都是從它直接或間接繼承的。主要包括六種數據類型,即原始數據類型、集合數據類型、元組數據類型、映射類型、枚舉類型和模塊元素類型。
2.3.2 AOMTL模塊
一個AOMTL模塊符合模型到模型的轉換,這種AOMTL單元能夠讓開發人員制訂從AOPIM產生AOPSM的方法。一個AOMTL模塊中的源模型AOPIM和目標模型AOPSM必須被各自的元模型“typed”。另外,一個AOMTL模型接收一個固定數量的模型作為輸入,并產生固定數量的輸出。AOMTL不能處理未知數量的模型。
AOMTL模型的結構:
{Header section;[Import section];Helper;Rulesets;}
Header section定義了轉換模型的名字以及相應源模型和目標模型變量的名字。在它內部能對模塊的可執行模型進行編碼。這部分語法定義如下:
Module name
Create AOPSM [from|refines] AOPIM
Improt section 是個可選項,用于要引入AOMTL庫的聲明,使用如下:
Uses library_name;
Helper是AOMTL的方法,可以定義AOMTL代碼,這些代碼能夠被別的AOMTL轉換所調用。一個AOMTL Helper用下面的元素定義:一個名字、一個環境類型、一個返回值類型、一個AOMTL表達式和一些參數集合選項。例如在模型轉換中操作名字轉換方法的定義:
Helper context String def:getGetterOperationName:String=…;
Rulesets是由多個規則集(Ruleset)組成。Ruleset反映了一個模型通過一組變換規則映射到另一個模型的變換過程,它是組成一個變換所用到的一系列規則的集合,包括多條變換規則(Rule)。Rule描述了從源模型的一個或多個元素到目標模型的一個或多個元素的映射關系。一個規則節點包含名稱、源條件、目標條件、動作,以及參數聲明等幾個主要部分。Rulename屬性是變模規則的名稱。源條件用于描述規則的匹配條件,它是一個集合,可以容納多個條件項的定義。這些不同的定義包括類型條件、值條件、一致性條件等;其內容可由擴展的OCL書寫。目標條件與源條件結構類似,但意義不同,源條件是對源模型中已有的模型元素作出判斷,目標條件是被變換引擎用做生成模型元素以及建好這些模型元素的關系。動作指定從源到目標模型元素的變換過程中要采取的一系列行為,包括值拷貝、子規則調用。參數部分指定了規則中設定的可變部分。具體表示如下:
Rule rulename {
From source Totarget
//source condition;
//target condition;
Map();}
Ruleset sname {
rule rulename1;
rule rulename2;
…;}
Rulesets name {
ruleset sname1;
ruleset sname2;
…;}
2.3.3 AOMTL庫
AOMTL庫是由定義的一系列的AOMTL Helper,這些Helper能夠被不同的ATL單元所調用。與其他單元一樣,AOMTL庫也包括一個可選的引入部分,當AOMTL庫導入AOMTL單元中后,這些Helper是可用的。
3 AOMTL的實現
為了能夠使用AOMTL形式化定義方面PIM到方面PSM的轉換,需要方面PIM和方面PSM的元模型,在變換定義中需要引用這些元模型中的元素以便給出形式化定義。因此,需要建立方面PIM元模型和方面PSM元模型。通過對UML元模型[7]的擴展,建立了方面PIM的元模型。圖4描述了這個元模型,它主要擴展了Classifier、Feature 和Association元類,增加了Aspect、PointCut、Advice和Crosscut四個元類。
AspectJ是一種針對Java擴展的面向方面語言,本文就以AspectJ[8]為例,構建面向方面PSM的元模型。圖5顯示了該PSM元模型。
基于方面PIM和PSM的元模型,使用AOMTL描述變換規則,完成方面PIM到AspectJ PSM的轉換。圖6描述了方面PIM到方面PSM的轉換過程。
其主體部分的AOMTL描述如下:
Rule Aspect {//Aspect的轉換規則
From s: Src!AOPIM To t: Dst!AOPSM
Pre:
s.attribute>include (att) and att.visibility=#public
Maps to s (
name<-s.name;
attribute()<-s.attribute();
isPrivileged<-s.isPrivileged;
declearedImplements<-s.declearedImplements;
declearedParents<-s.declearedParents;
perType<-s.perType;
Introductions()<-s.Introductions();
PointCuts()<-s.PointCuts();
Advice()<-s.Advice();
Operations()<-s.Operations();
) }
對于方面PIM中的每個名為AspectName的方面,目標模型PSM中要有一個同名的方面對應。對于PIM中的AspectName方面的每一個屬性,目標模型PSM中要有一個與其同名的屬性,并且類型也一樣。對于PIM中的Method():Returntype,在PSM中有同樣的Method():Returntype與其對應。
Rule Crosscut{//Crosscut的轉換規則如下:
Froms: Src!AOPIM Tot: Drc!AOPSM
Pre:
CrosscutDeclare->include(declare) and Structural=ture and declare=declare parents
Maps to s(
Intertypedeclare<-s.declare;) }
Rule other Intertypedeclaration{…}
對于方面PIM中的橫切的聲明表達式CrosscutDeclare,在方面PSM中,要有一個選定橫切對象的聲明性結構與之對應。根據CrosscutDeclare值在方面PSM中有對應的橫切表達式和橫切聲明成分,對于PIM中的CrosscutDeclare的每一個結構性橫切成分,在PSM的橫切分欄中有相應的成分對應,如AspectJ的Intertypedeclaration;對于PIM中CrosscutDeclare的行為性橫切,在目標模型中要有對應的包含平臺相關描述的橫切聲明成分Pointcut;對于PIM中動態橫切的操作部分CrosscutFeature,在目標模型方面PSM中要有一個使用相同類型修飾符的同名操作,并明確CrosscutDeclare的對應關系,使用平臺相關的操作。
Module Src2Dst;//方面模型的轉換
Create OUT: Dst from IN : Src;
Ruleset AOPIMtoAOPSM{
rule Aspect;
rule Crosscut;
rule other Intertypedeclaration;
…;}
4 結束語
MDA與AOSD的融合和相互支持代表著今后軟件開發的一個方向,其關鍵就在于方面模型的開發與轉換。方面模型轉換描述了方面PIM如何轉換到平臺相關的方面PSM。基于ATL和OCL設計的方面模型轉換語言AOMTL目的是形式化方面模型的轉換,使得方面模型轉換能夠用一致的方法來表達,并具有無二義性的特點。因此AOMTL對形式化及自動化方面模型轉換的描述與實現是可行的和有效的。
參考文獻:
[1]STEIN D, HANENBERG S, UNLAND R. Expressing different conceptual models selections in aspectoriented design[C]//Proc of the 5th International of Join Point Conference on AspectOriented Software Development.2006:15-26.
[2]JOUAULT F, KURTEV I. Transforming models with ATL[C]//Proc of Model Trans in Practice Workshop at Models. Jamaica:SpringerVerlag,2005:220-240.
[3]Object Management Group. OCL 2.0 specification[DB/OL].(2006-05-01).http://www.omg.org/.
[4]王學斌,王懷民,吳泉源,等.一種模型轉換的編織框架[J].軟件學報,2006,17(6): 1423-1435.
[5]陳曉燕,趙建華,李宣東.一個MDA支撐工具的設計與實現[J].計算機工程與設計,2005,26(1):39-43.
[6]馬浩海,高光來.基于圖形語法的UML模型轉換方法[J].內蒙古大學學報:自然科學版,2005,36(5):560-564.
[7]Object Management Group. Unified modeling language specification, version2.1.2 [DB/OL].(2007-11-01).http://www.omg.org/.
[8]COLYER A. Eclipse AspectJ中文版:利用Eclipse和Aspect J進行面向方面程序設計[M].錢竹青,鄒正武,譯.北京:清華大學出版社,2006:109-288.