使用EMF模型比较两个源代码文件

时间:2011-12-12 15:01:12

标签: java eclipse-emf

在我的应用程序中,我应该比较两个源代码文件,看看是否有变化,然后突出显示这些变化。为此,我想到使用EMF比较。我的应用程序是一个独立的应用程序,不用作插件或类似的东西。它应该没有日食运行。因此,我链接了所有必要的库,并尝试使用EMF比较。

现在的问题是我不知道如何构建我必须用来比较两个源代码文件的两个模型。在我作为第一种方法编写的下面的代码片段中,源代码文件作为文件(Test1.java和Test2.java)传递,但实际上两个文件的源代码都存储在字符串中,如方法参数所示。

所以我的问题基本上是如何基于包含Java源代码的String生成两个模型,以便我可以使用这两个模型进行相互比较?

public void compare(String source1, String source2) throws IOException, InterruptedException {

    Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("java", new ResourceFactoryImpl());

    XSDEcoreBuilder builder = new XSDEcoreBuilder();

    Collection<EObject> model1 = builder.generate(URI.createFileURI("Test1.java"));
    Collection<EObject> model2 = builder.generate(URI.createFileURI("Test2.java"));

    final MatchModel match = MatchService.doMatch(model1.iterator().next(), model2.iterator().next(), Collections.<String, Object> emptyMap());
    final DiffModel diff = DiffService.doDiff(match, false);

    final List<DiffElement> differences = new ArrayList<DiffElement>(diff.getOwnedElements());

    System.out.println("MatchModel :\n");
        System.out.println(ModelUtils.serialize(match));
        System.out.println("DiffModel :\n");
        System.out.println(ModelUtils.serialize(diff));
}

2 个答案:

答案 0 :(得分:1)

我认为你在这里使用了错误的技术。 AFAIK,EMF不支持可用于解析Java源代码并将解析树构建为EMF模型的解析器生成器。

IMO,更好的想法是使用现有的Java解析器生成器之一(ANTLR,JavaCC等)和现有的Java语法,然后根据生成的解析器生成的解析树实现比较。

答案 1 :(得分:1)

我认为您可以使用Modisco project中的Java元模型。 有了它,您可以将java文件反序列化为EMF模型,然后进行比较。

EMFText project也有Java模型实现。

试一试!