enhancement
major
minor
defect
critical
major
minor
major
#30231
HtmlResKey: Wert auch als Attribut einlesen (Format ergänzen)
Problem
Seit #28694 ist die Beschreibung von Modellteilen und Skript-Parametern (InternationalizedDescription.getDescription()) vom Typ HtmlResKey statt ResKey. ResKey hatte ein @Format(ResKey.ValueFormat.class) und ein @Binding. Der Wert ließ sich damit als Attribut oder als Element schreiben. HtmlResKey hat nur ein @Binding(DefaultHtmlResKey.ValueBinding.class) und kein @Format.
Konfigurationen, die vor #28694 gespeichert wurden und die Beschreibung als Attribut enthalten, lassen sich deshalb nicht mehr einlesen. Das gilt z. B. für ein leeres description="" an einem Parameter einer konfigurierten TL-Script-Funktion. Die Anwendung startet dann nicht:
ERROR com.top_logic.basic.config.ApplicationConfig - Inline configuration for property 'description' (com.top_logic.model.search.configured.ScriptParameter.getDescription()) without specified format at file:///tl/autoconf/com.top_logic.model.search.configured.ConfiguredTLScriptFunctions.config.xml line 4084 column 10.
Beispiel:
{{{#!xml <parameter name="param"
description=""
mandatory="true"
type="my.module:MyType"
/> }}}
Der ConfigurationReader findet für das Attribut keinen Value-Provider und meldet in errorNoFormat() einen Fehler.
Die Aussage im Migrationsabschnitt von #28694, dass keine Datenmigration erforderlich sei, gilt damit nur für Beschreibungen in Element-Form.
Lösung
HtmlResKey bekommt zusätzlich ein @Format, etwa DefaultHtmlResKey.ValueFormat. Es delegiert an ResKey.ValueFormat und verpackt das Ergebnis in einen DefaultHtmlResKey:
- Ein leerer Attributwert ergibt null, wie bisher bei ResKey (AbstractConfigurationValueProvider).
- Ein nicht leerer Wert wird wie bei ResKey als Schlüssel decodiert und in einen DefaultHtmlResKey gekapselt.
- Beim Schreiben verhält sich HtmlResKey wieder wie ResKey vor #28694: Ein einfacher Schlüssel wird als Attribut geschrieben (description="some.key"). isLegalValue() lehnt Literale ab, wie ResKey.ValueFormat. Übersetzte Texte werden deshalb weiterhin über das Binding als Element mit <en>/`<de>` gespeichert. Beim Lesen werden beide Formen akzeptiert.
Damit sind alte Konfigurationen wieder lesbar, ohne dass eine Migration nötig ist.
Test
TestHtmlResKeyFormat prüft das Format an einer Test-Konfiguration mit einer HtmlResKey-Eigenschaft:
- Lesen von content="", content="some.key", eines Schlüssels als Element und von Übersetzungen als Element.
- Round-Trip (Schreiben, dann Lesen) für Übersetzungen (werden nicht als Attribut geschrieben), einen einfachen Schlüssel und null.