Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to merge EMF models programmatically in Java?

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 ...
like image 945
bnjuly Avatar asked Jan 30 '11 14:01

bnjuly


2 Answers

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

like image 51
Tuukka Lindroos Avatar answered Oct 14 '22 05:10

Tuukka Lindroos


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.

like image 29
parasietje Avatar answered Oct 14 '22 05:10

parasietje