脱离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提供了一个监听资源变化的观察者。
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文件。

你可能感兴趣的:(eclipse,C++,c,C#)