【问题标题】:EMF Compare two modelsEMF 比较两个模型
【发布时间】:2017-01-24 21:57:09
【问题描述】:

我想比较两个符合给定 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。我尝试通过右键单击然后Register EPackages 注册ecore 模型,但没有成功。我在做什么错?`我如何注册包(我更喜欢静态但动态也可以)。

【问题讨论】:

    标签: emf ecore emf-compare


    【解决方案1】:

    所以您有一个特定的 ecore 模型,其 EPackage 名称/Ns 前缀为“xmi”?首先,将自定义模型命名为“xmi”是个坏主意,因为命名空间已经用于每个 ecore 模型本身:xmlns:xmi="http://www.omg.org/XMI"

    您是否为您的元模型(EPackage 和 EFactory)生成了模型代码?

    如果是这样,您可以查看here 如何根据您的自定义模型正确加载 xmi 文件。你需要注册你的自定义命名空间(你的模型文件的后缀,不应该是'xmi')

    由于命名约定,URI 以http:// 开头,如果您的元模型不是这种情况,请执行此操作,因为/uri/of/the/package 无效。无效的 URI 会导致多次出现问题,我相信这确实是您的原因。

    【讨论】:

    • 不,它没有被命名为xmi。我只是将它用于示例。我们称之为.xmj。不,没有生成的模型代码,只有 ecore 和 genmodel
    • 你需要生成的EPackage和EFactory,否则emf不知道怎么解析你的xmi文件。然而,可以在没有任何模型代码的情况下加载“*.ecore”文件,因为 EcorePackage 已经存在。所以只需生成模型代码并正确注册包即可。
    【解决方案2】:

    我遇到了同样的问题。我通过这个简单的步骤解决了这个问题:

    • 从元模型创建基因模型
    • 从 genmodel 点击根元素并生成模型代码

    这项工作对我来说!

    【讨论】:

      【解决方案3】:

      您应该注册元模型,并确保您已经自动生成所有代码(不是在运行时模式下)。

      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());
      }
      

      【讨论】:

        猜你喜欢
        • 2013-03-30
        • 1970-01-01
        • 1970-01-01
        • 2018-04-03
        • 2011-06-23
        • 1970-01-01
        • 2020-02-19
        • 1970-01-01
        相关资源
        最近更新 更多