基于反射机制的 EMF 模型比较
2010-07-06 00:00:00 来源:WEB开发网清单 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. 以树视图展示比较结果
图 5 中的树视图展示了比较器的比较结果(一个 CompareInfo 对象列表),其中红色 X 表示该节点发生删除操作,绿色 + 号表示增加操作,表格和一支笔的图案表示修改操作,右下角带有上、下箭头的小角标表示发起操作的是远端或者本地。比较器完成的工作是满足模型比较并展示需求的关键步骤,但是除了比较器,还至少需要建模模型对本地修改状态的记录,和一个友好的界面来显示比较结果。
后记
本文中提供的 EMF 比较器解决方案是根据字段的值得到差异性列表,得到字段值之后的比较过程没有特殊的处理需求。在某些比较场景中,也许需要对两个值的比较不只是调用 equals 方法那么简单,比如:也许业务需求在比较过程中会认为空字符串和 null 是相同的,但是在程序语句中这是两个完全不同的值。为了满足对值的复杂比较,可以设计一个字段比较器,把不同字段的比较工作交给该字段对应的比较器去执行。这样在应用中就可以更加灵活的设定比较规则。
更多精彩
赞助商链接