內容簡介
模型轉換框架(Model Transformation Framework)是ibm最新開發平台RSA(Rational Software Architect)中的重要組成部分其主要功能是在模型驅動的開發過程中為實現各種模型之間的轉換提供基礎平台的支持基於這個框架能夠很容易地實現模型之間的轉換程序以及擴展已有的轉換
本文首先介紹模型轉換的基本概念然後介紹RSA模型轉換框架之後本文以兩個具體的例子介紹如何在RSA開發平台中以模型轉換框架為基礎創建和擴展模型轉換
模型轉換
MDA(Model Driven Architecture模型驅動的體系結構)和MDD(Model Driven Development模型驅動的開發)是當今軟件領域最熱門的話題相比於傳統的以代碼為中心的開發模式MDA和MDD則是以模型為中心在開發的各個階段都使用模型來描述系統特征
模型轉換貫穿於MDD的全過程系統開發初期為了刻畫系統特征一般會創建系統的分析模型分析模型是一個比較粗糙的模型相當於草圖的作用只用於輔助分析隨著系統的特征越來越清晰系統的設計模型會慢慢形成設計模型能夠比較精確地描述系統是系統實現的基礎從設計模型可以很容易地導出系統的實現模型實現模型包括具體的代碼腳本配置文件等等這是一個自頂向下逐層細化的過程從高層的抽象模型開始經過一系列的模型轉換最終生成底層的系統實現
圖 模型轉換
由此可見模型轉換在模型驅動的開發和設計中起著非常重要的作用
RSA模型轉換框架
RSA(Rational Software Architect)是IBM的新一代軟件開發平台代號為AtlanticRSA基於開放/可擴展的Eclipse 構建全面支持UML 標准和模型驅動的開發方法RSA為開發當今日益復雜的應用系統提供了一個強大的的開發環境整合了UML建模JEEXMLweb servicesC++開發工具以及RUP過程指南等諸多功能是軟件架構師/開發人員的首選工具
為了支持模型驅動開發過程中各種模型之間的轉換RSA提供了一個功能強大易於擴展的模型轉換框架(Model Transformation Framework)該框架是一個基於規則的執行引擎基於該框架可以很方便地定義模型轉換規則實現各種模型之間的轉換RSA模型轉換框架實現了模型轉換的注冊和配置管理提供了統一的運行界面以及各種開發向導
RSA預裝有一些常用的模型轉換包括UMLJAVAUMLCPPUMLEJB這三個轉換分別以UML模型為輸入生成對應的Java程序CPP程序和EJB關於如何使用RSA預裝的模型轉換請讀者參閱RSA的相關文檔
下面簡單介紹RSA模型轉換相關的一些概念
Transformation(轉換)以源模型對象為輸入目標模型對象為輸出實現模型之間的轉換每個轉換由若干條轉換規則組成
Rule(轉換規則)以源模型對象中某部分為輸入目標模型對象的對應部分為輸出實現了功能邏輯上相對獨立的一部分轉換任務
Transformation Context(轉換上下文)轉換上下文是轉換過程中轉換規則之間共享數據的容器在轉換的執行過程中轉換上下文會在規則的實現之間傳遞每一個規則可以向上下文中存放需要共享的數據也可以從中獲取所需的數據
Transformation UI模型轉換框架會為每個轉換提供一個默認的配置管理界面讓用戶指定源模型目標模型以及所需的一些轉換屬性如果需要定制更加復雜的界面元素則需要模型轉換的開發人員對默認的界面加以擴展
至此讀者應該已經對RSA模型轉換框架有了總體的了解本文余下部分將結合具體的例子介紹如何在RSA中基於模型轉換框架開發新的模型轉換和擴展已有的模型轉換
基於RSA模型轉換框架的開發
本節以一個具體的模型轉換為例介紹如何在RSA中基於模型轉換框架開發新的模型轉換這個轉換名為ModelText接受的輸入為UML模型中的ClassPackage或者Model如果輸入為Class則遍歷類的屬性方法參數將這些信息輸出到控制台如果輸入為package或者model則遍歷package和model下面的每一個類將類的信息打印到控制台
創建新的插件工程
通過新建工程向導創建一個插件工程由於模型轉換框架是作為eclipse插件集成在RSA中因此模型轉換工程也必須是一個eclipse插件工程這樣才能夠使用轉換框架提供的組件
添加TransformationProviders擴展點
為了創建一個新的模型轉換需要從TransformationProvider擴展點進行擴展首先添加所需的插件
圖 開發模型轉換所需的插件
然後添加TransformationProviders擴展點該擴展點的ID為comibmretransformationProviders
創建模型轉換的入口TransformationProvider
從TransformationProviders擴展點擴展添加TransformationProvider
圖 創建TransformationProvider
添加TransformationProvider之後需要創建對應的實現類這個類需要繼承自模型轉換框架提供的接口comibmreAbstractTransformationProvider是模型轉換框架執行引擎調用模型轉換的入口點主要提供兩個方法
createTransformation 創建模型轉換的實例返回給調用引擎
validateContext 驗證模型轉換的執行上下文從上下文中可以獲取源模型和目標容器進行驗證驗證的結果會反映在模型轉換的配置管理界面上本例驗證源模型是否ClassPackage或者Model
創建Transformation
本例的ModeltoText轉換在pluginxml中定義如下
< Transformation
version=
name=%Transformationnsole
transformGUI=comibmxtoolstransformsamplesmodeltotextTransformGUI
keywords=%Transformationkeywnsole
author=%Transformationauthor
groupPath=%TransformationgroupPath
sourceModelType=UML
description=%Transformationdescripnsole
document=doc/clasl
targetModelType=None
id=comibmxtoolstransformsamnsoleroot>
< /Transformation>
version=
name=%Transformationnsole
transformGUI=comibmxtoolstransformsamplesmodeltotextTransformGUI
keywords=%Transformationkeywnsole
author=%Transformationauthor
groupPath=%TransformationgroupPath
sourceModelType=UML
description=%Transformationdescripnsole
document=doc/clasl
targetModelType=None
id=comibmxtoolstransformsamnsoleroot>
Transformation的主要屬性
Id 注冊在模型轉換框架中唯一的id可以通過這個id引用這個模型轉換
name 模型轉換的名字也即最終顯示在Transformation彈出菜單中菜單項的內容
sourceModelType 源模型的類型如UMLResource等等本例選擇UML
targetModelType 目標模型的類型由於本例是將源模型中類的信息輸出到控制台所以選擇None
transformGUI 自行定制的配置界面的實現類名如果不指定則轉換框架會提供一個缺省的界面
document 該模型轉換相關文檔存放的位置
為transformation定義規則
每個模型轉換都由若干轉換規則組成每條規則實現了邏輯上相對獨立的一部分轉換功能若干條規則組合在一起實現整個轉換功能轉換規則的實現類應該實現模型轉換框架中提供的comibmreAbstractRule接口一般需要實現如下兩個方法
createTarget 從轉換上下文對象中獲取源模型對象生成目標模型中相應的對象canAccept 該方法會在執行轉換規則之前調用驗證源模型通過驗證則調用規則否則執行引擎會忽略該規則
本例定義了條轉換規則ClassRuleOperationRuleParameterRulePropertyRule分別操作源模型中的類操作參數和屬性對象並輸出信息到控制台
轉換規則需要在模型轉換實例初始化的時候添加
UMLPackage uml = UMLPackageeINSTANCE;
addByKind(umlgetClass_() new ClassRule());
addByKind(umlgetProperty() new PropertyRule());
addByKind(umlgetOperation() new OperationRule());
addByKind(umlgetParameter() new ParameterRule());
這段代碼將條規則添加到模型轉換中並指定每條規則所能夠接收的源模型對象的類型
運行測試
至此ModeltoText轉換已經編寫完成下面開始運行測試由於模型轉換本身是一個Eclipse插件工程所以必須從RSA中再啟動一個RSA Workbench實例將ModeltoText插件加載運行
workbench啟動之後切換到modeling視圖選擇Modeling菜單>Transform>Configure Transformations打開模型轉換配置界面可以看到ModeltoText轉換已經注冊到模型轉換框架中
圖 ModeltoText轉換已經注冊到模型轉換框架中
創建一個UML模型新建一個類Account並添加一些屬性和操作
圖 Account類
然後在Account類上右擊從彈出菜單中選擇Transformations > Class to Text > console開始執行轉換該轉換接收Account類作為源模型對象將Account類的信息輸出到控制台
Class: Account
Attribute: id
Attribute: balance
Operation: setID
Parameter: id
Operation: getID
Parameter: ReturnResult
Operation: setBalance
Parameter: balance
Operation: getBalance
Parameter: ReturnResult
在模型編輯器中創建一個Component作為輸入再次執行ModeltoText轉換由於Component不能通過源模型認證因此模型轉換框架在配置界面上報告錯誤
圖 源模型對象驗證錯誤
如果需要對模型轉換進行調試則需要以Debug模式啟動RSA Workbench之後便可以在源代碼中設置斷點進行調試
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27199.html