Как получить правильные различия при использовании EMF для сравнения структурно одинаковых объектов, которые отличаются по ==?

Последующие действия ниже

Допустим, у меня есть эта простая модель (синтаксис 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, но я получаю два псевдоконфликта для вида ADD для A__BS. Я думаю, это из-за того, как EMF обрабатывает равенство, а A и B технически разные.

Как мне добиться того, чтобы я получил «правильные» различия?

Продолжение 1

Я воссоздал этот пример в новой рабочей области, но добавил UUID к типам A и B (как и в моей «настоящей» модели), и это работает, как и ожидалось. Теперь о том, почему моя "настоящая" модель не...


person rabejens    schedule 22.03.2017    source источник


Ответы (1)


Проблема здесь в том, что EMF Compare не может правильно сопоставить элементы, как вы поняли, добавив UUID.

Насколько я понимаю, EMF Compare должен иметь возможность сопоставлять ваши элементы B, поскольку внутри них есть что-то, что можно различать и сопоставлять, но A, напротив, сами по себе не содержат никакой информации. Добавление UUID к вашим элементам обеспечивает их идентификацию и позволяет EMF Compare узнать, кто есть кто.

Вы можете обойти эту проблему, добавив свою собственную логику для соответствия вашим элементам. Я предполагаю, что ваша фактическая модель (и метамодель) будет выглядеть иначе, поэтому у вас могут быть способы лучше различать ваши элементы (или, что еще лучше, убедиться, что ваши модели имеют идентификаторы). Логика сопоставления может быть переопределена несколькими способами. Один из них — изменить функцию идентификатора (отвечает за вычисление идентификаторов элементов), если ваш случай включает в себя способ уникальной идентификации ваших элементов, который не осуществляется через атрибут id или изменение помощник по вопросам равенства, чтобы вы могли указать EMF Compare, как именно сопоставлять ваши объекты (нет пример кода в документации для этого, но вы можете увидеть на ID function фрагмент, как изменить "фабрику помощников по равенству").

person Kellindil    schedule 19.06.2017