標籤:style blog http color java 使用 os io
atitit。自訂uml MOF EMF體系eclipse emf 教程o7t
1. 元對象機制(MOF,Meta-Object Facility)and 結構 1
2. 元模型圖、模型圖、對象圖uml自訂建模語言 2
3. 3層結構and 結構中的架構串連 3
4. GEF和EMF 4
5. 建立emf項目--建立一個empty emf proj 4
6. 建立一個ecore模型 4
7. EMF,Ecore 6
8. 建立genmodel的 jet 組建組態檔案 7
9. Ecore和Genmodel。 8
10. 8
11. 產生項目 9
12. 運行外掛程式run as eclipse app 11
13. 11
14. 建立自訂模型 11
15. 防止覆蓋自訂修改。。@generated標註 13
16. 定製應用程式的基本方法) 13
17. EMF的問題ati總結 14
18. 參考 14
1. 元對象機制(MOF,Meta-Object Facility)and 結構
起源於整合模組化語言(UML)。對象管理機構(Object Management Group|OMG)需要一種元模型結構來定義UML。
MOF被設計為4層次的結構。位於頂部的是元元模型層,即M3層。M3模型是MOF建立元模型(被稱為M2模型)的語言。M2模型最明顯的 例子是UML元模型,該模型描述UML。M2模型描述M1層以及M1層的要素,例如,UML模型。最後一層是M0層或資料層。它描述真實世界的物體。
作者:: 老哇的爪子 Attilax 艾龍, EMAIL:[email protected]
轉載請註明來源: http://blog.csdn.net/attilax
2. 元模型圖、模型圖、對象圖uml自訂建模語言
MOF的四層模型分別是:元元模型層(M3)、元模型層(M2)、模型層(M1)、運行時(M0)。其中元元模型層包含了定義建模語言所需的元素;元模型 層定義了一種建模語言的結構和文法;模型層定義了一個具體的系統的模型;運行時包含了一個模型的對象在運行時的狀態等。
本文涉及到的有M2、M1和M0層,下面給出一個例子,首先是M2層,它可以定義一個建模語言的結構和文法,例如:
本文涉及到的有M2、M1和M0層,下面給出一個例子,首先是M2層,它可以定義一個建模語言的結構和文法,例如:
這是一個簡要的元模型圖,它表示Class由Property和Operation組成,這張圖符合UML2.0的概念,但是我們也可以這樣畫:
這樣一來,Class包含三種元素:Attribute、AssociationEnd和Operation,這樣我們就建立了一個新的元模型,也可以說建立了一個小的建立模語言。雖然它不符合UML2.0規範。
M1層模型就是我們通常簡稱的“模型”,它是系統的標準化表示,一般用建模語言來表示一個軟體系統,例如下面的汽車和人的系統:
3. 3層結構and 結構中的架構串連
一個應用系統可以被分為典型的3層結構。在《UML模式與應用》[1]一書中分別稱為UI層、領域層、資料層。UI層和領域層的介面通過應用程式和應用程式框架來串連;領域層和資料層的介面通過持久化架構來串連。
4. GEF和EMF
GEF(Graphical Editor Framework)是一個圖形化編輯架構,它允許開發人員以圖形化的方式展示和編輯模型,從而提升使用者體驗。使用GEF可以方便的實現XML編輯器、UML類圖編輯器等應用程式。
EMF(Eclipse Modelling Framework)是Eclipse MDA(Model Driven Architecture)的重要組成部分,可以將模型轉換成高效的,正確的,易於定製的Java代碼。
基於GEF和EMF可以很方便地進行模型驅動開發(Model-Driven Development,MDD)
。GEF是Eclipse提供的圖形編輯架構,GEF可以為使用者提供圖形化編輯模型,提升使用者體驗。EMF是Eclipse提供的模型驅動應用程式 開發架構,可以產生代碼的架構。EMF可以基於XML Schema,UML或經過注釋的Java中指定的模型,建立Java代碼,實現圖形化的資料編輯、操縱、讀取和序列化。
5. 建立emf項目--建立一個empty emf proj6. 建立一個ecore模型
預設的只能樹形編輯。。
定義ecore模型,我比較喜歡圖形化的方式,因為看起來很直觀,所以我使用Omondo公司的EclipseUML外掛程式來畫類圖,這個外掛程式的免費版本在 它們網站下載,注意下載適合你的Eclipse的版本。當然rose也不錯而且更加穩定,但它 不是免費的,而且只能在Windows裡使用。和Rose不同,EclipseUML對EMF有特別的支 持,安裝這個外掛程式後,我就們可以在項目裡建立一個“EMF Class Diagram”,這樣會同時建立一個.ecd檔案和一個.ecore檔案,EclipseUML編輯的類圖資訊會儲存在這兩個檔案裡,前者主要是圖形方 面的內容,而後者是真正的模型資訊,注意這兩個檔案中的任何一個都不要搞丟了,最好能經常備份一下。
在EclipseUML裡編輯類圖很簡單,需要注意的是,兩個對象之間如果有關聯,要仔細考慮關聯是否為“包含”關係(一般在UML中以黑色菱形表 示),如果一個類沒有包含在任何其它類裡,則這個類的執行個體不會被儲存到檔案。例2中Category包含在Shop中,Product包含在 Category中。這樣,所有的對象都直接或間接的被Shop對象包含。換句話說,如果以Shop作為“根”,所有的對象都可以被儲存到檔案裡。
EMF對java基本類型和一些常用類做了封裝,例如int->EInt,java.lang.Integer->EInteger以 及java.util.List->EList等等,所以在定義類的屬性時要使用這些EMF的類型,當然也有辦法使用自訂類型(以後會用到)。我 們例子裡的模型相當簡單,一共只有三種業務對象(為了更加直觀,我們增加了一個NamedElement介面),現在網上 商店類圖的第一個版本2所示。
7. EMF,Ecore
項目的最初目標是要實現OMG(Object Management Group)的MOF規範(Meta Object Facility)。在項目的進行中EMF的開發人員根據大量的實踐經驗對MOF規範進行了再加工,提取出了一些核心的元素集(MOF 2.0 中稱為EMOF(Essential MOF))。可以說EMF 是MOF核心子集的java高效實現,在EMF 中MOF核心子集的實現稱為Ecore。
圖1.Ecore類階層:這個映像顯示出Ecore中繼資料完整的類層次。
EMF用於定義和實現結構化資料模型。所謂資料模型就是用來處理應用中需要處理的資料的一組相關類。
使用EMF的好處
1. 代碼產生。根據模型的定義產生可用資料模型的所有代碼。EMF依照模板檔案產生容易閱讀的代碼,模板檔案可以定製。你可以修改所產生的程式碼,並且重建類時會保留所做的修改。產生代碼需要的是Rational Rose模型檔案,批註Java介面或XML schema 定義(開發中)
2. 中繼資料。你可以用程式查詢模型結構,得到比標準的Java BeanInfo或反射更多的資訊。EMF還支援訪問和更新模型。
3. 預設序列化。EMF可以從XMI檔案裝載模型執行個體,也可以儲存模型執行個體到XMI檔案(XMI檔案是一種XML格式的檔案)。你也可以儲存到不同格式的檔案。檔案格式XML schema還在開發中。
4. 檔案之間的串連。你可以儲存和編輯多個檔案中的資料
5. 編輯器。EMF還會產生一個模型編輯器,還有一個反射編輯器,只用模型的中繼資料就可以瀏覽和編輯EMF模型檔案。
Eclipse建模架構(EMF)是一個Java開源架構與代碼產生工具-用於基於結構化的模型來構建工具和其它應用程式。在Eclipse平台在使用者介面和檔案級上提供一個強有力的整合架構的同時,EMF加強了這種能力來實現工具和應用程式之間良好粒度的資料分享。EMF可以快速為你的模型產生簡單、正確、有效對應JAVA代碼。如果給定一個模型,那麼EMF能夠自動產生Java原始碼-該源碼允許你建立、查詢、更新、序列化、反序列化、檢驗和追蹤你的模型執行個體的變化。
類似於其它的Java綁定架構,例如JAXB或XMLBeans,給定一個模型後,EMF就能夠產生Java原始碼-它允許你建立、查詢、更新、反序列化以及序列化你的模型的執行個體。儘管多數Java綁定架構僅支援一個模型類,例如XML模式,而EMF支援從XML模式,UML類圖(Rational Rose或UML2)以及被註解的Java介面中產生代碼。除了模型代碼,EMF還能產生一個完整的應用程式-它包括一個可定製的編輯器。
用來描述EMF模型的模型叫作Ecore,本質上是UML類圖的子集,它是關於應用的類和資料的簡單模型。當建立Ecore後,EMF採用實現與介面相分離的設計,將Ecore中的每個類(Eclass)自動產生1個介面和1個實作類別。
其中的介面都會繼承EObject這些EMF中的集介面,如同java.lang.Object在Java中的地位。EMF還為每個模型分別生 成一個對應factory和package的介面和實作類別。其中,**Factory繼承於EFactory,為模型中每個類的建立提供 create***方法。在jStudio中,採用EMF實現業務模型對象建立和代碼產生,降低開發人員的工作量,提高效率,而且產生的程式碼簡潔、高 效。
8. 建立genmodel的 jet 組建組態檔案
接下來就要產生代碼了。EMF使用JET利用模板產生代碼(前面曾介紹過JET),所以要把ecore模型轉換為可以被JET利用的genmodel模型,具體的操作是按 ctrl+n建立一個EMF Model,在這個嚮導的第一步指定名稱shop.genmodel,第二步選擇從ecore模型匯入,第三步選擇ecore模型檔案 (shop.ecore),這樣就建立了預設的genmodel模型,在這個模型的基礎上還可以做一些定製工作,例如每個屬性的描述資訊等等。
有了genmodel模型,離得到可用的java代碼就只有一步之遙了。開啟shop.genmodel檔案,在根節點上點開右鍵菜單(見圖3),如果只想生 成模型代碼選擇“Generate Model Code”,如果需要.edit的代碼(EMF提供的一些ItemProvider和AdapterFactory,協助實現編輯器)和可用的編輯器,選 擇“Generate All”最方便,這也是例子裡選擇的方式。EMF的代碼產生器為模型、.edit、編輯器和測試代碼各產生一個外掛程式項目 (com.my.shop/shop.edit/shop.editor/shop.tests),前三個是後者依賴前者的關係。這裡插上一句,即使沒有 用EMF的項目,也建議把模型和介面使用不同的外掛程式項目分開,這樣做有很多好處,主要是靈活性大大提高了。
圖3 從菜單裡選擇產生部分或全部代碼
9. Ecore和Genmodel。10.
EMF是基於兩種元模型來構建的,分別是
Ecore:主要用於定義模型結構的相關資訊,並對外提供了一個根對象(猶如XML檔案的根節點)用來代表要顯示的模型,該對象的子節點為 package(包),package的子節點為class(類),class的子節點為attribute(類的屬性欄位),這樣整個樹形結構就代表了 所要表示的EMF模型結構。
Genmodel:主要包含有關代碼產生的相關資訊(如:檔案產生路徑及檔案名稱),和一些控制參數用來控制碼怎樣產生。
11. 產生項目
EMF採用模型驅動開發方法,在無需編碼的情況下,我們可以基於模型使用EMF為我們產生以下幾樣東西。
1,與模型相對應的EMF實體類。
2,基於實體類的各種ItemProvider模型適配器類,通過該適配器類可以很好的將EMF模型繫結到Jface組件中去,稍後具體介紹。
3,editor-plugin項目,可理解為基於EMF應用的一個外掛程式項目。
4,測試bundle。
1實體類:就像Hibernate ORM為我們產生的實體類一樣,EMF也會為我們產生這樣的實體類,並且這些實體類含有更進階的特性(如:類屬性狀態發生變化時,實體類具有通知功能)
2適配器類:EMF的模型結構可能非常複雜(如可能含有多個實體類,並且類結構各不相 同),這樣當視圖組件直接使用這些實體類的時候就變得非常困難(要判斷出是哪一個實體類,針對該實體類怎樣顯示視圖等等..),因此EMF針對這些實體類 產生了一些適配器類,通過實現指定的介面,讓適配器類來設計實體類的顯示,而視圖只需要選擇合適的適配類便可。
3適配器工廠:上面講到視圖通過適配器類避免了與實體類的直接互動,然而視圖又是如何得到合適的適配器類的呢?那便是通過適配器工廠類。
模型定義如下:
從模型定義來看Library便是Ecore所對外提供的用來表示模型的根對象。
首先來看EMF為我們產生的模型實體類(假設這些實體類分布在org.emf.demo這個bundle之中)
EMF會為我們產生3個package,分別是:
org.emf.demo.library:包含實體類的介面;用於建立實體類的工廠(libraryFactory);訪問模型中繼資料的實用類(LibraryPackage)
org.emf.demo.library.impl:實體類介面的實作類別;實體類工廠的實作類別(LibraryFactryImpl);LibraryPackage的實作類別(LibraryPackageImpl)
org.emf.demo.library.util:針對該模型的適配器工廠類(LibraryAdapterFactory)
註:libraryFactory和LibraryPackage都是單例模式的,可通過其成員變數eINSTANCE來得到對象的執行個體。
12. 運行外掛程式run as eclipse app13. 14. 建立自訂模型
。EMF為我們產生了一個建立嚮導(New Wizard),利用這個嚮導可以產生新的Shop執行個體,注意在第三步要選擇以Shop類為根類型。編輯器的運行介面4所示,它的外觀雖然有待改進,但功能已 經足夠我們對網上商店裡的類別和產品進行編輯了。在以後的文章裡,我們要對網上商店的ecore模型和編輯器的介面做一些修改。
在EMF自動產生的editor中,只提供了TreeViewer作為編輯控制項,自動產生的程式碼能讓TreeViewer處理Redo&Undo操作,
圖4 預設的編輯器介面
15. 防止覆蓋自訂修改。。@generated標註
註:EMF所產生的變數或方法都會含有@generated標註,當執行regenerate操作時EMF只會覆蓋含有@generated標註的方法,而自己手工添加的方法不會被覆蓋。
16. 定製應用程式的基本方法)
編輯器的作用是編輯模型執行個體,比如你在模型裡定義了商店裡有商品,編輯器就可以讓你建立這些商品(例如佳能數位相機),否則這個模型的作用在哪裡體現呢。
如果要求不高的話,你產生好編輯器整個應用程式就完成了,你的項目就可以結束了,因為你已經可以用它來管理你的商店了。
不過大多數情況下我們對產生的應用還是不夠滿意的,比如認為產生的表徵圖不好看,菜單順序不合理,甚至整個介面都不滿意,等等。所以就需要對產生的應用進行定製,也就是改造,直到完全符合要求為止。
藉助EMF的協助,不用親自編寫一行代碼就可以產生一個完整的應用程式,你是不是對EMF有些感興趣了?不過產生的應用程式看起來都像是從同一個模子裡出來的,即 一個多頁編輯器,一個大綱視圖和屬性頁面,這當然無法滿足所有人的需求。不用耽心,只要瞭解EMF的機制,按照我們的要求修改這個應用程式並不是一件很困難的 事情。
首先大概的看一下EMF為我們產生了哪些東西吧。按照前文的操作,EMF應該一共產生了四個外掛程式項目:com.my.shop、 com.my.shop.edit、com.my.shop.editor和com.my.shop.tests,其中最後一個項目是方便我們編寫單元測 試的架構代碼,這裡我們先不管它,暫時把注意力集中在前三個項目上。
第一個項目是模型部分,主要包含你定義的ecore模型裡各類型(EClass,在ecore元模型裡類型稱為EClass,屬性稱為 EAttribute)對應的java介面和預設的實作類別代碼,例如Product.java和ProductImpl.java,它們分別被放置在 com.my.shop和com.my.shop.impl包裡;一個工廠類(ShopFactory)使用原廠模式建立新的模型執行個體;一個 Package類(ShopPackage)維護關於元模型的資訊,提供了一堆靜態成員變數;此外還產生了ShopAdapterFactory和 ShopSwitch這兩個類,它們是可選的,它們倆的作用這裡賣個關子暫時先不說。
第二個項目是.edit部分,這裡麵包含了一系列ItemProvider類,用來為在jface的各種查看器(Viewer)裡顯示這些模型對象 提供便利,以CategoryItemProvider為例,它實現了IStructuredItemContentProvider、 ITreeItemContentProvider和IItemLabelProvider這些介面,注意把這些介面名字中的"Item"去掉就是 jface裡需要的Provider,可以把這些帶有"Item"字樣的Provider想象成對jface相應Provider的封裝。有了這些 Provider,在應用程式裡使用jface的TreeViewer、TableViewer等查看器就很方便了。(前面講GEF的一個文章裡曾利用 EMF構造模型,當時使用的就僅僅是模型部分,因為並未用到jface查看器。所以視你的應用程式而定,可以只產生模型部分來用,.edit部分依賴模型部分,而反之不然。)
第三個項目是編輯器,這個部分依賴.edit部分,主要包含了幾個UI方面的類。EMF為我們產生的這個編輯器有兩個用途:一是讓我們可以不用從零開始,而是在這個編輯器的基礎上進行修改得到自己的編輯器; 二是通過這些代碼展示怎樣在應用程式裡使用前兩個項目裡的那些類,編輯器包含那麼多Tab正是為了示範各種查看器的用法。下面來說一下怎樣定製產生的應用 程式。
17. EMF的問題ati總結
Web好像不適用。。
18. 參考
EMF介紹系列(二、從模型產生應用程式) - 八進位 - 部落格園.htm
EMF介紹系列(三、定製應用程式的基本方法) - 八進位 - 部落格園.htm
EMF介紹系列(八、模型的驗證) - 八進位 - 部落格園.htm
脫離Eclipse環境使用EMF - 八進位 - 部落格園.htm
構建 Eclipse 外掛程式在 EMF 模型中瀏覽內容.htm