脱离eclipse的插件环境使用EMF模型
2008-06-08 14:22
399 查看
本文是一个简单的案例,讲解如果脱离eclipse的插件环境使用EMF建模后的生成代码。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 ...{
String file = "MyBak.model";
private List companies;
public EmployManager() ...{
companies = load();
}
public List getCompany() ...{
return companies;
}
public Company getCompany(String name) ...{
for (int i = 0; i < companies.size(); i++) ...{
Company com = companies.get(i);
if (com.getName() != null && com.getName().equals(name)) ...{
return com;
}
}
return createCompany(name);
}
public void hireEmploy(String companyName, String name, int age) ...{
Company company = getCompany(companyName);
Employee employee = ModelFactory.eINSTANCE.createEmployee();
employee.setName(name);
employee.setAge(age);
company.hire(employee);
}
public List load() ...{
// 创建资源集合
ResourceSet resourceSet = new ResourceSetImpl();
// 注册处理数据持久化的工厂类,model为文件后缀名
Resource.Factory.Registry registry = resourceSet.getResourceFactoryRegistry();
registry.getExtensionToFactoryMap().put("model", new EcoreResourceFactoryImpl());
// 注册类所在包的名字空间
EPackage.Registry reg = resourceSet.getPackageRegistry();
reg.put(ModelPackage.eNS_URI, ModelPackage.eINSTANCE);
List c = new ArrayList();
try ...{
// 读取文件
URI uri = URI.createFileURI(file);
Resource resource = resourceSet.getResource(uri, true);
resource.load(null);
//直接读取对象信息
for (Iterator iterator = resource.getContents().iterator(); iterator.hasNext();) ...{
Company company = (Company) iterator.next();
c.add(company);
}
} catch (Exception e) ...{
}
return c;
}
public Company createCompany(String name) ...{
Company c = ModelFactory.eINSTANCE.createCompany();
c.setName(name);
companies.add(c);
return c;
}
public void save() ...{
// 创建资源集合
ResourceSet resourceSet = new ResourceSetImpl();
// 添加资源状态改变监听器
resourceSet.eAdapters().add(new Observer());
// 注册处理数据持久化的工厂类,model为文件后缀名
Resource.Factory.Registry registry = resourceSet.getResourceFactoryRegistry();
registry.getExtensionToFactoryMap().put("model", new EcoreResourceFactoryImpl());
// 注册类所在包的名字空间
EPackage.Registry reg = resourceSet.getPackageRegistry();
reg.put(ModelPackage.eNS_URI, ModelPackage.eINSTANCE);
// 读取文件
URI uri = URI.createFileURI(file);
// 获取该文件的资源信息
Resource resource = resourceSet.createResource(uri);
for (int i = 0; i < companies.size(); i++) ...{
Company company = companies.get(i);
resource.getContents().add(company);
}
try ...{
// 保存对象
resource.save(null);
} catch (IOException e) ...{
e.printStackTrace();
}
}
public static void main(String[] args) ...{
// Resource resource = new Loader().load("My.model");
// for (Iterator iterator = resource.getContents().iterator(); iterator
// .hasNext();) {
// Company company = (Company) iterator.next();
// System.out.println(company);
// }
EmployManager l = new EmployManager();
l.hireEmploy("talend", "Nicolas", 28);
l.hireEmploy("soyatec", "moneyice", 26);
l.hireEmploy("xcalia", "Tom", 30);
l.save();
List company = l.load();
for (Iterator iter = company.iterator(); iter.hasNext();) ...{
Company element = (Company) iter.next();
System.out.println(element.getName() + "'s employer : " + element.getEmployees());
}
}
}
package file;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.util.EContentAdapter;
public class Observer extends EContentAdapter ...{
@Override
public void notifyChanged(Notification notification) ...{
int type = notification.getEventType();
if (type == Notification.ADD) ...{
// do something
}
if (type == Notification.SET) ...{
// do something
}
super.notifyChanged(notification);
}
}
保存的文件为名字为MyBak.model,内容如下:
xmlns:xmi="http://www.omg.org/XMI" xmlns:model="http://model">
EmployManager可以以Application的形式运行,注意要引入以下3个jar文件。
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 ...{
String file = "MyBak.model";
private List
public EmployManager() ...{
companies = load();
}
public List
return companies;
}
public Company getCompany(String name) ...{
for (int i = 0; i < companies.size(); i++) ...{
Company com = companies.get(i);
if (com.getName() != null && com.getName().equals(name)) ...{
return com;
}
}
return createCompany(name);
}
public void hireEmploy(String companyName, String name, int age) ...{
Company company = getCompany(companyName);
Employee employee = ModelFactory.eINSTANCE.createEmployee();
employee.setName(name);
employee.setAge(age);
company.hire(employee);
}
public List
// 创建资源集合
ResourceSet resourceSet = new ResourceSetImpl();
// 注册处理数据持久化的工厂类,model为文件后缀名
Resource.Factory.Registry registry = resourceSet.getResourceFactoryRegistry();
registry.getExtensionToFactoryMap().put("model", new EcoreResourceFactoryImpl());
// 注册类所在包的名字空间
EPackage.Registry reg = resourceSet.getPackageRegistry();
reg.put(ModelPackage.eNS_URI, ModelPackage.eINSTANCE);
List
try ...{
// 读取文件
URI uri = URI.createFileURI(file);
Resource resource = resourceSet.getResource(uri, true);
resource.load(null);
//直接读取对象信息
for (Iterator iterator = resource.getContents().iterator(); iterator.hasNext();) ...{
Company company = (Company) iterator.next();
c.add(company);
}
} catch (Exception e) ...{
}
return c;
}
public Company createCompany(String name) ...{
Company c = ModelFactory.eINSTANCE.createCompany();
c.setName(name);
companies.add(c);
return c;
}
public void save() ...{
// 创建资源集合
ResourceSet resourceSet = new ResourceSetImpl();
// 添加资源状态改变监听器
resourceSet.eAdapters().add(new Observer());
// 注册处理数据持久化的工厂类,model为文件后缀名
Resource.Factory.Registry registry = resourceSet.getResourceFactoryRegistry();
registry.getExtensionToFactoryMap().put("model", new EcoreResourceFactoryImpl());
// 注册类所在包的名字空间
EPackage.Registry reg = resourceSet.getPackageRegistry();
reg.put(ModelPackage.eNS_URI, ModelPackage.eINSTANCE);
// 读取文件
URI uri = URI.createFileURI(file);
// 获取该文件的资源信息
Resource resource = resourceSet.createResource(uri);
for (int i = 0; i < companies.size(); i++) ...{
Company company = companies.get(i);
resource.getContents().add(company);
}
try ...{
// 保存对象
resource.save(null);
} catch (IOException e) ...{
e.printStackTrace();
}
}
public static void main(String[] args) ...{
// Resource resource = new Loader().load("My.model");
// for (Iterator iterator = resource.getContents().iterator(); iterator
// .hasNext();) {
// Company company = (Company) iterator.next();
// System.out.println(company);
// }
EmployManager l = new EmployManager();
l.hireEmploy("talend", "Nicolas", 28);
l.hireEmploy("soyatec", "moneyice", 26);
l.hireEmploy("xcalia", "Tom", 30);
l.save();
List
for (Iterator
Company element = (Company) iter.next();
System.out.println(element.getName() + "'s employer : " + element.getEmployees());
}
}
}
package file;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.util.EContentAdapter;
public class Observer extends EContentAdapter ...{
@Override
public void notifyChanged(Notification notification) ...{
int type = notification.getEventType();
if (type == Notification.ADD) ...{
// do something
}
if (type == Notification.SET) ...{
// do something
}
super.notifyChanged(notification);
}
}
保存的文件为名字为MyBak.model,内容如下:
xmlns:xmi="http://www.omg.org/XMI" xmlns:model="http://model">
EmployManager可以以Application的形式运行,注意要引入以下3个jar文件。
相关文章推荐
- 脱离eclipse的插件环境使用EMF模型
- 脱离eclipse的插件环境使用EMF模型
- 脱离eclipse的插件环境使用EMF模型
- 脱离eclipse的插件环境使用EMF模型
- 脱离Eclipse环境使用EMF
- 在Eclipse中使用sequoyah插件配置Android NDK环境
- java开发环境eclipse的使用(模块代码折叠、可视化开发插件、生成Jar插件)
- 在Eclipse中使用sequoyah插件配置Android NDK环境
- 如何在 Eclipse 中使用插件构建 PHP 开发环境[转]
- 构建 Eclipse 插件在 EMF 模型中浏览内容
- Linxu环境下使用Eclipse直接调试mapreduce程序(不用插件)
- 配置ext4.1的eclipse的开发环境,主要是spket插件的使用
- [置顶] Centos环境下:使用ant编译hadoop2.X版eclipse插件及其通用教程
- 搭建Android开发环境:直接使用官网提供的 ADT Bundle(带Eclipse、ADT插件、SDK)
- utuntu13.04系统下hadoop-1.1.2环境搭建及其eclipse插件使用
- 构建 Eclipse 插件在 EMF 模型中浏览内容
- 配置ext4.1的eclipse的开发环境,主要是spket插件的使用
- 构建Eclipse插件在EMF模型中浏览内容
- 在Eclipse中使用spket插件配置ExtJS环境
- 如何在 Eclipse 中使用插件构建 PHP 开发环境