• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    基于RSA模型轉換框架的開發

    發布: 2007-5-24 20:36 | 作者: 佚名 | 來源: 互連網 | 查看: 151次 | 進入軟件測試論壇討論

    領測軟件測試網 本文首先介紹模型轉換的基本概念,然后介紹RSA模型轉換框架,之后本文以兩個具體的例子介紹如何在RSA開發平臺中以模型轉換框架為基礎創建和擴展模型轉換。

    1 內容簡介

    模型轉換框架(Model Transformation Framework)是IBM最新開發平臺RSA(Rational Software Architect)中的重要組成部分,其主要功能是在模型驅動的開發過程中,為實現各種模型之間的轉換提供基礎平臺的支持;谶@個框架,能夠很容易地實現模型之間的轉換程序,以及擴展已有的轉換。

    本文首先介紹模型轉換的基本概念,然后介紹RSA模型轉換框架,之后本文以兩個具體的例子介紹如何在RSA開發平臺中以模型轉換框架為基礎創建和擴展模型轉換。





    2 模型轉換

    MDA(Model Driven Architecture,模型驅動的體系結構)和MDD(Model Driven Development,模型驅動的開發)是當今軟件領域最熱門的話題。相比于傳統的以代碼為中心的開發模式,MDA和MDD則是以模型為中心,在開發的各個階段,都使用模型來描述系統特征。

    模型轉換貫穿于MDD的全過程。系統開發初期,為了刻畫系統特征,一般會創建系統的分析模型。分析模型是一個比較粗糙的模型,相當于草圖的作用,只用于輔助分析。隨著系統的特征越來越清晰,系統的設計模型會慢慢形成。設計模型能夠比較精確地描述系統,是系統實現的基礎。從設計模型可以很容易地導出系統的實現模型。實現模型包括具體的代碼、腳本、配置文件等等。這是一個自頂向下、逐層細化的過程,從高層的抽象模型開始,經過一系列的模型轉換,最終生成底層的系統實現。


    圖1 模型轉換
    圖1 模型轉換

    由此可見,模型轉換在模型驅動的開發和設計中起著非常重要的作用。





    3 RSA模型轉換框架

    RSA(Rational Software Architect)是IBM的新一代軟件開發平臺,代號為Atlantic。RSA基于開放/可擴展的Eclipse 3.0構建,全面支持UML 2.0標準和模型驅動的開發方法。RSA為開發當今日益復雜的應用系統提供了一個強大的的開發環境,整合了UML建模、J2EE、XML、web services、C++開發工具以及RUP過程指南等諸多功能,是軟件架構師/開發人員的首選工具。

    為了支持模型驅動開發過程中各種模型之間的轉換,RSA提供了一個功能強大、易于擴展的模型轉換框架(Model Transformation Framework),該框架是一個基于規則的執行引擎,基于該框架,可以很方便地定義模型轉換規則,實現各種模型之間的轉換。RSA模型轉換框架實現了模型轉換的注冊和配置管理,提供了統一的運行界面,以及各種開發向導。

    RSA預裝有一些常用的模型轉換,包括UML2JAVA、UML2CPP、UML2EJB,這三個轉換分別以UML模型為輸入,生成對應的Java程序、CPP程序和EJB。關于如何使用RSA預裝的模型轉換,請讀者參閱RSA的相關文檔。

    下面簡單介紹RSA模型轉換相關的一些概念:

    • Transformation(轉換):以源模型對象為輸入,目標模型對象為輸出,實現模型之間的轉換。每個轉換由若干條轉換規則組成。
    • Rule(轉換規則):以源模型對象中某部分為輸入,目標模型對象的對應部分為輸出,實現了功能邏輯上相對獨立的一部分轉換任務。
    • Transformation Context(轉換上下文):轉換上下文是轉換過程中轉換規則之間共享數據的容器。在轉換的執行過程中,轉換上下文會在規則的實現之間傳遞,每一個規則可以向上下文中存放需要共享的數據,也可以從中獲取所需的數據。
    • Transformation UI:模型轉換框架會為每個轉換提供一個默認的配置管理界面,讓用戶指定源模型,目標模型,以及所需的一些轉換屬性。如果需要定制更加復雜的界面元素,則需要模型轉換的開發人員對默認的界面加以擴展。

    至此,讀者應該已經對RSA模型轉換框架有了總體的了解,本文余下部分將結合具體的例子,介紹如何在RSA中基于模型轉換框架開發新的模型轉換和擴展已有的模型轉換。





    4 基于RSA模型轉換框架的開發

    本節以一個具體的模型轉換為例,介紹如何在RSA中基于模型轉換框架開發新的模型轉換。這個轉換名為Model2Text,接受的輸入為UML模型中的Class、Package,或者Model,如果輸入為Class,則遍歷類的屬性、方法、參數,將這些信息輸出到控制臺,如果輸入為package或者model,則遍歷package和model下面的每一個類,將類的信息打印到控制臺。

    4.1 創建新的插件工程

    通過新建工程向導創建一個插件工程。由于模型轉換框架是作為eclipse插件集成在RSA中,因此模型轉換工程也必須是一個eclipse插件工程,這樣才能夠使用轉換框架提供的組件。

    4.2 添加TransformationProviders擴展點

    為了創建一個新的模型轉換,需要從TransformationProvider擴展點進行擴展。首先添加所需的插件:


    圖2 開發模型轉換所需的插件
    圖2 開發模型轉換所需的插件

    然后添加TransformationProviders擴展點,該擴展點的ID為com.ibm.xtools.transform.core.transformationProviders。

    4.3 創建模型轉換的入口:TransformationProvider

    從TransformationProviders擴展點擴展,添加TransformationProvider:


    圖3 創建TransformationProvider
    圖3 創建TransformationProvider

    添加TransformationProvider之后需要創建對應的實現類,這個類需要繼承自模型轉換框架提供的接口com.ibm.xtools.transform.core.AbstractTransformationProvider,是模型轉換框架執行引擎調用模型轉換的入口點,主要提供兩個方法:

    createTransformation 創建模型轉換的實例,返回給調用引擎
    validateContext 驗證模型轉換的執行上下文,從上下文中可以獲取源模型和目標容器,進行驗證。驗證的結果會反映在模型轉換的配置管理界面上。本例驗證源模型是否Class、Package或者Model。

    4.4 創建Transformation

    本例的Model-to-Text轉換在plug-in.xml中定義如下:



    
                <Transformation
                version="1.0"
                name="%Transformation.name.classtotext.console"
                transformGUI="com.ibm.xtools.transform.samples.modeltotext.TransformGUI"
                keywords="%Transformation.keywords.classtotext.console"
                author="%Transformation.author"
                groupPath="%Transformation.groupPath"
                sourceModelType="UML2"
                description="%Transformation.description.classtotext.console"
                document="doc/classToTextToConsole.html"
                targetModelType="None"
                id="com.ibm.xtools.transform.samples.classtotext.console.root">
                </Transformation>
                

    Transformation的主要屬性:

    Id 注冊在模型轉換框架中唯一的id?梢酝ㄟ^這個id引用這個模型轉換
    name 模型轉換的名字,也即最終顯示在Transformation彈出菜單中菜單項的內容
    sourceModelType 源模型的類型,如UML2、Resource等等。本例選擇UML2。
    targetModelType 目標模型的類型,由于本例是將源模型中類的信息輸出到控制臺,所以選擇None
    transformGUI 自行定制的配置界面的實現類名。如果不指定,則轉換框架會提供一個缺省的界面
    document 該模型轉換相關文檔存放的位置

    4.5 為transformation定義規則

    每個模型轉換都由若干轉換規則組成,每條規則實現了邏輯上相對獨立的一部分轉換功能,若干條規則組合在一起實現整個轉換功能。轉換規則的實現類應該實現模型轉換框架中提供的com.ibm.xtools.transform.core.AbstractRule接口,一般需要實現如下兩個方法:

    createTarget 從轉換上下文對象中獲取源模型對象,生成目標模型中相應的對象
    canAccept 該方法會在執行轉換規則之前調用,驗證源模型,通過驗證則調用規則,否則執行引擎會忽略該規則。

    本例定義了4條轉換規則:ClassRule、OperationRule、ParameterRule、PropertyRule,分別操作源模型中的類、操作、參數和屬性對象,并輸出信息到控制臺。

    轉換規則需要在模型轉換實例初始化的時候添加:



    
                UML2Package uml2 = UML2Package.eINSTANCE;
                addByKind(uml2.getClass_(), new ClassRule());
                addByKind(uml2.getProperty(), new PropertyRule());
                addByKind(uml2.getOperation(), new OperationRule());
                addByKind(uml2.getParameter(), new ParameterRule());
                

    這段代碼將4條規則添加到模型轉換中,并指定每條規則所能夠接收的源模型對象的類型。

    4.6 運行測試

    至此,Model-to-Text轉換已經編寫完成,下面開始運行測試。由于模型轉換本身是一個Eclipse插件工程,所以必須從RSA中再啟動一個RSA Workbench實例,將Model-to-Text插件加載運行。

    workbench啟動之后,切換到modeling視圖,選擇Modeling菜單->Transform->Configure Transformations,打開模型轉換配置界面,可以看到,Model-to-Text轉換已經注冊到模型轉換框架中:


    圖4 Model-to-Text轉換已經注冊到模型轉換框架中
    圖4 Model-to-Text轉換已經注冊到模型轉換框架中

    創建一個UML模型,新建一個類Account,并添加一些屬性和操作:


    圖5 Account類
    圖5 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,作為輸入再次執行Model-to-Text轉換,由于Component不能通過源模型認證,因此模型轉換框架在配置界面上報告錯誤:


    圖6 源模型對象驗證錯誤
    圖6 源模型對象驗證錯誤

    如果需要對模型轉換進行調試,則需要以Debug模式啟動RSA Workbench,之后便可以在源代碼中設置斷點,進行調試。





    5 擴展模型轉換

    RSA模型轉換框架提供了良好的可擴展性,用戶可以根據具體的應用需求,在已有模型轉換的基礎上增加一些轉換規則進行擴展。例如,RSA預裝的UML2Java轉換是一種基礎性的轉換,在實際應用中,可以對其進行擴展,在生成的Java代碼中增加一些版權聲明。

    一般來說,一個模型轉換通常會根據功能劃分成若干個轉換,每個轉換由若干規則組成,實現一部分獨立的功能,例如,UML2JAVA總的轉換程序為UML2JavaTransform,按照轉換的不同階段,劃分為PropertyTransform,OperationTransform等等,在這些轉換之間,通過轉換上下文共享數據。這樣,在對其進行擴展的時候,需要根據具體的需要,在某些階段的模型轉換中增加轉換規則,并通過轉換上下文共享數據。

    對于一個已有的模型轉換,可能存在很多擴展,在轉換執行的時候,所有的這些擴展轉換規則都會被加載執行,那么用戶如何只選擇執行他們需要的擴展規則,而忽略掉其他擴展規則呢?在模型轉換的開發過程中,一般使用UML Profile來解決這個問題。在擴展模型轉換的時候,開發者往往會提供一個UML Profile,用戶使用這個profile中定義的stereotype對需要執行擴展轉換規則的源模型對象作標記,擴展轉換規則會根據特定的stereotype來過濾源模型對象,選擇執行還是不執行。

    本節以一個具體的例子來介紹如何基于RSA模型轉換框架擴展系統已有的模型轉換。本例將擴展UML2JAVA轉換,擴展之后,用戶對UML模型執行UML2JAVA的時候,擴展規則會為Class中的屬性添加Get和Set方法,對于只讀屬性,只添加Get方法。這個擴展的實現包括兩條擴展規則和一個UML profile,profile提供了一個stereotype,用戶在源模型中對需要生成get和set方法的屬性上應用這個stereotype。DefineGetterSetterRule添加到UML2JAVA轉換中的PropertyTransform,用于收集源模型中需要生成get和set方法的屬性,并存放到轉換上下文中,CreateGetterSetterRule添加到ClassTransform中,該規則從轉換上下文中獲取DefineGetterSetterRule之前設置的屬性信息,創建對應的get和set方法,如果屬性只讀,則只創建get方法。

    下面介紹主要的開發步驟:

    5.1 新建插件工程

    模型轉換的擴展也必須實現為Eclipse的插件。

    5.2 創建UML Profile

    關于如何創建UML Profile,請讀者參閱RSA相關的幫助文檔。本例所用profile的id為GetSetProfile,包含一個名為GetterAndSetter的stereotype,擴展自Property:


    圖7 GetSetProfile
    圖7 GetSetProfile

    5.3 實現擴展規則

    DefineGetterSetterRule的實現:



    
                public boolean canAccept(ITransformContext context) {
                // 本規則接受的源模型對象為應用了GetterAndSetter Stereotype的Property
                if (context.getSource() instanceof Property){
                Property attribute = (Property)context.getSource();
                if(attribute.getAppliedStereotype(GETTER_SETTER_STEREOTYPE) != null){
                return true;
                }
                }
                return false;
                }
                protected Object createTarget(ITransformContext context) {
                /**
                * 記錄需要處理的property的信息,并存放在轉換上下文中,供CreateGetterSetterRule 使用
                */
                Object[] propertyInfo = new Object[2];
                propertyInfo[0] = context.getSource();
                propertyInfo[1] = context.getTarget();
                List properties = (List)context.getPropertyValue("createGetAndSet");
                if (properties == null){
                ITransformContext classContext = context.getParentContext();
                List list = new ArrayList();
                list.add(propertyInfo);
                classContext.setPropertyValue("createGetAndSet",list);
                }else{
                properties.add(propertyInfo);
                }
                return propertyInfo[1];
                }
                

    CreateGetterSetterRule的實現請參考本文附帶的代碼。

    5.4 擴展UML2JAVA轉換

    為了擴展模型轉換,需要從com.ibm.xtools.transform.core.transformationExtensions擴展點進行擴展,將之前實現的轉換規則添加到需要被擴展的模型轉換中。本文以DefineGetterSetterRule為例,介紹如何添加擴展規則:



    
                <TransformationExtension
                version="1.0.0"
                name="DefineGetterAndSetter"
                enabled="true"
                targetTransformation="com.ibm.xtools.transform.uml2.java.internal.UML2JavaTransform"
                id="com.ibm.xtools.transform.samples.uml2java.getterSetter.extension.defineOperation">
                <RuleDefinition
                name="DefineGetterAndSetterOperation"
                class="com.ibm.xtools.transform.samples.uml2java.getterSetter.DefineGetterSetterRule"
                id="com.ibm.xtools.transform.samples.uml2java.getterSetter.DefineGetterSetterRule">
                </RuleDefinition>
                <ExtendTransform
                targetTransform="com.ibm.xtools.transform.uml2.java.internal.PropertyTransform">
                <AddRule
                id="com.ibm.xtools.transform.samples.uml2java.getterSetter.DefineGetterSetterRule">
                </AddRule>
                </ExtendTransform>
                </TransformationExtension>
                

    targetTransformation屬性指定了被擴展的模型轉換,RuleDefinition定義了擴展規則,ExtendTransform則將擴展規則添加到具體的轉換中。

    5.5 運行測試

    至此,對UML2JAVA轉換的擴展實現已經完成,從RSA再啟動一個RSA Workbench實例,加載擴展轉換插件。創建一個UML模型,在模型中創建Account類:


    圖8 Account類
    圖8 Account類

    Account類包含四個屬性,其中password和balance屬性應用了GetterAndSetter Stereotype,在轉換之后會生成對應的Get和Set方法,id屬性也應用了GetterAndSetter Stereotype,但id為只讀屬性,因此在轉換之后只會生成對應的Get方法。userName沒有應用這個Stereotype,則不會生成Get和Set方法。以Account類為源模型,執行UML2JAVA轉換,生成Java程序:




    由生成的代碼可以看出,在轉換框架執行UML2JAVA轉換的時候,會將兩條擴展規則加載執行。





    6 總結

    模型轉換在模型驅動的開發過程中起著重要的作用。RSA提供了一個功能強大、易于擴展的模型轉換框架。該框架是一個基于規則的執行引擎,模型轉換的開發者只需將轉換定義為一系列轉換規則即可,模型轉換框架會負責加載執行規則,并提供統一的模型轉換配置管理,在很大程度上簡化模型轉換的開發過程。

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>