如何在Java中以编程方式合并EMF模型?

5
有没有一种方法可以在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 ...
2个回答

7

有一个用于处理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);

这真的提供了很好的处理模型合并和其他比较工作的方法。您还可以手动浏览更改。
这是他们提供的完整示例: 这里

1
你需要定义“合并”对你意味着什么。你可以轻松地将所有EMF模型附加到同一资源上并对它们进行序列化。
你可能想要建立model1和model2之间的等价关系。找到一些在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

使用这些“差异”,您可以将它们应用于您的模型。仅应用“ADDED”差异会给您以下模型:
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已经包含了执行此操作的所有业务规则。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接