Программа просмотра объединения структур выполняет двух- или трехстороннее сравнение входных данных, представляет полученные результаты в виде иерархической структуры и позволяют пользователю объединить их. Как правило, программы просмотра объединения структур применяются для работы с ресурсами рабочей области и элементами архивных файлов.
Поскольку реализация многих программ просмотра сравнения структур основана на понятии дерева, в состав модуля сравнения входит базовая программа просмотра для работы с деревьями StructureDiffViewer. Модуль должен предоставить программу создания структуры, применяемую для создания иерархической структуры на основе отдельного входного объекта. StructureDiffViewer сравнивает полученную структуру и отображает результат в качестве дерева.
Программа создания структуры для модуля указывается с помощью расширения org.eclipse.compare.structureCreators. Подобно программам просмотра содержимого, программу создания структуры можно указать для набора расширений файлов, либо связать с конкретным типом содержимого с помощью contentTypeBinding. Текст на языке описания здесь не приводится, поскольку он аналогичен описанию программы просмотра содержимого. Модуль JDT определяет несколько дополнений для org.eclipse.compare.structureCreators.
В некоторых случаях возможностей программы StructureDiffViewer может быть недостаточно для реализации модуля. Точка расширения org.eclipse.compare.structureMergeViewers позволяет задать собственную реализацию программы просмотра объединения структур. Программу просмотра объединения структур можно указать для набора расширений файлов, либо связать с типом содержимого с помощью contentTypeBinding. Примеры дополнений для org.eclipse.compare.structureMergeViewers можно найти в модуле JDT.
Модуль поиска предоставляет несколько служебных классов, облегчающих реализацию программы просмотра поиска.
Differencer - это служба поиска различий в данных с иерархической структурой. Она позволяет выполнить двух- или трехстороннее сравнение входных данных.
Если входные элементы службы поиска различий реализуют интерфейс IStructureComparator, служба позволяет последовательно обработать их дочерние элементы. Концевые элементы должны применять интерфейс IStreamContentAccessor для побайтового сравнения содержимого.
Реализация платформы включает в себя несколько хороших примеров службы поиска различий:
По умолчанию служба поиска различий возвращает результат операции сравнения в качестве дерева объектов DiffNode. DiffNode описывает различия, обнаруженные в результате сравнения двух или трех объектов. Тип узлов можно изменить, переопределив отдельный метод службы.
Структуру, состоящую из узлов DiffNode, можно просмотреть с помощью DiffTreeViewer. DiffTreeViewer требует, чтобы внутренние узлы дерева применяли интерфейс IDiffContainer, а концевые узлы - интерфейс IDiffElement.
Ниже рассмотрен процесс сравнения данных с иерархической структурой и отображения различий.
StructureDiffViewer - это расширенная реализация DiffTreeViewer, позволяющая автоматизировать три этапа, описанные выше. Она принимает входной объект ICompareInput и извлекает из него два или три элемента для сравнения. Затем с помощью IStructureCreator извлекает из этих элементов дерево, содержащее объекты IStructureComparator и IStreamContentAccessor. Полученные деревья сравниваются службой поиска различий, а результат отображается в программе просмотра структур.
ZipFileStructureCreator представляет собой реализацию интерфейса IStructureCreator, позволяющую создать иерархическую структуру IStructureComparator на основе содержимого файла zip для дальнейшей обработки службой поиска различий (Differencer). Это хороший пример предоставления файлов со структурой соответствующей функции модуля сравнения.