0

我有 2 个模型要比较。在我的 *.ecore 模型中,我有一个“Id”属性,并且它的 ID 属性已设置为true。我正在使用 EcoreUtil.generateUUID() 作为唯一 ID。

就我而言,我有一个现成的模型,我正在运行时创建一个新模型。因此,ID 彼此不同。

在 EMFCompare 的开发者指南中,他们让我们使用UseIdentifiers.NEVER

IEObjectMatcher matcher = DefaultMatchEngine.createDefaultEObjectMatcher(UseIdentifiers.NEVER);

尽管如此,它仍然会为每个节点生成数学,其 id 如下所示:

左对象:DocModel.impl.ParagraphImpl@2767e23c (Id: _8pidAdVSEeSCK78kxjXrDg) (name: null) (rawText: Lorem ipsum ....)

右对象:DocModel.impl.ParagraphImpl@33bc72d1 (Id: _QSFJodrUEeSkqsl19NdwQQ) (name: null) (rawText: Lorem ipsum ....)

d.getKind(): 改变

我想比较会看到他们因为不同的 id 而改变。

简而言之,我想在比较中忽略 Id 属性。

谢谢并恭祝安康

4

1 回答 1

1

在给你答案之前,我想陷入理论。

Emf compare 使用两种不同的方式匹配对象。第一个是Id函数,另一个是关于一组对象之间的计算距离。默认情况下, emf compare 使用混合方法。如果元素的id 函数可用,则将调用它,否则它将使用距离函数按最近邻匹配对象。因此,当您创建匹配器时,您应该指定策略。在您的情况下,您选择从不使用 id 函数。

DefaultMatchEngine.createDefaultEObjectMatcher(UseIdentifiers.NEVER);

实际比较不在匹配引擎中,而是在diff 引擎中。您只需要扩展DefaultDiffEngine并覆盖createFeatureFilter方法以提供您拥有的FeatureFilter

于 2016-09-03T13:21:11.140 回答