0

以下は、私の emf インスタンス ドキュメントの 2 つのバージョンです。ご覧のとおり、'productCode' の値がKAFからChangedに変更されただけです。しかし、compare はこれを 2 つの変更ADDDELETEとして扱っています。なぜかわからない?

バージョン 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
4

1 に答える 1

0

私たちの wiki はまだ完全ではありませんが、要素の説明は、Diff EMF Compare にとって「追加」、「削除」、または「変更」が何を意味するかを説明するのに十分なはずです。

それ以外は、ここに印刷したものだけでは、実際に何が起こっているのかを伝えるには不十分です。「d.toString()」自体を印刷した場合、または少なくとも d.getValue() (インスタンスの ReferenceChange または ReferenceChange の場合) を印刷した場合、System.out はより便利になります。

ここでは、あなたのモデルについて何も知らずに答えます。それについて間違った仮定をしていないことを願っています (特に、「billableProductCode」とその「productCode」とは何か)。

billableSystemEvent.billableProductCode が多値属性であることは確かです。このような場合、互いに「等しくない」要素は一致しないと見なされます。「KAF」は「Changed」と等しくないため、2 つの値が一致しないと見なされ、「KAF」が削除され、「Changed」が追加された 2 つの違いが生じます。

これは簡略化であることに注意してください。ここでは Object#equals(Object) を使用しませんが、IEqualityHelper#matchingValues(Object, Object)を使用します。

「billableProductCode」が単一値の属性であった場合、「KAF」が「Changed」に変更されたことを検出できます。

于 2013-04-09T08:56:39.570 に答える