Un visor de fusión de estructuras efectúa una comparación de dos o tres vías de sus entradas, presenta los resultados de modo jerárquico y permite que el usuario fusione las entradas. Los visores de fusión de estructuras son comunes para los recursos del área de trabajo o para los miembros de un archivo de archivado.
Debido a que la implementación de muchos visores de comparación de estructuras se basa en un árbol, el conector de comparación proporciona un StructureDiffViewer genérico basado en árbol. El conector es responsable de suministrar un creador de estructuras que divide un objeto de entrada en una estructura jerárquica. El objeto StructureDiffViewer realiza la comparación de la estructura resultante y visualiza el resultado en forma de árbol.
El creador de estructuras destinado al conector se designa mediante el punto de extensión org.eclipse.compare.structureCreators.
En algunos casos, puede que el objeto StructureDiffViewer basado en árbol no sea apropiado para el conector. El punto de extensión org.eclipse.compare.structureMergeViewers permite definir una implementación propia para un visor de fusión de estructuras. Se suministran clases de utilidad para facilitar la implementación del visor.
El objeto Differencer es un motor de diferenciación para datos estructurados jerárquicamente. Toma dos o tres entradas y realiza entre ellas una comparación de dos o tres vías.
Si los elementos de entrada del motor de diferenciación implementan la interfaz IStructureComparator, el motor se aplica recursivamente sobre los hijos del elemento de entrada. Los elementos hoja deben implementar la interfaz IStreamContentAccessor para que el diferenciador pueda realizar una comparación a nivel de bytes entre su contenido.
Hay algunos buenos ejemplos de diferenciadores incluidos en la implementación de la plataforma:
Por omisión, el motor de diferenciación devuelve el resultado de la operación de comparación en forma de árbol de objetos DiffNode. El objeto DiffNode describe los cambios que se observan entre dos o tres entradas. El tipo de nodos de resultado se puede cambiar alterando temporalmente un método individual del motor.
Un árbol de objetos DiffNode se puede visualizar en un objeto DiffTreeViewer. En el objeto DiffTreeViewer, los nodos internos del árbol deben implementar la interfaz IDiffContainer, y las hojas deben implementar la interfaz IDiffElement.
Los pasos habituales que permiten comparar datos estructurados jerárquicamente y visualizar las diferencias son los siguientes:
El objeto ZipFileStructureCreator es una implementación de la interfaz IStructureCreator y hace que el contenido de un archivado zip esté disponible en forma de estructura jerárquica de interfaces IStructureComparator, que se pueden comparar fácilmente por medio del motor de diferenciación (Differencer). Este es un buen ejemplo de cómo hacer que los archivos estructurados estén disponibles para la función de comparación jerárquica del conector de comparación.