ЭДС Сравнить две модели

Я хочу сравнить две модели, которые соответствуют данной метамодели ecore, как это:

public void compare() {

    URI uri1 = URI.createFileURI("file1.xmi");
    URI uri2 = URI.createFileURI("file2.xmi");

    Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());

    ResourceSet resourceSet1 = new ResourceSetImpl();
    ResourceSet resourceSet2 = new ResourceSetImpl();

    resourceSet1.getResource(uri1, true);
    resourceSet2.getResource(uri2, true);

    IComparisonScope scope = new DefaultComparisonScope(resourceSet1, resourceSet2, null);
    Comparison comparison = EMFCompare.builder().build().compare(scope);

    List<Diff> differences = comparison.getDifferences();
    // Let's merge every single diff
    IMerger.Registry mergerRegistry = new IMerger.RegistryImpl();
    IBatchMerger merger = new BatchMerger(mergerRegistry);
    merger.copyAllLeftToRight(differences, new BasicMonitor());
}

Если я запускаю этот код, я получаю ошибку Package with uri '/uri/of/the/package' not found, который является URI метамодели. Я попытался зарегистрировать модель ecore с помощью правой кнопки мыши, а затем Register EPackages, но это не сработало. Что я делаю не так?`Как я могу зарегистрировать пакет (я предпочитаю статически, но динамически также будет работать).

2 ответа

Итак, у вас есть конкретная модель ecore с именем EPackage / префиксом Ns 'xmi'? Прежде всего, это плохая идея называть вашу пользовательскую модель "xmi", поскольку пространство имен уже используется для каждой модели ecore: xmlns:xmi="http://www.omg.org/XMI"

Вы сгенерировали код модели для своей метамодели (EPackage и EFactory)?

Если это так, вы можете увидеть здесь, как правильно загрузить файл xmi на основе вашей пользовательской модели. Вам необходимо зарегистрировать свое собственное пространство имен (суффикс файлов модели не должен быть 'xmi')

Из-за соглашения об именах URI начинается с http://, если это не так для вашей метамодели, сделайте это, так как /uri/of/the/package не является действительным. Неправильный URI будет вызывать проблемы в нескольких случаях, и я считаю, что это действительно причина в вашем случае.

У меня такая же проблема. Я решил это с помощью следующих простых шагов:

  • Создайте генмодель из метамодели
  • из genmodel нажмите на корневой элемент и сгенерируйте код модели

Для меня это работа!

Вы должны зарегистрировать метамодель и убедиться, что вы уже автоматически генерировали весь код (не в режиме выполнения).

public void compare() {
    URI uri1 = URI.createFileURI("E:/eclipse-dsl-workspace/edu.ustb.lesley.register/src/test/base.xmi");
    URI uri2 = URI.createFileURI("E:/eclipse-dsl-workspace/edu.ustb.lesley.register/src/test/branch1.xmi");

    Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());

    ResourceSet baseResourceSet = new ResourceSetImpl();
    ResourceSet branchResourceSet = new ResourceSetImpl();
    baseResourceSet.getPackageRegistry().put("https://edu/ustb/lesley/register", RegisterPackage.eINSTANCE);
    baseResourceSet.getPackageRegistry().put("https://edu/ustb/lesley/register", RegisterPackage.eINSTANCE);

    baseResourceSet.getResource(uri1, true);
    branchResourceSet.getResource(uri2, true);

    IComparisonScope scope = new DefaultComparisonScope(branchResourceSet, baseResourceSet, null);
    Comparison comparison = EMFCompare.builder().build().compare(scope);
    
    List<Diff> differences = comparison.getDifferences();
    for(Diff diff : differences) {
        System.out.println(diff.toString());
    }
    
    // Let's merge every single diff
    IMerger.Registry mergerRegistry = IMerger.RegistryImpl.createStandaloneInstance();
    IBatchMerger merger = new BatchMerger(mergerRegistry);
    merger.copyAllLeftToRight(differences, new BasicMonitor());
    
    // check that models are equal after batch merging
    Comparison assertionComparison = EMFCompare.builder().build().compare(scope);
    EList<Diff> assertionDifferences = assertionComparison.getDifferences();
    System.out.println("after batch merging: " + assertionDifferences.size());
    assertEquals(0, assertionDifferences.size());
}
Другие вопросы по тегам