EMF模型与EMF比较的比较

时间:2013-04-08 15:30:34

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

我有两个版本的EMF实例,它们基于相同的eco​​re模型。我需要准备一个按照以下格式从v1变为v2的事项列表

对于模型中的每个对象 对象名称: 修改后的属性: 添加了属性: 已删除的属性:

这些emf实例文件中的每一个实际上都是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

1 个答案:

答案 0 :(得分:0)

我不能说我真的理解你想要实现的一切,但据我所知,你并不真正对EMF Compare用于差异的格式感兴趣。相反,您正在尝试为差异生成不同类型的表示。

您可能只想重新实现an IDiffProcessor。每次检测到更改时都会通知Diff处理器。默认情况下,我们创建“Diff”实例......没有什么可以阻止您生成DML语句。您可以快速了解IDiffProcessor API here