WEB开发网
开发学院软件开发Java 基于反射机制的 EMF 模型比较 阅读

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

 2010-07-06 00:00:00 来源:WEB开发网   
核心提示: 清单 7. 比较两个 EObject 对象publicvoidcompareT(EObjectremote,EObjectlocal,intcompareType,List<CompareInfo>compareLog){if(remote==null&&local!=null){c

清单 7. 比较两个 EObject 对象

public void compareT(EObject remote, EObject local, int compareType, 
      List<CompareInfo> compareLog) 
  { 
    if (remote == null && local != null) 
    { 
      compareLog.add(new CompareInfo(CompareInfo.REMOTE_DELETE, 
          compareType, remote, local)); 
      return; 
    } 
    else if (remote != null && local == null) 
    { 
      compareLog.add(new CompareInfo(CompareInfo.REMOTE_ADD, compareType, 
          remote, local)); 
      return; 
    } 
    if (((MObject) local).getEditStatus().equals( 
        EditStatus.DELETED_LITERAL)) 
    { 
      compareLog.add(new CompareInfo(CompareInfo.REMOTE_MODIFIED, 
          compareType, remote, local)); 
      return; 
    } 
    if (!_comparedNodes.contains(remote)) 
      _comparedNodes.add(remote); 
    else 
      return; 
    // compare all 
    for (int i = 0; i < _featureList.size(); i++) 
    { 
      EStructuralFeature feature = _featureList.get(i); 
      if (isSuitable(remote, feature)) 
      { 
        if (remote.eGet(feature) instanceof Elist 
            || local.eGet(feature) instanceof Elist) 
        { // if the value is a list 
          compare((EList) remote.eGet(feature), (EList) local 
              .eGet(feature), compareType, compareLog); 
        } 
        else if (remote.eGet(feature) instanceof Eobject 
            || local.eGet(feature) instanceof Eobject) 
        { // if the value is an Eobject 
          compareT((EObject) remote.eGet(feature), (EObject) local 
              .eGet(feature), compareType, compareLog); 
        } 
        else 
        { // if the value is a simple object 
          Object remoteValue = remote.eGet(feature); 
          Object localValue = local.eGet(feature); 
          if (remoteValue != null && localValue != null) 
          { 
            if (!remoteValue.equals(localValue)) 
            { 
              // the two remote value and local value are 
              // different, record them 
              compareLog.add(new CompareInfo( 
                  CompareInfo.REMOTE_MODIFIED, compareType, 
                  remote, local)); 
            } 
          } 
          else if ((remoteValue == null && localValue != null) 
              || (remoteValue != null && localValue == null))// 一个为null 
          { 
              compareLog.add(new CompareInfo( 
                  CompareInfo.REMOTE_MODIFIED, compareType, 
                  remote, local)); 
          } 
        } 
      } 
    } 
  } 

比较结果界面

图 5. 以树视图展示比较结果
基于反射机制的 EMF 模型比较

图 5 中的树视图展示了比较器的比较结果(一个 CompareInfo 对象列表),其中红色 X 表示该节点发生删除操作,绿色 + 号表示增加操作,表格和一支笔的图案表示修改操作,右下角带有上、下箭头的小角标表示发起操作的是远端或者本地。比较器完成的工作是满足模型比较并展示需求的关键步骤,但是除了比较器,还至少需要建模模型对本地修改状态的记录,和一个友好的界面来显示比较结果。

后记

本文中提供的 EMF 比较器解决方案是根据字段的值得到差异性列表,得到字段值之后的比较过程没有特殊的处理需求。在某些比较场景中,也许需要对两个值的比较不只是调用 equals 方法那么简单,比如:也许业务需求在比较过程中会认为空字符串和 null 是相同的,但是在程序语句中这是两个完全不同的值。为了满足对值的复杂比较,可以设计一个字段比较器,把不同字段的比较工作交给该字段对应的比较器去执行。这样在应用中就可以更加灵活的设定比较规则。

上一页  4 5 6 7 8 9 

Tags:基于 反射 机制

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接