emf技术研究二

 
ecore模型分析
 
目前生成ecore模型主要由四种途径,如图:
       这里我们采用从UML Model产生ecore模型,首先用Rose设计包emf,然后在包中新建如下类图:
    生成的 ecore 模型如下
 
<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0"
    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="emf"
    nsURI="http:///emf.ecore" nsPrefix="emf">
 <eClassifiers xsi:type="ecore:EClass" name="Customer" eSuperTypes="#//Element">
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
    <eStructuralFeatures xsi:type="ecore:EReference" name="orders" upperBound="-1"
        eType="#//Order" containment="true"/>
 </eClassifiers>
 <eClassifiers xsi:type="ecore:EClass" name="Order" eSuperTypes="#//Element">
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELong"/>
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="price" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFloat"/>
 </eClassifiers>
 <eClassifiers xsi:type="ecore:EClass" name="Element" abstract="true">
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bool" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
 </eClassifiers>
</ecore:EPackage>
 
       下面我们就来分析一下这个文件:
EPackage
eocre模型的顶层元素是 EPackage ,它和 UML Model 中的包( Package )匹配;
 
EPackage nsURI nsPrefix 属性不能在 UML Model 中直接表示出来,这些属性的缺省值都是自动根据 Package 的名称产生;
 
EPackage name 属性和 UML Model Package 的名称是一样的;
<ecore:EPackage xmi:version="2.0"
    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="emf"
nsURI="http:///emf.ecore" nsPrefix="emf">
...
</ecore:EPackage>
EClass,EEnum,EDataType
UML Model 中类( Class )和可以匹配 EClass EEnum EDataType ,具体匹配哪个,取决于类的版型( stereotype )。
 
l         如果 UML 中的类的版型为空或者为 Interface, 则匹配 EClass;
l         如果 UML 中的类的版型为 enumeration, 则匹配 EEnum;
l         如果 UML 中的类的版型为 datatype, 则匹配 EDataType;
 
在我们的 UML Model 中,类 Customer 的版型为空,所以匹配 EClass
<eClassifiers xsi:type="ecore:EClass" name="Customer">
    ...
</eClassifiers>
 
类的名称就是 name 属性,
<eClassifiers xsi:type="ecore:EClass" name="Customer">
    ...
</eClassifiers>
如果这个类有父类,可以在属性 eSuperTypes 指定:
<eClassifiers xsi:type="ecore:EClass" name="Customer" eSuperTypes="#//Element">
    ...   
 </eClassifiers>
如果是抽象类, abstract 属性为 true ,默认值为 false
<eClassifiers xsi:type="ecore:EClass" name="Element" abstract="true">
    ...
</eClassifiers>
如果类的版型是 interface interface 属性为 true ,默认值为 false
 
EAttribute 和EReference
UML 类中的每个属性和EAttribute 匹配
 
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
 
UML中属性的name和EAttribute的name一样。
 
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
 
EAttribute 的eType属性来源于UML中属性的类型,这个类型必须是一个基本的 Java 类型,或者是在UML Model中定义的 EEnum 或者 EDataType。l.
 
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
 
UML 类中每个有箭头的关联(navigable association )和Ereference 匹配
<eStructuralFeatures xsi:type="ecore:EReference" name="orders" upperBound="-1"
        eType="#//Order" containment="true"/>
 
EReference lowerBound upperBound 属性值来自于 UML 关联的阶元( multiplicty )。例如 , 假如你指定阶元是 0..1, 则属性 lowerBound 0 ,而 upperBound 1 ,假如阶元是 0..n, 则属性 lowerBound 0 upperBound -1 (unbounded)
 
如果 UML 关联是聚合并且目标类的 containment "by value" ,则 EReference containment 属性为 true ,缺省是 false
eOperations
在UML类图中每个操作和eOperations匹配,例如如果在Customer增加name的get和set方法,如图:
ecore模型的代码如下:
<eOperations name="getName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
 
name 属性对应着操作名, eType 属性对应着操作返回值类型。
 
<eOperations name="setName">
      <eParameters name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
</eOperations>
 
eParameters 子元素对应着操作的参数,它的 name 属性对应参数的名字, eType 属性对应着参数类型。
 
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值