0

同じ ecore モデルに基づく 2 つのバージョンの EMF インスタンスがあります。v1 から v2 への変更点のリストを次の形式で準備する必要があります。

モデル内の各オブジェクト オブジェクト名: 変更された属性: 追加された属性: 削除された属性:

これらの各 emf インスタンス ファイルは、実際には DB データの表現です。ユーザーは DB を直接変更しませんが、emf インスタンス ファイルを変更します。ツールはこれらの変更を識別し、必要な DML ステートメントを生成する必要があります。これを達成する方法について疑似コードを提示できるかどうか、またはより良い代替手段があるかどうかを評価してください。以下は私が現在持っているコードです

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

あなたが達成しようとしていることすべてを本当に理解しているとは言えませんが、私が理解しているように、EMF Compare がその違いに使用する形式にはあまり関心がありません。むしろ、差分の異なる種類の表現を生成しようとしています。

IDiffProcessorを再実装することに興味があるかもしれません。変更が検出されるたびに差分プロセッサに通知されます。デフォルトでは、「Diff」インスタンスを作成します...代わりに DML ステートメントを生成することを妨げるものは何もありません。ここで IDiffProcessor API の概要を簡単に確認できます。

于 2013-04-15T07:54:06.300 に答える