本文是一个简单的案例,讲解如果脱离eclipse的插件环境使用EMF建模后的生成代码。
package
file;

import
java.io.IOException;
import
java.util.ArrayList;
import
java.util.Iterator;
import
java.util.List;

import
model.Company;
import
model.Employee;
import
model.ModelFactory;
import
model.ModelPackage;

import
org.eclipse.emf.common.notify.Adapter;
import
org.eclipse.emf.common.util.URI;
import
org.eclipse.emf.ecore.EPackage;
import
org.eclipse.emf.ecore.resource.Resource;
import
org.eclipse.emf.ecore.resource.ResourceSet;
import
org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import
org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl;


public
class
EmployManager
...
{

Stringfile="MyBak.model";

privateList<Company>companies;


publicEmployManager()...{
companies=load();
}


publicList<Company>getCompany()...{
returncompanies;
}


publicCompanygetCompany(Stringname)...{

for(inti=0;i<companies.size();i++)...{
Companycom=companies.get(i);

if(com.getName()!=null&&com.getName().equals(name))...{
returncom;
}

}
returncreateCompany(name);
}


publicvoidhireEmploy(StringcompanyName,Stringname,intage)...{
Companycompany=getCompany(companyName);

Employeeemployee=ModelFactory.eINSTANCE.createEmployee();
employee.setName(name);
employee.setAge(age);

company.hire(employee);
}


publicList<Company>load()...{
//创建资源集合
ResourceSetresourceSet=newResourceSetImpl();

//注册处理数据持久化的工厂类,model为文件后缀名
Resource.Factory.Registryregistry=resourceSet.getResourceFactoryRegistry();
registry.getExtensionToFactoryMap().put("model",newEcoreResourceFactoryImpl());

//注册类所在包的名字空间
EPackage.Registryreg=resourceSet.getPackageRegistry();
reg.put(ModelPackage.eNS_URI,ModelPackage.eINSTANCE);

List<Company>c=newArrayList<Company>();

try...{

//读取文件
URIuri=URI.createFileURI(file);
Resourceresource=resourceSet.getResource(uri,true);
resource.load(null);

//直接读取对象信息

for(Iteratoriterator=resource.getContents().iterator();iterator.hasNext();)...{
Companycompany=(Company)iterator.next();
c.add(company);
}

}catch(Exceptione)...{

}

returnc;
}


publicCompanycreateCompany(Stringname)...{
Companyc=ModelFactory.eINSTANCE.createCompany();
c.setName(name);
companies.add(c);
returnc;
}


publicvoidsave()...{
//创建资源集合
ResourceSetresourceSet=newResourceSetImpl();
//添加资源状态改变监听器
resourceSet.eAdapters().add(newObserver());
//注册处理数据持久化的工厂类,model为文件后缀名
Resource.Factory.Registryregistry=resourceSet.getResourceFactoryRegistry();
registry.getExtensionToFactoryMap().put("model",newEcoreResourceFactoryImpl());

//注册类所在包的名字空间
EPackage.Registryreg=resourceSet.getPackageRegistry();
reg.put(ModelPackage.eNS_URI,ModelPackage.eINSTANCE);

//读取文件
URIuri=URI.createFileURI(file);
//获取该文件的资源信息
Resourceresource=resourceSet.createResource(uri);


for(inti=0;i<companies.size();i++)...{
Companycompany=companies.get(i);
resource.getContents().add(company);
}


try...{
//保存对象
resource.save(null);

}catch(IOExceptione)...{
e.printStackTrace();
}
}


publicstaticvoidmain(String[]args)...{

//Resourceresource=newLoader().load("My.model");
//for(Iteratoriterator=resource.getContents().iterator();iterator
//.hasNext();){
//Companycompany=(Company)iterator.next();
//System.out.println(company);
//}

EmployManagerl=newEmployManager();
l.hireEmploy("talend","Nicolas",28);
l.hireEmploy("soyatec","moneyice",26);
l.hireEmploy("xcalia","Tom",30);

l.save();

List<Company>company=l.load();


for(Iterator<Company>iter=company.iterator();iter.hasNext();)...{
Companyelement=(Company)iter.next();
System.out.println(element.getName()+"'semployer:"+element.getEmployees());
}

}
}
package
file;

import
org.eclipse.emf.common.notify.Notification;
import
org.eclipse.emf.ecore.util.EContentAdapter;


public
class
Observer
extends
EContentAdapter
...
{

@Override

publicvoidnotifyChanged(Notificationnotification)...{
inttype=notification.getEventType();

if(type==Notification.ADD)...{
//dosomething
}

if(type==Notification.SET)...{
//dosomething
}
super.notifyChanged(notification);
}

}
<?
xmlversion="1.0"encoding="UTF-8"
?>
<
xmi:XMI
xmi:version
="2.0"
xmlns:xmi
="http://www.omg.org/XMI"
xmlns:model
="http://model"
>
<
model:Company
name
="talend"
>
<
employees
name
="Nicolas"
age
="28"
/>
<
employees
name
="Nicolas"
age
="28"
/>
</
model:Company
>
<
model:Company
name
="soyatec"
>
<
employees
name
="moneyice"
age
="26"
/>
<
employees
name
="moneyice"
age
="26"
/>
</
model:Company
>
<
model:Company
name
="xcalia"
>
<
employees
name
="Tom"
age
="30"
/>
<
employees
name
="Tom"
age
="30"
/>
</
model:Company
>
</
xmi:XMI
>
EMF的建模过程使用的是eUML2, 该程序为eclipse插件, 支持在eclipse环境中构建,生成EMF模型文件。
eUML2 下载网址为
www.soyatec.com. Eclipse update 地址为
1 创建Empty EMF 项目
2 在新建对话框中选择EMF Class Diagram, 创建eUML2的建模图表文件。
3 模型例子如下,成个模型的入口为Company, Company有雇佣和解雇员工的权力。Employee继承自Person,提供有别于普通人定义的薪水属性。
要注意的地方是,每个类的属性中不要选中 Is an interface 选项,否则只会生成模型的定义接口,不会生成具体的实现类。(如下图)
4 在新建对话框中,选择EMF Model, 创建EMF 模型文件
填写文件的名字和存放地址,文件名后缀必须是genmodel
选择从Ecore model文件导入模型。
在使用eUML2构建模型图表后,会生成.ecore文件。其中保存的EMF模型的相关信息,按照下图导入该文件即可。
5 生成.genmodel文件后,打开该文件,右键单击,选择Generate Model Code,即会根据模型信息生成可供使用的java文件。
同样,在设计EMF 模型的editor中,在右键菜单中,同样会出现生成代码的选项。在本文中,只生成模型代码,因为并不使用其他跟eclipse开发环境相关的功能。(如editor等)
6 生成的代码如下图红框部分所示。Model部分是模型的定义接口部分;model.impl是模型的实现部分;model.util提供了一些工具类。
7 上图中file包中的EmplyManager类,进行相关持久化的工作。Observer提供了一个监听资源变化的观察者。
package
file;
import
java.io.IOException;
import
java.util.ArrayList;
import
java.util.Iterator;
import
java.util.List;
import
model.Company;
import
model.Employee;
import
model.ModelFactory;
import
model.ModelPackage;
import
org.eclipse.emf.common.notify.Adapter;
import
org.eclipse.emf.common.util.URI;
import
org.eclipse.emf.ecore.EPackage;
import
org.eclipse.emf.ecore.resource.Resource;
import
org.eclipse.emf.ecore.resource.ResourceSet;
import
org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import
org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl;

public
class
EmployManager
...
{
Stringfile="MyBak.model";
privateList<Company>companies;

publicEmployManager()...{
companies=load();
}

publicList<Company>getCompany()...{
returncompanies;
}

publicCompanygetCompany(Stringname)...{
for(inti=0;i<companies.size();i++)...{
Companycom=companies.get(i);
if(com.getName()!=null&&com.getName().equals(name))...{
returncom;
}
}
returncreateCompany(name);
}

publicvoidhireEmploy(StringcompanyName,Stringname,intage)...{
Companycompany=getCompany(companyName);
Employeeemployee=ModelFactory.eINSTANCE.createEmployee();
employee.setName(name);
employee.setAge(age);
company.hire(employee);
}

publicList<Company>load()...{
//创建资源集合
ResourceSetresourceSet=newResourceSetImpl();
//注册处理数据持久化的工厂类,model为文件后缀名
Resource.Factory.Registryregistry=resourceSet.getResourceFactoryRegistry();
registry.getExtensionToFactoryMap().put("model",newEcoreResourceFactoryImpl());
//注册类所在包的名字空间
EPackage.Registryreg=resourceSet.getPackageRegistry();
reg.put(ModelPackage.eNS_URI,ModelPackage.eINSTANCE);
List<Company>c=newArrayList<Company>();
try...{
//读取文件
URIuri=URI.createFileURI(file);
Resourceresource=resourceSet.getResource(uri,true);
resource.load(null);
//直接读取对象信息
for(Iteratoriterator=resource.getContents().iterator();iterator.hasNext();)...{
Companycompany=(Company)iterator.next();
c.add(company);
}
}catch(Exceptione)...{
}
returnc;
}

publicCompanycreateCompany(Stringname)...{
Companyc=ModelFactory.eINSTANCE.createCompany();
c.setName(name);
companies.add(c);
returnc;
}

publicvoidsave()...{
//创建资源集合
ResourceSetresourceSet=newResourceSetImpl();
//添加资源状态改变监听器
resourceSet.eAdapters().add(newObserver());
//注册处理数据持久化的工厂类,model为文件后缀名
Resource.Factory.Registryregistry=resourceSet.getResourceFactoryRegistry();
registry.getExtensionToFactoryMap().put("model",newEcoreResourceFactoryImpl());
//注册类所在包的名字空间
EPackage.Registryreg=resourceSet.getPackageRegistry();
reg.put(ModelPackage.eNS_URI,ModelPackage.eINSTANCE);
//读取文件
URIuri=URI.createFileURI(file);
//获取该文件的资源信息
Resourceresource=resourceSet.createResource(uri);

for(inti=0;i<companies.size();i++)...{
Companycompany=companies.get(i);
resource.getContents().add(company);
}

try...{
//保存对象
resource.save(null);
}catch(IOExceptione)...{
e.printStackTrace();
}
}

publicstaticvoidmain(String[]args)...{
//Resourceresource=newLoader().load("My.model");
//for(Iteratoriterator=resource.getContents().iterator();iterator
//.hasNext();){
//Companycompany=(Company)iterator.next();
//System.out.println(company);
//}
EmployManagerl=newEmployManager();
l.hireEmploy("talend","Nicolas",28);
l.hireEmploy("soyatec","moneyice",26);
l.hireEmploy("xcalia","Tom",30);
l.save();
List<Company>company=l.load();

for(Iterator<Company>iter=company.iterator();iter.hasNext();)...{
Companyelement=(Company)iter.next();
System.out.println(element.getName()+"'semployer:"+element.getEmployees());
}
}
}
package
file;
import
org.eclipse.emf.common.notify.Notification;
import
org.eclipse.emf.ecore.util.EContentAdapter;

public
class
Observer
extends
EContentAdapter
...
{
@Override
publicvoidnotifyChanged(Notificationnotification)...{
inttype=notification.getEventType();
if(type==Notification.ADD)...{
//dosomething
}
if(type==Notification.SET)...{
//dosomething
}
super.notifyChanged(notification);
}
}
保存的文件为名字为MyBak.model,内容如下:
<?
xmlversion="1.0"encoding="UTF-8"
?>
<
xmi:XMI
xmi:version
="2.0"
xmlns:xmi
="http://www.omg.org/XMI"
xmlns:model
="http://model"
>
<
model:Company
name
="talend"
>
<
employees
name
="Nicolas"
age
="28"
/>
<
employees
name
="Nicolas"
age
="28"
/>
</
model:Company
>
<
model:Company
name
="soyatec"
>
<
employees
name
="moneyice"
age
="26"
/>
<
employees
name
="moneyice"
age
="26"
/>
</
model:Company
>
<
model:Company
name
="xcalia"
>
<
employees
name
="Tom"
age
="30"
/>
<
employees
name
="Tom"
age
="30"
/>
</
model:Company
>
</
xmi:XMI
>
EmployManager可以以Application的形式运行,注意要引入以下3个jar文件。
本文介绍如何使用EMF(eclipse建模框架)构建模型并生成Java代码。通过eUML2工具创建模型图表,导出EMF模型文件,最后生成可用于实际项目的代码。
557

被折叠的 条评论
为什么被折叠?



