Eclipse Modeling Framework(EMF)是實現模型驅動架構(MDA)的開源框架。核心能力:
forum.ucd,產生 .ecore 模型檔Forum、Member、Topic、PostEString、EInt 等)Forum→Member (members)、Forum→Topic (topics) 含 containment、navigable 設定TopicCategory:ANNOUNCEMENT(0)、GUEST_BOOK(1)、DISCUSSION(2).ecore 載入生成 forum.genmodel適用於需精確控制 XML 序列化格式的場景。關鍵語法:
<xsd:simpleType name="TopicCategory">
<xsd:restriction base="xsd:NCName">
<xsd:enumeration value="Announcement"/> ...
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="Post">
<xsd:sequence>
<xsd:element name="comment" type="xsd:string"/>
<xsd:element name="author" type="xsd:anyURI" ecore:reference="forum:Member"/>
</xsd:sequence>
</xsd:complexType>
透過 ecore:reference 實現跨型別引用。同樣透過 EMF 專案向導從 XSD 載入生成 genmodel。
最貼近開發者習慣的方式。核心規則:
@model 標籤type 與 containmentopposite 指定反向導航屬性class 而非介面,常數加 @model name="..."public interface Forum {
@model type="Topic" containment="true"
List getTopics();
@model type="Member" containment="true"
List getMembers();
@model
String getDescription();
}
生成的 forum.genmodel 可視化編輯器允許調整:
| 目標 | 產出內容 |
|---|---|
| Generate Model Code | com.ibm.example.forum(介面/工廠)、.impl(實作)、.util(AdapterFactory) |
| Generate Edit Code | com.ibm.example.forum.edit → .provider(編輯器項目提供者) |
| Generate Editor Code | com.ibm.example.forum.editor → .presentation(JFace 圖形編輯器) |
sample.forumEMF 生成代碼的 JavaDoc 均標記 @generated。刪除此標記後重新生成,JMerge 將保留手動修改。實例:
ForumEditor.createPages() 增加 Table 欄位(Author、Posts 數)TopicItemProvider 實作 ITableItemLabelProvider 客製化欄位顯示邏輯ForumItemProviderAdapterFactory 註冊新介面支援Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
Map m = reg.getExtensionToFactoryMap();
m.put("forummodel", new XMIResourceFactoryImpl());
ResourceSet resSet = new ResourceSetImpl();
Resource res = resSet.getResource(URI.createURI("model/forum.forummodel"), true);
Forum forum = (Forum) res.getContents().get(0);
ForumPackageImpl.init();
ForumFactory factory = ForumFactory.eINSTANCE;
Forum forum = factory.createForum();
forum.setDescription("programmatic forum example");
Member admin = factory.createMember();
admin.setNickname("Administrator");
forum.getMembers().add(admin);
Topic notice = factory.createTopic();
notice.setTitle("Notices");
notice.setCategory(TopicCategory.ANNOUNCEMENT_LITERAL);
notice.setCreator(admin);
forum.getTopics().add(notice); // 雙向關聯自動維護 creator/topicsCreated
URI fileURI = URI.createFileURI("model/forum.ecore");
Resource resource = new XMIResourceFactoryImpl().createResource(fileURI);
resource.getContents().add(forum);
resource.save(Collections.EMPTY_MAP);
根物件 Forum 含有所有子物件,僅需儲存根即可級聯持久化。非 containment 關聯物件需顯式 resource.getContents().add()。
EMF 提供從模型定義到代碼生成、編輯器構建、持久化的完整工具鏈。三種模型來源滿足不同團隊習慣,生成代碼具備企業級品質且支援增量客製化。配合圖形化編輯器與程式化 API,EMF 讓模型驅動開發真正落地。