From f6380c2d3c134edc8a41712cbde86a6356873bcc Mon Sep 17 00:00:00 2001 From: Mustapha Zorgati <15628173+mustaphazorgati@users.noreply.github.com> Date: Wed, 22 Mar 2023 01:42:15 +0100 Subject: [PATCH] #2181: init PriorityServiceProviders during TaskanaEngine init --- .../TaskanEngineInitalizationTest.java | 66 +++++++++++++++++++ .../common/internal/TaskanaEngineImpl.java | 2 +- .../internal/PriorityServiceManager.java | 4 +- 3 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 lib/taskana-core-test/src/test/java/acceptance/TaskanEngineInitalizationTest.java diff --git a/lib/taskana-core-test/src/test/java/acceptance/TaskanEngineInitalizationTest.java b/lib/taskana-core-test/src/test/java/acceptance/TaskanEngineInitalizationTest.java new file mode 100644 index 000000000..8ddc72262 --- /dev/null +++ b/lib/taskana-core-test/src/test/java/acceptance/TaskanEngineInitalizationTest.java @@ -0,0 +1,66 @@ +package acceptance; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import java.lang.reflect.Field; +import java.util.List; +import java.util.OptionalInt; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestInstance.Lifecycle; +import pro.taskana.common.api.TaskanaEngine; +import pro.taskana.common.internal.TaskanaEngineImpl; +import pro.taskana.spi.priority.api.PriorityServiceProvider; +import pro.taskana.spi.priority.internal.PriorityServiceManager; +import pro.taskana.task.api.models.TaskSummary; +import pro.taskana.testapi.TaskanaInject; +import pro.taskana.testapi.TaskanaIntegrationTest; +import pro.taskana.testapi.WithServiceProvider; + +@TaskanaIntegrationTest +public class TaskanEngineInitalizationTest { + + static class MyPriorityServiceProvider implements PriorityServiceProvider { + + private TaskanaEngine taskanaEngine; + + @Override + public void initialize(TaskanaEngine taskanaEngine) { + this.taskanaEngine = taskanaEngine; + } + + @Override + public OptionalInt calculatePriority(TaskSummary taskSummary) { + return OptionalInt.empty(); + } + } + + @Nested + @TestInstance(Lifecycle.PER_CLASS) + @WithServiceProvider( + serviceProviderInterface = PriorityServiceProvider.class, + serviceProviders = MyPriorityServiceProvider.class) + class PriorityServiceManagerTest { + @TaskanaInject TaskanaEngineImpl taskanaEngine; + + @Test + @SuppressWarnings("unchecked") + void should_InitializePriorityServiceProviders() throws Exception { + PriorityServiceManager priorityServiceManager = taskanaEngine.getPriorityServiceManager(); + Field priorityServiceProvidersField = + PriorityServiceManager.class.getDeclaredField("priorityServiceProviders"); + priorityServiceProvidersField.setAccessible(true); + List serviceProviders = + (List) priorityServiceProvidersField.get(priorityServiceManager); + + assertThat(priorityServiceManager.isEnabled()).isTrue(); + assertThat(serviceProviders) + .asList() + .hasOnlyElementsOfType(MyPriorityServiceProvider.class) + .extracting(MyPriorityServiceProvider.class::cast) + .extracting(sp -> sp.taskanaEngine) + .containsOnly(taskanaEngine); + } + } +} diff --git a/lib/taskana-core/src/main/java/pro/taskana/common/internal/TaskanaEngineImpl.java b/lib/taskana-core/src/main/java/pro/taskana/common/internal/TaskanaEngineImpl.java index e064f67d8..0220d5036 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/common/internal/TaskanaEngineImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/common/internal/TaskanaEngineImpl.java @@ -159,8 +159,8 @@ public class TaskanaEngineImpl implements TaskanaEngine { // IMPORTANT: SPI has to be initialized last (and in this order) in order // to provide a fully initialized TaskanaEngine instance during the SPI initialization! - priorityServiceManager = new PriorityServiceManager(); createTaskPreprocessorManager = new CreateTaskPreprocessorManager(); + priorityServiceManager = new PriorityServiceManager(this); historyEventManager = new HistoryEventManager(this); taskRoutingManager = new TaskRoutingManager(this); reviewRequiredManager = new ReviewRequiredManager(this); diff --git a/lib/taskana-core/src/main/java/pro/taskana/spi/priority/internal/PriorityServiceManager.java b/lib/taskana-core/src/main/java/pro/taskana/spi/priority/internal/PriorityServiceManager.java index 949e8114d..3807902a5 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/spi/priority/internal/PriorityServiceManager.java +++ b/lib/taskana-core/src/main/java/pro/taskana/spi/priority/internal/PriorityServiceManager.java @@ -8,6 +8,7 @@ import java.util.Set; import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.internal.util.LogSanitizer; import pro.taskana.common.internal.util.SpiLoader; import pro.taskana.spi.priority.api.PriorityServiceProvider; @@ -18,9 +19,10 @@ public class PriorityServiceManager { private static final Logger LOGGER = LoggerFactory.getLogger(PriorityServiceManager.class); private final List priorityServiceProviders; - public PriorityServiceManager() { + public PriorityServiceManager(TaskanaEngine taskanaEngine) { priorityServiceProviders = SpiLoader.load(PriorityServiceProvider.class); for (PriorityServiceProvider priorityProvider : priorityServiceProviders) { + priorityProvider.initialize(taskanaEngine); LOGGER.info("Registered PriorityServiceProvider: {}", priorityProvider.getClass().getName()); } if (priorityServiceProviders.isEmpty()) {