001package ca.uhn.fhir.cql.r4.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 myDaoRegistry; 044 private final TerminologyProvider myDefaultTerminologyProvider; 045 private final FhirContext myFhirContext; 046 private final ModelResolver myModelResolver; 047 048 @Autowired 049 public ProviderFactory(FhirContext theFhirContext, DaoRegistry theDaoRegistry, TerminologyProvider theDefaultTerminologyProvider, ModelResolver theFhirModelResolver) { 050 myDefaultTerminologyProvider = theDefaultTerminologyProvider; 051 myDaoRegistry = theDaoRegistry; 052 myFhirContext = theFhirContext; 053 myModelResolver = theFhirModelResolver; 054 } 055 056 public DataProvider createDataProvider(String model, String version, RequestDetails theRequestDetails) { 057 return this.createDataProvider(model, version, null, null, null, theRequestDetails); 058 } 059 060 public DataProvider createDataProvider(String model, String version, String url, String user, String pass, RequestDetails theRequestDetails) { 061 TerminologyProvider terminologyProvider = this.createTerminologyProvider(model, version, url, user, pass); 062 return this.createDataProvider(model, version, terminologyProvider, theRequestDetails); 063 } 064 065 public DataProvider createDataProvider(String model, String version, TerminologyProvider terminologyProvider, RequestDetails theRequestDetails) { 066 if (model.equals("FHIR") && version.startsWith("4")) { 067 JpaFhirRetrieveProvider retrieveProvider = new JpaFhirRetrieveProvider(myDaoRegistry, 068 new SearchParameterResolver(myFhirContext), theRequestDetails); 069 retrieveProvider.setTerminologyProvider(terminologyProvider); 070 retrieveProvider.setExpandValueSets(true); 071 072 return new CompositeDataProvider(myModelResolver, retrieveProvider); 073 } 074 075 throw new IllegalArgumentException(Msg.code(1674) + String.format("Can't construct a data provider for model %s version %s", model, version)); 076 } 077 078 public TerminologyProvider createTerminologyProvider(String model, String version, String url, String user, 079 String pass) { 080 TerminologyProvider terminologyProvider = null; 081 terminologyProvider = myDefaultTerminologyProvider; 082 return new PrivateCachingTerminologyProviderDecorator(terminologyProvider); 083 } 084}