以下是我的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
答案 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”已更改为“已更改”。