enhancement
major
minor
major
minor
major
#29742
Konfigurierte Defaults (<defaults>) wirken nicht innerhalb der Anwendungskonfiguration
Problem
Die Anwendungskonfiguration (*.config.xml, ApplicationConfig) kann im Abschnitt <defaults> Default-Werte für Konfigurations-Interfaces festlegen. So registriert com.top_logic.model.search in modelSearchConf.config.xml die Implementierungen der TL-Script-Funktionstypen, die in com.top_logic deklariert sind:
{{{#!xml <defaults> <config interface="com.top_logic.layout.ScriptFunction1"> <property name="class" value="com.top_logic.model.search.form.ScriptFunction1Impl"/> </config> ... </defaults> }}}
Diese Defaults wirken nur in Konfiguration, die nach dem Start des ApplicationConfig gelesen wird (Layouts, Views). Innerhalb der Anwendungskonfiguration selbst – also in Service-Konfigurationen und <configs> – greifen sie nicht. Eine Property vom Typ ScriptFunction1 lässt sich dort nicht ohne explizite Implementierungsklasse angeben:
{{{#!xml <anonymous-account-disabled> <account expression="contact -> $contact.get(Contacts:PersonContact#account)"/> </anonymous-account-disabled> }}}
scheitert beim Start mit
Configuration descriptor 'com.top_logic.layout.ScriptFunction1' has no property 'expression', valid properties are: [class, configuration-interface]
Als Ausweg muss die Implementierung explizit genannt werden (<account class="com.top_logic.model.search.form.ScriptFunction1Impl" expression="..."/>). Das macht die per <defaults> erreichte Abhängigkeitsumkehr an genau dieser Stelle zunichte.
Ursache
ApplicationConfig.Module#loadConfig liest alle Konfigurationsdateien in einem Durchgang – den Abschnitt <defaults> zusammen mit <services> und <configs>. Angewendet werden die Defaults erst in ApplicationConfig#startUp() über ConfigDescriptionResolver.adaptConfiguredDefaults(...), also nachdem die Service-Konfigurationen bereits gegen die unveränderten Deskriptoren geparst wurden.
Lösungsvorschlag
ApplicationConfig.Module#loadConfig liest und wendet zunächst nur die <defaults>-Abschnitte aller Konfigurationsdateien an (z.B. über einen gefilterten StAX-Reader, der nur die <defaults>-Teilbäume an den ConfigurationReader weitergibt) und liest danach die vollständige Konfiguration. Damit gelten konfigurierte Defaults auch in Service-Konfigurationen.
Aufräumen nach dem Fix
Die explizite Implementierungsklasse ScriptFunction1Impl am account der CommandApprovalService-Prüfung für Contacts:PersonContact in com.top_logic.contact/src/main/webapp/WEB-INF/conf/contactConf.config.xml (eingeführt mit #29740) entfernen.