defect
When you introduce a new singleton, the following is suggested as a data migration:
<add-annotations name="my.module">
<annotations>
<singletons>
<singleton name="MY_OBJECT"
type="MyObject"
/>
</singletons>
</annotations>
</add-annotations>
<create-singleton name="MY_OBJECT"
module="my.module"
>
<singleton
table="GenericObject"
type="my.module:MyObject"
/>
</create-singleton>
However, when you run these, the application fails to start and throws the following exception:
java.lang.RuntimeException: com.top_logic.basic.module.ModuleException: Unable to start implementation 'com.top_logic.element.model.DynamicModelService@7aa32b52'.
at com.top_logic.util.AbstractStartStopListener.contextInitialized(AbstractStartStopListener.java:245)
at ...
Caused by: com.top_logic.basic.module.ModuleException: Unable to start implementation 'com.top_logic.element.model.DynamicModelService@7aa32b52'.
at com.top_logic.basic.module.BasicRuntimeModule.startUpImplementation(BasicRuntimeModule.java:199)
at com.top_logic.basic.module.BasicRuntimeModule.startUp(BasicRuntimeModule.java:179)
at com.top_logic.basic.module.BasicRuntimeModule.startUp(BasicRuntimeModule.java:152)
at com.top_logic.basic.module.ModuleUtil.start(ModuleUtil.java:263)
at com.top_logic.basic.module.ModuleUtil.startModuleAndAdd(ModuleUtil.java:768)
at com.top_logic.basic.module.ModuleUtil$3.run(ModuleUtil.java:744)
at com.top_logic.basic.module.ModuleUtil$3.run(ModuleUtil.java:1)
at com.top_logic.basic.thread.ThreadContextManager.inInteractionInternal(ThreadContextManager.java:404)
at com.top_logic.basic.thread.ThreadContextManager.inSystemInteractionInternal(ThreadContextManager.java:446)
at com.top_logic.basic.thread.ThreadContextManager.inSystemInteraction(ThreadContextManager.java:438)
at com.top_logic.basic.module.ModuleUtil.startInThreadContext(ModuleUtil.java:753)
at com.top_logic.basic.module.ModuleUtil.startModulesAndAdd(ModuleUtil.java:717)
at com.top_logic.basic.module.ModuleUtil.startUp(ModuleUtil.java:243)
at com.top_logic.util.AbstractStartStopListener.startTokenSystem(AbstractStartStopListener.java:552)
at com.top_logic.util.AbstractStartStopListener$2.run(AbstractStartStopListener.java:260)
at com.top_logic.util.AbstractStartStopListener$2.run(AbstractStartStopListener.java:1)
at com.top_logic.basic.thread.ThreadContextManager.inInteractionInternal(ThreadContextManager.java:385)
at com.top_logic.basic.thread.ThreadContextManager.inSystemInteractionInternal(ThreadContextManager.java:446)
at com.top_logic.basic.thread.ThreadContextManager.inSystemInteraction(ThreadContextManager.java:438)
at com.top_logic.basic.thread.ThreadContext.inSystemContext(ThreadContext.java:157)
at com.top_logic.util.AbstractStartStopListener.boot(AbstractStartStopListener.java:252)
at com.top_logic.util.AbstractStartStopListener.contextInitialized(AbstractStartStopListener.java:206)
... 24 more
Caused by: java.lang.IllegalStateException: Cannot parse old model configuration; schema upgrade not possible.
at com.top_logic.element.model.DynamicModelService.upgradeModel(DynamicModelService.java:422)
at com.top_logic.element.model.DynamicModelService.setupModel(DynamicModelService.java:345)
at com.top_logic.element.model.DynamicModelService.startUpInContext(DynamicModelService.java:320)
at com.top_logic.util.model.ModelService$1.inContext(ModelService.java:224)
at com.top_logic.basic.thread.ThreadContextManager.inInteractionInternal(ThreadContextManager.java:322)
at com.top_logic.basic.thread.ThreadContextManager.inSystemInteractionInternal(ThreadContextManager.java:348)
at com.top_logic.basic.thread.ThreadContextManager.inSystemInteraction(ThreadContextManager.java:341)
at com.top_logic.basic.thread.ThreadContext.inSystemContext(ThreadContext.java:176)
at com.top_logic.util.model.ModelService.startUp(ModelService.java:220)
at com.top_logic.basic.module.ManagedClass.doStart(ManagedClass.java:123)
at com.top_logic.basic.module.BasicRuntimeModule.startUpImplementation(BasicRuntimeModule.java:197)
... 45 more
Caused by: com.top_logic.basic.config.ConfigurationException: "Errors in context: Invalid indexed property entry for property 'name' (com.top_logic.element.config.SingletonConfig.getName()) at [no name] line 71 column 3695: Multiple entries with key: MY_OBJECT"
at com.top_logic.basic.config.InstantiationContextImpl.toConfigurationException(InstantiationContextImpl.java:94)
at com.top_logic.basic.config.InstantiationContextImpl.checkErrors(InstantiationContextImpl.java:54)
at com.top_logic.basic.config.InstantiationContextAdaptor.checkErrors(InstantiationContextAdaptor.java:60)
at com.top_logic.basic.config.AbstractConfigurationReader.checkSuccess(AbstractConfigurationReader.java:237)
at com.top_logic.basic.config.AbstractConfigurationReader.read(AbstractConfigurationReader.java:228)
at com.top_logic.basic.config.AbstractConfigurationReader.read(AbstractConfigurationReader.java:194)
at com.top_logic.basic.config.TypedConfiguration.readConfig(TypedConfiguration.java:732)
at com.top_logic.basic.config.TypedConfiguration.parse(TypedConfiguration.java:688)
at com.top_logic.basic.config.TypedConfiguration.parse(TypedConfiguration.java:664)
at com.top_logic.element.model.DynamicModelService.parseConfig(DynamicModelService.java:491)
at com.top_logic.element.model.DynamicModelService.loadTransientModel(DynamicModelService.java:481)
at com.top_logic.element.model.DynamicModelService.upgradeModel(DynamicModelService.java:420)
... 55 more
In other words, the migration creates the annotation for the singleton twice. Specifically, the class com.top_logic.element.model.migration.model.CreateTLSingletonProcessor calls MigrationUtils.modifyTLModel(log, connection, tlModel -> addSingletonDefinition(log, tlModel)); on line 152, which it presumably should not be doing.