MetaDiff 是一個基於 OMG MOF(Meta-Object Facility)標準的可擴展模型比較框架,源自瑞典斯德哥爾摩大學碩士論文。針對模型驅動開發(MDD)中模型版本控制、差異合併、視覺化比較等核心挑戰,提供統一擴展點與基礎設施,支援 Eclipse EMF 與 NetBeans MDR 兩大 MOF 實作。本文系統整理其架構設計、擴展機制、實作細節與應用實例。
隨著 MDA、MDSD、LDD 等方法論普及,模型從輔助文檔升級為核心建構產出。但傳統以文本為中心的版控工具(Diff/Merge)在模型層面失效:
通用、半自動化的模型比較框架:支援任意元模型(Meta-model)的模型比較;比較演算法由電腦執行,但需調用者提供額外指導資訊(如對應提示)。
圖:MetaDiff 架構三大組件
+---------------------------+ | Extension Template | ← 介面契約層:定義擴展點(匹配、比較、Delta、元模型載入) +---------------------------+ | Infrastructure | ← 基礎設施層:整合 MOF 實作(EMF/MDR)、元模型註冊、模型載入工具 +---------------------------+ | Extensions | ← 具體實作層:演算法實作(TucsDiff、DeltaXML、ID-Based Mapping 等) +---------------------------+
org.metadiff:核心介面org.metadiff.template:擴展模板介面定義org.metadiff.infra:基礎設施抽象org.metadiff.infra.ecore / .mdr:EMF/MDR 具體適配org.metadiff.ext.generic:通用演算法實作org.metadiff.ext.tucs:TUCS 樹差異演算法(文獻[2])org.metadiff.ext.deltaxml:商業 DeltaXML 引擎整合| 介面 | 職責 | 關鍵方法 |
|---|---|---|
ModelMappingFinder | 模型匹配演算法 | matchModels(Model, Model, MappingCallback) |
ModelDiffFinder | 模型比較演算法 | findDiff(Model, Model, ModelMapping, DiffCallback) |
ModelMapping | 匹配結果:元素對應集合 | 獲取源/目標元素對應 |
ModelComparisonDelta | 比較差異結果 | 增/刪/修改元素集合 |
ModelLoaderUtil | 模型載入工具 | 從 EMF/MDR 資源載入模型實例 |
// 比較模型典型調用序列
FrameworkCaller caller = new FrameworkCaller();
ModelDiffFinder diffFinder = new TucsDiffFinder(); // 選擇演算法
ModelMappingFinder mapFinder = new IDBasedMappingFinder(); // 可選映射
Model source = EMFModelLoader.load("model_v1.xmi");
Model target = EMFModelLoader.load("model_v2.xmi");
ModelComparisonDelta delta = diffFinder.findDiff(source, target, mapFinder.matchModels(source, target));
CallbackMatchingFinder,每個匹配決策提示使用者命令列確認TucsDiffFinder 自動比較