基于反射机制的 EMF 模型比较
2010-07-06 00:00:00 来源:WEB开发网4. 一个完整的 EMF 模型比较器
下面针对一个本地模型与远端模型同步的场景,综合运用 EMF 反射 API 实现一个完整的 EMF 模型比较器。所谓同步,是指将远端模型与本地模型做比较,得到两者的差异并显示给用户,最终由用户决定更新本地模型还是更新远端模型的一系列动作。对照图 4 的类图,工具类 ModelComparePort 负责比较本地模型和远端模型,每比较出一处不同,便生成一个 CompareInfo 对象记录此差异项,最终得到一个差异项列表。CompareInfo 可以记录的差异类型包括:远端 / 本地模型增加新节点、远端 / 本地模型删除和修改节点。
图 4. 比较器类图
ModelComparePort 类在执行比较之前,函数 initALLStructuralFeature() 初始化一个 EStructuralFeature 列表,罗列所有需要参与比较的字段。如清单 5 所示。设定此列表的作用是控制比较的范围。
清单 5. 初始化需要比较的字段
private void initALLStructuralFeature()
{
// initiate the features that need to be compared
ModelPackage pkg = ModelPackage.eINSTANCE;
_featureList.add(pkg.getProjectModel_Scenarios());
_featureList.add(pkg.getProjectModel_ProjectNode());
......
......
_featureList.add(pkg.getStructureModel_Transactions());
}
比较两个对象差异的本质是比较两个可比对象相同字段值的差异。本例中的被比较对象都具有 ID 字段,只有 ID 相同的对象才具有可比性。
更多精彩
赞助商链接