Implementar um visualizador de estruturas

Um visualizador de intercalação de estruturas realiza uma comparação em dois sentidos ou em três sentidos das respectivas entradas de dados, apresenta o resultado nu,a vista hierárquica e deixa o utilizar intercalar as entradas de dados.   Os visualizadores de intercalação de estruturas são comuns para recursos de espaço de trabalho ou membros de um ficheiro de arquivo.

Visualizadores de estruturas em árvore

Dado que a implementação de muitos visualizadores de comparação de estruturas se baseia num formato de árvore, o plug-in de comparação proporciona um StructureDiffViewer genérico baseado em árvore. O plug-in é responsável por fornecer um criador de estruturas que divida um único objecto de entrada de dados numa estrutura hierárquica. O StructureDiffViewer realiza a comparação na estrutura resultante e apresenta o resultado em formato de árvore.

Pode designar um criador de estruturas para o seu plug-in através da extensão org.eclipse.compare.structureCreators. À semelhança dos visualizadores de conteúdos, pode especificar-se um criador de estruturas para um conjunto de extensões de ficheiro ou pode utilizar-se um contentTypeBinding para associar um tipo de conteúdo a determinado criador de estruturas. Não vamos rever a marcação aqui dado ser muito semelhante à dos visualizadores de conteúdos. O plug-in JDT define vários contributos para org.eclipse.compare.structureCreators.

Outros visualizadores de estruturas hierárquicos

Em alguns casos, o StructureDiffViewer baseado em árvore poderá não ser apropriado para o plug-in. O ponto de extensão org.eclipse.compare.structureMergeViewers permite definir uma implementação própria para um visualizador de intercalação de estruturas. Pode especificar-se um visualizador de intercalação de estruturas para um conjunto de extensões de ficheiro ou pode utilizar-se um contentTypeBinding para associar um tipo de conteúdo a determinado visualizador de intercalação de estruturas. Consulte o plug-in JDT para mais exemplos de contributos org.eclipse.compare.structureMergeViewers.

O plug-in de pesquisa proporciona várias classes de utilitários para ajudar a implementar um visualizador de pesquisa.

Diferenciador 

ODiferenciador é um motor de diferenciação para dados estruturados hierarquicamente. Implica duas ou três entradas de dados e realiza uma comparação em dois ou em três sentidos nelas.

Se os elementos da entrada de dados para o motor de diferenciação implementarem a interface IStructureComparator, o motor aplica-se a si próprio recursivamente aos descendentes do elemento da entrada de dados. Os elementos de ramificação devem implementar a interface IStreamContentAccessor de modo a que o diferenciador possa realizar uma comparação de bytes no conteúdo deles.

Existem vários bons exemplos de diferenciadores incluídos na implementação da plataforma:

Por predefinição, o motor de diferenciação devolve o resultado da operação de comparação em forma de árvore de objectos DiffNode.  U m DiffNode descreve as alterações entre duas ou três entradas de dados.  O topo de nós de resultados pode ser alterado mediante sobreposição de um único método do motor.

Visualizadores de Diferenças

Uma árvore de DiffNodes pode ser apresentada num DiffTreeViewer. O DiffTreeViewer implica que os nós interiores da árvore implementem a interface IDiffContainer e as ramificações implementem a interface IDiffElement.

Os passos habituais para comparar dados estruturados hierarquicamente e para apresentar as diferenças são os seguintes:

  1. Correlacionar os dados de entrada numa árvore de objectos que implemente tanto a interface IStructureComparator como a interface IStreamContentAccessor
  2. Realizar a operação de comparação através do Diferenciador
  3. Introduzir o resultado da diferenciação no DiffTreeViewer

O StructureDiffViewer é um DiffTreeViewer especializado que automatiza os três passos supra. Começa com um único objecto de entrada de dados do tipo ICompareInput do qual obtém os dois ou três elementos de entrada de dados para comparar.  Utiliza um IStructureCreator para extrair uma árvore que contém objectos IStructureComparator e IStreamContentAccessor deles.  Estas árvores em seguida são comparadas com o motor de diferenciação e o resultado é apresentado no visualizador em árvore.

O ZipFileStructureCreator é uma implementação da interface IStructureCreator e disponibiliza o conteúdo de um arquivo zip como estrutura hierárquica de IStructureComparators, os quais podem ser facilmente comparados pelo motor de diferenciação (Diferenciador). Trata-se de um bom exemplo da disponibilização de ficheiros estruturados à função de comparação hierárquica do plug-in de comparação.