WEB开发网
开发学院WEB开发Jsp EMF编程使用 阅读

EMF编程使用

 2008-01-05 10:08:24 来源:WEB开发网   
核心提示: 看到eclipse3.2里面的GMF, 觉得比较有趣,底层还是用到了EMF. 花了两天时间仔细研究了以下EMF,的确是个好东西. EMF根据ecore建模(可以和schema的xsd相互转换)生成强类型的EMF代码. 这个强类型更强的地方是可以取得meta信息,从而可以用于校验和界面辅助信息的生成.类似于动态bean

  看到eclipse3.2里面的GMF, 觉得比较有趣,底层还是用到了EMF. 花了两天时间仔细研究了以下EMF,的确是个好东西.

EMF根据ecore建模(可以和schema的xsd相互转换)生成强类型的EMF代码. 这个强类型更强的地方是可以取得meta信息,从而可以用于校验和界面辅助信息的生成.类似于动态bean,属性也可以根据名称动态取得.

以前考虑过用xsd描述界面, 但是数据载体只能是xml, 即使利用apache的schema编译工具生成强类型的类,后台代码也是xml. 不利于持久化. emf在代码生成引擎比较智能,可以标记出用户代码和自动生成代码.不会有生成覆盖问题.

这里做个简单示例:
1. Ecore:
可以新建Ecore, 建立好以后用GMF可视化编辑(Eclipse3.2RC2)
EMF编程使用(图一)


2. 生成Model:
点击my.ecore文件,菜单:File->New->Other->Eclipse Modeling Framework->EMF Model
3. 打开生成的my.genmodel, 选择树顶点的:Generate Model Code
生成的代码里面会有一个编译错误. 是中文编程的问题, 中文没有大小写(先天不足啊),结果性别这个成员变量和性别类名混淆,出错.在错误代码前面加上包全名即可.
4. 利用生成的代码构建一个家庭,输出xml并且校验之:

Word-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee" twffan="done">EMF编程使用(图二) import  java.io.IOException;
EMF编程使用(图二) import  java.util.Iterator;
EMF编程使用(图二)
EMF编程使用(图二) import  org.eclipse.emf.common.util.Diagnostic;
EMF编程使用(图二) import  org.eclipse.emf.common.util.URI;
EMF编程使用(图二) import  org.eclipse.emf.ecore.EObject;
EMF编程使用(图二) import  org.eclipse.emf.ecore.resource.Resource;
EMF编程使用(图二) import  org.eclipse.emf.ecore.util.Diagnostician;
EMF编程使用(图二) import  org.eclipse.emf.ecore.xmi.XMLResource;
EMF编程使用(图二) import  org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
EMF编程使用(图二) import  org.steeven.family.FamilyFactory;
EMF编程使用(图二) import  org.steeven.family.人物;
EMF编程使用(图二) import  org.steeven.family.家庭;
EMF编程使用(图二) import  org.steeven.family.性别;
EMF编程使用(图二)
EMF编程使用(图三)EMF编程使用(图四) public   class  TestMy  EMF编程使用(图五) {
EMF编程使用(图六)
EMF编程使用(图七)EMF编程使用(图八)   public   static   void  main(String[] args)  throws  IOException  EMF编程使用(图五) {
EMF编程使用(图六)    testFamily();
EMF编程使用(图九)  }
EMF编程使用(图六)
EMF编程使用(图七) EMF编程使用(图八)   PRivate   static   void  testFamily()  throws  IOException  EMF编程使用(图五) {
EMF编程使用(图六)    家庭 family  =  FamilyFactory.eINSTANCE.create家庭();
EMF编程使用(图六)    family.setTitle( " steeven家 " );
EMF编程使用(图六)    family.set老公(FamilyFactory.eINSTANCE.create人物());
EMF编程使用(图六)    family.get老公().set姓名( " steeven " );
EMF编程使用(图六)    family.set老婆(FamilyFactory.eINSTANCE.create人物());
EMF编程使用(图六)    family.get老婆().set姓名( " stella " );
EMF编程使用(图六)    family.get老婆().set性别(性别.女_LITERAL);
EMF编程使用(图六)    人物 sophie  =  FamilyFactory.eINSTANCE.create人物();
EMF编程使用(图六)    sophie.set姓名( " sophie " );
EMF编程使用(图六)    sophie.set性别(性别.女_LITERAL);
EMF编程使用(图六)    family.get兔崽子().add(sophie);
EMF编程使用(图六)    dump(family);
EMF编程使用(图六)    validate(family);
EMF编程使用(图九)  }
EMF编程使用(图六)
EMF编程使用(图七) EMF编程使用(图八)   private   static   void  validate(EObject family)  EMF编程使用(图五) {
EMF编程使用(图六)    Diagnostic diagnostic  =  Diagnostician.INSTANCE.validate(family);
EMF编程使用(图六)    System.out.println(diagnostic);
EMF编程使用(图七)EMF编程使用(图八)     for  (Iterator it  =  diagnostic.getChildren().iterator(); it.hasNext();)  EMF编程使用(图五) {
EMF编程使用(图六)      Diagnostic diag  =  (Diagnostic) it.next();
EMF编程使用(图六)      System.out.println(diag.getMessage());
EMF编程使用(图九)    }
EMF编程使用(图九)  }
EMF编程使用(图六)
EMF编程使用(图七) EMF编程使用(图八)   private   static  Resource dump(EObjectEMF编程使用(图五) objs)  throws  IOException  EMF编程使用(图五) {
EMF编程使用(图六)     //  ResourceSet rs = new ResourceSetImpl();
EMF编程使用(图六)     //  rs.getResourceFactoryRegistry().getExtensionToFactoryMap().put(
EMF编程使用(图六)     //  Resource.Factory.Registry.DEFAULT_EXTENSION,
EMF编程使用(图六)     //  new XMIResourceFactoryImpl());
EMF编程使用(图六)     //  Resource resource = rs.createResource(URI
EMF编程使用(图六)     //  .createFileURI("c:\\temp\\test.xml"));
EMF编程使用(图六)     XMLResource resource  =   new  XMLResourceImpl(URI
EMF编程使用(图六)        .createFileURI( " c:\\temp\\test.xml " ));
EMF编程使用(图六)    resource.setEncoding( " GBK " );
EMF编程使用(图六)     for  (EObject obj : objs)
EMF编程使用(图六)      resource.getContents().add(obj);  //  目前版本不加入resource验证会报singling异常
EMF编程使用(图六)     resource.save(System.out,  null );
EMF编程使用(图六)     return  resource;
EMF编程使用(图九)  }
EMF编程使用(图十)}
EMF编程使用(图二)


Tags:EMF 编程 使用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接