Legt man einen neuen Typ A` ohne Obertyp an, gibt ihm ein Attribut `name, so werden Instanzen dieses Typs an manchen Stellen über den Wert in ihrem Namensattribut dargestellt (z.B. in Referenzen, die auf den Typ A` zeigen). An anderen Stellen erhält man die Anzeige `AttributedWrapper(type:my.app:A, id: GenericObject:3848, name: A3), z.B. im Titel des Kontext-Menüs für ein Objekt vom Typ A und in Tooltips.
- Faszinierenderweise scheint das Problem nach einem Neustart der Anwendung zu verschwinden.
- Das Problem scheint auch nicht immer aufzutreten.
Analyse
Wenn das Problem auftritt, dann sind für den neu angelegten Typ inkonsistente ResourceProvider und LabelProvider registriert. Die Referenzanzeige verwendet den tl:ResourceProvider, die Titel-Anzeige im Kontext-Menü und die Namens-Anzeige im Tooltip verwendet hingegen den LabelProvider.
Das Problem tritt folgendermaßen auf: Nach dem Neustart der Anwendung sind die Caches des LabelProviderService insoweit leer, dass nur die direkt konfigurierten Abbildungen Typ->LabelProvider eingetragen sind. Damit das Problem auftritt, muss das erste Fachobjekt, für das ein Label angefragt wird, ein Neu-Object einer Grid sein.
Ein Grid-New-Object wird betrachtet wie ein (transientes) Fachobjekt, das aber sehr wohl einen Modell-Typ hat (den Typ, der gerade instanziiert wird). In diesem Fall ist der Typ des Grid-New-Objects der gerade neu angelegte Modelltyp 'A' (siehe Testfallbeschreibung). Für diesen Modell-Typ ist kein konfigurierter Label-Provider hinterlegt. Daher fällt die Suche nach einem Label-Provider auf die Java-Klassenhierarchie zurück. Aber auch dort wird kein Label-Provider gefunden, da nur für com.top_logic.knowledge.wrap.AbstractWrapper ein Label-Provider hinterleget ist, das Grid-New-Object aber nicht von AbtractWrapper ableitet. Daher wird der DefaultLabelProvider gefunden und anschließend im Cache für den neu angelegeten Modelltyp registriert. Wenn danach ein echtes Objekt vom Typ A` gerendert werden soll, wird im Cache der `DefaultLabelProvider gefunden. Wenn zuerst ein LabelProvider für ein echtes A`-Objekt angefragt worden wäre, dann wäre über die Java-Klassenhierarchie der für `AbstractWrapper registrierte LabelProvider "com.top_logic.knowledge.gui.WrapperResourceProvider" gefunden worden.
Test
Achtung: Das Problem tritt nur auf, wenn man sich exakt an die Reihenfolge hält:
- Neu App anlegen.
- Neuen Typ A definieren.
- Dem Typ ein Namens-Attribut name geben.
- In die Instanzen-Sicht für A wechseln.
- Neue Zeile in der Grid anlegen, nicht speichern oder übernehmen.
- Kontext-Menü für die neue Zeile anzeigen.
- Werte füllen und speichern.
- Demo Typ eine Referenz auf sich selbst geben.
- Zwei Instanzen a1 und a2 von A anlegen.
- a1 auf a2 verweisen lassen.
- Tooltip des Referenzwertes anzeigen lassen.