如何在 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 中以编程方式启动和停止 Amazon EC2 实例
以编程方式获取 Android 手机型号,如何在 android 中以编程方式获取设备名称和型号?