Verbesserung
Wichtig
Detail
Fehlerbehebung
Detail
Detail
#26461
Überschriebenes Attribut erbt zwingend Anpassung "Standardwert"
Eine Klasse A definiert ein String Attribut "s" und annotiert dafür einen Standard-Wert "v". D.h. bei der Erzeugung einer Instanz von A wird das Attribut "s" mit dem Wert "v" belegt.
Eine Klasse B erbt von A, überschreibt das Attribut "s" und annotiert nun **anstatt** des Standardwerts eine Speichervorschrift, die den Wert von "s" berechnet.
Das funktioniert zunächst einwandfrei.
Wird diese Modellkonfiguration aber exportiert und anschließend reimportiert oder eine leere Datenbank damit initialisiert, erhält das überschriebene Attribut "s" an der Klasse B immer beides: sowohl den Standardwert (geerbt von A), als auch die Speichervorschrift (annotiert an B).
Damit schlägt die Erzeugung von Instanzen der Klasse B fehl, weil der Standardwert für berechnete Attribute nicht gespeichert werden kann.
Das Problem kann man in-App beheben, indem man im Modelleditor die Annotation "Standardwert" an dem überschriebenen Attribut wieder entfernt.
Diese Änderung wird jedoch im Export nicht abgebildet bzw. geht beim reimport verloren.
Analyse
Aktuell werden bei der der Anlage eines neuen überschriebenen Attributs implizit alle Annotationen kopiert. Das geschieht unabhängig davon, ob das Attribut an der GUI angelegt oder über XML importiert wird. Daher hat das Löschen einer solchen implizit angelegten Annotation in der Anwendung keine Auswirkungen auf den Export und Re-Import.
Verbesserung
Annotationen werden bei der Anlage überschriebener Attribute nicht mehr kopiert. Stattdessen wird beim Nachschlagen von Annotationen ein weiterer Fallback eingebaut, der eine Annotation am überschriebenen Attribut als Fallback heranzieht, bevor die entsprechende Annotation im Attributtyp verwendet wird. Pro Annotationstyp lässt sich dieses Verhalten aber über die Meta-Annotation @AnnotationInheritance mit der Policy inherit, redefine oder final steuern. Die bisherige Meta-Annotation @CanNotOverride entfällt und wird durch die Annotation-Inheritance-Policy final ersetzt.
Code-Migration
- Sollte die Anwendung ein überschriebenes Attribut definieren, das den Standardwert unverändert von seinem Original-Attribut erben soll, muss in der Modelldefinition dieser Standardwert am überschriebenen Attribut wiederholt werden. Beim Exportieren des Modells aus einer laufenden Anwendung mit einem Datenstand von vor der Änderung bewirkt diese Migration automatisch.
Test
- /com.top_logic.demo/src/test/java/test/com/top_logic/demo/scripted/model/attribute/defaultValue/TestOverridingDefaultWithDerived.script.xml
Manuell:
- Beiliegende Konfiguration importieren.
- Es können (Instanzenreiter) keine Instanzen vom Typ B erzeugt werden.
- Im Modelleditor die Annotation "Standardwert" am Attribut B::constantValue löschen.
- Danach funktioniert die Erzeugung von Instanzen des Typs B.
- Das Modul nun exportieren.
- Alle erzeugten Instanzen und das Modul löschen.
- Das zuvor exportierte Modul wieder importieren.
-> Erwartung: Keine Veränderung, Anlage von Bs funktioniert weiterhin.
-> Ist: Die Annotation "Standardwert" an B::constantValue wurde wieder erzeugt. Es können keine Bs angelegt werden.