2016-09-16 53 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

因此,您有一个EPackage名称/ Ns前缀'xmi'的特定ecore模型?首先,为自定义模型'xmi'命名是个坏主意,因为名称空间已经用于每个ecore模型本身: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已经存在。所以只需生成模型代码并正确注册包装。 –