如何在结构相等的对象上使用EMF比较时获得正确的Diffs,这些对象根据= =不同?

时间:2017-03-22 14:09:17

标签: java emf emf-compare

以下跟进

假设我有这个简单的模型(Xcore语法):

class A {
  contains B[] bs opposite a
}

class B {
  String foo
  container A a opposite bs
}

我现在有三个A,创建如下:

A a1 = ModelFactory.eINSTANCE.createA();
B b1 = ModelFactory.eINSTANCE.createB();
b1.setFoo("foo");
b1.setA(a1);

A a2 = ModelFactory.eINSTANCE.createA();
B b2 = ModelFactory.eINSTANCE.createB();
b2.setFoo("bar");
b2.setA(a2);

A a3 = ModelFactory.eINSTANCE.createA();
B b3 = ModelFactory.eINSTANCE.createB();
b3.setFoo("bar");
b3.setA(a3);

当我尝试比较它们时:

DefaultComparisonScope scope = new DefaultComparisonScope(a1, a2, a3);
Comparison comp = EMFCompare.builder().build().compare(scope);
EList<Diff> diffs = comp.getDifferences();

我希望在B__FOO EAttribute上获得一个属性更改,但我为A__BS的ADD类型获得了两个伪冲突。我认为这是因为EMF如何处理平等,而A和B在技术上是不同的。

我如何实现我得到“正确”的差异?

跟进1

我在一个新的工作区中重新创建了这个例子,但我在A和B类型中添加了一个UUID(正如我的“真实”模型也有),这可以按预期工作。现在,找出为什么我的“真实”模型不...

1 个答案:

答案 0 :(得分:0)

这里的问题是EMF Compare无法正确匹配元素,正如您通过添加UUID实现的那样。

在我看来,EMF Compare应该能够匹配您的B元素,因为它们内部有一些区别和匹配,但A相反,不是SCollection自己掌握任何信息。向元素添加UUID会强制其身份,并允许EMF比较以了解谁是谁。

您可以通过添加自己的逻辑来匹配您的元素来规避问题。我假设这不是你的实际模型(和元模型)的样子,所以你可能有办法更好地区分你的元素(或者更好,以确保你的模型有标识符)。匹配逻辑可以以多种方式重新定义。一个是change the ID function(负责计算元素ID),如果你的案例包含一种方法来唯一地识别你的元素不是通过id属性或更改equality helper,这样你就可以准确地告诉EMF比较如何匹配您的对象(文档中没有示例代码,但您可以在ID function代码段上看到如何更改&#34;平等帮助工具&#34; )。