Thema dieser Dokumentation / Das FirstSpirit 5 Modul- / Komponenten-Modell / Von Gadgets, Aspects, Brokern und Agents / Aspekte (ValueEngineer) / Aspekt: DifferenceComputing

Aspekt: DifferenceComputing

Aspect: DifferenceComputing

Package: de.espirit.firstspirit.client.access.editor

Innerhalb der ValueEngineer-Implementierung kann der Unterschied zwischen zwei gegebenen Werten ermittelt werden. Diese Funktionalität wird über den Aspekt DifferenceComputing bereitgestellt.

Dieser Aspekt kann der ValueEngineer-Implementierung über die Methode <T> T getAspect(@NotNull ValueEngineerAspectType<T> aspect) aus dem Interface ValueEngineer<T> hinzugefügt werden (siehe Das Interface ValueEngineer<T>). Die Methode liefert eine aspektorientierte Instanz des Persistenztyps zurück:

public <T> T getAspect(@NotNull final ValueEngineerAspectType<T>  aspect) {
if (aspect == DifferenceComputing.TYPE) {
return aspect.cast(this);
}
return null;
}

Außerdem muss die Methode List<Difference> computeDifferences (@NotNull T actualValue, @NotNull T oldValue) implementiert werden, die eine Liste von Differenzen (List<Difference>) zwischen zwei übergegebenen Werten liefern soll. Ein Objekt vom Typ Difference ist ein Daten-Container, der eine Beschreibung der Differenz in Form des geänderten Inhalts und einer zugehörigen Änderungsart (Modification) enthält. Man unterscheidet die Änderungsarten NONE, INSERTED, DELETED und CHANGED. Jede Änderung wird vom FirstSpirit-Framework unterschiedlich dargestellt.

Man unterscheidet vier Fälle:

  1. Einer der beiden übergebenen Werte ist null: In diesem Fall wird vom FirstSpirit-Framework automatisch eine Liste mit einem einzelnen Differenzeintrag zurückgeliefert, der den gesamten aktuellen Wert als CHANGED beschreibt. Die Methode List<Difference> computeDifferences(@NotNull T actualValue, @NotNull T oldValue) wird nicht aufgerufen.
  2. Beide übergebene Werte sind null: In diesem Fall wird vom FirstSpirit-Framework automatisch eine Liste mit einem einzelnen Differenzeintrag zurückgeliefert, der den Inhalt als „nicht verändert“ beschreibt (Modification.NONE). Die Methode List<Difference> computeDifferences(@NotNull T actualValue, @NotNull T oldValue) wird nicht aufgerufen.
  3. Beide Werte sind identisch, es liegen also keine Unterschiede vor: In diesem Fall kann der Komponentenentwickler eine leere Liste zurückliefern.
  4. Beide Werte unterscheiden sich, beispielsweise zwei Strings mit folgendem Inhalt:

    actualValue == "This is the actual value!",
    oldValue == "This is the old value."

    In diesem Fall gibt es zwei Lösungsmöglichkeiten:
    1. Allgemeine Beschreibung (geringer Implementierungsaufwand):  Der Komponentenentwickler liefert eine Liste mit einem einzelnen Eintrag zurück, der den gesamten aktuellen Wert als CHANGED beschreibt:

      return Collections.singletonList(new Difference(actualValue, CHANGED));
    2. Detaillierte Beschreibung (insbesondere bei textuellen Vergleichen mit hohem Implementierungsaufwand verbunden): Jeder Unterschied wird einzeln herausgefiltert und mit einer bestimmten Änderungsart als Differenzbeschreibung zur Liste hinzugefügt:

      return Arrays.asList(
              new Difference("This is the ", Modification.NONE),
              new Difference("actual", Modification.INSERTED),
              new Difference("old", Modification.DELETED),
              new Difference(" value", Modification.NONE),
              new Difference("!",Modification.INSERTED),
              new Difference(".",Modification.DELETED)
      );

Die zurückgelieferte Liste kann beispielsweise zur Visualisierung der Differenzen an die SwingGadget-Implementierung weitergeleitet werden (siehe Aspekt: DifferenceVisualizing).

© 2005 - 2024 Crownpeak Technology GmbH | Alle Rechte vorbehalten. | FirstSpirit 2024.5 | Datenschutz