【问题标题】:How to merge EMF models programmatically in Java?如何在 Java 中以编程方式合并 EMF 模型?
【发布时间】:2011-06-18 02:58:06
【问题描述】:

有没有办法在 Java 中以编程方式将多个 Ecore 模型(2 个或更多)组合到一个 Ecore 模型中?所有模型都符合相同的元模型。

在:

Model1 conforming to metamodelX
Model2 conforming to metamodelX
model3 conforming to metamodelX
model4 conforming to metamodelX
model5 conforming to metamodelX

输出:

modelOut conforming to metamodelX and merge of Model1, Model2, model3, model4, model5 ...

【问题讨论】:

    标签: java model merge eclipse-emf eclipse-emf-ecore


    【解决方案1】:

    有一个用于处理 EMF 比较和合并的 Eclipse 项目,称为 EMF Compare。

    这是他们提供的示例:

    // Loading models
    EObject model1 = ModelUtils.load(model1, resourceSet);
    EObject model2 = ModelUtils.load(model2, resourceSet);
    
    // Matching model elements
    MatchModel match = MatchService.doMatch(model1, model2, Collections.<String, Object> emptyMap());
    // Computing differences
    DiffModel diff = DiffService.doDiff(match, false);
    // Merges all differences from model1 to model2
    List<DiffElement> differences = new ArrayList<DiffElement>(diff.getOwnedElements());
    MergeService.merge(differences, true);
    

    这确实提供了很好的方法来处理模型合并和其他比较的东西。您也可以手动完成更改。

    这是他们提供的完整示例:Here

    【讨论】:

      【解决方案2】:

      您需要定义“合并”对您意味着什么。您可以轻松地将所有 EMF 模型附加到同一资源并对其进行序列化。

      您可能希望在模型 1 和模型 2 之间建立等价关系。在model1和model2之间找到一些相等的对象。 在此之后,您可以找到差异。

      举个例子:

      Model1 is a FARM with serial number 33829. Children: 2 CHICKENS, 3 EGGS and 1 PIG
      Model2 is a FARM with serial number 33829. Children: 4 CHICKENS, 3 EGGS and 1 PIG
      

      匹配步骤建立了以下等价性:

      Model1->FARM = Model2->FARM   because serial number is equal
      all other entities have not been matched
      

      这一步之后是区别步骤:

      REMOVED: 2 CHICKENS, 3 EGGS, 1 PIG
      ADDED: 4 CHICKENS, 3 EGGS, 1 PIG
      

      使用这些差异,您可以将它们应用到您的模型中。仅应用“添加”差异为您提供以下模型:

      Model1+2 is a FARM with serial number 33829. Children: 2 CHICKENS, 3 EGGS, 1 PIG, 4 CHICKENS, 3 EGGS, 1 PIG
      

      “合并”的业务规则由您决定。您首先必须确定两个实体何时相同(匹配)。这可以基于唯一键、它们在树中的位置或基于许多其他事物,具体取决于您的元模型。

      因此,您将获得一个“差异”列表。由您决定应用哪些差异。

      如果您将“合并”视为 SVN 合并(即 Model1 = Model0 + 更改,Model2 = Model0 + 其他更改),则 MergeService 已包含执行此操作的所有业务规则。

      【讨论】:

        猜你喜欢
        • 2014-05-07
        • 2012-01-25
        • 2010-11-16
        • 2018-03-23
        • 2010-10-30
        • 1970-01-01
        • 1970-01-01
        • 2012-04-29
        • 1970-01-01
        相关资源
        最近更新 更多