Skip to content

Commit 58d76c7

Browse files
sliver007barhodes
andauthored
Hapi 7 5 4 temp (#802)
* Updated dependencies for CR 3.21.0-SNAPSHOT * use new CR config * Removed the eCR module registration from the POM * use new CR providers --------- Co-authored-by: Brenin Rhodes <brenin.rhodes@smiledigitalhealth.com>
1 parent 846b461 commit 58d76c7

13 files changed

Lines changed: 333 additions & 25 deletions

File tree

core/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@
5252
<groupId>org.opencds.cqf.fhir</groupId>
5353
<artifactId>cqf-fhir-cr</artifactId>
5454
</dependency>
55+
<dependency>
56+
<groupId>org.opencds.cqf.fhir</groupId>
57+
<artifactId>cqf-fhir-cr-hapi</artifactId>
58+
</dependency>
5559
<dependency>
5660
<groupId>org.opencds.cqf.fhir</groupId>
5761
<artifactId>cqf-fhir-jackson</artifactId>

core/src/main/java/org/opencds/cqf/ruler/config/RulerConfig.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
import org.opencds.cqf.external.common.FhirServerConfigDstu3;
77
import org.opencds.cqf.external.common.FhirServerConfigR4;
88
import org.opencds.cqf.external.common.FhirServerConfigR5;
9-
import org.opencds.cqf.external.cr.StarterCrDstu3Config;
10-
import org.opencds.cqf.external.cr.StarterCrR4Config;
119
import org.opencds.cqf.ruler.ServerConfig;
1210
import org.springframework.context.ApplicationContext;
1311
import org.springframework.context.annotation.Bean;
@@ -35,8 +33,8 @@
3533
FhirServerConfigR5.class,
3634
JpaBatch2Config.class,
3735
Batch2JobsConfig.class,
38-
StarterCrDstu3Config.class,
39-
StarterCrR4Config.class
36+
RulerCrDstu3Config.class,
37+
RulerCrR4Config.class
4038
})
4139
public class RulerConfig {
4240
public class DaoConfigCustomizer {
Lines changed: 234 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
package org.opencds.cqf.ruler.config;
2+
3+
import ca.uhn.fhir.jpa.api.dao.DaoRegistry;
4+
import ca.uhn.fhir.jpa.cache.IResourceChangeListenerRegistry;
5+
import ca.uhn.fhir.jpa.cache.ResourceChangeListenerRegistryInterceptor;
6+
import ca.uhn.fhir.jpa.searchparam.SearchParameterMap;
7+
import ca.uhn.fhir.rest.server.RestfulServer;
8+
import ca.uhn.fhir.rest.server.provider.ResourceProviderFactory;
9+
import org.cqframework.cql.cql2elm.CqlCompilerOptions;
10+
import org.cqframework.cql.cql2elm.model.CompiledLibrary;
11+
import org.cqframework.cql.cql2elm.model.Model;
12+
import org.hl7.cql.model.ModelIdentifier;
13+
import org.hl7.elm.r1.VersionedIdentifier;
14+
import org.opencds.cqf.cql.engine.execution.CqlEngine;
15+
import org.opencds.cqf.cql.engine.runtime.Code;
16+
import org.opencds.cqf.external.cr.CrConfigCondition;
17+
import org.opencds.cqf.external.cr.CrProperties;
18+
import org.opencds.cqf.external.cr.PostInitProviderRegisterer;
19+
import org.opencds.cqf.fhir.cql.EvaluationSettings;
20+
import org.opencds.cqf.fhir.cql.engine.retrieve.RetrieveSettings;
21+
import org.opencds.cqf.fhir.cql.engine.terminology.TerminologySettings;
22+
import org.opencds.cqf.fhir.cr.hapi.common.CodeCacheResourceChangeListener;
23+
import org.opencds.cqf.fhir.cr.hapi.common.CqlThreadFactory;
24+
import org.opencds.cqf.fhir.cr.hapi.common.ElmCacheResourceChangeListener;
25+
import org.opencds.cqf.fhir.cr.measure.CareGapsProperties;
26+
import org.opencds.cqf.fhir.cr.measure.MeasureEvaluationOptions;
27+
import org.opencds.cqf.fhir.utility.ValidationProfile;
28+
import org.springframework.boot.context.properties.ConfigurationProperties;
29+
import org.springframework.context.annotation.Bean;
30+
import org.springframework.context.annotation.Conditional;
31+
import org.springframework.context.annotation.Configuration;
32+
import org.springframework.context.annotation.Primary;
33+
import org.springframework.security.concurrent.DelegatingSecurityContextExecutorService;
34+
35+
import java.util.EnumSet;
36+
import java.util.List;
37+
import java.util.Map;
38+
import java.util.Set;
39+
import java.util.concurrent.ConcurrentHashMap;
40+
import java.util.concurrent.ExecutorService;
41+
import java.util.concurrent.Executors;
42+
43+
@Configuration
44+
@Conditional({CrConfigCondition.class})
45+
public class RulerCrCommonConfig {
46+
47+
@Bean
48+
@ConfigurationProperties(prefix = "hapi.fhir.cr")
49+
CrProperties crProperties() {
50+
return new CrProperties();
51+
}
52+
53+
@Bean
54+
RetrieveSettings retrieveSettings(CrProperties theCrProperties) {
55+
return theCrProperties.getCql().getData();
56+
}
57+
58+
@Bean
59+
TerminologySettings terminologySettings(CrProperties theCrProperties) {
60+
return theCrProperties.getCql().getTerminology();
61+
}
62+
63+
@Bean
64+
public EvaluationSettings evaluationSettings(
65+
CrProperties theCrProperties,
66+
RetrieveSettings theRetrieveSettings,
67+
TerminologySettings theTerminologySettings,
68+
Map<VersionedIdentifier, CompiledLibrary> theGlobalLibraryCache,
69+
Map<ModelIdentifier, Model> theGlobalModelCache,
70+
Map<String, List<Code>> theGlobalValueSetCache) {
71+
var evaluationSettings = EvaluationSettings.getDefault();
72+
var cqlOptions = evaluationSettings.getCqlOptions();
73+
74+
var cqlEngineOptions = cqlOptions.getCqlEngineOptions();
75+
Set<CqlEngine.Options> options = EnumSet.noneOf(CqlEngine.Options.class);
76+
var cqlRuntimeProperties = theCrProperties.getCql().getRuntime();
77+
if (cqlRuntimeProperties.isEnableExpressionCaching()) {
78+
options.add(CqlEngine.Options.EnableExpressionCaching);
79+
}
80+
if (cqlRuntimeProperties.isEnableValidation()) {
81+
options.add(CqlEngine.Options.EnableValidation);
82+
}
83+
cqlEngineOptions.setOptions(options);
84+
if (cqlRuntimeProperties.isDebugLoggingEnabled()) {
85+
cqlEngineOptions.setDebugLoggingEnabled(true);
86+
}
87+
cqlOptions.setCqlEngineOptions(cqlEngineOptions);
88+
89+
var cqlCompilerOptions = new CqlCompilerOptions();
90+
91+
var cqlCompilerProperties = theCrProperties.getCql().getCompiler();
92+
93+
if (cqlCompilerProperties.isEnableDateRangeOptimization()) {
94+
cqlCompilerOptions.setOptions(CqlCompilerOptions.Options.EnableDateRangeOptimization);
95+
}
96+
if (cqlCompilerProperties.isEnableAnnotations()) {
97+
cqlCompilerOptions.setOptions(CqlCompilerOptions.Options.EnableAnnotations);
98+
}
99+
if (cqlCompilerProperties.isEnableLocators()) {
100+
cqlCompilerOptions.setOptions(CqlCompilerOptions.Options.EnableLocators);
101+
}
102+
if (cqlCompilerProperties.isEnableResultsType()) {
103+
cqlCompilerOptions.setOptions(CqlCompilerOptions.Options.EnableResultTypes);
104+
}
105+
cqlCompilerOptions.setVerifyOnly(cqlCompilerProperties.isVerifyOnly());
106+
if (cqlCompilerProperties.isEnableDetailedErrors()) {
107+
cqlCompilerOptions.setOptions(CqlCompilerOptions.Options.EnableDetailedErrors);
108+
}
109+
cqlCompilerOptions.setErrorLevel(cqlCompilerProperties.getErrorSeverityLevel());
110+
if (cqlCompilerProperties.isDisableListTraversal()) {
111+
cqlCompilerOptions.setOptions(CqlCompilerOptions.Options.DisableListTraversal);
112+
}
113+
if (cqlCompilerProperties.isDisableListDemotion()) {
114+
cqlCompilerOptions.setOptions(CqlCompilerOptions.Options.DisableListDemotion);
115+
}
116+
if (cqlCompilerProperties.isDisableListPromotion()) {
117+
cqlCompilerOptions.setOptions(CqlCompilerOptions.Options.DisableListPromotion);
118+
}
119+
if (cqlCompilerProperties.isEnableIntervalDemotion()) {
120+
cqlCompilerOptions.setOptions(CqlCompilerOptions.Options.EnableIntervalDemotion);
121+
}
122+
if (cqlCompilerProperties.isEnableIntervalPromotion()) {
123+
cqlCompilerOptions.setOptions(CqlCompilerOptions.Options.EnableIntervalPromotion);
124+
}
125+
if (cqlCompilerProperties.isDisableMethodInvocation()) {
126+
cqlCompilerOptions.setOptions(CqlCompilerOptions.Options.DisableMethodInvocation);
127+
}
128+
if (cqlCompilerProperties.isRequireFromKeyword()) {
129+
cqlCompilerOptions.setOptions(CqlCompilerOptions.Options.RequireFromKeyword);
130+
}
131+
cqlCompilerOptions.setValidateUnits(cqlCompilerProperties.isValidateUnits());
132+
if (cqlCompilerProperties.isDisableDefaultModelInfoLoad()) {
133+
cqlCompilerOptions.setOptions(CqlCompilerOptions.Options.DisableDefaultModelInfoLoad);
134+
}
135+
cqlCompilerOptions.setSignatureLevel(cqlCompilerProperties.getSignatureLevel());
136+
cqlCompilerOptions.setCompatibilityLevel(cqlCompilerProperties.getCompatibilityLevel());
137+
cqlCompilerOptions.setAnalyzeDataRequirements(cqlCompilerProperties.isAnalyzeDataRequirements());
138+
cqlCompilerOptions.setCollapseDataRequirements(cqlCompilerProperties.isCollapseDataRequirements());
139+
140+
cqlOptions.setCqlCompilerOptions(cqlCompilerOptions);
141+
evaluationSettings.setLibraryCache(theGlobalLibraryCache);
142+
evaluationSettings.setModelCache(theGlobalModelCache);
143+
evaluationSettings.setValueSetCache(theGlobalValueSetCache);
144+
evaluationSettings.setRetrieveSettings(theRetrieveSettings);
145+
evaluationSettings.setTerminologySettings(theTerminologySettings);
146+
return evaluationSettings;
147+
}
148+
149+
@Primary
150+
@Bean
151+
public ExecutorService cqlExecutor() {
152+
CqlThreadFactory factory = new CqlThreadFactory();
153+
ExecutorService executor = Executors.newFixedThreadPool(2, factory);
154+
executor = new DelegatingSecurityContextExecutorService(executor);
155+
156+
return executor;
157+
}
158+
159+
@Bean
160+
CareGapsProperties careGapsProperties(CrProperties theCrProperties) {
161+
var careGapsProperties = new CareGapsProperties();
162+
// This check for the resource type really should be happening down in CR where the setting is actually used but
163+
// that will have to wait for a future CR release
164+
careGapsProperties.setCareGapsReporter(
165+
theCrProperties.getCareGaps().getReporter().replace("Organization/", ""));
166+
careGapsProperties.setCareGapsCompositionSectionAuthor(
167+
theCrProperties.getCareGaps().getSection_author().replace("Organization/", ""));
168+
return careGapsProperties;
169+
}
170+
171+
@Bean
172+
MeasureEvaluationOptions measureEvaluationOptions(
173+
EvaluationSettings theEvaluationSettings, Map<String, ValidationProfile> theValidationProfiles) {
174+
MeasureEvaluationOptions measureEvalOptions = new MeasureEvaluationOptions();
175+
measureEvalOptions.setEvaluationSettings(theEvaluationSettings);
176+
if (measureEvalOptions.isValidationEnabled()) {
177+
measureEvalOptions.setValidationProfiles(theValidationProfiles);
178+
}
179+
return measureEvalOptions;
180+
}
181+
182+
@Bean
183+
public PostInitProviderRegisterer postInitProviderRegisterer(
184+
RestfulServer theRestfulServer, ResourceProviderFactory theResourceProviderFactory) {
185+
return new PostInitProviderRegisterer(theRestfulServer, theResourceProviderFactory);
186+
}
187+
188+
@Bean
189+
public Map<VersionedIdentifier, CompiledLibrary> globalLibraryCache() {
190+
return new ConcurrentHashMap<>();
191+
}
192+
193+
@Bean
194+
public Map<ModelIdentifier, Model> globalModelCache() {
195+
return new ConcurrentHashMap<>();
196+
}
197+
198+
@Bean
199+
public Map<String, List<Code>> globalValueSetCache() {
200+
return new ConcurrentHashMap<>();
201+
}
202+
203+
@Bean
204+
public ElmCacheResourceChangeListener elmCacheResourceChangeListener(
205+
IResourceChangeListenerRegistry theResourceChangeListenerRegistry,
206+
DaoRegistry theDaoRegistry,
207+
EvaluationSettings theEvaluationSettings) {
208+
ElmCacheResourceChangeListener listener =
209+
new ElmCacheResourceChangeListener(theDaoRegistry, theEvaluationSettings.getLibraryCache());
210+
theResourceChangeListenerRegistry.registerResourceResourceChangeListener(
211+
"Library", SearchParameterMap.newSynchronous(), listener, 1000);
212+
return listener;
213+
}
214+
215+
@Bean
216+
public CodeCacheResourceChangeListener codeCacheResourceChangeListener(
217+
IResourceChangeListenerRegistry theResourceChangeListenerRegistry,
218+
EvaluationSettings theEvaluationSettings,
219+
DaoRegistry theDaoRegistry) {
220+
221+
CodeCacheResourceChangeListener listener =
222+
new CodeCacheResourceChangeListener(theDaoRegistry, theEvaluationSettings.getValueSetCache());
223+
// registry
224+
theResourceChangeListenerRegistry.registerResourceResourceChangeListener(
225+
"ValueSet", SearchParameterMap.newSynchronous(), listener, 1000);
226+
227+
return listener;
228+
}
229+
230+
@Bean
231+
public ResourceChangeListenerRegistryInterceptor resourceChangeListenerRegistryInterceptor() {
232+
return new ResourceChangeListenerRegistryInterceptor();
233+
}
234+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.opencds.cqf.ruler.config;
2+
3+
import org.opencds.cqf.external.annotations.OnDSTU3Condition;
4+
import org.opencds.cqf.external.cr.CrConfigCondition;
5+
import org.opencds.cqf.fhir.cr.hapi.config.dstu3.ApplyOperationConfig;
6+
import org.opencds.cqf.fhir.cr.hapi.config.dstu3.CrDstu3Config;
7+
import org.opencds.cqf.fhir.cr.hapi.config.dstu3.DataRequirementsOperationConfig;
8+
import org.opencds.cqf.fhir.cr.hapi.config.dstu3.EvaluateOperationConfig;
9+
import org.opencds.cqf.fhir.cr.hapi.config.dstu3.PackageOperationConfig;
10+
import org.springframework.context.annotation.Conditional;
11+
import org.springframework.context.annotation.Configuration;
12+
import org.springframework.context.annotation.Import;
13+
14+
@Configuration
15+
@Conditional({OnDSTU3Condition.class, CrConfigCondition.class})
16+
@Import({
17+
RulerCrCommonConfig.class,
18+
CrDstu3Config.class,
19+
ApplyOperationConfig.class,
20+
DataRequirementsOperationConfig.class,
21+
EvaluateOperationConfig.class,
22+
PackageOperationConfig.class
23+
})
24+
public class RulerCrDstu3Config {}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.opencds.cqf.ruler.config;
2+
3+
import org.opencds.cqf.external.annotations.OnR4Condition;
4+
import org.opencds.cqf.external.cr.CrCommonConfig;
5+
import org.opencds.cqf.external.cr.CrConfigCondition;
6+
import org.opencds.cqf.fhir.cr.hapi.config.r4.ApplyOperationConfig;
7+
import org.opencds.cqf.fhir.cr.hapi.config.r4.CrR4Config;
8+
import org.opencds.cqf.fhir.cr.hapi.config.r4.DataRequirementsOperationConfig;
9+
import org.opencds.cqf.fhir.cr.hapi.config.r4.EvaluateOperationConfig;
10+
import org.opencds.cqf.fhir.cr.hapi.config.r4.ExtractOperationConfig;
11+
import org.opencds.cqf.fhir.cr.hapi.config.r4.PackageOperationConfig;
12+
import org.opencds.cqf.fhir.cr.hapi.config.r4.PopulateOperationConfig;
13+
import org.opencds.cqf.fhir.cr.hapi.config.r4.QuestionnaireOperationConfig;
14+
import org.springframework.context.annotation.Conditional;
15+
import org.springframework.context.annotation.Configuration;
16+
import org.springframework.context.annotation.Import;
17+
18+
@Configuration
19+
@Conditional({OnR4Condition.class, CrConfigCondition.class})
20+
@Import({
21+
RulerCrCommonConfig.class,
22+
CrR4Config.class,
23+
ApplyOperationConfig.class,
24+
DataRequirementsOperationConfig.class,
25+
EvaluateOperationConfig.class,
26+
ExtractOperationConfig.class,
27+
PackageOperationConfig.class,
28+
PopulateOperationConfig.class,
29+
QuestionnaireOperationConfig.class
30+
})
31+
public class RulerCrR4Config {}

docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ services:
1616
depends_on:
1717
- postgres
1818
ports:
19-
- "8080:8080"
19+
- "8082:8080"
2020
healthcheck:
2121
test:
2222
[

external/pom.xml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@
3939
</dependency>
4040

4141
<!-- This dependency includes the JPA CQL Server -->
42-
<dependency>
43-
<groupId>ca.uhn.hapi.fhir</groupId>
44-
<artifactId>hapi-fhir-storage-cr</artifactId>
45-
</dependency>
42+
<!-- <dependency>-->
43+
<!-- <groupId>ca.uhn.hapi.fhir</groupId>-->
44+
<!-- <artifactId>hapi-fhir-storage-cr</artifactId>-->
45+
<!-- </dependency>-->
4646

4747
<!-- This dependency includes the JPA MDM Server -->
4848
<dependency>
@@ -77,6 +77,10 @@
7777
<groupId>org.opencds.cqf.fhir</groupId>
7878
<artifactId>cqf-fhir-cr</artifactId>
7979
</dependency>
80+
<dependency>
81+
<groupId>org.opencds.cqf.fhir</groupId>
82+
<artifactId>cqf-fhir-cr-hapi</artifactId>
83+
</dependency>
8084
<dependency>
8185
<groupId>org.opencds.cqf.fhir</groupId>
8286
<artifactId>cqf-fhir-jackson</artifactId>

plugin/cds-hooks/src/main/java/org/opencds/cqf/ruler/cdshooks/r4/CdsHooksServlet.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
import org.opencds.cqf.cql.engine.exception.DataProviderException;
2525
import org.opencds.cqf.cql.engine.model.ModelResolver;
2626
import org.opencds.cqf.external.AppProperties;
27+
import org.opencds.cqf.fhir.cr.hapi.r4.activitydefinition.ActivityDefinitionApplyProvider;
28+
import org.opencds.cqf.fhir.cr.hapi.r4.cpg.CqlExecutionOperationProvider;
29+
import org.opencds.cqf.fhir.cr.hapi.r4.library.LibraryEvaluateProvider;
2730
import org.opencds.cqf.fhir.utility.model.FhirModelResolverCache;
2831
import org.opencds.cqf.fhir.utility.Canonicals;
2932
import org.opencds.cqf.fhir.utility.Ids;
@@ -45,8 +48,6 @@
4548
import com.google.gson.JsonObject;
4649
import com.google.gson.JsonParser;
4750

48-
import ca.uhn.fhir.cr.r4.cpg.CqlExecutionOperationProvider;
49-
import ca.uhn.fhir.cr.r4.library.LibraryEvaluateProvider;
5051
import ca.uhn.fhir.jpa.api.dao.DaoRegistry;
5152
import ca.uhn.fhir.rest.server.RestfulServer;
5253
import ca.uhn.fhir.rest.server.exceptions.BaseServerResponseException;
@@ -69,7 +70,7 @@ public class CdsHooksServlet extends HttpServlet implements DaoRegistryUser {
6970
@Autowired
7071
private LibraryEvaluateProvider libraryExecution;
7172
@Autowired
72-
private ca.uhn.fhir.cr.r4.activitydefinition.ActivityDefinitionApplyProvider applyEvaluator;
73+
private ActivityDefinitionApplyProvider applyEvaluator;
7374
@Autowired
7475
private ProviderConfiguration providerConfiguration;
7576

0 commit comments

Comments
 (0)