2013-04-08 7 views
0

Ниже приведены 2 версии моих документов экземпляра emf. Как вы можете видеть, единственное, что изменилось, это значение «productCode» от KAF до Изменено. Но сравнение рассматривает это как два изменения ADD и DELETE. Не знаете почему?EMF Compare: DifferenceKind ADD и DELETE вместо CHANGE. Зачем?

Version 1

<billableSystemEvent eventType="1" description="Application Processed"> 
     <billableProductCode productCode="KAF"/> 
</billableSystemEvent> 

Version 2

<billableSystemEvent eventType="1" description="Application Processed"> 
     <billableProductCode productCode="Changed"/> 
</billableSystemEvent> 

public Comparison compare() 
{ 
    // Load the two input models 
    ResourceSet resourceSet1 = new ResourceSetImpl(); 
    ResourceSet resourceSet2 = new ResourceSetImpl(); 
    String xmi1 = "src/test/java/com/equifax/ic/provisioning/service/v1.xmi"; 
    String xmi2 = "src/test/java/com/equifax/ic/provisioning/service/v2.xmi"; 
    load(xmi1, resourceSet1); 
    load(xmi2, resourceSet2); 

    // Configure EMF Compare 
    EMFCompare comparator = EMFCompare.builder().build(); 

    // Compare the two models 
    IComparisonScope scope = EMFCompare.createDefaultScope(resourceSet1, resourceSet2); 
    return comparator.compare(scope); 
} 

@Test 
public void testCompare() 
{ 
    Comparison comparison = compare(); 
    List<Diff> differences = comparison.getDifferences(); 

    for(Diff d: differences) 
    { 
     System.err.println("d.getKind(): "+d.getKind()); 
     System.err.println("d.getMatch(): " + d.getMatch()); 
     System.err.println("State: " + d.getState()); 
    } 

    assertSame(Integer.valueOf(12), Integer.valueOf(differences.size())); 
} 

Выход

d.getKind(): ADD 
d.getMatch(): MatchSpec{[email protected] Application Processed, [email protected] Application Processed, origin=<null>, #differences=2, #submatches=2} 
State: UNRESOLVED 

d.getKind(): DELETE 
d.getMatch(): MatchSpec{[email protected] Application Processed, [email protected] Application Processed, origin=<null>, #differences=2, #submatches=2} 
State: UNRESOLVED 

ответ

0

Наша вики далека от завершения , но description of the Diff elements должен быть достаточно полным, чтобы описать, что означает «Добавить», «Удалить» или «Изменено» для сравнения EMF.

Помимо этого, то, что вы напечатаете здесь, недостаточно, чтобы рассказать, что на самом деле происходит. Ваш System.out был бы более полезен, если бы вы напечатали «d.toString()» самостоятельно ... или по крайней мере d.getValue() (если instanceof ReferenceChange или ReferenceChange).

Здесь я отвечу без знания вашей модели, надеюсь, что я не ошибаюсь в своих предположениях (в частности, что такое «billableProductCode» и «productCode»).

Я уверен, что этот billableSystemEvent.billableProductCode является многозначным атрибутом. В таких случаях элементы, которые не являются «равными» друг с другом, будут считаться не соответствующими. «KAF» не равно «Изменен», и поэтому мы считаем, что эти два значения не совпадают, что приводит к двум отличиям: «KAF» удален, а «Изменено» добавлено.

Обратите внимание, что это упрощение: мы не используем Object # equals (Object) здесь, но IEqualityHelper#matchingValues(Object, Object).

Если «billableProductCode» был однозначным атрибутом, мы бы обнаружили, что «KAF» был изменен на «Изменен».