Implementar un visor de estructuras

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.

Visores de estructuras en forma de árbol

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. De forma muy similar a los visores de contenido, puede especificarse un creador de estructuras para un conjunto de extensiones de archivo o puede utilizarse un elemento contentTypeBinding para asociar un tipo de contenido con un creador de estructuras determinado. Dado que es muy similar al de los visores de contenidos, no revisaremos el código en este punto. El conector JDT define varias contribuciones para org.eclipse.compare.structureCreators.

Otros visores de estructuras jerárquicas

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. Puede especificarse un visor de fusión de estructuras para extensiones de archivo o puede utilizarse un elemento contentTypeBinding para asociar un tipo de contenido con un visor de fusión de estructuras determinado. Coneculte el conector JDT para obtener ejemplos de las contribuciones a org.eclipse.compare.structureMergeViewers.

El conector de búsqueda proporciona varias clases de utilidad que facilitan la implementación de un visor de búsqueda.

Diferenciador 

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.

Visores de diferencias

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:

  1. Correlacionar los datos de entrada con un árbol de objetos que implementen las interfaces IStructureComparator y IStreamContentAccessor.
  2. Realizar la operación de comparación por medio del objeto Differencer
  3. Llevar el resultado de la diferenciación al visor DiffTreeViewer

El objeto StructureDiffViewer es un visor DiffTreeViewer especializado que automatiza los tres pasos descritos anteriormente. Toma un solo objeto entrada de tipo ICompareInput del que recupera los dos o tres elementos de entrada que deben compararse.  Utiliza una interfaz IStructureCreator para extraer a partir de ellos un árbol que contenga objetos IStructureComparator e IStreamContentAccessor.  Posteriormente se comparan estos árboles con el motor de diferenciación y el resultado se muestra en el visor del árbol.

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.