Fixflow引擎解析(四)(模型) - 經過EMF擴展BPMN2.0元素 |
Fixflow引擎解析(三)(模型) - 建立EMF模型來讀寫XML文件 |
Fixflow引擎解析(二)(模型) - BPMN2.0讀寫 |
Fixflow引擎解析(一)(介紹) - Fixflow開源流程引擎介紹 |
EMF(全稱Eclipse Modeling Framework),是Eclipse組織推出的建模框架。它可以幫助軟件開發人員將模型(UML, XSD等)轉換成爲健壯且功能豐富的Java代碼。經過使用EMF,程序員編寫的程序能免費的得到一個健壯的模型層,它一般比程序員本身手工編寫的模型層更爲健壯。事實上,有不少商業產品都使用了 EMF 來做爲其模型層。因爲 EMF 的普遍使用,Eclipse 組織爲其推出了衆多的周邊模塊。html
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代碼光有 .ecore文件和.ecorediag文件還不夠,還須要一個.genmodel文件。
(1)建立一個.genmodel 配置文件
(2) 配置.genmodel文件
(3)生成Java模型文件
模型和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提供的高級功能。