enhancement
major
major
minor
#29766
TL-Script add() wirft UnsupportedOperationException bei Multi-Referenz auf transientem Objekt
== Beschreibung
Die TL-Script-Funktion add() schlägt mit einer java.lang.UnsupportedOperationException fehl, wenn sie auf ein Multi-Referenz-Attribut eines **transienten Objekts** angewendet wird, dessen Attribut noch leer (nicht initialisiert) ist.
Die von getValue() zurückgegebene Collection für ein leeres Multi-Referenz-Attribut auf einem transienten Objekt ist unveränderlich (z.B. Collections.emptyList()). Add.eval() ruft direkt Collection.add() darauf auf, was fehlschlägt.
== Reproduktion
obj = new(`some.module:SomeType`, transient: true); obj.add(`some.module:SomeType#multiRef`, $element); // → UnsupportedOperationException
Dabei ist multiRef ein Referenz-Attribut mit multiple="true".
== Erwartetes Verhalten
add() muss auch dann funktionieren, wenn das Multi-Referenz-Attribut auf einem transienten Objekt noch leer/nicht initialisiert ist. Die Funktion sollte in diesem Fall die unveränderliche Collection durch eine veränderliche ersetzen oder eine neue erzeugen, bevor das Element hinzugefügt wird.
== Stack Trace
com.top_logic.util.error.TopLogicException: Evaluation of 'add($transientAttachments, difa.aema.common:TransienMailAttachments#sendAttachments, $attachment)' failed
...
Caused by: java.lang.UnsupportedOperationException
at java.base/java.util.AbstractCollection.add(AbstractCollection.java:251)
at com.top_logic.model.search.expr.Add.eval(Add.java:78)
== Betroffene Klasse
com.top_logic.model.search.expr.Add — Zeile 78: Der eval()-Aufruf muss prüfen, ob die Collection veränderlich ist, und ggf. eine mutable Kopie anlegen.
== Workaround
Statt add() kann set() mit concat() verwendet werden:
// Statt: $obj.add(`Module:Type#multiRef`, $element); // Workaround: $obj.set(`Module:Type#multiRef`, concat($obj.get(`Module:Type#multiRef`), list($element)));