EMF比较:DifferenceKind是ADD和DELETE而不是CHANGE。为什么?

时间:2013-04-08 15:19:57

标签: java eclipse eclipse-emf emf emf-compare

以下是我的emf实例文档的2个版本。正如您所看到的,唯一改变的是“productCode”值从 KAF 已更改的值。但是比较将此视为两个更改 ADD DELETE 。不确定为什么?

版本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{left=BillableSystemEvent@1b5340c Application Processed, right=BillableSystemEvent@16c163f Application Processed, origin=<null>, #differences=2, #submatches=2}
State: UNRESOLVED

d.getKind(): DELETE
d.getMatch(): MatchSpec{left=BillableSystemEvent@1b5340c Application Processed, right=BillableSystemEvent@16c163f Application Processed, origin=<null>, #differences=2, #submatches=2}
State: UNRESOLVED

1 个答案:

答案 0 :(得分:0)

我们的维基远未完成,但description of the Diff elements应足以描述EMF比较中“添加”,“删除”或“更改”的含义。

除此之外,你在这里打印的内容还不足以说明真正发生的事情。如果您打印“d.toString()”本身...或至少d.getValue()(如果是instanceof ReferenceChange或ReferenceChange),则System.out会更有用。

在这里,我将回答不知道你的模型,我希望我没有做出错误的假设(特别是什么是“billableProductCode”及其“productCode”)。

我很确定billableSystemEvent.billableProductCode是一个多值属性。在这种情况下,彼此不“相等”的元素将被视为不匹配。 “KAF”不等于“已更改”,因此我们认为这两个值不匹配,这导致两个不同:“KAF”已被删除,并且已添加“已更改”。

请注意,这是一个简化:我们这里不使用Object#equals(Object),而是使用IEqualityHelper#matchingValues(Object, Object)

如果“billableProductCode”是单值属性,我们会检测到“KAF”已更改为“已更改”。