内容简介 模型转换框架(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之后便可以在源代码中设置断点进行调试 |