Änderungsprotokoll
Wertauflöser - Kurzfassung
Zweck: Erzeugt ein Änderungsprotokoll, das die Unterschiede zwischen einem als Eingabewert übergebenen Objekt und einem parametrierten Vergleichsobjekt ermittelt und in strukturierter Form - als "Änderungsprotokoll" - ausgibt.
►WICHTIG◄ Dieser Wertauflöser ist in einem Client Workflow nicht verfügbar!
Der Änderungsprotokoll-Wertauflöser erzeugt ein Änderungsprotokoll, das die Unterschiede zwischen einem als Eingabewert übergebenen Objekt und einem per Parameter Vergleichswert definierten Vergleichsobjekt ermittelt und in strukturierter Form - als "Änderungsprotokoll" - ausgibt.
Der Typ des Rückgabewerts hängt dabei vom Typ des Eingabewerts ab:
Eingabewert-Typ |
Beispiele |
Rückgabewert-Typ |
Spezifische Felder |
Simpler Wert |
Textwerte, Zahlenwerte, Aufzählungswerte, usw. |
"Änderungsprotokoll > Einfacher Wert" (SimpleValueChangeLog) |
fromValue, toValue |
Collection |
Liste, Eindeutige Liste, usw. |
"Änderungsprotokoll > Collection" (CollectionChangeLog) |
fromLength, toLength |
Entität |
Geschäftsobjekt, Eigene Typdefinitionen, Position, Konfiguration, |
"Änderungsprotokoll > Entität" (EntityChangeLog) |
fromId, toId |
andere Objekte |
Client-Objekt, Datumswert, Datumsbereich, Attribut (s. a. nachfolgende Tabelle), usw. |
"Änderungsprotokoll > Objekt" (ObjectChangeLog) |
fromClass, toClass |
►WICHTIG◄ Technisch bietet jeder Änderungsprotokoll-Typ die Felder fromIndex und toIndex an, die sich auf die Reihenfolgenposition innerhalb einer Collection beziehen. Diese Felder enthalten den Wert -1, falls der Index (mangels Bezug zu einer Collection) nicht anwendbar ist.
►HINWEIS◄ Änderungen an Attributen einer Entität können auf unterschiedlichen Wegen ermittelt werden. Der Rückgabewert-Typ variiert dabei:
Eingabewert für das Änderungsprotokoll |
Eingabewert-Typ |
Rückgabewert-Typ |
Spezifische Felder |
Attributbesitzer Übergeordnete Entität des Attributs |
Entität |
"Änderungsprotokoll > Entität" (EntityChangeLog) für den Attributbesitzer, das für jedes geänderte Attribut einen der folgenden Änderungsprotokoll-Typen beinhaltet:
|
attributeType |
Attribut-Implementierung |
Entität |
"Änderungsprotokoll > Entität" (EntityChangeLog) für eine Instanz der Attribut-Implementierung als selbstständige Entität, die das eigentliche Attribut als Wert (s. nächste Zeile) im value-Feld beinhaltet. |
keine bzgl. Attribut |
Attribut |
Objekt |
"Änderungsprotokoll > Objekt" (ObjectChangeLog) für das Attribut, das Änderungsprotokolle für andere Typen (s. o.) beinhaltet, um die eigentlichen Änderungen zu beschreiben. |
keine bzgl. Attribut |
Vergleichslogik:
Werden keine Unterschiede zwischen dem Eingabewert und dem Vergleichsobjekt festgestellt, lautet der Rückgabewert "Kein Wert" ($null).
Falls kein Vergleichswert konfiguriert ist (Standard) und zur Laufzeit eine Entität als Eingabewert vorliegt, wird auf deren Original-Objekt (also den serverseitigen Stand für die Entität) als Vergleichsobjekt zurückgegriffen. Dies ist der typische Anwendungsfall für den Wertauflöser.
Die Option Entitätsattribute ignorieren wirkt nur in diesem Anwendungsfall. Sie regelt, ob Veränderungen an den Entitätsattributen ("Besitzer", "Erstellt von", "Erstelldatum", usw.) beim Vergleich ignoriert werden (Standard) oder berücksichtigt.
Beinhaltet die Entität im Eingabewert andere Entitäten (z. B. Positionen oder Attribute), wird für diese - ggf. rekursiv - ein Änderungsprotokoll erzeugt, das zusammen mit anderen "Änderungen" als Bestandteil des übergeordneten Änderungsprotokolls erscheint.
Handelt es sich beim Eingabewert nicht um eine Entität, sondern z. B. um einen simplen Wert, eine Liste oder ein "Client-Objekt", dann sollte der Vergleichswert explizit konfiguriert sein, sonst gilt er Eingabewert auch als Vergleichsobjekt und der Wertauflöser gibt "Kein Wert" ($null) zurück.
Falls als Eingabewert eine Liste von Entitäten vorliegt, werden diese nicht automatisch mit dem jeweiligen Original-Objekt verglichen, wenn kein Vergleichswert konfiguriert ist. Allerdings kann das bei Bedarf durch eine explizite Konfiguration für den Vergleichswert erreicht werden (s. Besonderer Anwendungsfall im Abschnitt "Beispiele").
Die Option Änderungen auch für gelöschte und erstellte Werte erzeugen steuert, wieviel Information das Änderungsprotokoll über Objekte bereitstellt, die im Kontext des Vergleichs als erzeugt oder gelöscht eingestuft werden:
Für erstellte oder gelöschte Werte erscheint per Standard (Option abgewählt) nur ein minimaler Informationsumfang.
Wird die Option ausgewählt, gibt das Änderungsprotokoll mehr Daten des betreffenden Objekts aus:
Ein als "gelöscht" eingestuftes Objekt werden "zum Abschied" komplett alle Details wiedergegeben.
Für ein als "erstellt" eingestuftes Objekt werden dessen Daten durch ein "Änderungsprotokoll" mit "Kein Wert" ($null) als Vergleichsobjekt wiedergegeben.
Beispiel eines Änderungsprotokolls:
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
core
:EntityChangeLog [...]
fromIndex
=
"-1"
toIndex
=
"-1"
changeType
=
"MODIFIED"
fromClass
=
"shp:Shipment"
toClass
=
"shp:Shipment"
fromId
=
"51"
toId
=
"51"
>
<
changeLogs
>
<
core
:TypedAttributeChangeLog
name
=
"attributes"
fromIndex
=
"-1"
toIndex
=
"-1"
changeType
=
"MODIFIED"
fromClass
=
"shp:ShipmentText"
toClass
=
"shp:ShipmentText"
fromId
=
"1"
toId
=
"1"
attributeType
=
"base:TextAttribute"
type
=
"base:TextType#DESCRIPTION"
>
<
changeLogs
>
<
core
:ObjectChangeLog
name
=
"value"
fromIndex
=
"-1"
toIndex
=
"-1"
changeType
=
"MODIFIED"
fromClass
=
"base:TextAttribute"
toClass
=
"base:TextAttribute"
>
<
changeLogs
>
<
core
:SimpleValueChangeLog
name
=
"textValue"
fromIndex
=
"-1"
toIndex
=
"-1"
>
<
fromValue
xsi:type
=
"xsd:string"
>Beschreibung (original)</
fromValue
>
<
toValue
xsi:type
=
"xsd:string"
>Beschreibung (geändert)</
toValue
>
</
core
:SimpleValueChangeLog>
</
changeLogs
>
</
core
:ObjectChangeLog>
</
changeLogs
>
</
core
:TypedAttributeChangeLog>
</
changeLogs
>
</
core
:EntityChangeLog>
Der Rückgabewert vom Typ "Änderungsprotokoll > Entität" (EntityChangeLog) definiert über das Feld toClass dass eine Sendung (s. Sendungen) als Eingabewert übergeben wurde und verweist auf deren ID (toId) mit dem Wert 51.
Da die Felder fromClass und fromId keine vom Eingabewert abweichenden Daten angeben, betrifft der Vergleich offenbar zwei Datenstände für die Sendung mit der ID 51. Typischerweise dient dabei das Original-Objekt als Vergleichsobjekt, weil kein Vergleichswert konfiguriert wurde.
Das Listenfeld changeLogs enthält im Beispiel genau ein Element vom Typ "Änderungsprotokoll > Typisiertes Attribut" (TypedAttributeChangeLog), dessen Feld changeType den "Änderungstyp" als MODIFIED (geändert) benennt.
An den Feldern fromClass und toClass ist erkennbar, dass das TypedAttributeChangeLog ein typisiertes Textattribut - genauer: dessen Implementierung - für eine Sendung (ShipmentText) betrifft.
Das attributeType-Feld verweist auf den als Wert verwendeten Attributtyp (TextAttribute) und das Feld type identifiziert den als Wert aus der Dynamischen Aufzählung Texttyp (TextType) definierten Subtyp "Beschreibung" (DESCRIPTION).
Das Listenfeld changeLogs innerhalb des TypedAttributeChangeLog-Elements enthält ein "Änderungsprotokoll > Objekt" (ObjectChangeLog), das das Attribut (TextAttribute) als geändert (MODIFIED) klassifiziert.
Das name-Feld verweist hier auf den Namen des value-Felds im Datenmodell des übergeordneten ShipmentText-Objekts.
Das Listenfeld changeLogs innerhalb des ObjectChangeLogs enthält ein "Änderungsprotokoll > Einfacher Wert" (SimpleValueChangeLog) für das textValue-Feld (s. name) im TextAttribute-Objekt.
Das SimpleValueChangeLog dokumentiert die Änderung des Textwerts von "Beschreibung (original)" (fromValue) nach "Beschreibung (geändert)" (toValue)
ACHTUNG
Wie das Beispiel zeigt, erzeugt bereits eine simple Textwert-Änderung innerhalb eines bereits existierenden typisierten Attributs einer Sendung einen erheblichen Informationsumfang im Rückgabewert des Änderungsprotokoll-Wertauflösers. Beim Einsatz des Wertauflösers ist zu bedenken, dass multiple Änderungen innerhalb von komplexeren Objekten (etwa ein Geschäftsobjekt mit Positionshierarchie und Attributen auf allen Ebenen) einen erheblichen "Rechenaufwand" bedingen und entsprechende Datenmengen erzeugen können. Oft soll ein umfangreiches Änderungsprotokoll im Anschluss auch noch spezifisch ausgewertet werden, um relevante Informationen zu erhalten oder in leichter "lesbarer" Form aufzubereiten.
Konfiguration
Option "Entitätsattribute ignorieren"
Die Option Entitätsattribute ignorieren ist per Standard ausgewählt. Beim Vergleichen von "Entitätsdaten" werden die sogenannten Entitätsattribute dann nicht ausgewertet. Beispiel: Als Eingabewert liegen die volatilen Daten einer beliebigen Entität vor, die (ohne Konfiguration für den Vergleichswert) mit dem serverseitigen Datenstand abgeglichen werden sollen. In der rechts oben abgebildeten Standardkonfiguration für den Änderungsprotokoll-Wertauflöser ist die Option Entitätsattribute ignorieren ausgewählt. Falls die volatilen Daten der Entität als einzige Änderung einen "Besitzerwechsel" - also einen gegenüber dem Original-Objekt veränderten Wert für das Entitätsattribut "Besitzer" (Feld ownerId) aufweisen, gibt der Wertauflöser trotzdem "Kein Wert" ($null) zurück, da der volatile Datenstand trotz der Änderung als unverändert gewertet wird. |
|
Wird die Option Entitätsattribute ignorieren abgewählt, dann bezieht der Vergleich zwischen Eingabewert und Vergleichsobjekt für das Änderungsprotokoll auch alle Entitätsattribute mit ein. Für das obige Beispiel bedeutet dies, dass auch ein "Besitzerwechsel" als Änderung gewertet wird, so dass im Rückgabewert des Änderungsprotokoll-Wertauflösers u. a. ein SimpleValueChangeLog-Objekt für das ownerId-Feld zu finden ist. |
Option "Änderungen auch für gelöschte und erstellte Werte erzeugen"
Die Option Änderungen auch für gelöschte und erstellte Werte erzeugen ist per Standard abgewählt. Falls der Vergleich Werte als "erstellt" oder "gelöscht" klassifiziert, erscheint für diese im Rückgabewert des Änderungsprotokoll-Wertauflösers nur der minimale Funktionsumfang. Der jeweilige "Änderungstyp" (changeType), also DELETED oder CREATED wird im Kopf des betreffenden Änderungsprotokoll-Eintrags angegeben, ohne dass alle Details zum Objekt genannt werden. Beispiel: Als Eingabewert liegen volatile Daten für ein Firmenkonto vor, in denen die serverseitig (noch) gespeicherte Adresse gelöscht wurde. Bei einem Vergleich mit abgewählter Option Änderungen auch für gelöschte und erstellte Werte erzeugen (s. Screenshot rechts oben) wird für das Feld address ein EntityCahngeLog (mit der eingebetteten Adresse als Entität) ausgegeben, das den "Änderungstyp" (changeType) DELETED ausweist und dabei die gelöschte Entität nur über die Felder fromClass und fromId identifiziert. |
|
Wird die Option Änderungen auch für gelöschte und erstellte Werte erzeugen ausgewählt (s. Screenshot rechts unten), dann liefert im oben beschriebenen Szenario der Vergleich detaillierte Informationen für die gelöschte Adresse, die zu diesem Zweck mit "Kein Wert" ($null). Das EntityChangeLog für das address-Feld enthält zusätzlich zu den auch im Standardfall angeführten Daten (fromClass, fromId) im Listenfeld changeLogs eine ggf. sehr umfangreiche Auflistung von untergeordneten Änderungsprotokollen, so als wäre jedes Merkmal innerhalb der Adresse individuell gelöscht worden. Durch die Rekursion bezieht dies auch Attribute der Adresse, Adresskontakte, deren Attribute usw. mit ein. |
Vergleichswert-Konfiguration
Der optionale Parameter Vergleichswert kann verwendet werden, um dem Eingabewert ein Vergleichsobjekt gegenüberzustellen. Wird auf eine Konfiguration für den Vergleichswert komplett verzichtet (Standard, s. Screenshot rechts), dann wird als Vergleichsobjekt das "Originalobjekt" zum Eingabewert verwendet.
|
|
In der Konfiguration rechts soll die Adresse der Firma der Session (im Eingabewert) mit der für den Benutzer der Session angegebenen Adresse verglichen als Vergleichsobjekt verglichen werden.
►ANMERKUNG◄ Falls ein Gastbenutzer (s. Gastbenutzer) angemeldet ist, liefert der Benutzer der Session-Wertauflöser kein Benutzerkonto (s. Benutzer). Dann gibt der verkettete Eingabeobjekt (Typsicher)-Wertauflöser "Kein Wert" ($null) an den Objekt-Feld-Wertauflöser weiter. Da ein Gastbenutzerkonto nicht über ein address-Feld verfügt, würde dieser aber ohnehin ins Leere greifen. Falls eine Wertauflöserkette für den Vergleichswert konfiguriert ist, die zur Laufzeit "Kein Wert" ($null) als Rückgabewert liefert, wird $null als Vergleichsobjekt verwendet. Falls eine Entität als Eingabewert anliegt, ergibt dies ein EntityChangeLog das die Entität im Eingabewert als "erstellt" (CREATED) bewertet. Ohne Konfiguration für den Vergleichswert würde dagegen $null zurückgegeben, wie oben beschrieben. |
Beispiele
Änderungsprotokoll > Einfacher Wert
Die folgenden Beispiele verwenden das JSON-Format zur Beschreibung von Datenstrukturen.
Eingabewert |
Vergleichswert |
Änderungsprotokoll |
"ABC" |
"XYZ" |
{ |
|
||
4711 |
3210 |
{ |
|
||
{ "class": "java.lang.Long", "value": "4711" } z. B. aus einem Long-Wertauflöser |
{ "class": "java.lang.Integer", "value": "4711" }
z. B. aus einem Ganzzahl-Wertauflöser |
{ |
|
||
Aufzählungswert "Ost" (E) aus der benutzerdefinierten
|
Aufzählungswert "Nord" (N) aus der benutzerdefinierten |
{ |
|
Änderungsprotokoll > Collection
Die folgenden Beispiele verwenden das JSON-Format zur Beschreibung von Datenstrukturen.
Eingabewert |
Vergleichswert |
Änderungsprotokoll |
["Tom","Dick","Harry","Sally"] |
["Tom","Dick","Harry"] |
{ |
|
||
["Tom","Dick","Harry"] |
["Tom","Dick","Harry","Sally"] |
{ |
|
||
{ "class": "set", "data": [ "Tom", "Harry" ] } |
{ "class": "set", "data": [ "Tom", "Harry", "Dick"] } |
{ |
►HINWEIS◄ Die "Eindeutige Liste" verwaltet keine Indexnummern für die Einträge. Die Felder fromIndex und toIndex zeigen daher den Standardwert -1. |
||
[1,2,3] |
[3,2,1,0] |
{ |
►ANMERKUNG◄ Der Wert 2 taucht im Feld changeLogs nicht auf, da er als komplett unverändert gilt. |
||
Besonderer Anwendungsfall: Alle Entitäten in einer Liste vergleichen |
||
Eine mit dem Erzeuge Liste angelegte Collection enthält volatile Daten von unterschiedlichen Entitäten, die gegenüber dem serverseitigen Stand geändert sein können:
Beide Konten wurden bereits erstellt und wurden im aktuellen Kontext unter Umständen verändert. Der Änderungsprotokoll-Wertauflöser sollen alle "volatilen" Änderungen an den als Entitäten aufgelisteten Konten feststellen. |
Als Vergleichswert soll der Liste von Entitäten im Eingabewert eine Liste der zugehörigen "Originalobjekte" gegenübergestellt werden. Dies kann mit dem Sammle Werte-Wertauflöser erreicht werden, der hier als Wert zum Sammeln auf den Original-Objekt-Wertauflöser zurückgreift, um den serverseitigen Stand für jedes Element der als Eingabewert vorliegenden Liste von Entitäten abzurufen. |
{ |
|
Änderungsprotokoll > Objekt
Die folgenden Beispiele verwenden das JSON-Format zur Beschreibung von Datenstrukturen.
Eingabewert |
Vergleichswert |
Änderungsprotokoll |
{ "class": "de.lobster.scm.utils.date.DateTime", Ein als Relatives Datum mit Zeit ermitteltes "Datum mit Zeit"-Objekt:
|
{ "class": "de.lobster.scm.utils.date.DateTime",
|
{ |
|
||
{ "name": "Darth Vader", "nickname": "Dee-Vee" } |
{ "name": "Anakin" } |
{ |
|
||
{ "name": "Luke", } |
{ "name": "Luke" } |
{ |
|
Änderungsprotokoll > Entität
Die folgenden Beispiele verwenden wahlweise das XML-Format und das JSON-Format zur Beschreibung von Datenstrukturen.
Eingabewert |
Vergleichswert |
Rückgabewert |
Eine Ereignisbehandlung wird durch das Ereignis "Ändern" (s. Allgemein (Ereignisse)) ausgelöst, so dass sie auf das Speichern bereits erstellter Entitäten reagiert. Eine Typprüfung stellt sicher, dass die Ereignisaktion nur im Kontext von Zuordnungskriterien aktiv wird. Als Eingabewert liegen also immer die ggf. geänderten volatilen Daten des Zuordnungskriteriums vor, das gespeichert werden soll. Vor dem Speichern von Änderungen soll ein Änderungsprotokoll erstellt werden, damit - abhängig von der Art der Änderungen - ggf. ein Administrator benachrichtigt werden kann. Beispiel: <?xml version="1.0" encoding="UTF-8"?>
|
nicht konfiguriert, also das Original-Objekt zur betreffenden Entität |
{ |
Ausgehend vom geänderten Stand des Zuordnungskriteriums im vorherigen Beispiel hat der benachrichtigte Administrator das Zuordnungskriterium überprüft und möchte es nun mit Änderungen wieder abspeichern. Die Ereignisbehandlung reagiert wiederum und ermittelt die Änderungen am Zuordnungskriterium über den Änderungsprotokoll-Wertauflöser. Beispiel: <?xml version="1.0" encoding="UTF-8"?>
|
nicht konfiguriert, also das Original-Objekt zur betreffenden Entität |
{ |