Tutorial e Exemplos

Correspondência Geral vs. Esquemas de Mapeamento de ID:
Como Criar um Esquema de Mapeamento de ID para Aprimorar os Resultados da Comparação

Considere um arquivo XML de exemplo em duas versões levemente diferentes, esquerda e direita. Suponha que o elemento extension-point seja identificado exclusivamente pelo atributo id. As diferenças textuais são mostradas em negrito.

<?xml version="1.0" encoding="UTF-8"?>

<plug-in
   name="%Plugin.name"
   id="org.eclipse.ui"
   version="1.0"
   provider-name="Object Technology International, Inc."
   class="org.eclipse.ui.internal.WorkbenchPlugin">

<extension-point name="%ExtPoint.editorMenus " id="editorActions"/>
<extension-point name="%ExtPoint.popupMenus " id="popupMenus"/>
<extension-point name="%ExtPoint.importWizards" id="importWizards"/>

</plugin>

  

<?xml version="1.0" encoding="UTF-8"?>

<plugin
   name="%Plugin.name"
   id="org.eclipse.ui"
   version="1.0"
   provider-name="Object Technology International, Inc."
   class="org.eclipse.ui.internal.WorkbenchPlugin">

<extension-point name="%ExtPoint.editorMenus " id="editorActions"/>
<extension-point name="%ExtPoint.popupMenus " id="popupMenus"/>
<extension-point name="%ExtPoint.exportWizards" id="exportWizards"/>

</plugin>


Suponha que a ordem dos elementos deva ser ignorada. A diferença estrutural entre os dois documentos consiste no elemento extension-point à esquerda com id="importWizards" sendo substituído à direita por um novo extension-point com id="exportWizards". Utilizando o algoritmo de correspondência geral chamado Unordered, porque ele ignora a ordem em que os elementos XML aparecem no documento, nós obtemos a seguinte árvore de diferenças.

Árvore de Diferenças utilizando o Algoritmo de Correspondência Geral

Os dois primeiros elementos extension-point são idênticos e são, portanto, correspondidos e não são mostrados na árvore de diferenças. Aí permanece o terceiro elemento extension-point nos dois lados que, tendo o mesmo nome de elemento, também são correspondidos. A árvore de diferenças mostra, então, as diferenças entre o terceiro elemento extension-point à esquerda e o terceiro elemento extension-point à direita. Essas diferenças consistem nos valores dos atributos id e name.
Porém, isso não é o que gostaríamos de ver. Nós gostaríamos que a árvore de diferenças nos mostrasse que um elemento extension-point foi removido do lado esquerdo e um novo elemento extension-point foi incluído no lado direito.
Para alcançar isso, criamos um novo Esquema de Mapeamento de ID. Isso pode ser feito utilizando o botão apropriado na barra de ferramentas.

Criando um Novo Esquema de Mapeamento de ID

Suponha que chamamos o Esquema de Mapeamento de ID de MyPlugin. Agora, selecionamos o Esquema de Mapeamento de ID MyPlugin na lista drop-down na Barra de ferramentas

Selecione o Esquema de Mapeamento de ID MyPlugin

e inclua nele o seguinte Mapeamento:

Criando um novo mapeamento a partir da página de preferências     Criando um novo mapeamento utilizando o menu de contexto

Isso pode ser feito a partir da página de preferências (esquerda) ou a partir do menu de contexto na visualização da estrutura (direita).
A árvore de diferenças, agora, passa a ser:
(Para atualizar a visualização da estrutura, clique no botão Botão para atualizar visualização na lista drop-down na barra de ferramentas.)

Árvore de Diferenças utilizando o Esquema de Mapeamento de ID MyPlugin

Esse é o resultado de comparação desejado e atingido ao criar um Esquema de Mapeamento de ID.

O Plug-in de Comparação XML já vem com um Esquema de Mapeamento de ID para arquivos de Plug-in, que podem ser personalizados para arquivos de Plug-in particulares.

Aviso:
Se um Mapeamento de ID é criado, é assumido que o id é exclusivo, isto é, que não existem dois elementos XML com o mesmo nome e caminho que tenham o mesmo id. Se esse não for o caso, o Esquema de Mapeamento de ID pode não entregar uma árvore de diferenças sensível.
Quando um id aparecer mais de uma vez, uma deve contar com o algoritmo geral.

Além disso, quando um Esquema de Mapeamento de ID é utilizado e existem elementos sem mapeamento de id especificado, o método de comparação Unordered será utilizado, isto é, os elementos são correspondidos pela sua similaridade e não pela ordem em que aparecem no documento. Para especificar que os filhos de um elemento devem ser comparados na ordem em que aparecem. Consulte a próxima seção em Entradas ordenadas.

Incluindo Entradas Ordenadas

As entradas ordenadas são utilizadas para especificar que os filhos diretos (excluindo atributos) de um elemento xml - identificados por seu caminho - devem ser comparados de forma ordenada em vez do método não ordenado padrão.
Como exemplo, considere o arquivo ANT a seguir em duas versões levemente diferentes:

<?xml version="1.0" encoding="UTF-8"?>

<project name="org.junit.wizards" default="export" basedir="..">
   <target name="export" depends="build">
      <mkdir dir="${destdir}" />
      <delete dir="${dest}" />
      <mkdir dir="${dest}" />
      <jar
         jarfile="${dest}/JUnitWizard.jar"
         basedir="bin"
      />
</project>

  

<?xml version="1.0" encoding="UTF-8"?>

<project name="org.junit.wizards" default="export" basedir="..">
   <target name="export" depends="build">
      <mkdir dir="${destdir}"/>
      <mkdir dir="${dest}"/>
      <delete dir="${dest}"/>
      <jar
         jarfile="${dest}/JUnitWizard.jar"
         basedir="bin"
      />
      <copy file="plugin.xml" todir="${dest}"/>
</project>


As diferenças entre os dois documentos são mostradas em negrito. Dois elementos foram trocados (<mkdir dir="${dest}"/> e <delete dir="${dest}"/>) e um novo elemento (<copy .../>) foi anexado ao elemento de destino.
Executar uma comparação não ordenada resultará na seguinte árvore de diferenças:

Árvore de Diferenças utilizando a Correspondência Não Ordenada

O fato de que dois elementos foram trocados não é mostrado uma vez que a ordem dos elementos é ignorada.
Porém, de um ponto de vista ANT, os dois documentos causam um comportamento muito diferente, porque a ordem dos elementos dentro de um destino é importante. Portanto, queremos criar uma entrada ordenada para o destino para instruir o mecanismo de comparação a comparar os filhos diretos do destino da forma ordenada.
Isso é feito criando primeiro um novo Esquema de Mapeamento de ID. Isso pode ser feito utilizando o botão apropriado na barra de ferramentas.

Criando um Novo Esquema de Mapeamento de ID

Suponha que chamamos o Esquema de Mapeamento de ID de MyANT.
Agora, selecionamos o Esquema de Mapeamento de ID MyANT na lista drop-down na Barra de ferramentas e incluímos nele a seguinte Entrada Ordenada:

Criando uma nova entrada ordenada a partir da página de preferências     Criando uma nova entrada ordenada utilizando o menu de contexto

Isso pode ser feito a partir da página de preferências (esquerda) ou a partir do menu de contexto na visualização da estrutura (direita).
A árvore de diferenças, agora, passa a ser:
(Para atualizar a visualização da estrutura, clique no botão Botão para atualizar visualização na lista drop-down na barra de ferramentas.)

Árvore de Diferenças utilizando o Esquema de Mapeamento de ID MyANT

Esse é o resultado de comparação desejado e atingido ao criar uma Entrada Ordenada.

Além disso, os Mapeamentos de Id (consulte a seção anterior) podem ser utilizados para identificar exclusivamente os filhos ordenados. Especialmente quando houver muitas alterações, isso aprimorará os resultados de comparação.

O Plug-in de Comparação XML já vem com um Esquema de Mapeamento de ID para arquivos ANT, que podem ser personalizados para arquivos ANT particulares.