Eclipse Modeling Framework(EMF)
“粘合”Java,XML和UML
为了更好的理解EMF,我们举一个简单例子。假如让你写个程序来管理某个厂商的顾客信息(Customer),每个顾客都有一个姓名(name)和一些订单(orders),同时每个订单(Order)都有一个编号(id)和价格(price),为此我们创建以下Java接口:
publicinterface Customer {
String getName();
void setName(String name);
List getOrders();
}
publicinterface Order {
long getId();
void setId(long id);
float getPrice();
void setPrice(float price);
}
有了这两个接口,接下来我们考虑如何设计用户界面和持久化等等。
当然,你可能刚开始并没有急于创建这两个接口,也许你会首先用UML创建模型:
接下来,你要考虑如何保存模型,是保存到数据库中还是XML文件中,如果把模型持久化到XML文件中,我们要定义XML Schema来定义XML文件的结构。
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com/SimplePO"
xmlns:PO="http://www.example.com/SimplePO">
<xsd:complexType name="Customer">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="orders" type="PO:Order"
minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Order">
<xsd:sequence>
<xsd:element name="id" type="xsd:long"/>
<xsd:element name="price" type="xsd:float"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
现在我们应用的“数据模型”有了三种表现方式(Java Interface,UML diagram,XML Schema),不知道你是否想过,能否从其中一种表现方式生成其它两种,或者更深一步,如果给这些模型再增加些信息,能否可以生成我们所需要的代码。这就是EMF产生的原因,它是一个代码生成工具,你可以定义以上三种表现方式的任何一种,然后借助于EMF,就可以生成其它的表现方式以及具体的代码。
从上图可以看到EMF能把Java,UML,XML这三种技术“粘合”在一起,无论你从哪种技术开始(这取决于你对这种技术的熟悉程度),都可以通过EMF在三者之间进行转化。
比较这三种表现方式,我们可以看出:
1. Customer和Order,在UML和Java对应着接口定义,而在XML Schema对应着complexType定义;
2. name,id和price,在UML中对应着属性定义,在Java中对应者get()/set()方法对,在XML Schema中是嵌入的element声明;
3. orders:在UML中对应者聚合关系,在Java中对应着get()方法,在XML Schema对应着一个引用complexType的元素;
为了在这三种模型之间互相转化,我们需要一个描述它们的“公共语言”,也就是我们需要一种模型来描述EMF模型,即原模型(ecore)。
下面我们简单解释一下Ecore模型:
1. EClass:用来代表模型类,它有一些属性(name,abstract等),0或者多个属性和引用;
2. EAttribute:用来代表模型属性,它有一些属性(name,eType等);
3. EReference:用来代表类之间关联的一端,它有一些属性(name,containment等);
4. EDataType:用来代表属性的类型,可以是个基本类型int等,也可以是对象类型java.util.Date;