Wichtig
Detail
Wichtig
Detail
Detail
#26554
Berechnete Webfoldern-Referenzen löschen Ordner beim Löschen des Basisobjektes
Wenn eine Klasse A eine mandatory Referenz des Typs "DokumentenOrdner" deklariert, wird automatisch zu jeder Instanz von A ein Ordner angelegt und verknüpft.
Wird eine Instanz mit Referenzen des Typs "DokumentenOrdner" gelöscht, werden diese aufgelöst und die referenzierten Ordner gelöscht.
Das passiert aber auch für berechnete Ordner-Referenzen: Wenn nun Objekt B eine berechnete Referenz des Typs "DokumentenOrdner" deklariert und in dieser den Ordner von A zurückgibt, wird beim löschen von B der Ordner von A gelöscht, obwohl B gar nicht der Anlagekontext des Ordners ist.
A bleibt nun mit leerer (obwohl verpflichtender) Ordner Referenz zurück.
Analyse
Der Typ tl.folder:WebFolder hat aus historischen Gründen die Besonderheit, dass alle Referenzen vom Typ WebFolder bei der Objekterstellung mit einer neuen WebFolder-Instanz belegt werden. Dieser Aspekt ist im Modell bisher nicht (z.B. über eine Default-Annotation) hinterlegt. Entsprechend werden bei der (der direkten) Löschung eines Objektes (über tDelete()) ein WebFolder, der in irgendeiner Referenz gespeichert ist mitgelöscht. Hierbei wird weder berücksichtigt, ob die Referenz als Komposition ausgezeichnet ist, noch ob die Referenz möglicherweise berechnet ist. Beim Löschen wiederum läuft Spezialcode, der sicherstellt, dass der WebFolder rekursiv mit seinem Inhalt gelöscht wird, ohne dass dies im Modell ausgezeichnet ist.
Verbesserung
- Der Spezial-Code für den Typ WebFolder wird entfernt.
- Der Typ WebFolder erhält eine Default-Provider-Annotation (<default-value/>), die bewirkt, dass eine alle Einzel-Kompositions-Referenzen vom Typ WebFolder bei der Objekterzeugung mit einer WebFolder-Instanz vorbelegt werden.
- WebFolder-Attribute müssen in Folge immer als Komposition angelegt werden, wenn die Vorbelegung erwünscht ist. Im Gegenzug passiert das Löschen des Ordners bei Löschen des Basisobjektes dann automatisch über die Kompositionsauszeichnung der Referenz.
- Beim Löschen eines WebFolder muss immer ein rekursives Löschen stattfinden, unabhängig davon, ob der Ordner als Teil eines Basisobjektes gelöscht wird, oder nicht. Das kann nicht über das Modell erfolgen, weil WebFolder-Inhalt historisch auch "verlinkt" sein kann. Verlinkter Inhalt darf aber beim rekursiven Löschen nicht mitgelöscht werden.
Code-Migration
- In exportierten Modell-Dateien muss eine Referenz vom Typ tl.folder:WebFolder zu einer Komposition gemacht werden, um dieselbe Semantik zu erhalten wie bisher. Die zugehörige Datenmigration in bestehenden Datenbeständen passiert automatisch.
#!xml <reference name="folder" composite="true" type="tl.folder:WebFolder" />
Test
- /com.top_logic.demo/src/test/java/test/com/top_logic/demo/scripted/webfolder/TestComputedWebfolderRef.script.xml
- test.scripted.TestMigration740