Сравнение EMF: 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

1 ответ

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

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

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

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

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

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

Другие вопросы по тегам