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:
- 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.
- 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.
- Beide Werte sind identisch, es liegen also keine Unterschiede vor: In diesem Fall kann der Komponentenentwickler eine leere Liste zurückliefern.
- 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:- 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)); - 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)
);
- Allgemeine Beschreibung (geringer Implementierungsaufwand): Der Komponentenentwickler liefert eine Liste mit einem einzelnen Eintrag zurück, der den gesamten aktuellen Wert als CHANGED beschreibt:
Die zurückgelieferte Liste kann beispielsweise zur Visualisierung der Differenzen an die SwingGadget-Implementierung weitergeleitet werden (siehe Aspekt: DifferenceVisualizing).