001package ca.uhn.fhir.cql.dstu3.evaluation; 002 003/*- 004 * #%L 005 * HAPI FHIR JPA Server - Clinical Quality Language 006 * %% 007 * Copyright (C) 2014 - 2022 Smile CDR, Inc. 008 * %% 009 * Licensed under the Apache License, Version 2.0 (the "License"); 010 * you may not use this file except in compliance with the License. 011 * You may obtain a copy of the License at 012 * 013 * http://www.apache.org/licenses/LICENSE-2.0 014 * 015 * Unless required by applicable law or agreed to in writing, software 016 * distributed under the License is distributed on an "AS IS" BASIS, 017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 018 * See the License for the specific language governing permissions and 019 * limitations under the License. 020 * #L% 021 */ 022 023import ca.uhn.fhir.i18n.Msg; 024import ca.uhn.fhir.context.FhirContext; 025import ca.uhn.fhir.cql.common.provider.EvaluationProviderFactory; 026import ca.uhn.fhir.cql.common.retrieve.JpaFhirRetrieveProvider; 027import ca.uhn.fhir.jpa.api.dao.DaoRegistry; 028import ca.uhn.fhir.rest.api.server.RequestDetails; 029import org.opencds.cqf.cql.engine.data.CompositeDataProvider; 030import org.opencds.cqf.cql.engine.data.DataProvider; 031import org.opencds.cqf.cql.engine.fhir.searchparam.SearchParameterResolver; 032import org.opencds.cqf.cql.engine.model.ModelResolver; 033import org.opencds.cqf.cql.engine.terminology.TerminologyProvider; 034import org.opencds.cqf.cql.evaluator.engine.terminology.PrivateCachingTerminologyProviderDecorator; 035import org.springframework.beans.factory.annotation.Autowired; 036import org.springframework.stereotype.Component; 037 038// This class is a relatively dumb factory for data providers. It supports only 039// creating JPA providers for FHIR and only basic auth for terminology 040@Component 041public class ProviderFactory implements EvaluationProviderFactory { 042 043 private final DaoRegistry registry; 044 private final TerminologyProvider defaultTerminologyProvider; 045 private final FhirContext fhirContext; 046 private final ModelResolver fhirModelResolver; 047 048 @Autowired 049 public ProviderFactory(FhirContext fhirContext, DaoRegistry registry, 050 TerminologyProvider defaultTerminologyProvider, ModelResolver fhirModelResolver) { 051 this.defaultTerminologyProvider = defaultTerminologyProvider; 052 this.registry = registry; 053 this.fhirContext = fhirContext; 054 this.fhirModelResolver = fhirModelResolver; 055 } 056 057 public DataProvider createDataProvider(String model, String version, RequestDetails theRequestDetails) { 058 return this.createDataProvider(model, version, null, null, null, theRequestDetails); 059 } 060 061 public DataProvider createDataProvider(String model, String version, String url, String user, String pass, RequestDetails theRequestDetails) { 062 TerminologyProvider terminologyProvider = this.createTerminologyProvider(model, version, url, user, pass); 063 return this.createDataProvider(model, version, terminologyProvider, theRequestDetails); 064 } 065 066 public DataProvider createDataProvider(String model, String version, TerminologyProvider terminologyProvider, RequestDetails theRequestDetails) { 067 if (model.equals("FHIR") && version.startsWith("3")) { 068 JpaFhirRetrieveProvider retrieveProvider = new JpaFhirRetrieveProvider(this.registry, 069 new SearchParameterResolver(this.fhirContext), theRequestDetails); 070 retrieveProvider.setTerminologyProvider(terminologyProvider); 071 retrieveProvider.setExpandValueSets(true); 072 073 return new CompositeDataProvider(this.fhirModelResolver, retrieveProvider); 074 } 075 076 throw new IllegalArgumentException(Msg.code(1650) + String.format("Can't construct a data provider for model %s version %s", model, version)); 077 } 078 079 public TerminologyProvider createTerminologyProvider(String model, String version, String url, String user, 080 String pass) { 081 TerminologyProvider terminologyProvider = null; 082 terminologyProvider = this.defaultTerminologyProvider; 083 return new PrivateCachingTerminologyProviderDecorator(terminologyProvider); 084 } 085}