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的示例模型。

Using the HomeExample Profile to Extend a Model

图12.13 Using the HomeExample Profile to Extend a Model

应用了零个或多个Profiles的模型的XMI序列化是一个组织为两个逻辑部分(物理上可以是一个文件中任意次序或者是单独的文件)的XMI文件:

  1. 模型的XMI序列化
  2. 对应于每个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>

results matching ""

    No results matching ""