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

importjava.io.IOException;
importjava.util.ArrayList;
importjava.util.Iterator;
importjava.util.List;

importmodel.Company;
importmodel.Employee;
importmodel.ModelFactory;
importmodel.ModelPackage;

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


publicclassEmployManager...{

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());
}

}
}
packagefile;

importorg.eclipse.emf.common.notify.Notification;
importorg.eclipse.emf.ecore.util.EContentAdapter;


publicclassObserverextendsEContentAdapter...{

@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:XMIxmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI"xmlns:model="http://model">
<model:Companyname="talend">
<employeesname="Nicolas"age="28"/>
<employeesname="Nicolas"age="28"/>
</model:Company>
<model:Companyname="soyatec">
<employeesname="moneyice"age="26"/>
<employeesname="moneyice"age="26"/>
</model:Company>
<model:Companyname="xcalia">
<employeesname="Tom"age="30"/>
<employeesname="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提供了一个监听资源变化的观察者。
保存的文件为名字为MyBak.model,内容如下:
EmployManager可以以Application的形式运行,注意要引入以下3个jar文件。