EMF Compare: DifferenceKind — это ADD и DELETE вместо CHANGE. Почему?

Ниже приведены 2 версии документации моего экземпляра emf. Как видите, единственное, что изменилось, — это значение значения 'productCode' с KAF на Changed. Но сравнение рассматривает это как два изменения ADD и DELETE. Не уверен, почему?

Версия 1

<billableSystemEvent eventType="1" description="Application Processed">
        <billableProductCode productCode="KAF"/>
</billableSystemEvent>

Версия 2

<billableSystemEvent eventType="1" description="Application Processed">
        <billableProductCode productCode="Changed"/>
</billableSystemEvent>

public Comparison compare()
{
    // Load the two input models
    ResourceSet resourceSet1 = new ResourceSetImpl();
    ResourceSet resourceSet2 = new ResourceSetImpl();
    String xmi1 = "src/test/java/com/equifax/ic/provisioning/service/v1.xmi";
    String xmi2 = "src/test/java/com/equifax/ic/provisioning/service/v2.xmi";
    load(xmi1, resourceSet1);
    load(xmi2, resourceSet2);

    // Configure EMF Compare
    EMFCompare comparator = EMFCompare.builder().build();

    // Compare the two models
    IComparisonScope scope = EMFCompare.createDefaultScope(resourceSet1, resourceSet2);
    return comparator.compare(scope);
}

@Test
public void testCompare()
{
    Comparison comparison = compare();
    List<Diff> differences = comparison.getDifferences();

    for(Diff d: differences)
    {
        System.err.println("d.getKind(): "+d.getKind());
        System.err.println("d.getMatch(): " + d.getMatch());
        System.err.println("State: " + d.getState());
    }

    assertSame(Integer.valueOf(12), Integer.valueOf(differences.size()));
}

Вывод

d.getKind(): ADD
d.getMatch(): MatchSpec{left=BillableSystemEvent@1b5340c Application Processed, right=BillableSystemEvent@16c163f Application Processed, origin=<null>, #differences=2, #submatches=2}
State: UNRESOLVED

d.getKind(): DELETE
d.getMatch(): MatchSpec{left=BillableSystemEvent@1b5340c Application Processed, right=BillableSystemEvent@16c163f Application Processed, origin=<null>, #differences=2, #submatches=2}
State: UNRESOLVED

person Aravind Yarram    schedule 08.04.2013    source источник


Ответы (1)


Наша вики далека от завершения, но описание Diff элементов должно быть достаточно полным, чтобы опишите, что означают «Добавить», «Удалить» или «Изменен» для EMF Compare.

Кроме того, того, что вы здесь печатаете, недостаточно, чтобы сказать, что происходит на самом деле. Ваш System.out был бы более полезен, если бы вы напечатали сам "d.toString()"... или, по крайней мере, d.getValue() (если instanceof ReferenceChange или ReferenceChange).

Здесь я отвечу, не зная вашей модели, надеюсь, я не делаю неправильных предположений о ней (в частности, что такое «billableProductCode» и его «productCode»).

Я почти уверен, что billableSystemEvent.billableProductCode является многозначным атрибутом. В таких случаях элементы, которые не «равны» друг другу, будут считаться не соответствующими. «KAF» не равно «Changed», и поэтому мы считаем, что два значения не совпадают, что приводит к двум различиям: «KAF» удалено, а «Changed» добавлено.

Обратите внимание, что это упрощение: здесь мы используем не Object#equals(Object), а IEqualityHelper#matchingValues(Object, Object).

Если бы "billableProductCode" был атрибутом с одним значением, мы бы обнаружили, что "KAF" изменился на "Changed".

person Kellindil    schedule 09.04.2013