diff --git a/pom.xml b/pom.xml
index 905f4c5..231ab69 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,7 +14,7 @@
ca.uhn.hapi.fhir
hapi-fhir
- 6.9.7-SNAPSHOT
+ 6.9.8-SNAPSHOT
hapi-fhir-jpaserver-starter
@@ -132,6 +132,12 @@
hapi-fhir-jpaserver-mdm
${project.version}
+
+
+ ca.uhn.hapi.fhir
+ hapi-fhir-server-cds-hooks
+ ${project.version}
+
ca.uhn.hapi.fhir
diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/Application.java b/src/main/java/ca/uhn/fhir/jpa/starter/Application.java
index 5a33baa..da701fb 100644
--- a/src/main/java/ca/uhn/fhir/jpa/starter/Application.java
+++ b/src/main/java/ca/uhn/fhir/jpa/starter/Application.java
@@ -1,8 +1,12 @@
package ca.uhn.fhir.jpa.starter;
import ca.uhn.fhir.batch2.jobs.config.Batch2JobsConfig;
+import ca.uhn.fhir.cr.common.IRepositoryFactory;
+import ca.uhn.fhir.cr.repo.HapiFhirRepository;
+import ca.uhn.fhir.jpa.api.dao.DaoRegistry;
import ca.uhn.fhir.jpa.batch2.JpaBatch2Config;
import ca.uhn.fhir.jpa.starter.annotations.OnEitherVersion;
+import ca.uhn.fhir.jpa.starter.cdshooks.StarterCdsHooksConfig;
import ca.uhn.fhir.jpa.starter.common.FhirTesterConfig;
import ca.uhn.fhir.jpa.starter.cr.StarterCrDstu3Config;
import ca.uhn.fhir.jpa.starter.cr.StarterCrR4Config;
@@ -33,6 +37,7 @@ import org.springframework.web.servlet.DispatcherServlet;
@Import({
StarterCrR4Config.class,
StarterCrDstu3Config.class,
+ StarterCdsHooksConfig.class,
SubscriptionSubmitterConfig.class,
SubscriptionProcessorConfig.class,
SubscriptionChannelConfig.class,
@@ -90,4 +95,9 @@ public class Application extends SpringBootServletInitializer {
return registrationBean;
}
+
+ @Bean
+ IRepositoryFactory repositoryFactory(DaoRegistry theDaoRegistry, RestfulServer theRestfulServer) {
+ return rd -> new HapiFhirRepository(theDaoRegistry, rd, theRestfulServer);
+ }
}
diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/cr/CrR4Config.java b/src/main/java/ca/uhn/fhir/jpa/starter/cr/CrR4Config.java
new file mode 100644
index 0000000..4713bdb
--- /dev/null
+++ b/src/main/java/ca/uhn/fhir/jpa/starter/cr/CrR4Config.java
@@ -0,0 +1,182 @@
+package ca.uhn.fhir.jpa.starter.cr;
+
+import ca.uhn.fhir.context.FhirContext;
+import ca.uhn.fhir.context.FhirVersionEnum;
+import ca.uhn.fhir.cr.common.IRepositoryFactory;
+import ca.uhn.fhir.cr.config.ProviderLoader;
+import ca.uhn.fhir.cr.config.ProviderSelector;
+import ca.uhn.fhir.cr.r4.IActivityDefinitionProcessorFactory;
+import ca.uhn.fhir.cr.r4.ICareGapsServiceFactory;
+import ca.uhn.fhir.cr.r4.ICqlExecutionServiceFactory;
+import ca.uhn.fhir.cr.r4.IMeasureServiceFactory;
+import ca.uhn.fhir.cr.r4.IPlanDefinitionProcessorFactory;
+import ca.uhn.fhir.cr.r4.IQuestionnaireProcessorFactory;
+import ca.uhn.fhir.cr.r4.IQuestionnaireResponseProcessorFactory;
+import ca.uhn.fhir.cr.r4.ISubmitDataProcessorFactory;
+import ca.uhn.fhir.cr.r4.activitydefinition.ActivityDefinitionApplyProvider;
+import ca.uhn.fhir.cr.r4.cqlexecution.CqlExecutionOperationProvider;
+import ca.uhn.fhir.cr.r4.measure.CareGapsOperationProvider;
+import ca.uhn.fhir.cr.r4.measure.MeasureOperationsProvider;
+import ca.uhn.fhir.cr.r4.measure.MeasureService;
+import ca.uhn.fhir.cr.r4.measure.SubmitDataProvider;
+import ca.uhn.fhir.cr.r4.plandefinition.PlanDefinitionApplyProvider;
+import ca.uhn.fhir.cr.r4.plandefinition.PlanDefinitionPackageProvider;
+import ca.uhn.fhir.cr.r4.questionnaire.QuestionnairePackageProvider;
+import ca.uhn.fhir.cr.r4.questionnaire.QuestionnairePopulateProvider;
+import ca.uhn.fhir.cr.r4.questionnaireresponse.QuestionnaireResponseExtractProvider;
+import ca.uhn.fhir.rest.server.RestfulServer;
+import org.opencds.cqf.fhir.cql.EvaluationSettings;
+import org.opencds.cqf.fhir.cr.activitydefinition.r4.ActivityDefinitionProcessor;
+import org.opencds.cqf.fhir.cr.cql.r4.R4CqlExecutionService;
+import org.opencds.cqf.fhir.cr.measure.CareGapsProperties;
+import org.opencds.cqf.fhir.cr.measure.MeasureEvaluationOptions;
+import org.opencds.cqf.fhir.cr.measure.r4.R4CareGapsService;
+import org.opencds.cqf.fhir.cr.measure.r4.R4SubmitDataService;
+import org.opencds.cqf.fhir.cr.plandefinition.r4.PlanDefinitionProcessor;
+import org.opencds.cqf.fhir.cr.questionnaire.r4.QuestionnaireProcessor;
+import org.opencds.cqf.fhir.cr.questionnaireresponse.r4.QuestionnaireResponseProcessor;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.concurrent.Executor;
+
+@Configuration
+public class CrR4Config {
+
+ @Bean
+ IMeasureServiceFactory r4MeasureServiceFactory(
+ IRepositoryFactory theRepositoryFactory, MeasureEvaluationOptions theEvaluationOptions) {
+ return rd -> new MeasureService(theRepositoryFactory.create(rd), theEvaluationOptions);
+ }
+
+ @Bean
+ ISubmitDataProcessorFactory r4SubmitDataProcessorFactory(IRepositoryFactory theRepositoryFactory) {
+ return rd -> new R4SubmitDataService(theRepositoryFactory.create(rd));
+ }
+
+ @Bean
+ ICqlExecutionServiceFactory r4CqlExecutionServiceFactory(
+ IRepositoryFactory theRepositoryFactory, EvaluationSettings theEvaluationSettings) {
+ return rd -> new R4CqlExecutionService(theRepositoryFactory.create(rd), theEvaluationSettings);
+ }
+
+ @Bean
+ CqlExecutionOperationProvider r4CqlExecutionOperationProvider() {
+ return new CqlExecutionOperationProvider();
+ }
+
+ @Bean
+ ICareGapsServiceFactory careGapsServiceFactory(
+ IRepositoryFactory theRepositoryFactory,
+ CareGapsProperties theCareGapsProperties,
+ MeasureEvaluationOptions theMeasureEvaluationOptions,
+ @Qualifier("cqlExecutor") Executor theExecutor) {
+ return rd -> new R4CareGapsService(
+ theCareGapsProperties,
+ theRepositoryFactory.create(rd),
+ theMeasureEvaluationOptions,
+ theExecutor,
+ rd.getFhirServerBase());
+ }
+
+ @Bean
+ CareGapsOperationProvider r4CareGapsOperationProvider() {
+ return new CareGapsOperationProvider();
+ }
+
+ @Bean
+ SubmitDataProvider r4SubmitDataProvider() {
+ return new SubmitDataProvider();
+ }
+
+ @Bean
+ MeasureOperationsProvider r4MeasureOperationsProvider() {
+ return new MeasureOperationsProvider();
+ }
+
+ @Bean
+ IActivityDefinitionProcessorFactory r4ActivityDefinitionProcessorFactory(
+ IRepositoryFactory theRepositoryFactory, EvaluationSettings theEvaluationSettings) {
+ return rd -> new ActivityDefinitionProcessor(
+ theRepositoryFactory.create(rd), theEvaluationSettings);
+ }
+
+ @Bean
+ IPlanDefinitionProcessorFactory r4PlanDefinitionProcessorFactory(
+ IRepositoryFactory theRepositoryFactory, EvaluationSettings theEvaluationSettings) {
+ return rd -> new PlanDefinitionProcessor(
+ theRepositoryFactory.create(rd), theEvaluationSettings);
+ }
+
+ @Bean
+ IQuestionnaireProcessorFactory r4QuestionnaireProcessorFactory(
+ IRepositoryFactory theRepositoryFactory, EvaluationSettings theEvaluationSettings) {
+ return rd -> new QuestionnaireProcessor(
+ theRepositoryFactory.create(rd), theEvaluationSettings);
+ }
+
+ @Bean
+ IQuestionnaireResponseProcessorFactory r4QuestionnaireResponseProcessorFactory(
+ IRepositoryFactory theRepositoryFactory, EvaluationSettings theEvaluationSettings) {
+ return rd -> new QuestionnaireResponseProcessor(
+ theRepositoryFactory.create(rd), theEvaluationSettings);
+ }
+
+ @Bean
+ ActivityDefinitionApplyProvider r4ActivityDefinitionApplyProvider() {
+ return new ActivityDefinitionApplyProvider();
+ }
+
+ @Bean
+ PlanDefinitionApplyProvider r4PlanDefinitionApplyProvider() {
+ return new PlanDefinitionApplyProvider();
+ }
+
+ @Bean
+ QuestionnaireResponseExtractProvider
+ r4QuestionnaireResponseExtractProvider() {
+ return new QuestionnaireResponseExtractProvider();
+ }
+
+ @Bean
+ PlanDefinitionPackageProvider r4PlanDefinitionPackageProvider() {
+ return new PlanDefinitionPackageProvider();
+ }
+
+ @Bean
+ QuestionnairePackageProvider r4QuestionnairePackageProvider() {
+ return new QuestionnairePackageProvider();
+ }
+
+ @Bean
+ QuestionnairePopulateProvider r4QuestionnairePopulateProvider() {
+ return new QuestionnairePopulateProvider();
+ }
+
+ @Bean
+ public ProviderLoader r4PdLoader(
+ ApplicationContext theApplicationContext, FhirContext theFhirContext, RestfulServer theRestfulServer) {
+
+ var selector = new ProviderSelector(
+ theFhirContext,
+ Map.of(
+ FhirVersionEnum.R4,
+ Arrays.asList(
+ MeasureOperationsProvider.class,
+ SubmitDataProvider.class,
+ CareGapsOperationProvider.class,
+ CqlExecutionOperationProvider.class,
+ ActivityDefinitionApplyProvider.class,
+ PlanDefinitionApplyProvider.class,
+ QuestionnaireResponseExtractProvider.class,
+ QuestionnairePackageProvider.class,
+ PlanDefinitionPackageProvider.class,
+ QuestionnairePopulateProvider.class)));
+
+ return new ProviderLoader(theRestfulServer, theApplicationContext, selector);
+ }
+}
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 0d63e3e..09e37b7 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
@@ -1,18 +1,13 @@
package ca.uhn.fhir.jpa.starter.cr;
-import ca.uhn.fhir.cr.config.r4.ApplyOperationConfig;
-import ca.uhn.fhir.cr.config.r4.CrR4Config;
-import ca.uhn.fhir.cr.config.r4.ExtractOperationConfig;
-import ca.uhn.fhir.cr.config.r4.PackageOperationConfig;
-import ca.uhn.fhir.cr.config.r4.PopulateOperationConfig;
+import ca.uhn.fhir.cr.repo.HapiFhirRepository;
import ca.uhn.fhir.jpa.starter.annotations.OnR4Condition;
import ca.uhn.fhir.rest.server.RestfulServer;
import ca.uhn.fhir.rest.server.provider.ResourceProviderFactory;
-import org.springframework.context.annotation.Conditional;
-import org.springframework.context.annotation.Import;
-
import ca.uhn.fhir.cr.common.CqlThreadFactory;
+import ca.uhn.fhir.cr.common.IRepositoryFactory;
+import ca.uhn.fhir.jpa.api.dao.DaoRegistry;
import ca.uhn.fhir.jpa.starter.AppProperties;
import org.cqframework.cql.cql2elm.CqlCompilerOptions;
import org.cqframework.cql.cql2elm.model.CompiledLibrary;
@@ -38,11 +33,7 @@ import java.util.concurrent.Executors;
@Configuration
@Conditional({ OnR4Condition.class, CrConfigCondition.class })
-@Import({ CrR4Config.class,
- ApplyOperationConfig.class,
- ExtractOperationConfig.class,
- PackageOperationConfig.class,
- PopulateOperationConfig.class})
+@Import(CrR4Config.class)
public class StarterCrR4Config {
private static final Logger ourLogger = LoggerFactory.getLogger(StarterCrR4Config.class);
@@ -57,6 +48,7 @@ public class StarterCrR4Config {
return executor;
}
+
@Bean
CareGapsProperties careGapsProperties(AppProperties theAppProperties) {
var careGapsProperties = new CareGapsProperties();
@@ -75,6 +67,7 @@ public class StarterCrR4Config {
}
return measureEvalOptions;
}
+
@Bean
public EvaluationSettings evaluationSettings(
AppProperties theAppProperties,