2013-04-08 43 views
0

以下是我的emf實例文檔的2個版本。正如您所看到的,唯一改變的是'productCode'的值從KAF更改。但是比較是把這個當成兩個變化ADD and DELETE。不知道爲什麼?EMF比較:DifferenceKind是ADD和DELETE而不是CHANGE。爲什麼?

1版

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

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

我們的wiki還遠遠沒有完成,但description of the Diff elements應該足夠完整,以描述EMF Compare的「添加」,「刪除」或「更改」的含義。

除此之外,您在此處打印的內容不足以說明真正發生的情況。如果您打印「d.toString()」本身或至少d.getValue()(如果instanceof ReferenceChange或ReferenceChange),則System.out會更加有用。我希望我不會對它做出錯誤的假設(特別是什麼是「billableProductCode」和它的「productCode」),我不會回答你的模型。

我很確定雖然billableSystemEvent.billableProductCode是一個多值屬性。在這種情況下,不相互「相等」的元素將被視爲不匹配。 「KAF」不等於「更改」,因此我們認爲這兩個值不匹配,導致兩個不同:「KAF」已被刪除,並且「已更改」已被添加。

請注意,這是一個簡化:我們不在這裏使用Object#equals(Object),但是IEqualityHelper#matchingValues(Object, Object)

如果「billableProductCode」是單值屬性,我們會檢測到「KAF」已更改爲「已更改」。

相關問題