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

Posted

技术标签:

【中文标题】如何在 Java 中以编程方式合并 EMF 模型?【英文标题】:How to merge EMF models programmatically in Java? 【发布时间】: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 ...

【问题讨论】:

【参考方案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 已包含执行此操作的所有业务规则。

【讨论】:

以上是关于如何在 Java 中以编程方式合并 EMF 模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在核心数据中以编程方式创建超类/子类?

如何在 Java 中以编程方式检查 SSL 证书到期日期

如何在 Java 中以编程方式启动和停止 Amazon EC2 实例

以编程方式获取 Android 手机型号,如何在 android 中以编程方式获取设备名称和型号?

Gradle:如何在java中以编程方式声明对项目特定配置的依赖关系

Android:如何在 Java 中以编程方式选中/取消选中 RadioGroup 中的单选按钮