還是從一個例子裡看看EMF的使用方法和作用吧。假設我們的應用是一個網上商店,在系 統裡有這些對象:商店Shop、類別Category、商品Product,其中類別可以包含子類別。現在 我們用EMF從頭到尾生成一個可以管理類別和商品的應用程序。如果你的Eclipse裡還沒有安 裝 EMF,在eclipse.org/emf下載適合你Eclipse版本的EMF SDK,建議你下載全部包含的那種 。安裝後,在新建對話框裡會增加EMF的類別,如圖1所示:
圖1 新建向導裡的EMF類別
其中“EMF Model”是從已有的模型文件創建genmodel模型,這個模型是專門用來生成代 碼的;如果你手裡已經有一個模型(比如一個.mdl文件或是一個.xsd文件等等),可以選擇 新建“EMF Project”,這樣在向導的後面部分裡會要求提供已有的模型文件;因為我們打算 自己從頭開始建立這樣的模型,所以選擇“Empty EMF Project”,和建立普通插件一樣,要 提供一個插件名稱,我們為這個商店項目起名為com.my.shop,然後按Finish即完成向導。目 前這個新建立的項目裡還沒有包含任何代碼,只是在META-INF/MANIFEST.MF文件裡定義了對 EMF相關插件的依賴。
下面開始定義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所示。
圖2 網上商店類圖(版本1.0)
接下來就要生成代碼了。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 從菜單裡選擇生成部分或全部代碼
現在可以運行起來看看效果了,注意我們甚至連一句代碼也沒有寫呢。EMF為我們生成了 一個新建向導(New Wizard),利用這個向導可以生成新的Shop實例,注意在第三步要選擇 以Shop類為根類型。編輯器的運行界面如圖4所示,它的外觀雖然有待改進,但功能已經足夠 我們對網上商店裡的類別和產品進行編輯了。在以後的帖子裡,我們要對網上商店的ecore模 型和編輯器的界面做一些修改。
圖4 缺省的編輯器界面