From 2b4b867d7037d8db913447b2a995bb6cb6d5dcd3 Mon Sep 17 00:00:00 2001 From: f43nd1r Date: Fri, 23 Apr 2021 15:10:51 +0200 Subject: [PATCH] synchronize parameter name cache access. Ref #246 --- .../faendir/acra/navigation/ParameterUIListener.kt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/acrarium/src/main/kotlin/com/faendir/acra/navigation/ParameterUIListener.kt b/acrarium/src/main/kotlin/com/faendir/acra/navigation/ParameterUIListener.kt index 72dd65e1..d20dee26 100644 --- a/acrarium/src/main/kotlin/com/faendir/acra/navigation/ParameterUIListener.kt +++ b/acrarium/src/main/kotlin/com/faendir/acra/navigation/ParameterUIListener.kt @@ -1,6 +1,7 @@ package com.faendir.acra.navigation import com.faendir.acra.service.DataService +import com.faendir.acra.util.catching import com.vaadin.flow.server.UIInitEvent import com.vaadin.flow.server.UIInitListener import org.springframework.context.support.GenericApplicationContext @@ -11,13 +12,15 @@ import kotlin.reflect.full.createInstance @Component class ParameterUIListener(private val applicationContext: GenericApplicationContext, private val dataService: DataService) : UIInitListener { + private val nameCache = mutableSetOf() override fun uiInit(uiInitEvent: UIInitEvent) { - val nameCache = mutableListOf() uiInitEvent.ui.addBeforeEnterListener { event -> event.routeParameters.parameterNames.forEach { val annotation = AnnotationUtils.findAnnotation(event.navigationTarget, ParseParameter::class.java) val parameter = event.routeParameters.get(it).orElseThrow() - nameCache.add(it) + synchronized(nameCache) { + nameCache.add(it) + } if (annotation != null) { registerParsedParameter(annotation.value.createInstance(), it, parameter) } else { @@ -26,8 +29,10 @@ class ParameterUIListener(private val applicationContext: GenericApplicationCont } } uiInitEvent.ui.addAfterNavigationListener { - nameCache.forEach { applicationContext.removeBeanDefinition(it) } - nameCache.clear() + synchronized(nameCache) { + nameCache.forEach { catching { applicationContext.removeBeanDefinition(it) } } + nameCache.clear() + } } }