UML 到 CORBA 的转换将统一建模语言(UML)版本 2.0 的模型元素转换成公共对象请求代理体系结构(CORBA)接口定义语言(IDL)。您可以使用该转换从 UML 2.0 规范生成 CORBA 项目。该转换还提供了可选的轻量级概要文件,您可以使用该概要文件来建立模型并生成大多数 CORBA 元素。
在使用 UML 到 CORBA 的转换之前,您应该熟悉 UML 2.0 模型和项目的创建和编辑。以下过程显示了 CORBA 转换的最基本用法。
要将 UML 模型转换成 CORBA:
1. 确保您在“建模”透视图中。
2. 在“模型浏览器”视图中创建名为“Component1”的 UML 组件,在该组件内部创建名为“Interface1”的接口。
3. 右键单击该组件;然后单击转换 > 运行转换 > UML 2 CORBA。
4. 在“运行转换”窗口中,单击创建目标容器。
5. 在新建项目窗口中,将项目名称指定为 Sample ,并单击完成。
新项目包含名为“Component1.idl”的 IDL 文件,该文件具有已定义的名为“Interface1”的接口。
转换也可以执行其他几个更复杂的功能,例如覆盖名称而不修改源模型、验证 UML 模型的潜在转换问题等。
您可以将 UML 模型、组件、包含组件的包或者这些元素的组合指定为每个转换应用的源。转换为指定源层次结构中的每个 UML 组件生成一个 IDL 文件。每个 IDL 文件只包含属于相应 UML 组件的元素的代码。转换忽略不属于 UML 组件的元素。如果您将任何其他元素指定为转换的源,则在验证过程中转换将失败。
当您应用 CORBA 概要文件时,您可以控制模型中的 UML 组件,转换生成的正是这些组件的代码。您可以通过将 generateCode 属性设置为 true 或 false 来执行此控制。将该属性设置为 false 时,转换在生成代码时将忽略这些组件。
每个转换应用的目标是简单的 Eclipse 项目资源。该项目包含一个或多个 IDL 文件,这些文件被视为 Eclipse 工作区资源文件。
您可以建立以下 CORBA 类型的模型而无需使用概要文件:
可选概要文件提供构造型可对更多特定 CORBA 类型(如下所示)建立模型:
CORBA 转换概要文件定义了对于构造型的约束。要评估这些约束并报告有关源模型的任何错误,您可以使用“运行验证”命令。CORBA 转换还对应用转换的模型部分执行其他验证。
您可以使用映射模型对生成的代码中的已建模元素进行重命名。除组件外,您只能用简单标识来重命名 UML 元素。您可以用简单标识或用有效的部分路径(相对于生成 IDL 文件处的目标容器)来重命名 UML 组件。该路径应该以 IDL 文件的名称结尾。例如,如果您将组件 A 重命名为 dirA\A,则转换在名为 dirA 的目录(不是在顶级目标容器)中生成 A.idl。
下表列出了转换如何将 UML 2.0 模型元素映射为 CORBA IDL。
UML 2.0 元素 |
CORBA IDL 元素 |
模型 |
无 |
组件 |
IDL 文件 |
基本(Primitive)类型 |
基本(Basic)类型 |
专有 |
|
包 |
模块(如果包在组件中) |
被忽略(如果包不在组件中) |
|
接口 |
接口 |
属性或关联 |
属性 |
操作 |
IDL 操作 |
参数 |
IDL 操作的参数 |
枚举 |
枚举 |
类 <<CORBAValue>> |
值类型 |
定制值类型 |
|
固定的值类型 |
|
静态属性 |
常量 |
类 <<CORBAStruct>> |
Struct |
类 <<CORBAException>> |
异常 |
类 <<CORBATypedef>> |
Typedef |
数组 |
|
序列 |
UML 2.0 组件映射为单个 CORBA IDL 文件。组件的 IDL 文件包含属于该组件的所有 CORBA 元素。
UML 2.0 基本类型映射为 CORBA 基本类型或 CORBA 专有类型。包含所有 CORBA 基本类型(作为 UML 2.0 基本类型)的 UML 2.0 类型库可以导入到模型中。另外,您还可以创建与现有 CORBA 基本类型同名的 UML 2.0 基本类型,用作模型中的类型选项。以下列表显示了类型库中可用的 CORBA 基本类型:
不以该列表中指定的类型命名的 UML 2.0 基本类型表示 CORBA 专有类型。CORBA 专有类型生成
IDL 文件中的专有定义,并可用作该模型中的类型选项。
UML 2.0 组件中包含的 UML 2.0 包映射为 CORBA 模块。转换忽略不在 UML 2.0 组件中的
UML 2.0 包。
UML 2.0 接口映射为 CORBA 接口。UML 2.0 接口的 UML 2.0 泛化关系映射为 CORBA 接口的继承。下表列出了转换是如何转换接口属性的。
UML 接口属性 |
转换结果 |
名称 |
IDL 中的新 CORBA 接口(具有指定的名称,且已除去名称中的所有非法字符)。 |
可视性(公共) |
普通接口 |
可视性(私有) |
本地接口 |
抽象 |
抽象 CORBA 接口 |
叶 |
Ignored |
UML 2.0 属性和关联映射为 CORBA 属性。下表列出了转换是如何转换属性特性的。
转换结果 |
|
名称 |
具有相同名称的 CORBA 属性 |
类型 |
具有指定基本类型的 CORBA 属性 |
“Is Static”和“default”值 |
CORBA 常量 |
只读 |
只读 CORBA 属性 |
顺序 |
IDL 顺序 |
下表列出了转换是如何转换关联属性的。
UML 关联属性 |
转换结果 |
名称 |
具有相同名称的 CORBA 属性 |
类型 |
类型为此关联的供应端的 CORBA 属性 |
“Is Static”和“default”值 |
CORBA 常量 |
只读 |
只读 CORBA 属性 |
顺序 |
IDL 顺序 |
UML 2.0 操作在 UML 接口或者具有 <<CORBAValue>> 构造型的 UML 类中声明,直接映射为 IDL 操作。转换忽略其他 UML 2.0 操作。下表列出了转换是如何转换操作属性的。
UML 操作属性 |
转换结果 |
名称 |
具有指定名称的新 CORBA 操作 |
返回类型 |
CORBA 操作的返回类型 |
所有其他属性 |
忽略 |
具有 <<CORBAOneway>> 构造型的操作 |
单向 IDL 操作 |
<<CORBAValue>> UML 类中操作上的 <<create>> 构造型 |
映射为 CORBA 值初始化程序操作 |
UML 2.0 参数映射为 IDL 操作的参数。下表列出了转换是如何转换参数属性的。
UML 参数属性 |
转换结果 |
名称 |
具有指定名称的新参数 |
方向(进、出和进出) |
IDL 中的相应参数;忽略“return” |
类型 |
具有指定类型的参数 |
可视性 |
忽略 |
UML 2.0 枚举映射为 CORBA 枚举。枚举只能包含枚举字面值。
具有 <<CORBAValue>> 构造型的 UML 2.0 类映射为 CORBA 值类型。<<CORBAValue>> 构造型是名为
specification 的属性附带的,并以 enumeration {"none",
"custom", "boxed"} 形式输入。缺省值是“none”。如果您将 specification 属性设置为“custom”,则它映射为
CORBA 定制值。如果您将 specification 属性设置为“boxed”,则它映射为 CORBA 固定值。
CORBA 值类型是具有可选状态和初始化程序方法的实体,上述状态和方法均不同于接口的属性。CORBA 值类型中的状态成员由具有 <<CORBAState>> 构造型的 UML 2.0 属性表示;初始化程序方法则通过应用 <<create>> 构造型(在产品附带的基本概要文件中)来表示。
下表列出了转换是如何转换类属性的。
UML 类属性 |
转换结果 |
构造型 |
<<CORBAValue>> |
名称 |
具有指定名称的新值类型。 |
可视性 |
被忽略 |
抽象 |
抽象值类型 |
具有 <<CORBAState>> 的属性(可视性为公共或私有) |
具有 CORBA 值类型的 CORBA 状态成员(可视性为公共或私有) |
具有 <<create>> 的操作 |
非抽象值类型的 CORBA 工厂方法 |
CORBA 常量声明可以出现在 IDL 文件、模块、接口或值类型的范围内。
出现在接口或值类型范围内的 CORBA 常量可以由相应 UML 接口或类中的
UML 静态属性表示。
出现在 CORBA 模块范围内或 IDL 文件范围内的 CORBA 常量必须是具有
<<CORBAConstants>> 构造型的 UML 类,该构造型出现在 UML 包(对于模块常量)或 UML 组件(对于 IDL 范围常量)中。
该类的名称将被忽略。具有 <<CORBAConstants>> 构造型的类的每个属性表示常量声明。
具有 <<CORBAStruct>> 构造型的 UML 2.0 类映射为 CORBA struct。强制该类只有属性,而没有操作。struct 成员由该类的 UML 属性或关联表示。
具有 <<CORBAException>> 构造型的 UML 2.0 类表示异常定义。这种类型的类可选择性地包含属性。
在 CORBA 2.4 中,只有 CORBA 操作可以导致异常,而 CORBA 属性无法导致异常。因此,如果 CORBA 操作导致异常,
则由相应 UML 操作的 RaisedException 属性表示。
转换使用 CORBA typedef 为现有 CORBA 类型指定新名称。具有 <<CORBATypedef>> 构造型的 UML 2.0 类
映射为 CORBA typedef。由此类到现有 CORBA 类型的 UML 2.0 替代关系是表示 CORBA typedef
的完整表示法。
CORBA 2.4 规范不推荐使用 CORBA 数组和序列类型的匿名声明。该映射不支持匿名
CORBA 数组或序列。
您应该使用 typedef 声明来命名数组或序列类型。扩展 UML 2.0 类的 <<CORBATypedef>> 构造型
包含 specification 属性(其值为“none”、“array”和“sequence”,缺省值为“none”)
和包含数组或序列维数的 dimensions 属性(其缺省值为空)。
CORBA 数组建模为 UML 2.0 替代关系(从具有 <<CORBATypedef>> 构造型的类到表示数组元素类型的 UML 元素)。
该构造型的“specification”属性设置为“array”,而“dimensions”属性设置为表示数组维数(例如,“[3][5]”)的字符串。
从构造类型到“具有 <<CORBATypedef>> 构造型的类”的关联建模为 CORBA 数组类型的构造类型中的成员。
CORBA 序列建模为 UML 2.0 替代关系(从具有 <<CORBATypedef>> 构造型的类到表示序列元素类型的 UML 元素)。
该构造型的“specification”属性设置为“sequence”,而“dimensions”属性可以设置为表示序列的上限
(例如,“12”)的字符串值。
从构造类型到“具有 <<CORBATypedef>> 构造型的类”的关联建模为 CORBA 序列类型的构造类型中的成员。
当所用类型的定义出现在其他组件中时,转换将自动生成 #include。大多数 CORBA IDL 文件
需要包含 ORB.idl 文件。当您需要在未建模的另一个外部 IDL 文件的生成 IDL 文件中强制包含 #include 时,您必须
创建从当前组件到新建组件(表示外部 IDL 文件)的依赖关系。您可以通过将 generateCode 属性设置为 false 来
避免生成新建组件的代码。该属性是 CORBA 概要文件中的组件构造型
附带的。例如,要在 IDL 文件中生成“#include <ORB.idl>”,您应该创建从
对当前 IDL 文件建模的组件到名为 ORB 的新组件之间的依赖关系。另外,为阻止转换生成名为 ORB 的新组件的代码
请将其 generateCode 属性设置为 false。
以下 CORBA 构造当前在此概要文件中没有映射:
CORBA 转换提供与“团队支持”的集成,以便用户可以自动检出新文件并将其添加到源控制系统。
如果您不想修改转换的源模型,您可以为转换的目标元素指定备用名称。
如果要在平台无关的模型中包含 CORBA 特定的详细信息(例如,命名限制),则您也可能想要指定备用名称。
要支持备用目标名称而不修改源模型,请创建模型映射。
要创建映射模型:
1. 确保您在“建模”透视图中。
2. 在“模型浏览器”视图中,单击 UML 模型。
3. 从菜单栏,单击建模 > 转换 > 配置转换。
4. 创建新的 UML 2.0 到 CORBA 转换(例如,将转换命名为
Create mapping
)。
5. 在“映射”页面上,单击只创建映射模型(无转换)。
6. 指定文件名并单击运行。
当您使用转换映射功能时,CORBA 转换将创建映射模型,它是一个单独的模型,对每个可转换的元素都包括了一个工件。工件参考并具有与原始可转换元素相同的名称。要指定原始元素的备用名称,
请在工件的文件名属性中输入一个新名称。如果不更改工件的文件名属性,则转换生成
具有工件缺省名称的元素。下表列出了备用名称的示例。
UML 源 |
映射工件文件名 |
生成的 CORBA |
Component1 |
"" |
Component1.idl 文件 |
Component2 |
"myIDL" |
myIDL.idl 文件 |
Component3 |
"myDir\myIDL2" |
“myDir”文件夹中的 myIDL2.idl 文件。 |
要使用映射模型:
1. 确保您在“建模”透视图中。
2. 在“模型浏览器”视图中,单击 UML 模型。
3. 从菜单栏,单击建模 > 转换 > 配置转换。
4. 创建新的 UML 2.0 到 CORBA 转换(例如,将该转换命名为
Use mapping
)。
5. 在“映射”页面上,单击使用映射模型。
6. 单击您先前创建的映射模型,然后单击运行。
当转换运行时,它使用在映射模型中指定的任何备用名称。
CORBA 转换插件提供了验证模型是否存在潜在转换问题的功能。例如,循环泛化关系和命名冲突导致在生成的 IDL 文件中存在编译错误。要查看在生成的代码期中可能发生的潜在问题的列表,
请将该概要文件应用到源模型,并运行验证功能。
下表列出了一些潜在的转换问题。
类别 |
潜在的转换问题 |
CORBAValue 构造型 |
值类型不应该有除 typedef、struct、exception 或 enumeration 外的嵌套分类器。 |
值类型应该具有名称唯一的成员。 |
|
值类型应该具有唯一的继承属性。 |
|
值类型应该具有唯一的继承操作。 |
|
值类型至多可以支持一个非抽象接口。 |
|
抽象值类型应该只从其他抽象值类型继承。 |
|
值类型不能从同一个类继承多次。 |
|
具有状态成员的值类型只能从具有状态成员的一个值类型继承。 |
|
抽象值类型不能具有状态成员并且不能是固定的值类型。 |
|
固定的值类型不能参与继承。 |
|
固定的值类型应该恰好有一个关联或属性。 |
|
CORBAConstants 构造型
|
CORBAConstants 类不能有操作。 |
CORBAConstants 类不应该有任何嵌套分类器。 |
|
CORBAConstants 类应该具有名称唯一的成员。 |
|
CORBAException 构造型 |
CORBAException 类不应该有任何嵌套分类器。 |
CORBAStruct 构造型 |
struct 不应该是泛化关系或实施关系的所有者。 |
struct 不应该有任何嵌套分类器。 |
|
struct 不应该有任何操作。 |
|
CORBATypedef 构造型 |
typedef 不应该有任何泛化关系。 |
typedef 应该具有一个替代关系。 |
|
typedef 不应该有任何关联、属性或操作。 |
|
typedef 不应该有任何嵌套分类器。 |
|
CORBAState 构造型 |
状态成员属性应该具有一个值类型类作为其所有者。 |
CORBAOneway 构造型 |
单向操作不应该有类型为 in 或 inout 的参数。 |
单向操作应该有一个 void 返回类型。 |
|
单向操作必须有一个接口作为其所有者。 |
|
单向操作不得导致任何异常。 |
|
枚举 |
枚举应该有名称唯一的枚举字面值。 |
组件 |
组件不应该包含嵌套组件。 |
组件中的所有包都应该有唯一的名称。 |
|
接口 |
接口应该有名称唯一的成员。 |
接口不应该包含嵌套的接口、包、值类型或组件。 |
|
无约束的接口无法从本地接口继承。 |
|
接口应该有唯一的继承操作。 |
|
接口应该有唯一的继承属性。 |
|
接口不能从同一接口继承多次。 |
|
抽象接口只能从其他抽象接口继承。 |
|
常规 |
模型不应该有以 CORBA 关键字(例如,packages、classes、interfaces、operations、properties、parameters 和 enumerations)命名的元素。 |
模型不应该有具有泛化关系或实施关系的类或接口。 |
|
模型不应该有重复的元素名称。 |
|
模型不应该有格式错误的层次结构,例如包含嵌套组件的层次结构。 |