我有两个版本的EMF实例,它们基于相同的ecore模型。我需要准备一个按照以下格式从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
答案 0 :(得分:0)
我不能说我真的理解你想要实现的一切,但据我所知,你并不真正对EMF Compare用于差异的格式感兴趣。相反,您正在尝试为差异生成不同类型的表示。
您可能只想重新实现an IDiffProcessor。每次检测到更改时都会通知Diff处理器。默认情况下,我们创建“Diff”实例......没有什么可以阻止您生成DML语句。您可以快速了解IDiffProcessor API here。