Fixflow引擎解析(三)(模型) - 建立EMF模型来读写XML文件

Fixflow引擎解析(四)(模型) - 经过EMF扩展BPMN2.0元素
Fixflow引擎解析(三)(模型) - 建立EMF模型来读写XML文件
Fixflow引擎解析(二)(模型) - BPMN2.0读写
Fixflow引擎解析(一)(介绍) - Fixflow开源流程引擎介绍

关于EMF

  EMF(全称Eclipse Modeling Framework),是Eclipse组织推出的建模框架。它可以帮助软件开发人员将模型(UML, XSD等)转换成为健壮且功能丰富的Java代码。经过使用EMF,程序员编写的程序能免费的得到一个健壮的模型层,它一般比程序员本身手工编写的模型层更为健壮。事实上,有不少商业产品都使用了 EMF 来做为其模型层。因为 EMF 的普遍使用,Eclipse 组织为其推出了众多的周边模块。html

 

Fixflow中的EMF

  Fixflow引擎读写BPMN2.0模型文件都是经过EMF来实现,扩展的"fixflow:"的元素也是经过EMF提供的注入技术实现,Eclipse的流程设计器上也使用EMF去读写模型文件,java

除此以外,系统里的各类.xml配置文件都是EMF完成读写,同时还涉及到了脱离Eclipse环境在web中使用EMF。程序员

 

设计模型

假设咱们须要经过EMF读写一个这样格式的XML文件:web

1 <bookRepository>
2    <book id="1" name="个人奋斗" author="阿道夫·希特勒"></book>
3    <book id="2" name="闪击英雄" author="海因茨·古德里安"></book>
4    <book id="3" name="失去的胜利" author="冯·埃里希·曼施泰因"></book>
5 </bookRepository>

下面就根据上面XML实例来建立一个EMF模型。(固然EMF支持用一个XSD文件来生成模型,这种方式咱们这里先不作介绍)框架

 

注意:下面的内容我用的是Eclipse Modeling Tools版本的Eclipseeclipse

(1) 建立一个空的EMF项目(并不必定非要是EMF项目)测试

(2) 项目名称EMFTest编码

  

(3) 在model目录下建立一个Diagram模型设计文件spa

(4) 给这个Diagram模型设计文件所对应的ecore文件起名: book.ecore 设计

 建立完成以后会同时生成两个文件,.ecore文件为模型文件,.ecorediag 为模型的设计文件用来图形化设计器EMF模型。

   

(5) 打开book.ecorediag文件设计模型,这里咱们能够修改一下命名空间,EClass 对应到XML的Element,EAttribute对应到XML Element的字段。

 

(6) 建立两个EClass 分别起名 BookRepository 和 Book ,在Book类的定义中 添加三个 EAttribute id、name、author。

(7) 设置 EAttribute 的属性 ,除了名字,三个 EAttribute 采用相同的设置。

设置为attribute类型

 

(8)设置两个类之间的关系,添加一个 BookRepository 到 Book 的引用

 

继续关系设置

 

 

这样咱们的模型文件设计完毕,下面咱们须要来生成java代码。

 

生成Java代码

要生成java代码光有 .ecore文件和.ecorediag文件还不够,还须要一个.genmodel文件。

(1)建立一个.genmodel 配置文件

(2) 配置.genmodel文件

 

 

(3)生成Java模型文件

 

 

 

读写XML文件

模型和java代码建立完毕以后咱们来建立测试类,来尝试读写一个XML文件。

建立一个 test.java 带main方法的:

 1 import java.io.IOException;
 2 import java.util.Collections;
 3 import java.util.Map;
 4 
 5 import org.eclipse.emf.common.util.URI;
 6 import org.eclipse.emf.ecore.resource.Resource;
 7 import org.eclipse.emf.ecore.resource.ResourceSet;
 8 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 9 import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
10 import org.fixflow.model.book.Book;
11 import org.fixflow.model.book.BookFactory;
12 import org.fixflow.model.book.BookPackage;
13 import org.fixflow.model.book.BookRepository;
14 import org.fixflow.model.book.util.BookResourceImpl;
15 
16 public class test {
17 
18 
19     public static void main(String[] args) {
20 
21         // 初始化模型
22         BookPackage.eINSTANCE.eClass();
23         
24         // 建立根元素
25         BookRepository bookRepository = BookFactory.eINSTANCE.createBookRepository();
26 
27         // 建立书籍1
28         Book book = BookFactory.eINSTANCE.createBook();
29         book.setId("1");
30         book.setName("个人奋斗");
31         book.setAuthor("阿道夫·希特勒");
32         // 将建立的书建立到根元素下
33         bookRepository.getBook().add(book);
34 
35         // 建立书籍2
36         book = BookFactory.eINSTANCE.createBook();
37         book.setId("2");
38         book.setName("闪击英雄");
39         book.setAuthor("海因茨·古德里安");
40         // 将建立的书建立到根元素下
41         bookRepository.getBook().add(book);
42 
43         // 建立书籍3
44         book = BookFactory.eINSTANCE.createBook();
45         book.setId("3");
46         book.setName("失去的胜利");
47         book.setAuthor("冯·埃里希·曼施泰因");
48         // 将建立的书建立到根元素下
49         bookRepository.getBook().add(book);
50 
51         //注册XML扩展
52         Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
53         Map<String, Object> m = reg.getExtensionToFactoryMap();
54         m.put("xml", new XMIResourceFactoryImpl());
55 
56         // 建立一个资源
57         BookResourceImpl resource = new BookResourceImpl(URI.createURI("modelfile/book.xml"));
58         
59         //设置文件编码
60         resource.setEncoding("UTF-8");
61         //将模型保存到资源中
62         resource.getContents().add(bookRepository);
63 
64         try {
65             //保存文件
66             resource.save(Collections.EMPTY_MAP);
67         } catch (IOException e) {
68             e.printStackTrace();
69         }
70 
71         //加载测试
72         load();
73 
74         
75     }
76 
77     public static BookRepository load() {
78         // 初始化模型
79         BookPackage.eINSTANCE.eClass();
80 
81         // 注册XML扩展
82         Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
83         Map<String, Object> m = reg.getExtensionToFactoryMap();
84         m.put("xml", new XMIResourceFactoryImpl());
85 
86         //建立一个 资源 ResourceSet
87         ResourceSet resSet = new ResourceSetImpl();
88 
89         // 获取资源
90         Resource resource = resSet.getResource(URI.createURI("modelfile/book.xml"), true);
91         
92         //或者根节点
93         BookRepository bookRepository = (BookRepository) resource.getContents().get(0);
94 
95         return bookRepository;
96     }
97 }

 

下面运行测试类以后生成文件:

 

至此一个最简单的XML文件经过EMF来读写的功能已经介绍完了,在后面的章节中我还会详细介绍EMF提供的高级功能。

相关文章
相关标签/搜索