Wichtig
Kleinigkeit
Fehlerbehebung
Wichtig
Es kann sinnvoll sein, Bedingungen zu hinterlegen, welche die Löschbarkeit von Objekten einschränken. Aktuell können solche Bedingungen an speziellen Fachobjektklassen codiert werden, vgl. com.top_logic.element.structured.StructuredElement.allowsRemove().
Diese API ist unsinnig, weil sie nicht in allen Aufrufpfaden, welche zu einer Objektlöschung führen, berücksichtigt wird. Außerdem wird eine Build-Time-Fachobjektklasse benötigt.
Verbesserung
Eine Lösch-Bedingung kann über die Annotation delete-constraints am Fachobjekttyp hinterlegt werden. Vgl. com.top_logic.model.annotate.persistency.TLDeleteConstraints. Das Constraint selber kann entweder über eine Implementierung von
#!java interface DeleteConstraint { /** * Checks whether the given object can be deleted. * * A deletion veto is signaled by returning a non-<code>null</code> {@link ResKey} describing * the reason, why the given object cannot be deleted. * * @param obj * The object in question. * @return If the given object cannot be deleted, a reason why deletion is not possible, * {@link Optional#empty()} otherwise. */ Optional<ResKey> getDeleteVeto(TLObject obj); }
codiert oder über einen TL-Script-Ausdruck ebenfalls konfiguriert werden:
#!xml <class name="P"> <annotations> <delete-constraints> <delete-constraint expr="x->if($x.get(`DemoTypes:P#protected`), #('Objekt geschützt.'@de, 'Object protected.'@en))"/> </delete-constraints> </annotations> ... </class>
Delete-Constraits werden von Opertypen geerbt, außer, das Erbe wird über <delete-constraints override="true">...</...> ausgeschlagen.
Code-Migration
Ist in einer Fachklasse die Methode boolean StructuredElement.allowDelete() überschrieben, muss statt dessen entweder eine Lösch-Bedingung am Modellelement konfiguriert werden, oder aber die Methode Optional<ResKey> TLObject.tDeleteVeto() implementiert werden. In beiden Fällen muss eine Begründung zurückgeliefert werden, warum eine Löschung nicht möglich ist.
Test
- /com.top_logic.demo/src/test/com/top_logic/demo/scripted/model/type/TestDeleteConstraint.script.xml