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