From 66dabad12639d796cde36060a70b1b8be4ce95ed Mon Sep 17 00:00:00 2001 From: Hauke Hund Date: Wed, 27 Oct 2021 13:52:57 +0200 Subject: [PATCH] Implements #261 by adding a default method to ProcessPluginDefinition The new ProcessPluginDefinition.onProcessesDeployed(ApplicationContext pluginApplicationContext, List activeProcesses) method is called after all processes have been deployed and process FHIR resources have been created/updated. Overriding this Method should allow process plugin implementers to run custom initialization logic (e.g. validating the connection configuration to an external FHIR Server by performing a connection test) after all processes have been deployed and only if a specific process is known to be active. Resolves #261 --- .../dsf/bpe/ProcessPluginDefinition.java | 14 ++++++++ ...ProcessPluginDefinitionAndClassLoader.java | 2 +- .../dsf/bpe/plugin/ProcessPluginProvider.java | 3 ++ .../bpe/plugin/ProcessPluginProviderImpl.java | 35 ++++++++++++++++++- .../config/PostProcessDeployConfig.java | 2 ++ 5 files changed, 54 insertions(+), 2 deletions(-) diff --git a/dsf-bpe/dsf-bpe-process-base/src/main/java/org/highmed/dsf/bpe/ProcessPluginDefinition.java b/dsf-bpe/dsf-bpe-process-base/src/main/java/org/highmed/dsf/bpe/ProcessPluginDefinition.java index 629aee382..eb99f591f 100644 --- a/dsf-bpe/dsf-bpe-process-base/src/main/java/org/highmed/dsf/bpe/ProcessPluginDefinition.java +++ b/dsf-bpe/dsf-bpe-process-base/src/main/java/org/highmed/dsf/bpe/ProcessPluginDefinition.java @@ -7,6 +7,7 @@ import org.camunda.bpm.engine.impl.variable.serializer.TypedValueSerializer; import org.highmed.dsf.fhir.resources.ResourceProvider; +import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.PropertyResolver; @@ -83,4 +84,17 @@ default List getDependencyNamesAndVersions() { return Collections.emptyList(); } + + /** + * Override this method to implement custom logic after a process has been deployed and is active, e.g. test the + * connection to an external server needed by a process. + * + * @param pluginApplicationContext + * the process plugin spring application context, never null + * @param activeProcesses + * active processes from this plugin by process key + */ + default void onProcessesDeployed(ApplicationContext pluginApplicationContext, List activeProcesses) + { + } } diff --git a/dsf-bpe/dsf-bpe-server/src/main/java/org/highmed/dsf/bpe/plugin/ProcessPluginDefinitionAndClassLoader.java b/dsf-bpe/dsf-bpe-server/src/main/java/org/highmed/dsf/bpe/plugin/ProcessPluginDefinitionAndClassLoader.java index 5cb8701d7..a2a316c21 100644 --- a/dsf-bpe/dsf-bpe-server/src/main/java/org/highmed/dsf/bpe/plugin/ProcessPluginDefinitionAndClassLoader.java +++ b/dsf-bpe/dsf-bpe-server/src/main/java/org/highmed/dsf/bpe/plugin/ProcessPluginDefinitionAndClassLoader.java @@ -64,7 +64,7 @@ public ClassLoader getClassLoader() return classLoader; } - public ApplicationContext createPluginApplicationContext(ApplicationContext mainContext) + public ApplicationContext getPluginApplicationContext(ApplicationContext mainContext) { if (context == null) { diff --git a/dsf-bpe/dsf-bpe-server/src/main/java/org/highmed/dsf/bpe/plugin/ProcessPluginProvider.java b/dsf-bpe/dsf-bpe-server/src/main/java/org/highmed/dsf/bpe/plugin/ProcessPluginProvider.java index 9277688d5..342d7b167 100644 --- a/dsf-bpe/dsf-bpe-server/src/main/java/org/highmed/dsf/bpe/plugin/ProcessPluginProvider.java +++ b/dsf-bpe/dsf-bpe-server/src/main/java/org/highmed/dsf/bpe/plugin/ProcessPluginProvider.java @@ -4,6 +4,7 @@ import java.util.Map; import org.highmed.dsf.bpe.process.ProcessKeyAndVersion; +import org.highmed.dsf.bpe.process.ProcessStateChangeOutcome; import org.highmed.dsf.fhir.resources.ResourceProvider; import org.springframework.context.ApplicationContext; @@ -53,4 +54,6 @@ public interface ProcessPluginProvider List getProcessKeyAndVersions(); List getDraftProcessKeyAndVersions(); + + void onProcessesDeployed(List changes); } diff --git a/dsf-bpe/dsf-bpe-server/src/main/java/org/highmed/dsf/bpe/plugin/ProcessPluginProviderImpl.java b/dsf-bpe/dsf-bpe-server/src/main/java/org/highmed/dsf/bpe/plugin/ProcessPluginProviderImpl.java index 06d9a9cc8..883df4f01 100644 --- a/dsf-bpe/dsf-bpe-server/src/main/java/org/highmed/dsf/bpe/plugin/ProcessPluginProviderImpl.java +++ b/dsf-bpe/dsf-bpe-server/src/main/java/org/highmed/dsf/bpe/plugin/ProcessPluginProviderImpl.java @@ -9,12 +9,15 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Collections; +import java.util.EnumSet; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.ServiceLoader; import java.util.ServiceLoader.Provider; +import java.util.Set; import java.util.function.BinaryOperator; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -23,6 +26,8 @@ import org.highmed.dsf.bpe.ProcessPluginDefinition; import org.highmed.dsf.bpe.process.ProcessKeyAndVersion; +import org.highmed.dsf.bpe.process.ProcessState; +import org.highmed.dsf.bpe.process.ProcessStateChangeOutcome; import org.highmed.dsf.fhir.resources.ResourceProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -333,7 +338,7 @@ private BinaryOperator dupplicatedProcessKeyVersion() public Map getApplicationContextsByProcessDefinitionKeyAndVersion() { return getDefinitions().stream().flatMap(def -> def.getProcessKeysAndVersions().stream().map( - keyAndVersion -> new Pair<>(keyAndVersion, def.createPluginApplicationContext(mainApplicationContext)))) + keyAndVersion -> new Pair<>(keyAndVersion, def.getPluginApplicationContext(mainApplicationContext)))) .collect(Collectors.toMap(p -> p.k, p -> p.v, dupplicatedProcessKeyVersion())); } @@ -365,4 +370,32 @@ public List getDraftProcessKeyAndVersions() return getDefinitions().stream().filter(ProcessPluginDefinitionAndClassLoader::isDraft) .flatMap(def -> def.getProcessKeysAndVersions().stream()).collect(Collectors.toList()); } + + @Override + public void onProcessesDeployed(List changes) + { + Set activeProcesses = changes.stream() + .filter(c -> EnumSet.of(ProcessState.ACTIVE, ProcessState.DRAFT).contains(c.getNewProcessState())) + .map(ProcessStateChangeOutcome::getProcessKeyAndVersion).collect(Collectors.toCollection(HashSet::new)); + + for (ProcessPluginDefinitionAndClassLoader definition : getDefinitions()) + { + List pluginActiveProcesses = definition.getProcessKeysAndVersions().stream() + .filter(activeProcesses::contains).map(ProcessKeyAndVersion::getKey).sorted() + .collect(Collectors.toList()); + + ApplicationContext pluginApplicationContext = definition + .getPluginApplicationContext(mainApplicationContext); + + try + { + definition.getDefinition().onProcessesDeployed(pluginApplicationContext, pluginActiveProcesses); + } + catch (Exception e) + { + logger.warn("Error while executing onProcessesDeployed for plugin " + + definition.getDefinition().getNameAndVersion(), e); + } + } + } } diff --git a/dsf-bpe/dsf-bpe-server/src/main/java/org/highmed/dsf/bpe/spring/config/PostProcessDeployConfig.java b/dsf-bpe/dsf-bpe-server/src/main/java/org/highmed/dsf/bpe/spring/config/PostProcessDeployConfig.java index 1bb3c1f0c..8e5166c8b 100644 --- a/dsf-bpe/dsf-bpe-server/src/main/java/org/highmed/dsf/bpe/spring/config/PostProcessDeployConfig.java +++ b/dsf-bpe/dsf-bpe-server/src/main/java/org/highmed/dsf/bpe/spring/config/PostProcessDeployConfig.java @@ -55,6 +55,8 @@ public void onContextRefreshedEvent(ContextRefreshedEvent event) fhirResourceHandler().applyStateChangesAndStoreNewResourcesInDb( processPluginProvider.getDefinitionByProcessKeyAndVersion(), changes); + + processPluginProvider.onProcessesDeployed(changes); } @Bean