IBM Rational Software Architect 通过编程方式生成UML模型
统一建模语言(UML)在全世界范围内,成为软件开发项目方面广泛采用的交流标准。在软件项目中,UML 模型现在用于描述以及交流软件产品,它从获取软件结构的需求出发,然后分析,设计,开发,部署应用,以及维护。
但是,在大多数情况下,项目中的信息资源是用文本格式描述的,所以这些资源在 UML 中需要以最佳实践方式表达出来,这样就能与项目的其他成员顺利交流。
例如,在设计团队设计软件时,提交给团队之前,业务过程分析可能需要,将文本形式的业务过程描述转化为 UML 活动图。UML 活动图对于构建人员与设计人员来说,表达的更加清晰与简洁。业务分析员在理解业务过程描述,为每一个业务过程创建活动图时,可能要花相当长的一段时间 。这时候如果有一个能由文本描述自动生成模型的工具,那无疑能有很大的帮助。 而 Rational Modeling Platform. API 通过简单的 Java ™代码,就具有构建一个这种工具的能力
Rational Modeling Platform. 是建立在 Rational 建模方案 的基础之上。它最显著的特性,和建模编辑器,视图以及通过使用平台提供的各种服务,来构建的工具一道,组成了一个 UML 建模器。 该平台基于 Eclipse 技术,这是一个开放源工具集成平台。Rational 建模方案包括了 Eclipse。
Rational Modeling Platform. 结构
Rational Modeling Platform. 覆盖了大量的技术,这些技术可以分成两组: Rational 建模组件以及 Eclipse 组件。接下来的章节,是在编程模型过程中,发挥过一定作用的每个组件的简单概述。
图 1. Rational Modeling Platform. 结构图
- Eclipse 平台。Eclipse 技术的核心是Eclipse 平台。该组件包括构建用户界面的框架,管理资源,坐标构建器,集成调试器,以及其他部件。Eclipse 平台,拥有一个集成开发环境需要的全部基本框架。IBM Rational 建模方案,大量使用了该平台提供的扩展性能。
- Eclipse Modeling Framework(EMF。EMF 是一项用作 IBM Rational 建模方案中枢的集成技术。
- UML 2 。UML 2 是一个基于 EMF 的 UML 2.1 子结构规格说明的实现。UML 是一种对分布式对象系统可视化,说明,构建以及记录的图形化定义语言。Rational Modeling Platform. 为它的 UML 2.1 功能而使用该工具。
- EMFT Transactions 。EMFT就是 Eclipse Modeling Framework Technology。该框架包含了补充管理基于 EMF 模型的一些技术。EMFT Transactions 组件,为建模管理(模型评估以及修改),提供了一个框架。Rational Modeling Platform. 为所有的模型管理使用 EMFT Transactions 。
- EMFT OCL 。EMFT OCL 是一个基于 EMF 的 OCL 2.0 规格说明的工具。 Object Constraint Language (OCL)是一种用于描述应用于 UML 模型规则的规范语言。Rational Modeling Platform. 使用 EMFT OCL ,来对它管理的模型评估 OCL 效果,并在代码完成期间,验证用户输入。
- EMFT Validation 。EMFT Validation 是一种对 EMF 实例模型的可扩展的验证框架。Rational Modeling Platform. 使用 EMFT Validation 来约束它管理的模型。特别值得一提的是,它使用框架根据官方规格说明来约束 UML 2 模型。
- EMFT Query 。EMFT Query 是一种帮组转移 EMF 模型实例的框架。它提供了一种 SQL-inspired 系列的类,以组织查询,以及类的层级结构。 OCL 效果在模型转移期间,支持作为一个过滤器。Rational Modeling Platform. 使用 EMFT Query 来在它管理的模型中,执行搜索。
- Graphical Editing Framework (GEF) 。GEF 为创建图形编辑器提供了一个基础。它包括了基于 模型-显示-控制 (MVC)的框架,以及一个呈现分系统。Rational Modeling Platform. 在 GMF(Graphical Modeling Framework)组件中,为它的图形工具而直接使用 GEF 。
- Graphical Modeling Framework (GMF) 。GMF 是一个创建图形化建模编辑器的框架。它包括了两个主要的部分:一个运行时组件,以及一个工具组件。运行时部分提供了,支持可扩展的基于 GEF 和 EMF 建模图形,所需要的基础。工具部分能够从各种输入模型中,生成一个这样的编辑器。Rational Modeling Platform. 可扩展的使用 GMF 运行时元素。
Rational Modeling Platform. 组件
Rational Modeling Platform. 组件涉及到三层: UML Modeler, UML Modeling 层,以及 Domain Modeling 层。
- UML Modeler 层。UML Modeler 层包含了,管理平台的 UML 建模环境所需要的类和接口。类
UMLModeler
是一个控制建模器的 UML 模型的生命周期以及概述的切入点。另外, 该层还为与 UML 模型交流需要的各种类,提供了访问方法。
- UML Modeling 层。UML Modeling 层包括了与 UML 模型与图协同工作的帮助组件。例如,它包括了在模型中帮助找到 UML 对象的组件,帮组使用 UML 元素种类(例如,获得节点,控制节点,注释)的组件,以及帮组寻找,创建,编辑或者分析图的组件。
- Domain Modeling 层。Domain Modeling 层涵盖了各种对生成任意基于 EMF 建模编辑器有用的服务。
Rational Modeling Platform. API 术语以及概念
在开始使用 Rational Modeling Platform. API 之前,了解怎样管理模型与图非常重要。接下来的列表包含了,一些您需要了解的重要术语以及概念。
- Rational Modeling Platform. 模型 。Rational Modeling Platform. 管理的模型 ,是 EMF 模型的实例。例如, Rational Modeling Platform. 中的每一个 UML 模型,都是一个基于 EMF 的 UML 模型的实例,该模型可通过 UML 2 中的
org.eclipse.uml2.uml
插件获得。该插件是官方 UML 2.0 规格说明的一个工具。UML 模型通过使用 Java 接口来阅读和修改。Model 管理主要通过UMLModeler
Java 类来进行。这是一个显示模型以及概述生命周期操作,并提供建模平台访问方式的实用类.。
- Rational Modeling Platform. 编辑域。EMF 引入了一个编辑域(editing domain)概念,以控制模型的生命周期。一个编辑域管理一系列自包含的相关 EMF 模型,以及修改模型的指令(commands)。Rational Modeling Platform. 的 UML 建模器使用的编辑域,可通过
UMLModeler.getEditingDomain()
方法获得。
- Commands 。一个command对模型的修改具有作用。 一个命令通过
Command
Java 接口表达。
- Command stacks 。一个command stack是指与编辑区相关的特性。命令集包含了用于修改模型的命令,这些模型是被编辑域控制的。一个命令集是由
CommandStack
Java 接口表达的。
- Rational Modeling Platform. 图。Rational Modeling Platform. 图基于GMF 符号模型。 一个 GMF 注释提供了描述图的基本对象。它定义节点,边缘,形式,以及其他系列化图框架所需的图形信息。在 Rational Modeling Platform. 中,图是作为注释,而向 UML 模型元素添加的,并持续存在于 UML 建模文件(.emx 文件)中。Java 接口
IUMLDiagramHelper
用于管理 Rational Modeling Platform. 图。下面的 Java 代码示例,演示了 Rational Modeling Platform. API 的使用。该代码是通过 IBM®Rational®Software Architect 中的一个 Java Pluglet 显示的 。Pluglets 是一种小型的 Java 程序,用于以一种简单而直接的方式,来对工作台作出一些微小的扩展。Pluglets 用 Java 写成,并置于一个 pluglet 项目中。 pluglet 可以用工作台的相同示例测试,就像任何其他 Java 应用软件一样。Pluglet 作者可以使用 Java 开发环境,并且他们可以访问 Rational Modeling Platform. 软件编程接口(APIs)。
代码示例从一个文本文件中,阅读业务过程步骤,并为 Rational Software Architect 中的该过程,创建一个 UML 活动图框架(每一步过程都对应着一个活动节点)。为了创建这个图,代码使用 Rational Modeling Platform. API ,以管理 Rational Modeling Platform. 模型,图以及模型元素。
为了更好的理解代码,建议您浏览一下 pluglet 代码的 UML 序列图。该图以一张 JPG 图片的方式显示,并在下载部分中作为文章的附属材料。
pluglet 是 pluglet 类的
plugletmain()
方法的执行切入点:GenerateActivityDiagram
。代码从获得 Rational Modeling Platform. UML Modeler 编辑域开始。如上所述,编辑域用于管理 Rational Modeling Platform. 模型。列表 1 中的代码行获得了建模编辑域:
列表 1. 获得 UML Modeler 编辑域TransactionalEditingDomain editDomain = UMLModeler.getEditingDomain();
接下来的一步是模型管理。根据 Rational Modeling Platform. 编程模型,模型管理通过定义与运行命令来完成,这些命令来自与编辑域相关的命令集。最简单的方式,是扩展
RecordingCommand
类,并执行doExecute()
抽象方法,来完成需要的模型改变。列表 2 中的代码片段,创建了一个新的RecordingCommand
,执行doExecute()
方法,并通过访问execute()
方法,来执行命令,该方法位于与 UML Modeler 编辑域相关的命令集。
列表 2. 获得一个特定的 UML 模型并对它进行编辑editDomain.getCommandStack().execute(new RecordingCommand(editDomain, undoLabel) { protected void doExecute() { Collection models = UMLModeler.getOpenedModels(); for (Iterator iter = models.iterator(); iter.hasNext();) { Model model = (Model) iter.next(); out.println(model.getName()); if (model == null ) out.println("Could not open model"); else{ //Start operating on models having the name "*Test*" if (model.getName().indexOf("Test") != -1){ createProcessActivityDiagram(model); } } } } });
前面代码中的
doExecute()
方法,获取了所有当前在 Rational Modeling Platform. 环境(Rational Software Architect)环境中打开的模型。接下来,它对这些模型进行迭代,对于每一个以“Test”作为名字一部分的模型,它执行createProcessActivityDiagram()
方法,传递管理作为一个参数的模型示例。该方法从一个外部文本文档中阅读业务过程步骤示例,并向作为一个参数传递的模型,添加一个新的活动图。新创建的活动图包含了,为从文本文件中读取的每一个业务过程步骤设置的节点。接下来是一个createProcessActivityDiagram()
方法的具体解释。方法
createProcessActivityDiagram()
做了所有的模型管理工作。最初,它向进行中的模型添加一个新的 UML 包裹 ,package1
。接下来,它向新创建的包裹,添加一个新的 UML 活动 ,Activity1
,然后它创建一个新的 UML 活动图,ActivityDiagram1
,并将其添加至 UML 活动。然后,过程步骤从文本文件中读取,一个活动节点为其中的每一步添加至Activity1
。最后,通过使用IUMLDiagramHelper
接口方法layoutNodes()
,图中为活动创建的节点,为显示而作出调整。浏览列表 3 中的代码片段。
列表 3. 修改 Rational Software Architect 中的 UML 模型并添加包裹,活动,图,以及活动节点//Create a package to hold the activity diagram Package aPackage = addPackage(model, "package1"); //Add an activity "Activity1" to the package Activity activity1 = addActivity(aPackage, "Activity1"); //Add an activity diagram to the activity Diagram diagram = addActivityDiagram(activity1, "ActivityDiagram1"); ... //Read process steps from a file... in = new BufferedReader(new FileReader("...")); ... while((actionName = in.readLine())!=null){ //Add an action to the activity addAction(activity1, actionName); } ... //Adjust diagram layout UMLModeler.getUMLDiagramHelper().layoutNodes(diagram.getChildren(), "DEFAULT"); ...
如果您想得到关于
addPackage()
,addActivity()
,addActivityDiagram()
,以及addAction()
更多的细节信息,您可以阅读 Rational Modeling Platform. API 文件(参见参考资源)。完整的代码可由这里获得(参见下载部分)。该代码是用 Rational Software Architect V7.0.0 开发与测试的。确保在运行代码之前,您已经安装了 Rational Software Architect 的以下可扩展性特性:
- Pluglets
- Plug-in Development Environment
- Eclipse Technology Extensibility
- Modeling Extensibility
通过以下步骤,运行示例代码:
- 切换至 Rational Software Architect 的Modeling视角。
- 向 Rational Software Architect 引入ModelGenProj项目。
- 选择File > Import。
- 在Import对话框中,选择Other > Project Interchange并点击Next。
- 在 Import Project Interchange Contents 对话框中,指向文件ModelGenProj.zip,检查ModelGenProj条目并点击Finish。
- 打开GenerateActivityDiagram.java文件,它位于
com.gbm.rational.support
包裹中。确保 pluglet 代码定义的过程步骤文件的路径,指向了正确的位置。该位置在列表 4 所示的代码行中得以定义。您要么可以在代码中编辑文件位置,要么可以在您的文件系统中创建一个文件夹结构,该文件系统在代码中与参考的路径一起编辑。
in = new BufferedReader(new FileReader("..."));
- 通过在位于ModelGenProj > Models > Test之下的 Rational Software Architect Project Explorer 中双击一个名为Test的模型,来打开它。确保这是 Rational Software Architect 中唯一打开的模型,因为 pluglet 代码会处理,所有打开的以字符串“Test”作为名字一部分的模型。
- 在 Project Explorer 中,右击GenerateActivityDiagram.java文件,并选择Run As > Pluglet。
- 在运行代码后,检查您的 UML 模型。您会发现一个新创建的包裹,以及一个创建用于显示 steps.txt 文件中定义的过程步骤的UML 活动图。该文件包含了一列建模的过程步骤,每一个单独成行。为了在 Project Explorer 中检查创建的 UML 图,进入ModelGenProj > Diagrams > Test并双击 UML 图package1:Activity1: ActivityDiagram1。
作者:Ahmed Makady, GMSR 合作伙伴, Gulf Business Machines
- Rational Modeling Platform. 模型 。Rational Modeling Platform. 管理的模型 ,是 EMF 模型的实例。例如, Rational Modeling Platform. 中的每一个 UML 模型,都是一个基于 EMF 的 UML 模型的实例,该模型可通过 UML 2 中的