Major
Detail
Detail
#27027
Declarative forms: SelectField disappears after upload if option list depends on mandatory property
#27042
MaintenanceJspBase should write to the log first, then to the client, instead of the other way around.
Bugfix
Detail
#26992
Asynchronous loading of layouts for themes crashes short-running test cases
Running a test case one at a time, e.g. /com.top_logic.bpe.app/src/test/java/test/com/top_logic/bpe/app/scripted/formeditor/TestForeignObjects.script.xml, runs green, but the shutdown crashes because errors are logged:
junit.framework.AssertionFailedError: Errors (2) logged during startup: com.top_logic.gui.ThemeFactory module not started. com.top_logic.basic.thread.ThreadContextManager module not started. at test.com.top_logic.layout.scripting.ApplicationTestSetup.basicRun(ApplicationTestSetup.java:89) at test.com.top_logic.basic.NamedTestSetup$1.protect(NamedTestSetup.java:35) at junit.framework.TestResult.runProtected(TestResult.java:124) at test.com.top_logic.basic.NamedTestSetup.run(NamedTestSetup.java:39) at test.com.top_logic.basic.NamedTestDecorator.basicRun(NamedTestDecorator.java:40) at test.com.top_logic.basic.NamedTestSetup$1.protect(NamedTestSetup.java:35) ... at junit.framework.TestResult.runProtected(TestResult.java:124) at test.com.top_logic.basic.NamedTestSetup.run(NamedTestSetup.java:39) at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24) at junit.extensions.TestSetup$1.protect(TestSetup.java:21) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.extensions.TestSetup.run(TestSetup.java:25) at test.com.top_logic.basic.LoggingTestSetup.run(LoggingTestSetup.java:207) .. Caused by: java.lang.IllegalStateException: com.top_logic.gui.ThemeFactory module not started. at com.top_logic.basic.module.ModuleUtil.invalidStateNotStarted(ModuleUtil.java:1035) at com.top_logic.basic.module.BasicRuntimeModule.getImplementationInstance(BasicRuntimeModule.java:90) at com.top_logic.gui.ThemeFactory.getInstance(ThemeFactory.java:90) at com.top_logic.gui.ThemeFactory.getTheme(ThemeFactory.java:81) at com.top_logic.layout.processor.LayoutResolver.newRuntimeResolver(LayoutResolver.java:339) at com.top_logic.layout.editor.DynamicComponentDefinition.createLayoutResolver(DynamicComponentDefinition.java:261) at com.top_logic.layout.editor.DynamicComponentDefinition.createTemplateBody(DynamicComponentDefinition.java:253) at com.top_logic.layout.editor.DynamicComponentDefinition.createComponentConfig(DynamicComponentDefinition.java:330) at com.top_logic.layout.editor.LayoutTemplateUtils.createUnqualifiedComponentConfig(LayoutTemplateUtils.java:162) at com.top_logic.layout.editor.LayoutTemplateUtils.getInstantiatedLayoutTemplate(LayoutTemplateUtils.java:139) at com.top_logic.mig.html.layout.LayoutTemplateCall.createLayoutConfiguration(LayoutTemplateCall.java:43) at com.top_logic.mig.html.layout.LayoutTemplateCall.<init>(LayoutTemplateCall.java:34) at com.top_logic.mig.html.layout.ComponentConfigurationBuilder.createTemplateCallLayout(ComponentConfigurationBuilder.java:303) at com.top_logic.mig.html.layout.ComponentConfigurationBuilder.createLayoutFromTemplate(ComponentConfigurationBuilder.java:187) at com.top_logic.mig.html.layout.ComponentConfigurationBuilder.createLayout(ComponentConfigurationBuilder.java:133) at com.top_logic.mig.html.layout.ComponentConfigurationBuilder.build(ComponentConfigurationBuilder.java:123) at com.top_logic.mig.html.layout.LayoutStorage.createLayout(LayoutStorage.java:503) at com.top_logic.mig.html.layout.LayoutStorage.installLayout(LayoutStorage.java:454) at com.top_logic.mig.html.layout.LayoutStorage.installLayout(LayoutStorage.java:436) at com.top_logic.mig.html.layout.LayoutStorage$1.run(LayoutStorage.java:413) at com.top_logic.mig.html.layout.LayoutStorage$1.run(LayoutStorage.java:1) at com.top_logic.gui.MultiThemeFactory.withTheme(MultiThemeFactory.java:237) at com.top_logic.mig.html.layout.LayoutStorage.fetchAvailableLayouts(LayoutStorage.java:403) at com.top_logic.mig.html.layout.LayoutStorage.loadLayoutsForNonDefaultThemes(LayoutStorage.java:256) at com.top_logic.mig.html.layout.LayoutStorage.lambda$2(LayoutStorage.java:240) at com.top_logic.basic.thread.ThreadContextManager.inInteractionInternal(ThreadContextManager.java:312) at com.top_logic.basic.thread.ThreadContextManager.inSystemInteractionInternal(ThreadContextManager.java:346) at com.top_logic.basic.thread.ThreadContextManager.inSystemInteraction(ThreadContextManager.java:339) at com.top_logic.mig.html.layout.LayoutStorage.lambda$1(LayoutStorage.java:239) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829)
The problem is that the test case shuts down the application again after execution, but there are still threads running in the shutting down application that load said layouts. Although some provision has already been made for this in LayoutStorage, this does not work.
Solution
Do not shut down the layout storage while its layout loading thread is still running.
Test
- No test.