2011-01-30 86 views
5

有沒有辦法在Java中以編程方式將單個Ecore模型中的多個Ecore模型(2個或更多)合併?所有模型都符合相同的元模型。如何在Java中以編程方式合併EMF模型?

在:

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 ... 

回答

6

有處理EMF比較和合並Eclipse項目,叫做EMF進行比較。

這裏是例如由他們提供:

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

0

您需要定義什麼「合併」對你意味着什麼。您可以輕鬆地將所有EMF模型附加到相同的資源並對它們進行序列化。

您可能想要在model1和model2之間建立等同關係。找到一些在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 

使用那些差異,您可以將它們應用於您的模型。僅應用'ADDED'差異將爲您提供以下型號:

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已包含執行此操作的所有業務規則。

相關問題