Как программно объединить модели EMF в Java? - PullRequest
6 голосов
/ 30 января 2011

Есть ли способ программно объединить несколько моделей Ecore (2 или более) в одну модель Ecore на Java? При этом все модели соответствуют одной метамодели.

В:

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 голосов
/ 31 января 2011

Существует проект Eclipse для обработки сравнения и объединения EMF, который называется 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 голос
/ 07 января 2014

Вам нужно будет определить, что для вас означает «слияние». Вы можете легко присоединить все модели 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 уже содержит все бизнес-правила для этого.

...