Сравните два файла исходного кода с использованием моделей EMF - PullRequest
0 голосов
/ 12 декабря 2011

В моем приложении я должен сравнить два файла исходного кода, чтобы увидеть, изменилось ли что-то, а затем выделить эти изменения. Для этого я подумал об использовании ЭДС сравнения. Мое приложение является отдельным приложением и не используется как плагин или что-то подобное. Он должен работать без затмения. Поэтому я связал все необходимые библиотеки и попытался использовать сравнение EMF.

Проблема сейчас в том, что я не знаю, как построить две модели, которые я должен использовать для сравнения двух файлов исходного кода друг с другом. В следующем фрагменте кода, который я написал в качестве первого подхода, файлы исходного кода передаются в виде файлов (Test1.java и Test2.java), но на самом деле исходный код обоих файлов хранится в строке, как показывают параметры метода.

Итак, мой вопрос заключается в том, как я могу сгенерировать две модели на основе String, содержащие исходный код Java, чтобы я мог использовать эти две модели для сравнения друг с другом?

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 ]

1 голос
/ 14 декабря 2011

Вы можете использовать метамодель Java из проекта Modisco , я думаю.С его помощью вы можете десериализовать Java-файлы в модель EMF, а затем сравнить.

Проект EMFText также имеет реализацию модели Java.

Дайте им попробовать!

1 голос
/ 12 декабря 2011

Я думаю, что вы используете неправильную технологию здесь. AFAIK, EMF не поддерживает генератор синтаксического анализа, который можно использовать для анализа исходного кода Java и построения деревьев синтаксического анализа в качестве моделей EMF.

IMO, лучше было бы использовать один из существующих генераторов синтаксического анализатора Java (ANTLR, JavaCC и т. Д.) И существующую грамматику Java, а затем реализовать сравнение на основе деревьев синтаксического анализа, создаваемых созданным анализатором.

...