Folgende Situation führt bis zum Logout zu Fehlermeldungen: Ein Objekt A hat ein Attribut vom Typ "Dokumentenordner" (WebFolder). Dieser WebFolder wird an Objekt A gepflegt, soll aber auch an einem anderen Objekt B dargestellt werden. Dafür hat B ein berechnetes Attribut welches den WebFolder von A liefert. Bei Objekt B ist der WebFolder in dar Formular eingebettet. Der Inhalt kann dort nicht geändert werden, aber die Dateien werden zum Download angezeigt. Wird nun an Objekt A eine Datei hochgeladen, so wird diese bei Objekt B angezeigt. Wird die Datei an Objekt A wieder entfernt und man betrachtet dann wieder Objekt B erscheint eine Fehlermeldung und in der Tabelle wird eine Zeile der Art "DeletedObject(ImmutableKnowledgeObjectAttributedDocument(type:tl.folder:Document, id: Document:46017@717, name: test.html, DSN: repository://topl33211/test.html))" angezeigt. Die GUI scheint nach F5 wieder in Ordnung, die Tabelle zeigt dann keinen Eintrag mehr an, aber die Fehlermeldung erscheint fortan bei jedem Klick bis zum Logout.
Log-Eintrag dazu:
com.top_logic.knowledge.wrap.exceptions.InvalidWrapperException: Deleted object access: Document:183403 at com.top_logic.knowledge.wrap.AbstractWrapper.checkInvalid(AbstractWrapper.java:443) at com.top_logic.knowledge.wrap.AbstractWrapper.getDAP(AbstractWrapper.java:127) at com.top_logic.common.webfolder.ui.commands.UpdateExecutable.calculateExecutability(UpdateExecutable.java:70) at com.top_logic.layout.form.model.AbstractExecutabilityModel.updateExecutabilityState(AbstractExecutabilityModel.java:41) at com.top_logic.layout.basic.CommandModelRegistry.updateCommandModel(CommandModelRegistry.java:85) at com.top_logic.layout.basic.CommandModelRegistry.updateCommandModel(CommandModelRegistry.java:87) at com.top_logic.layout.basic.CommandModelRegistry.updateCommandModels(CommandModelRegistry.java:72) at com.top_logic.layout.basic.CommandModelRegistry.validate(CommandModelRegistry.java:115) at com.top_logic.util.DefaultValidationQueue.actualValidation(DefaultValidationQueue.java:134) at com.top_logic.util.DefaultValidationQueue.runValidation(DefaultValidationQueue.java:108) at com.top_logic.layout.internal.SubsessionHandler.runValidation(SubsessionHandler.java:349) at com.top_logic.mig.html.layout.MainLayout.globallyValidateModel(MainLayout.java:1605) at com.top_logic.base.services.simpleajax.AJAXServlet.validate(AJAXServlet.java:739) at com.top_logic.base.services.simpleajax.AJAXServlet.validate(AJAXServlet.java:717) at com.top_logic.base.services.simpleajax.AJAXServlet.doPost(AJAXServlet.java:362)
Im Debugger stellt man fest, dass die CommandModelRegistry eine Referenz auf ein Kommando aus dem WebFolder-Field hält, welches eine Referenz auf das gelöschte AttributedDocument hat. Bei jedem Klick wird die ExecutabilityRule des Kommandos geprüft und führt zu dem Fehler.
Lösung
Die ExecutabilityRule des Kommandos überprüft, ob es sich um ein gelöschtes Objekt handelt bevor auf das Objekt zugegriffen wird.