How to merge EMF models programmatically in Java?

雨燕双飞 提交于 2019-12-07 03:52:13

问题


Is there a way to combine multiple Ecore models (2 or more) in a single Ecore model programmatically in Java? With all models conform to the same metamodel.

In:

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

Out:

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

回答1:


There is Eclipse project for handling EMF comparing and Merging, called EMF Compare.

Here is example provided by them:

// 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);

This really provides very good ways to handle model merging and other compare stuffs. You can also manually go through the changes.

Here is full example provided by them: Here




回答2:


You will need to define what 'merge' means to you. You can easily attach all EMF models to the same resource and serialize them.

You will probably want to establish equivalencies between model1 and model2. Find some objects which are equal between model1 and model2. After this, you can find the differences.

As an example:

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

The matching step establishes the following equivalencies:

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

After this step comes the differences step:

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

Using those differences, you can apply them to your model. Applying only the 'ADDED' difference gives you the following model:

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

It's up to you to determine the business rules of 'merging'. You will first have to determine when two entities are the same (matching). This can be based on a unique key, on their place in the tree, or based on a lot of other things, depending on your metamodel.

As a result, you will have a list of 'differences'. It's up to you to define which differences to apply.

If you see 'merge' as an SVN Merge (i.e. Model1 = Model0 + changes, Model2 = Model0 + other changes), then the MergeService already contains all business rules to do this.



来源:https://stackoverflow.com/questions/4843427/how-to-merge-emf-models-programmatically-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!