2016-09-16 8 views
0

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

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, но это не сработало. Что я делаю неправильно? «Как я могу зарегистрировать пакет (я предпочитаю статически, но динамически также работать).

ответ

0

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

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

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

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

+0

Нет, это не называется 'xmi'. Я просто использовал его для примера. Назовем это '.xmj'. Нет никакого сгенерированного кода модели, только ecore и genmodel. – landunder

+0

Вам нужен сгенерированный EPackage и EFactory, иначе emf не знает, как разбирать ваш xmi-файл. Тем не менее, можно загрузить файл * .ecore без какого-либо кода модели, потому что EcorePackage уже существует. Поэтому просто сгенерируйте код модели и правильно зарегистрируйте пакет. –