#2181: init PriorityServiceProviders during TaskanaEngine init

This commit is contained in:
Mustapha Zorgati 2023-03-22 01:42:15 +01:00
parent 54bf3d8d69
commit f6380c2d3c
3 changed files with 70 additions and 2 deletions

View File

@ -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<PriorityServiceProvider> serviceProviders =
(List<PriorityServiceProvider>) priorityServiceProvidersField.get(priorityServiceManager);
assertThat(priorityServiceManager.isEnabled()).isTrue();
assertThat(serviceProviders)
.asList()
.hasOnlyElementsOfType(MyPriorityServiceProvider.class)
.extracting(MyPriorityServiceProvider.class::cast)
.extracting(sp -> sp.taskanaEngine)
.containsOnly(taskanaEngine);
}
}
}

View File

@ -159,8 +159,8 @@ public class TaskanaEngineImpl implements TaskanaEngine {
// IMPORTANT: SPI has to be initialized last (and in this order) in order // IMPORTANT: SPI has to be initialized last (and in this order) in order
// to provide a fully initialized TaskanaEngine instance during the SPI initialization! // to provide a fully initialized TaskanaEngine instance during the SPI initialization!
priorityServiceManager = new PriorityServiceManager();
createTaskPreprocessorManager = new CreateTaskPreprocessorManager(); createTaskPreprocessorManager = new CreateTaskPreprocessorManager();
priorityServiceManager = new PriorityServiceManager(this);
historyEventManager = new HistoryEventManager(this); historyEventManager = new HistoryEventManager(this);
taskRoutingManager = new TaskRoutingManager(this); taskRoutingManager = new TaskRoutingManager(this);
reviewRequiredManager = new ReviewRequiredManager(this); reviewRequiredManager = new ReviewRequiredManager(this);

View File

@ -8,6 +8,7 @@ import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.internal.util.LogSanitizer; import pro.taskana.common.internal.util.LogSanitizer;
import pro.taskana.common.internal.util.SpiLoader; import pro.taskana.common.internal.util.SpiLoader;
import pro.taskana.spi.priority.api.PriorityServiceProvider; import pro.taskana.spi.priority.api.PriorityServiceProvider;
@ -18,9 +19,10 @@ public class PriorityServiceManager {
private static final Logger LOGGER = LoggerFactory.getLogger(PriorityServiceManager.class); private static final Logger LOGGER = LoggerFactory.getLogger(PriorityServiceManager.class);
private final List<PriorityServiceProvider> priorityServiceProviders; private final List<PriorityServiceProvider> priorityServiceProviders;
public PriorityServiceManager() { public PriorityServiceManager(TaskanaEngine taskanaEngine) {
priorityServiceProviders = SpiLoader.load(PriorityServiceProvider.class); priorityServiceProviders = SpiLoader.load(PriorityServiceProvider.class);
for (PriorityServiceProvider priorityProvider : priorityServiceProviders) { for (PriorityServiceProvider priorityProvider : priorityServiceProviders) {
priorityProvider.initialize(taskanaEngine);
LOGGER.info("Registered PriorityServiceProvider: {}", priorityProvider.getClass().getName()); LOGGER.info("Registered PriorityServiceProvider: {}", priorityProvider.getClass().getName());
} }
if (priorityServiceProviders.isEmpty()) { if (priorityServiceProviders.isEmpty()) {