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提供的高級功能。

相關文章
相關標籤/搜索