Kurs i przykłady

Ogólne dostosowywanie a schematy odwzorowania identyfikatorów:
Jak utworzyć schemat odwzorowywania identyfikatorów, aby poprawić wyniki porównywania

Za przykład będzie służyć plik XML w dwóch nieznacznie różnych wersjach po lewej i prawej stronie. Założono tu, że element extension-point jest unikalnie identyfikowany przez atrybut id. Różnice w tekście są zaznaczone pogrubioną czcionką.

<?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.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>


Kolejnym założeniem będzie, że porządek elementów ma być ignorowany. Różnica między dwoma dokumentami to zastąpienie elementu extension-point z wartością id="importWizards" z lewej strony elementem extension-point z wartością id="exportWizards" po prawej stronie. W wyniku użycia ogólnego algorytmu dopasowania (algorytmu nieuporządkowanego, który ignoruje porządek występowania elementów XML w dokumencie) powstanie następujące drzewo różnic.

Drzewo różnic dla ogólnego algorytmu dopasowania

Pierwsze dwa elementy extension-point są identyczne i w konsekwencji zgodne, więc nie są wyświetlane w drzewie różnic. Pozostaje trzeci element extension-point po obu stronach, który zostanie dopasowany, ponieważ zgadza się jego nazwa. Drzewo różnic pokazuje różnice między trzecim elementem extension-point z lewej strony i trzecim elementem extension-point z prawej strony. Różnice sprowadzają się do różnic w wartościach atrybutów id i name.
Jednak nie jest to oczekiwany wynik. Drzewo różnic powinno informować, że element extension-point został usunięty z lewej strony i nowy element extension-point został dodany z prawej strony.
W tym celu trzeba utworzyć nowy schemat odwzorowywania identyfikatorów. Można to wykonać za pomocą odpowiedniego przycisku na pasku narzędzi.

Tworzenie nowego schematu odwzorowywania identyfikatorów

Schemat odwzorowywania identyfikatorów zostanie nazwany MyPlugin. Schemat odwzorowywania identyfikatorów MyPlugin należy wybrać z rozwijanej listy na pasku narzędzi

Wybór schematu odwzorowywania identyfikatorów MyPlugin

i dodać do niego następujące odwzorowanie:

Tworzenie nowego odwzorowania ze strony preferencji     Tworzenie nowego odwzorowania za pomocą menu kontekstowego

Można to zrobić ze strony preferencji (ilustracja po lewej) lub z menu kontekstowego w widoku struktury (ilustracja po prawej).
Drzewo różnic zmieni się w następujący sposób:
Aby odświeżyć widok struktury, należy kliknąć przycisk Przycisk odświeżania widoku na liście rozwijanej paska narzędzi.

Drzewo różnic dla schematu odwzorowywania identyfikatorów MyPlugin

Jest to pożądany wynik porównania osiągnięty za pomocą schematu odwzorowywania identyfikatorów.

Moduł dodatkowy porównywania XML obejmuje schemat odwzorowywania identyfikatorów dla plików modułów dodatkowych, który może zostać dostosowany do określonych plików modułów dodatkowych.

Uwaga:
Gdy tworzone jest odwzorowanie identyfikatorów, przyjmuje się, że identyfikator jest unikalny, tzn. nie istnieją dwa elementy XML o tej samej nazwie i ścieżce oraz takim samym identyfikatorze. W przeciwnym razie drzewo różnic schematu odwzorowywania identyfikatorów może zawierać nieprawidłowe informacje.
Jeśli identyfikator może wystąpić więcej niż jeden raz, należy polegać na ogólnym algorytmie.

Ponadto jeśli wykorzystywany jest schemat odwzorowywania identyfikatorów i występują elementy bez określonego identyfikatora odwzorowania, używana będzie metoda nieuporządkowana, tzn. elementy będą dopasowywane według podobieństwa a nie porządku występowania w dokumencie. Informacje o włączaniu porównywania elementów potomnych danego elementu w porządku ich występowania można znaleźć w następnej sekcji, która zawiera opis uporządkowanych pozycji.

Dodawanie uporządkowanych pozycji

Pozycje uporządkowane są używane do określania, że bezpośrednie elementy podrzędne (wyłączając atrybuty) elementu xml, które są identyfikowane przez jego ścieżkę, mają być porównywane w sposób uporządkowany zamiast domyślnej nieuporządkowanej metody.
Jako przykład posłuży poniższy plik ANT w dwóch nieznacznie różniących się wersjach:

<?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>


Różnice między dokumentami są zaznaczone pogrubioną czcionką. Dwa elementy zostały zamienione (<mkdir dir="${dest}"/> i <delete dir="${dest}"/>), a dodatkowo nowy element (<copy .../>) został dodany do elementu docelowego.
Przeprowadzenie nieuporządkowanego porównania da następujące drzewo różnic:

Drzewo różnic dla porównania nieuporządkowanego

Zamiana dwóch elementów nie została wykazana, ponieważ porządek elementów jest ignorowany.
Jednak z punktu widzenia narzędzia ANT obydwa dokumenty powodują różne działanie, ponieważ porządek elementów wewnątrz elementu target ma znaczenie. Dlatego trzeba utworzyć uporządkowaną pozycję dla elementu docelowego, aby mechanizm porównywania porównał bezpośrednie elementy potomne elementu target w sposób uporządkowany.
W tym celu należy najpierw utworzyć nowy schemat odwzorowywania identyfikatorów. Można to wykonać za pomocą odpowiedniego przycisku na pasku narzędzi.

Tworzenie nowego schematu odwzorowywania identyfikatorów

Schemat odwzorowywania identyfikatorów zostanie nazwany MyANT.
Należy teraz wybrać z rozwijanej listy na pasku narzędzi schemat odwzorowywania identyfikatorów MyANT i dodać do niego następującą uporządkowaną pozycję:

Tworzenie nowej pozycji uporządkowanej ze strony preferencji     Tworzenie nowej pozycji uporządkowanej za pomocą menu kontekstowego

Można to zrobić ze strony preferencji (ilustracja po lewej) lub z menu kontekstowego w widoku struktury (ilustracja po prawej).
Drzewo różnic zmieni się w następujący sposób:
Aby odświeżyć widok struktury, należy kliknąć przycisk Przycisk odświeżania widoku na liście rozwijanej paska narzędzi.

Drzewo różnic dla schematu odwzorowywania identyfikatorów MyANT

Jest to pożądany wynik porównania osiągnięty w wyniku utworzenia pozycji uporządkowanej.

Dodatkowo odwzorowania identyfikatorów (zobacz poprzednią sekcję) mogą zostać użyte do unikalnego identyfikowania uporządkowanych elementów potomnych. Poprawi to wyniki porównania zwłaszcza wtedy, gdy występuje wiele zmian.

Moduł dodatkowy porównywania XML obejmuje schemat odwzorowywania identyfikatorów dla plików ANT, który może zostać dostosowany do określonych plików ANT.