From b5351ae237892e051824fec52008290edefb6b0e Mon Sep 17 00:00:00 2001 From: "justin.mckelvy" Date: Fri, 9 Jun 2023 16:24:08 -0600 Subject: [PATCH] add cr operation loader --- .../jpa/starter/common/StarterJpaConfig.java | 2 +- .../jpa/starter/cr/CrProviderFactory.java | 93 +++++++++++++++++++ .../fhir/jpa/starter/cr/CrProviderLoader.java | 56 +++++++++++ .../jpa/starter/cr/StarterCrR4Config.java | 4 + 4 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ca/uhn/fhir/jpa/starter/cr/CrProviderFactory.java create mode 100644 src/main/java/ca/uhn/fhir/jpa/starter/cr/CrProviderLoader.java diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/common/StarterJpaConfig.java b/src/main/java/ca/uhn/fhir/jpa/starter/common/StarterJpaConfig.java index 27ed0ed..506530b 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/common/StarterJpaConfig.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/common/StarterJpaConfig.java @@ -9,7 +9,6 @@ import ca.uhn.fhir.context.ConfigurationException; import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.context.support.IValidationSupport; -import ca.uhn.fhir.cr.config.CrProviderLoader; import ca.uhn.fhir.interceptor.api.IInterceptorBroadcaster; import ca.uhn.fhir.jpa.api.IDaoRegistry; import ca.uhn.fhir.jpa.api.config.JpaStorageSettings; @@ -43,6 +42,7 @@ import ca.uhn.fhir.jpa.starter.AppProperties; import ca.uhn.fhir.jpa.starter.annotations.OnCorsPresent; import ca.uhn.fhir.jpa.starter.annotations.OnImplementationGuidesPresent; import ca.uhn.fhir.jpa.starter.common.validation.IRepositoryValidationInterceptorFactory; +import ca.uhn.fhir.jpa.starter.cr.CrProviderLoader; import ca.uhn.fhir.jpa.starter.util.EnvironmentHelper; import ca.uhn.fhir.jpa.subscription.util.SubscriptionDebugLogInterceptor; import ca.uhn.fhir.jpa.util.ResourceCountCache; diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/cr/CrProviderFactory.java b/src/main/java/ca/uhn/fhir/jpa/starter/cr/CrProviderFactory.java new file mode 100644 index 0000000..59b4680 --- /dev/null +++ b/src/main/java/ca/uhn/fhir/jpa/starter/cr/CrProviderFactory.java @@ -0,0 +1,93 @@ +package ca.uhn.fhir.jpa.starter.cr; + +import ca.uhn.fhir.context.ConfigurationException; +import ca.uhn.fhir.context.FhirContext; +import ca.uhn.fhir.cr.dstu3.measure.MeasureOperationsProvider; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Service; + +/** + * This class represents clinical reasoning provider factory used for loading cql and measure operation dependencies of various fhir models + **/ +@Primary +@Service +public class CrProviderFactory { + @Autowired + private FhirContext myFhirContext; + + @Autowired + private ApplicationContext myApplicationContext; + + public Object getMeasureOperationsProvider() { + switch (myFhirContext.getVersion().getVersion()) { + case DSTU3: + return myApplicationContext.getBean(MeasureOperationsProvider.class); + case R4: + return myApplicationContext.getBean(ca.uhn.fhir.cr.r4.measure.MeasureOperationsProvider.class); + default: + throw new ConfigurationException("EvaluateMeasure is not supported for FHIR version " + myFhirContext.getVersion().getVersion()); + } + } + public Object getActivityDefinitionOperationProvider() { + switch (myFhirContext.getVersion().getVersion()) { + case DSTU3: + return myApplicationContext.getBean(ca.uhn.fhir.cr.dstu3.activitydefinition.ActivityDefinitionOperationsProvider.class); + case R4: + return myApplicationContext.getBean(ca.uhn.fhir.cr.r4.activitydefinition.ActivityDefinitionOperationsProvider.class); + default: + throw new ConfigurationException("ActivityDefinition is not supported for FHIR version " + myFhirContext.getVersion().getVersion()); + } + } + public Object getPlanDefinitionOperationProvider() { + switch (myFhirContext.getVersion().getVersion()) { + case DSTU3: + return myApplicationContext.getBean(ca.uhn.fhir.cr.dstu3.plandefinition.PlanDefinitionOperationsProvider.class); + case R4: + return myApplicationContext.getBean(ca.uhn.fhir.cr.r4.plandefinition.PlanDefinitionOperationsProvider.class); + default: + throw new ConfigurationException("PlanDefinition is not supported for FHIR version " + myFhirContext.getVersion().getVersion()); + } + } + + public Object getCareGapsOperationProvider() { + switch (myFhirContext.getVersion().getVersion()) { + case R4: + return myApplicationContext.getBean(ca.uhn.fhir.cr.r4.measure.CareGapsOperationProvider.class); + default: + throw new ConfigurationException("Caregaps is not supported for FHIR version " + myFhirContext.getVersion().getVersion()); + } + } + + public Object getSubmitDataOperationProvider() { + switch (myFhirContext.getVersion().getVersion()) { + case R4: + return myApplicationContext.getBean(ca.uhn.fhir.cr.r4.measure.SubmitDataProvider.class); + default: + throw new ConfigurationException("SubmitData is not supported for FHIR version " + myFhirContext.getVersion().getVersion()); + } + } + + public Object getQuestionnaireOperationProvider() { + switch (myFhirContext.getVersion().getVersion()) { + case DSTU3: + return myApplicationContext.getBean(ca.uhn.fhir.cr.dstu3.questionnaire.QuestionnaireOperationsProvider.class); + case R4: + return myApplicationContext.getBean(ca.uhn.fhir.cr.r4.questionnaire.QuestionnaireOperationsProvider.class); + default: + throw new ConfigurationException("Questionnaire is not supported for FHIR version " + myFhirContext.getVersion().getVersion()); + } + } + public Object getQuestionnaireResponseOperationProvider() { + switch (myFhirContext.getVersion().getVersion()) { + case DSTU3: + return myApplicationContext.getBean(ca.uhn.fhir.cr.dstu3.questionnaireresponse.QuestionnaireResponseOperationsProvider.class); + case R4: + return myApplicationContext.getBean(ca.uhn.fhir.cr.r4.questionnaireresponse.QuestionnaireResponseOperationsProvider.class); + default: + throw new ConfigurationException("Questionnaire Response is not supported for FHIR version " + myFhirContext.getVersion().getVersion()); + } + } +} + diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/cr/CrProviderLoader.java b/src/main/java/ca/uhn/fhir/jpa/starter/cr/CrProviderLoader.java new file mode 100644 index 0000000..e829e85 --- /dev/null +++ b/src/main/java/ca/uhn/fhir/jpa/starter/cr/CrProviderLoader.java @@ -0,0 +1,56 @@ +package ca.uhn.fhir.jpa.starter.cr; + +import ca.uhn.fhir.context.ConfigurationException; +import ca.uhn.fhir.context.FhirContext; + +import ca.uhn.fhir.i18n.Msg; +import ca.uhn.fhir.rest.server.provider.ResourceProviderFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Primary; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Service; + +/** + * This class loads and registers CQL provider factory for clinical reasoning into hapi-fhir central provider factory + **/ +@Primary +@Service +public class CrProviderLoader { + private static final Logger myLogger = LoggerFactory.getLogger(CrProviderLoader.class); + private final FhirContext myFhirContext; + private final ResourceProviderFactory myResourceProviderFactory; + private final CrProviderFactory myCrProviderFactory; + + public CrProviderLoader(FhirContext theFhirContext, ResourceProviderFactory theResourceProviderFactory, CrProviderFactory theCrProviderFactory) { + myFhirContext = theFhirContext; + myResourceProviderFactory = theResourceProviderFactory; + myCrProviderFactory = theCrProviderFactory; + } + + @EventListener(ContextRefreshedEvent.class) + public void loadProvider() { + switch (myFhirContext.getVersion().getVersion()) { + case DSTU3: + myLogger.info("Registering Dstu3 Cr Providers"); + myResourceProviderFactory.addSupplier(() -> myCrProviderFactory.getMeasureOperationsProvider()); + myResourceProviderFactory.addSupplier(() -> myCrProviderFactory.getActivityDefinitionOperationProvider()); + myResourceProviderFactory.addSupplier(() -> myCrProviderFactory.getPlanDefinitionOperationProvider()); + myResourceProviderFactory.addSupplier(() -> myCrProviderFactory.getQuestionnaireOperationProvider()); + myResourceProviderFactory.addSupplier(() -> myCrProviderFactory.getQuestionnaireResponseOperationProvider()); + case R4: + myLogger.info("Registering R4 Cr Providers"); + myResourceProviderFactory.addSupplier(() -> myCrProviderFactory.getMeasureOperationsProvider()); + myResourceProviderFactory.addSupplier(() -> myCrProviderFactory.getActivityDefinitionOperationProvider()); + myResourceProviderFactory.addSupplier(() -> myCrProviderFactory.getPlanDefinitionOperationProvider()); + myResourceProviderFactory.addSupplier(() -> myCrProviderFactory.getCareGapsOperationProvider()); + myResourceProviderFactory.addSupplier(() -> myCrProviderFactory.getSubmitDataOperationProvider()); + myResourceProviderFactory.addSupplier(() -> myCrProviderFactory.getQuestionnaireOperationProvider()); + myResourceProviderFactory.addSupplier(() -> myCrProviderFactory.getQuestionnaireResponseOperationProvider()); + break; + default: + throw new ConfigurationException(Msg.code(1653) + "Cr providers not supported for FHIR version " + myFhirContext.getVersion().getVersion()); + } + } +} \ No newline at end of file diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrR4Config.java b/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrR4Config.java index a97cea7..42a503c 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrR4Config.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrR4Config.java @@ -8,4 +8,8 @@ import org.springframework.context.annotation.Import; @Conditional({OnR4Condition.class, CrConfigCondition.class}) @Import({CrR4Config.class}) public class StarterCrR4Config { + + + + }