12.3.3.1.3 MOF等同的语义
本小节使用MOF来规定Stereotypes和它们的实例的语义。这并不意味着工具需要使用MOF来实现Proflies,而是说一个不基于MOF的实现必须做一些必须的工作以使它在外部看来就如同一个MOF的实现。
到MOF的相同的映射也用来决定如何使用XMI来对应用的profiles进行序列化。一个Proflie是一个UML2元模型的实例,而不是一个CMOF元模型的实例。因此,MOF到XMI的映射规则并不能直接应用到Proflie的实例。图12.15是一个UML2 Profile到一个等同的CMOF模型的映射示例。该映射用于解释和形式化的规定Proflies如何被序列化并以XMI的形式交换。使用如下Profile到CMOF的映射规则,XMI规范可以用来决定Profiles和应用了Profiles的模型如何以XMI的形式表现。在映射中:
- 一个Profile映射到一个CMOF包
- 一个Stereotype映射到一个具有相同名称和属性的CMOF类
- 元类已经是CMOF的类因此映射为自身
- 一个Extension按照Extension章节的语义映射为一个关联
- Profiles中的任何其它元素(即非Stereotype类、数据类型、基本类型、枚举和关联)被当做MOF元素
- Stereotype的实例(在Stereotype应用到元素上的时候创建)映射到代表该Stereotype的CMOF类的实例。该stereotype实例使用一个链接(Extension映射到的关联的实例)与它应用到的元素组合起来
对于Profile,URI属性(继承自包)用来决定XMI中用于鉴别该Profile实例的nsURI。
注意:缺省,Profile的name属性可以用于XMI中的nsPrefix,但这可以被CMOF标签 org.omg.xmi.nsPrefix 所覆写。
OMG标准Profiles,像UML标准Profile,遵循OMG标准的URIs命名规约。对于非标准的profiles,推荐如下惯例:
nsURi = http://<profileParentQualifiedName>/<version>/<profileName>.xmi
nsPrefix = <profileName>
其中:
- <profileParentQualifiedName>是包含该Profile的包的限定名,使用 "/"代替"::",并且删除所有非法的XML QName字符。
- <version>是版本标识符。 注意:对于OMG标准profiles这是一个日期,格式为 YYYYMMnn,其中nn是月份中的天。它代表了Profile XMI的版本,而不是规范的版本,后者可能会重新发布而不影响该XMI。
- <profileName>是Profile的名称。
Profile可以像其它任何模型一样被交换。作为一个XMI文件,应用了一个Profile的任何模型也可以被交换。
图12.19展示了一个名为Home的Stereotype扩展了UML2的元类Interface。图12.15通过引入一个Home MOF类到Interface MOF类的关联来展示了相应的MOF。出于说明的目的,我们为Home Stereotype增加了“magic:String”属性。
如下第一个序列化展示了图12.19(该Profile的定义扩展了UML2元模型)中的模型如何被交换。
<?xml version="1.0" encoding="UTF-8"?>
<xmi:XMI xmlns:xmi=http://www.omg.org/spec/XMI/YYYYMMnn
xmlns:mofext=http://www.omg.org/spec/MOF/YYYYMMnn xmlns:uml=http://www.omg.org/spec/UML/YYYYMMnn>
<uml:Profile xmi:id="id0" xmi:type=”uml:Profile” name="HomeExample">
<metamodelReference xmi:type=”uml:PackageImport” xmi:id="id2">
<importedPackage href="http://www.omg.org/spec/UMLYYYYMMnn/UML.xmi#_0"/>
</metamodelReference >
<packagedElement xmi:type="uml:Stereotype" xmi:id="id3" name="Home">
<ownedAttribute xmi:type="uml:Property" xmi:id="id5" name="base_Interface" association="id6">
<type href="http://www.omg.org/spec/UML/YYYYMMnn/UML.xmi#Interface"/>
</ownedAttribute>
</packagedElement>
<packagedElement xmi:type="uml:Extension" xmi:id="id6" name="A_Interface_Home" memberEnd="id7 id5">
<ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="id7" name="extension_Home" type="id3" aggregation="composite">
</ownedEnd>
</packagedElement>
</uml:Profile>
<mofext:Tag xmi:type=”mofext:Tag” name="org.omg.xmi.nsPrefix" value="HomeExample"/>
<mofext:Tag xmi:type=”mofext:Tag” name="org.omg.xmi.nsURI" value="http://HomeExample/20120501/HomeExample.xmi"/>
</xmi:XMI>
图12.13展示了一个被Home Stereotype扩展的Interface的示例模型。
图12.13 Using the HomeExample Profile to Extend a Model
应用了零个或多个Profiles的模型的XMI序列化是一个组织为两个逻辑部分(物理上可以是一个文件中任意次序或者是单独的文件)的XMI文件:
- 模型的XMI序列化
- 对应于每个Profile应用的模型或部分模型的实例的XMI序列化
由于删除模型上的Profiles应用或它的一部分不能修改模型本身的XMI序列化,所以Part 1中的所有XMI元素都不能引用Part 2中的任何XMI元素。典型的,被应用的Stereotype的基本属性和以元类为类型的属性的值使得Part 2中的对应Stereotypes的实例的XMI元素引用Part 1中的XMI元素。通常,Part 2包含如下种类的实例:
- Stereotypes的实例(参见图12.13的示例)
- 可选的,按照MOF等同映射为组合关联的Extensions的实例
- Profile定义的类和数据类型的实例。特别的,这些实例不能与实例规约混淆和替换,后者是实例的基于UML的模型表示,而与它们所表示的实例不是等同和可替换的
- 可选的,Profile定义的组合和非组合关联的实例
如下的XMI展示了图12.13中的模型如何序列化为XMI。引入了该XMI文件的工具可以过滤掉与HomeExample Profile相关的元素(如果它没有该Profile的定义)。
<?xml version="1.0" encoding="UTF-8"?>
<xmi:XMI xmlns:xmi="http://www.omg.org/spec/XMI/YYYYMMnn"
xmlns:uml="http://www.omg.org/spec/UML/YYYYMMnn"
xmlns:HomeExample="http://HomeExample/20120501/HomeExample.xmi">
<uml:Package xmi:type=”uml:Package” xmi:id="id1" name="ClientPackage">
<profileApplication xmi:type=”uml:ProfileApplication” xmi:id="id3">
<appliedProfile href="http://HomeExample/20120501/HomeExample.xmi#id0"/>
</profileApplication>
<packagedElement xmi:type="uml:Interface" xmi:id="id2" name="Client"/>
</uml:Package>
<!-- applied stereotypes -->
<HomeExample:Home xmi:id= "id4" base_Interface="id2"/>
</xmi:XMI>