enhancement
major
minor
defect
critical
major
minor
minor
#30085
Vorgabewerte <country value="..."/> und <time-zone value="..."/> (CountryDefaultProvider, TimeZoneDefaultProvider) nicht nutzbar
Beschreibung
Der Vorgabewert <country value="DE"/> für ein Attribut vom Typ tl.util:Country lässt sich nicht verwenden. Das Modell lädt nicht, die Anwendung startet nicht. Dasselbe gilt für den Vorgabewert <time-zone value="Europe/Berlin"/> für ein Attribut vom Typ tl.util:TimeZone.
Betroffen: TopLogic 8.0.0-alpha12, unverändert auf dem aktuellen master (letzte Änderung der Klasse in f8206c98a8, 2023-12-14).
Reproduktion
{{{#!xml <property name="country" type="tl.util:Country"> <annotations> <default-value> <country value="DE"/> </default-value> </annotations> </property> }}}
Fehler beim Start
Invalid value 'DE' for property 'value' (com.top_logic.model.provider.BooleanDefaultProvider$Config.getValue()) at file:///WEB-INF/model/....model.xml ... Configuration value 'DE' for property 'value' is invalid: Boolean value (true or false) expected. ... Caused by: com.top_logic.basic.module.ModuleException: Unable to start implementation 'com.top_logic.element.model.DynamicModelService@...'.
Ursache
com.top_logic.model.provider.CountryDefaultProvider (Modul com.top_logic):
{{{#!java @TagName("country") public interface Config extends ConfiguredConstantDefaultProvider.Config<BooleanDefaultProvider> { @Override Country getValue(); } }}}
Der Typparameter ist BooleanDefaultProvider statt CountryDefaultProvider (vermutlich von BooleanDefaultProvider.Config kopiert). Dadurch wird die Konfiguration als die des BooleanDefaultProvider behandelt und value als Boolean gelesen.
Die Prüfung der übrigen Unterklassen von ConfiguredConstantDefaultProvider zeigt denselben Kopierfehler in TimeZoneDefaultProvider (<time-zone>). Alle anderen (Boolean, Byte, Short, Integer, Long, Float, Double, String, Date, Icon, Color) sind korrekt.
Workaround
Für ein Vorgabeland gleich dem Land der Standard-Locale:
{{{#!xml <default-value> <provider class="com.top_logic.model.provider.DefaultCountryDefault"/> </default-value> }}}
Ein beliebiges festes Land lässt sich damit nicht angeben.
Lösung
Die Konfigurationen von CountryDefaultProvider und TimeZoneDefaultProvider nennen ihre eigene Klasse als Typparameter:
{{{#!java public interface Config extends ConfiguredConstantDefaultProvider.Config<CountryDefaultProvider> { public interface Config extends ConfiguredConstantDefaultProvider.Config<TimeZoneDefaultProvider> { }}}
Damit sind <country value="DE"/> und <time-zone value="Europe/Berlin"/> als Vorgabewert eines Attributs verwendbar.
Test
- test.com.top_logic.model.provider.TestConfiguredConstantDefaultProvider (Modul com.top_logic) liest die Annotation <default-value> mit <country>, <time-zone> und <string>, erzeugt den Provider und prüft dessen Klasse und Vorgabewert.