快速业务通道

基于反射机制的EMF模型比较 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
    } else {         compareLog.add(new CompareInfo (CompareInfo.REMOTE_ADD,         compareType, remoteObject, localObject));       }     }     for (int i = 0; i < local.size(); i++) {       EObject localObject = (EObject) local.get(i);       EObject remoteObject = findElementByID(remote,  localObject);       if (remoteObject == null) { //差集 local-remote 元 素          compareLog.add(new CompareInfo (CompareInfo.REMOTE_DELETE,         compareType, remoteObject, localObject));       }     }   }

基于反射机制的EMF模型比较(5)

时间:2011-09-09 IBM 石立川 王芹华 邵兵

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());    }

基于反射机制的EMF模型比较(6)

时间:2011-09-09 IBM 石立川 王芹华 邵兵

比较两个对象差异的本质是比较两个可比对象相同字段值的差异。本例中的 被比较对象都具有 ID 字段,只有 ID 相同的对象才具有可比性。

当确定两个对象具有可比性之后,需要遍历字段列表 _featureList,获取并 比较两个对象中相同字段的值。因为需要比较的字段来自不同的建模类,并且本 例中这些字段被放置在一个列表内,所以需要判断某字段是否可以用于一个对象 的方法。清单 6 列出了完成这一功能的代码片断,函数 isSuitable() 递归遍 历一个类型及其所有超类型,判断参数 feature 是否适用于此对象。

清单 6. 判断一个 EStructuralFeature 是否适用于一个对象

public static boolean isSuitable(EObject eo,  EStructuralFeature feature)    {      if (eo == null)        return false;      return isSuitable(eo.getClass(), feature);    }    private static boolean isSuitable(Class c,  EStructuralFeature feature)    {      Class[] interfaces = c.getInterfaces();      for (int m = 0; m < interfaces.length; m++)      {        if (interfaces[m] == feature.getContainerClass()            || isSuitable(interfaces[m], feature))        {          r

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号