2011-01-30 22 views
5

Java'da programlı olarak tek bir Ecore modelinde birden çok Ecore modelini (2 veya daha fazla) birleştirmenin bir yolu var mı? Tüm modeller aynı metamodel ile uyumludur.EMF modellerini Java'da programsal olarak nasıl birleştirirsiniz?

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

Out: In

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

cevap

6

EMF karşılaştırın denilen karşılaştıran EMF işleme ve birleştirme için Eclipse projesi var.

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

Bu gerçekten modeli birleştirilmesi ve diğer karşılaştırmak maddeleri işlemek için çok iyi yol sunar: İşte

onlar tarafından sağlanan örneğidir. Değişiklikleri manuel olarak da yapabilirsiniz.

İşte onlar tarafından sağlanan tam örnek: 'birleştirme' size ne ifade tanımlamak gerekir Here

0

. Tüm EMF modellerini aynı kaynağa kolayca bağlayabilir ve bunları serileştirebilirsiniz.

Büyük olasılıkla model1 ile model2 arasında eşdeğerlik kurmak isteyeceksiniz. Model1 ve model2 arasında eşit olan bazı nesneleri bulun. Bundan sonra, farklılıkları bulabilirsiniz.

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 

adımı, aşağıdaki eşitlikleri kurar eşleşen: Bir örnek olarak

REMOVED: 2 CHICKENS, 3 EGGS, 1 PIG 
ADDED: 4 CHICKENS, 3 EGGS, 1 PIG 
: Bu adımdan sonra

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

farkları adım geliyorBu farklarını kullanarak, bunları modelinize uygulayabilirsiniz.

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

O 'birleştiği' iş kurallarını belirlemek size kalmış: Sadece 'EKLENDİ' farkı uygulanıyor size aşağıdaki modelini verir. İlk olarak, iki varlığın aynı (eşleşme) olduğu zamanı belirlemeniz gerekir. Bu, ağacınızdaki yerlerinde veya metamodelinize bağlı olarak başka birçok şeye dayanan benzersiz bir anahtara dayanabilir.

Sonuç olarak, bir 'farklar' listeniz olacaktır. Hangi farklılıkların uygulanacağını tanımlamak size kalmıştır.

'Birleştirme'yi bir SVN Birleştirme olarak görüyorsanız (yani, Model1 = Model0 + değişiklikler, Model2 = Model0 + diğer değişiklikler), MergeService zaten bunu yapmak için tüm iş kurallarını içerir.