2016-09-16 52 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已經存在。所以只需生成模型代碼並正確註冊包裝。 –