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
属性对应着参数类型。