脱离eclipse的插件环境使用EMF模型

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

脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型脱离eclipse的插件环境使用EMF模型
publicList<Company>getCompany()...{
脱离eclipse的插件环境使用EMF模型
returncompanies;
脱离eclipse的插件环境使用EMF模型}

脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型脱离eclipse的插件环境使用EMF模型
publicCompanygetCompany(Stringname)...{
脱离eclipse的插件环境使用EMF模型脱离eclipse的插件环境使用EMF模型
for(inti=0;i<companies.size();i++)...{
脱离eclipse的插件环境使用EMF模型Companycom
=companies.get(i);
脱离eclipse的插件环境使用EMF模型脱离eclipse的插件环境使用EMF模型
if(com.getName()!=null&&com.getName().equals(name))...{
脱离eclipse的插件环境使用EMF模型
returncom;
脱离eclipse的插件环境使用EMF模型}

脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型}

脱离eclipse的插件环境使用EMF模型
returncreateCompany(name);
脱离eclipse的插件环境使用EMF模型}

脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型脱离eclipse的插件环境使用EMF模型
publicvoidhireEmploy(StringcompanyName,Stringname,intage)...{
脱离eclipse的插件环境使用EMF模型Companycompany
=getCompany(companyName);
脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型Employeeemployee
=ModelFactory.eINSTANCE.createEmployee();
脱离eclipse的插件环境使用EMF模型employee.setName(name);
脱离eclipse的插件环境使用EMF模型employee.setAge(age);
脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型company.hire(employee);
脱离eclipse的插件环境使用EMF模型}

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

脱离eclipse的插件环境使用EMF模型脱离eclipse的插件环境使用EMF模型}
catch(Exceptione)...{
脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型}

脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型
returnc;
脱离eclipse的插件环境使用EMF模型}

脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型脱离eclipse的插件环境使用EMF模型
publicCompanycreateCompany(Stringname)...{
脱离eclipse的插件环境使用EMF模型Companyc
=ModelFactory.eINSTANCE.createCompany();
脱离eclipse的插件环境使用EMF模型c.setName(name);
脱离eclipse的插件环境使用EMF模型companies.add(c);
脱离eclipse的插件环境使用EMF模型
returnc;
脱离eclipse的插件环境使用EMF模型}

脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型脱离eclipse的插件环境使用EMF模型
publicvoidsave()...{
脱离eclipse的插件环境使用EMF模型
//创建资源集合
脱离eclipse的插件环境使用EMF模型
ResourceSetresourceSet=newResourceSetImpl();
脱离eclipse的插件环境使用EMF模型
//添加资源状态改变监听器
脱离eclipse的插件环境使用EMF模型
resourceSet.eAdapters().add(newObserver());
脱离eclipse的插件环境使用EMF模型
//注册处理数据持久化的工厂类,model为文件后缀名
脱离eclipse的插件环境使用EMF模型
Resource.Factory.Registryregistry=resourceSet.getResourceFactoryRegistry();
脱离eclipse的插件环境使用EMF模型registry.getExtensionToFactoryMap().put(
"model",newEcoreResourceFactoryImpl());
脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型
//注册类所在包的名字空间
脱离eclipse的插件环境使用EMF模型
EPackage.Registryreg=resourceSet.getPackageRegistry();
脱离eclipse的插件环境使用EMF模型reg.put(ModelPackage.eNS_URI,ModelPackage.eINSTANCE);
脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型
//读取文件
脱离eclipse的插件环境使用EMF模型
URIuri=URI.createFileURI(file);
脱离eclipse的插件环境使用EMF模型
//获取该文件的资源信息
脱离eclipse的插件环境使用EMF模型
Resourceresource=resourceSet.createResource(uri);
脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型脱离eclipse的插件环境使用EMF模型
for(inti=0;i<companies.size();i++)...{
脱离eclipse的插件环境使用EMF模型Companycompany
=companies.get(i);
脱离eclipse的插件环境使用EMF模型resource.getContents().add(company);
脱离eclipse的插件环境使用EMF模型}

脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型脱离eclipse的插件环境使用EMF模型
try...{
脱离eclipse的插件环境使用EMF模型
//保存对象
脱离eclipse的插件环境使用EMF模型
resource.save(null);
脱离eclipse的插件环境使用EMF模型脱离eclipse的插件环境使用EMF模型}
catch(IOExceptione)...{
脱离eclipse的插件环境使用EMF模型e.printStackTrace();
脱离eclipse的插件环境使用EMF模型}

脱离eclipse的插件环境使用EMF模型}

脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型脱离eclipse的插件环境使用EMF模型
publicstaticvoidmain(String[]args)...{
脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型
//Resourceresource=newLoader().load("My.model");
脱离eclipse的插件环境使用EMF模型
//for(Iteratoriterator=resource.getContents().iterator();iterator
脱离eclipse的插件环境使用EMF模型
//.hasNext();){
脱离eclipse的插件环境使用EMF模型
//Companycompany=(Company)iterator.next();
脱离eclipse的插件环境使用EMF模型
//System.out.println(company);
脱离eclipse的插件环境使用EMF模型
//}
脱离eclipse的插件环境使用EMF模型

脱离eclipse的插件环境使用EMF模型EmployManagerl
=newEmployManager();
脱离eclipse的插件环境使用EMF模型l.hireEmploy(
"talend","Nicolas",28);
脱离eclipse的插件环境使用EMF模型l.hireEmploy(
"soyatec","moneyice",26);
脱离eclipse的插件环境使用EMF模型l.hireEmploy(
"xcalia","Tom",30);
脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型l.save();
脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型List
<Company>company=l.load();
脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型脱离eclipse的插件环境使用EMF模型
for(Iterator<Company>iter=company.iterator();iter.hasNext();)...{
脱离eclipse的插件环境使用EMF模型Companyelement
=(Company)iter.next();
脱离eclipse的插件环境使用EMF模型System.out.println(element.getName()
+"'semployer:"+element.getEmployees());
脱离eclipse的插件环境使用EMF模型}

脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型}

脱离eclipse的插件环境使用EMF模型}

脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型packagefile;
脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型
importorg.eclipse.emf.common.notify.Notification;
脱离eclipse的插件环境使用EMF模型
importorg.eclipse.emf.ecore.util.EContentAdapter;
脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型脱离eclipse的插件环境使用EMF模型
publicclassObserverextendsEContentAdapter...{
脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型@Override
脱离eclipse的插件环境使用EMF模型脱离eclipse的插件环境使用EMF模型
publicvoidnotifyChanged(Notificationnotification)...{
脱离eclipse的插件环境使用EMF模型
inttype=notification.getEventType();
脱离eclipse的插件环境使用EMF模型脱离eclipse的插件环境使用EMF模型
if(type==Notification.ADD)...{
脱离eclipse的插件环境使用EMF模型
//dosomething
脱离eclipse的插件环境使用EMF模型
}

脱离eclipse的插件环境使用EMF模型脱离eclipse的插件环境使用EMF模型
if(type==Notification.SET)...{
脱离eclipse的插件环境使用EMF模型
//dosomething
脱离eclipse的插件环境使用EMF模型
}

脱离eclipse的插件环境使用EMF模型
super.notifyChanged(notification);
脱离eclipse的插件环境使用EMF模型}

脱离eclipse的插件环境使用EMF模型
脱离eclipse的插件环境使用EMF模型}

脱离eclipse的插件环境使用EMF模型

保存的文件为名字为MyBak.model,内容如下:

脱离eclipse的插件环境使用EMF模型<?xmlversion="1.0"encoding="UTF-8"?>
脱离eclipse的插件环境使用EMF模型
<xmi:XMIxmi:version="2.0"
脱离eclipse的插件环境使用EMF模型xmlns:xmi
="http://www.omg.org/XMI"xmlns:model="http://model">
脱离eclipse的插件环境使用EMF模型
<model:Companyname="talend">
脱离eclipse的插件环境使用EMF模型
<employeesname="Nicolas"age="28"/>
脱离eclipse的插件环境使用EMF模型
<employeesname="Nicolas"age="28"/>
脱离eclipse的插件环境使用EMF模型
</model:Company>
脱离eclipse的插件环境使用EMF模型
<model:Companyname="soyatec">
脱离eclipse的插件环境使用EMF模型
<employeesname="moneyice"age="26"/>
脱离eclipse的插件环境使用EMF模型
<employeesname="moneyice"age="26"/>
脱离eclipse的插件环境使用EMF模型
</model:Company>
脱离eclipse的插件环境使用EMF模型
<model:Companyname="xcalia">
脱离eclipse的插件环境使用EMF模型
<employeesname="Tom"age="30"/>
脱离eclipse的插件环境使用EMF模型
<employeesname="Tom"age="30"/>
脱离eclipse的插件环境使用EMF模型
</model:Company>
脱离eclipse的插件环境使用EMF模型
</xmi:XMI>

EmployManager可以以Application的形式运行,注意要引入以下3个jar文件。

脱离eclipse的插件环境使用EMF模型