Сравнение модели EMF с EMF Compare

У меня есть две версии экземпляров EMF, основанные на одной и той же модели ecore. Мне нужно подготовить список вещей, которые изменились с v1 на v2 в следующем формате

Для каждого объекта в модели Имя объекта: измененные атрибуты: добавленные атрибуты: удаленные атрибуты:

Каждый из этих файлов экземпляров EMF на самом деле представляет данные БД. Пользователь не изменяет напрямую БД, но он изменяет файл экземпляра EMF. Инструменту необходимо определить эти изменения, а затем сгенерировать необходимые операторы DML. Оцените, можно ли представить псевдокод о том, как этого добиться, или есть лучшая альтернатива. Ниже приведен код, который у меня есть

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 ответ

Не могу сказать, что я действительно понимаю все, чего вы пытаетесь достичь, но, насколько я понимаю, вас не очень интересует формат, который EMF Compare использует для его различий. Скорее, вы пытаетесь сгенерировать другой тип представления для различий.

Возможно, вам будет интересно просто переопределить IDiffProcessor. Разные процессоры уведомляются каждый раз, когда мы обнаруживаем изменение. По умолчанию мы создаем наши экземпляры "Diff"... Ничто не мешает вам генерировать операторы DML. Вы можете получить краткий обзор API IDiffProcessor здесь.

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