使用各版本的 IBM Rational Software Architect 以及相关软件中的 UML-to-Java 转换
本文展示了如何应用 IBM® Rational® Software Architect 中包含的 Java 转换,来进行在设计合约管理协议(design contract management protocols)背景下的交互式开发。这些协议是专门面向在软件开发周期内管理设计模型与实现代码之间关系的方法
- 内容
在 Rational Software Archictect V7.5 版本中,已经引入了支持设计合约管理协议的转换。以下是对该转换的一些特性的介绍。
注意:
为了简单起见,本文中对该转换都采用 Rational Software Architect(RSA)这一名称来进行描述,但这些信息均适用于以下各版本的 Rational Software Architect,以及相关的 IBM® Rational® 产品。
- Rational Software Architect RealTime Edition
- Rational Software Architect Standard Edition
- Rational Software Architect for WebSphere® Software
- Rational Software Modeler
作者假设您已经了解统一建模语言(Unified Modeling Language,UML)2.0、Eclipse、Rational Software Architect 的一个版本,以及 Java 开发方面的基本知识,这篇文章并不会具体地展示 UML 建模以及 Java 代码实现的细节问题。
过程概述
包含实现转换的开发过程,由以下基本步骤组成:
- 创建一个反映程序结构的 UML 模型。
- 使用 UML 到 Java 转换以生成基于已创建 UML 模型的 Java 代码。
- 编辑生成的代码并运行程序的业务逻辑。
- 使用提供的 Java 转换来保持 UML 模型与 Java 程序同步化。
创建一个排序系统的 UML 模型
- 在 Rational Software Architect 中,打开Modeling 视图,然后从主菜单中选择File > New > Model Project ,来创建一个新的模型项目
- 命名项目为 order,并在向导的第二个页面上,对排序项目添加一个名为 Order Model 的空白包(见于图 1)。
图 1. 创建 UML 模型向导
向创建的模型添加名为orderingApplication 包(图 2)。
图 2. 创建的 UML 样品模型
开发 UML 模型。您可以从 Palette 的 Class 项中的 orderingApplication 包中,对 Main Diagram 添加元素,并在图中使用建模助手。
图 3 展示了范例程序的模型,该程序允许业务所有人生成一个序列,并从用户那里接受付款。
图 3. 范例模型的 UML 类图
使用转换生成基于模型的 Java 代码
下一步,您需要创建一个转换,以指定转换实现参数。
配置转换
- 为了创建一个新的 UML 到 Java 转换配置,在主菜单中选择Modeling>Transform > New Configuration。
- 在打开的 New Transformation Configuration 向导(图 4)的Name区域中,输入转换配置的名字:MyUMLtoJavaTransform in Name。
- 点击省略号(...)以浏览 UML 项目顺序 。
- 在应用转换的列表中,打开Java Transformations 文件夹并选择UML-to-Java 转换。
您必须在向导页面中选择协议类型(图 4)。
图 4. New Transformation Configuration 向导的 Main 页面
协议种类指定在开发周期中推荐采用的 Design Contract Management 协议(DCMP)。使用不同的设计合约管理协议,提供管理的水平,并控制设计模型和实现代码。在三种类型的DCMPs 中涉及到了转换:Conceptual,Mixed,以及 Reconciled。您在转换配置中选择的协议种类,决定了源模型与目标代码之间的同步化水平。
Conceptual protocol
如果您想使用源模型作为未来重复开发中的主引擎产品的话,那么您就可以选择该协议。对源模型的任何更改,都将会在有人运行转换时,推广到目标项目中。
Mixed protocol
如果概念 UML 模型在开发生命周期内重复涉及到了,该协议就是最佳的选择。在运行转换时,源模型中的 UML 元素,会转换为 Java 元素的可视化代表,而且转换输出成为主要的引擎产品。
Reconciled protocol
如果概念模型被维护,并在设计过程中重复使用的话,您必须选择这个模型,而且您会想要在开发周期的某个特定点时,同步化 Java 和 UML 域中发展项目。
注意:
在 Conceptual 协议的背景下,使用 UML 到 Java 的转换,会在这里首先讨论。而在 Mixed 和 Reconciled 协议的背景下,使用转换也会在文章的后面部分涉及到。
在 Transformation Configuration 向导中选择 Conceptual 协议。
应用协议以后,对源模型的任何更改都会扩大到目标模型中。在您运行转换以后,在不更改源模型的前提下,更新目标项目也是可能的。
在 Transformation Configuration 向导中点击Next 按钮(图 4),以移动倒向导的新页面中,在这里您可以为转换指定源元素和目标元素 。
从创建的 UML 项目中选择一个名为Order Model 的模型以作为一个源,然后选择Create a Target Container (图 5)。这将会打开一个 New Java Project 向导。
创建一个名为myOrderCode 的新 Java 项目。并将其作为一个目标选择。
图 5. New Transformation Configuration 向导的源和目标页面
点击Finish (图 5)以指定的项目顺序,创建一个新的 Transformation Configuration 文件,MyUMLtoJavaTransform.tc。
创建的 Java 项目和转换配置文件,在 Project Explorer 视图中可以看到,而且会在 Editor 视图中打开 Transformation 配置(图 6)。
图 6. 转换配置
运行转换配置
- 在 Transformation Configuration 向导中点击Run 以运行配置。
在目标项目中生成 Java 代码(图 7)。
图 7. 生成的转换输出
转换会在源 UML 模型的背景的基础之上,生成 Java 代码:
- 对于类和界面,会生成相应的 xyz.java 文件。转换会对文件和文件夹分配默认的文件名(在 UML 模型中指定)。例如,会生成与 UMLOrderDetail 相应的 JavaOrderDetail 类。
- 转换还会生成 Java 方法和 Java 类文件中的属性。
例如,与 UML 属性数量相关的 Java 属性数量,会在如清单 1 所示的 Java 类OrderDetail中生成。
清单 1. Java OrderDetail 类
/**
* < !-- begin-UML-doc -->
* < !-- end-UML-doc -->
* @generated UML to Java (com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform)
*/
private Integer quantity;
对于每一个 Java 属性 get 和 set 方法,例如,转换会生成getQuantity() 和setQuantity(Integer) 。而与 UML 操作calcSubTotal() 和 calcWeight() 相关的 Java 方法calcSubTotal() 和calcWeight() 会在 JavaOrderDetail 类中生成(清单 2)。
清单 2. OrderDetail 类中的 calcSubTotal() 和 calcWeight() UML 操作
/**
* (non-Javadoc)
* @see Autirization#autorized()
* @generated UML to Java (com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform)
*/
public void calcSubTotal() {
// begin-user-code
// TODO Auto-generated method stub
// end-user-code
}
/**
* (non-Javadoc)
* @see Autirization#autorized()
* @generated UML to Java (com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform)
*/
public void calcWeight() {
// begin-user-code
// TODO Auto-generated method stub
// end-user-code
}
可能您会注意到,转换会在生成的代码中,对元素应用@generated 注释(图 8)。
图 8. 生成代码中的@generated 项
该注释用于保护代码。如果包含实现代码的@generated 注释被删除或者更改了,那么当在同一目标项目中再次运行转换转换时,该代码会受到保护并不再更改(改善的选项,会进一步保护在转换设计中提供的用户代码,在本文中对此不再赘述)。
您可能偶尔会需要更新程序。例如,您可能想要添加一种新的付款方式,例如接受付款顺序。您可以直接更改 Java 代码,或者向模型添加新的类,然后您必须返回致转换部分中。代码会重新生成,而在目标 Java 项目中会添加新类,而根本不去更改受保护的代码部分。
建立一个源-目标追踪关系
转换会给您一个选项,去建立源产品与目标产品之间的追踪关系。元素之间的关系,随着系统复杂性的增加,将会帮助您的团队理解元素,设计决定的说明。
- 为了生成转换源与目标元素之间的追踪关系,在 Transformation Configuration 编辑器的 Common 页面中选择Create trace relationships 复选框(图 9)。
图 9. Transformation Configuration 向导的 Common 页面
当有人在运行转换时,支持 @generated 注释的每一个生成的元素的注释,都被修改为包含代表源 UML 元素的 EMF URI 。如清单 3 所示。
清单 3. 代表源 UML 元素的 EMF URI
/**
* @generated sourceid:platform:/resource/UMLS/UMLS.emx#_NLHDQIr0Edu0eunV5GC2yg
*/
public class Order {
}
在源 UML 元素和目标 Java 元素之间,建立一个追踪关系。建立的追踪关系,允许在返回致转换时,目标与源元素之间的改善的合并操作(改善的功能超出了本文的讨论范围)。
- 在建立追踪关系以后,对于每一个 UML 类或者界面,您可以通过在 Project Explorer 中选择元素,然后从下拉菜单中选择Query > Traceability > Implementations ,来追踪 Java 的实现情况。
- 点击OK 以响应 Save As 对话框(图 10)。
图 10. Traceability 图的 Save As 对话框
将会创建一个新的图,以追踪选择 UML 类和实现该类的 Java 类之间的关系(图 11)。
图 11. 生成追踪性图
使用映射模型以指定可选的 Java 文件名
在开发过程中,为目标 Java 文件或者 Java 包,可能需要指定可选的(非默认的)名字。例如,您可能会想要生成包含特定用户信息,或者提供不同类名的多种 Java 包。在UML 到Java 转换中,在映射模型中可以指定可选或者逻辑组织的名字。
- 为了生成 Mapping mode,l ,在 Transformation Configuration 编辑器中打开 the Mapping 项,并选中Enable the mapping functionality for this configuration 旁边的复选框(图 12)。
图 12. Transformation Configuration 编辑器的映射项
- 点击 New按钮然后选择 OK,这样在 Create a Mapping Model 向导中接受默认值(图 13)。
注意:
您可以选择任意的项目,以存储 Mapping 模型,但是该 Mapping 模型必须存储在存储源模型的地方 。
图 13. Create a Mapping Model 向导
结果,会为每一个源模型的 UML 元素,生成一个新的包含了 UML 产品的 UML 模型,而生成产品与相应 UML 元素之间关系的关系也建立起来。在该模型中,您可以为任意的 Java 文件,或者转换生成的 Java 包指定文件名。
- 在 Transformation Configuration 编辑器的 Mapping 项上,点击 Edit Mapping 按钮。
- 当您看到 Model Element 向导的 Edit the Mapped names 窗口时(图 14),选择您想要指定名字的 UML 元素。
- 在“Mapped name”区域中,为在目标项目中生成的选择元素输入一个新名字 。
在图 14 中,选中了orderingApplication 包,并为其指定了名字 orderingCD。
图 14. Edit the Mapped Names 视图
- 点击Apply 。
指定的映射名,出现在 UML Element List 中包的附近(图 15)。
提示:
然后您可以指定另外一个元素(例如, **Customer 类),并为其指定一个映射名。您可以使用一个有意义的名字,例如 com.ibm、NewCustomer.com,也或者是一个无意义的名字,例如NewCustomer。
在图 15 中,NewCustomer 就是映射名。注意在映射模型中指定一个名字,并不会改变源模型。
图 15. 在前面为包已经指定名字的 Edit the Mapped Names 向导
- 在 Edit the Mapped Names 视图中,为包更改前面指定的映射名
- 点击Apply 然后点击OK 以关闭 Edit the Mapped Names 视图的 Model Element 对话框。
在 Mapping 模型中, Customer 产品的 File Name 属性值被设置为NewCustomer (图 16)。
图 16. Mapping 模型中 Customer 产品的属性
- 保存更改的转换配置并运行转换。
当您运行已经选中 Mapping 模型的转换时,在 Mapping 模型中指定的文件或者包名,会应用到转换生成的元素上。在新的包下,会生成已指定映射名的包下的所有类(图 18)。该例会生成一个新的 Java 包,orderingCD,它包含了在源 UML 模型中所有可用的 Java 类。在该包中会生成称为 Customer 的 UML 类,它的名字就是在 Mapping 模型中指定的新名字 NewCustomer。
图 17 .能够使用 Mapping 模型的 UML 到 Java 转换生成的输出
Java 区域以及操作参数的种类,同样会以新名字 NewCustomer 生成(见于清单 4)。
清单 4. 参数同样会以新名字"NewCustomer"生成
/**
*
*/
package orderingCD; import java.util.Set;
/**
* <!-- begin-UML-doc -->
* <!-- end-UML-doc -->
* @author Administrator
* @generated UML to Java (com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform)
*/
public class Order {
/**
* <!-- begin-UML-doc -->
* <!-- end-UML-doc -->
* @generated UML to Java (com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform)
*/
private NewCustomer customer;
/**
* @return the customer
* @generated UML to Java (com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform)
*/
public NewCustomer getCustomer() {
// begin-user-code
return customer;
// end-user-code
}
/**
* @param customer the customer to set
* @generated UML to Java (com.ibm.xtools.transform.uml2.java5.internal.UML2JavaTransform)
*/
public void setCustomer(NewCustomer customer) {
// begin-user-code
this.customer = customer;
// end-user-code
}
提示:
当您打算传递一些UML 模型中生成的 Java 程序的时候,运行转换时 Mapping 模型的使用将会十分有用。
决定是否使用 Mixed 或者 Reconciled 协议
什么时候去使用 Mixed 协议
如果您打算在目标域中,而不是源模型中继续开发的话,那么您 可以选择该协议。如果您为转换选择的是 Mixed 协议,那么源模型中的 UML 元素将会在转换和输出成为主要的产品时,转化为 Java 元素的可视化代表。
- 在 Transformation Configuration 编辑器的Main页面上(图 18),选择 Mixed 复选框作为协议。
图 18. 已选择 Mixed 协议的转换配置编辑器的主页面
- 保存配置。
并不是概念协议中所有可用的转换特性现在都可以使用;例如,在 Common 项上创建追踪关系的选项现在就不能用。但是,您仍然可以为转换输出,创建以及使用 Mapping 模型以指定可选(非默认)文件名。当您运行转换时,源模型中的 UML 元素会被 Java 文件的参考所代替 。
- 运行转换并点击 OK 以回应警告对话框(图 19)。
注意:
显示的对话框会提醒您,源模型中的 UML 元素已经删除。如果您点击 OK 以回应警告对话框的话,那么在源模型中就只能使用 Java 元素的可视化代表了。而如果您点击的是警告对话框中的Cancel 按钮时,目标项目中仍然会生成代码,而源模型中的 UML 元素则不会被参考所取代。
图 19. 当转换试着取代 UML 元素时的警告
在 UML 模型的 Project Explorer (图 20)中,会显示出 Java 文件而不是 UML 元素的参考。
图 20. 使用 Mixed 协议的 UML 到 Java 转换生成的 Project Explorer 视图
在源模型中存在的图上,UML 元素会被 Java 可视化元素所取代(图 21)。注意 UML 联系会被 Java 类中生成的属性所取代。
图 21. 使用混合协议的 UML 到 Java 转换生成的输出的 Diagram 视图
在 Project Explorer 或者图中双击任意一个链接,都将会在 Java 编辑器中打开元素的 Java 代码。如果您需要在模型中存储 UML 元素,使用这个 Main 菜单路径:Edit > Undo UML to Java 5 Transform。
在未来的开发过程中,您可以完全的移至 Java 域,或者继续对源模型添加 UML 元素,并重新使用 UML 到 Java 的转换。
什么时候使用 Reconciled 协议
如果您打算同时在 Java 和 UML 中独立的发展项目,并且在开发周期的某个特定点处同步化产品,那么您可以为 UML 到 Java 转换选择 Reconciled 协议。该选项回应了名为 Reconciled Modeling 的 Design Contract Management 协议。
在 Transformation Configuration 编辑器的主页面上,选择Reconciled protocol 。反向 Java 到 UML 的转换也是可以的,在编辑器中还会出现 Java 到 UML 转换的特定额外细节(图 22):“Java to UML Options”和“Java to UML Associations”。您可以使用这些项去配置一个反向的 Java 到 UML 转换。
图 22. 带有选择 Reconciled 协议的转换配置
通过运行前面(UML 到 Java)转换,Java 代码会以文章前面描述的那样生成。您可以在 Java 和 UML 域中独立的进行以后的开发。在开发周期的任意点处,通过运行 Java 到 UML 转换,并将得到的结果与已存在的模型融合,可以使 UML 模型与 Java 代码保持同步性。如果模型是从代码中独立发展出来的,那么将已存在的 java 项目作为目标来实现 UML 到 Java 转换,可以达到进一步同步化的效果(使用 Reconciled 协议来重复开发的具体细节部分,超出了本文的讨论范围)。
如果一个团队要建模、实现、开发或者维护程序时,那么 Reconciled 协议将会变得十分有用。Reconciled 建模为在开发周期内的结构化更改管理,提供了一种强有力的支持。
探索进一步的细节并得到范例模型
本篇文章涉及到了 Rational Software Architect 家族产品包含的 Java 转换的基本程序,以使用 Java 程序的 Design Contract Management 协议。参考软件的 Help 文件以得到更多的具体细节。